DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

Plugin Trellis Workflow — DSH Plugin for DeepSeek Harness
DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins
P

dsh-plugin-trellis-workflow

Plugin Trellis Workflow

Trellis workflow enforcement for the DeepSeek Harness: injects the per-turn workflow state and the trellis-start entry gate that dsh's missing session-start and user-prompt hooks would otherwise provide.

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add github:elmersky/dsh-plugin-trellis-workflow#a937103bd9248c07b8602a8e7453036b0bf54a8e
READMECompatibilityVersions

Compatibility and provenance

Plugin Trellis Workflow is published as dsh-plugin-trellis-workflow and currently resolves to version 0.1.1. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
any
Release source
github
Registry updated
9/18/2026

Versions

0.1.1stable
9/18/2026

Related plugins

Loading related plugins…

Latest
0.1.1
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
any
License
MIT
Source
github
GitHub
★ 0
Weekly downloads
0
Last push
9/18/2026
View source ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue

Related plugins

More verified plugins in developer-tools.

Web App@deepseek-ai/dsh-web-appThe dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)Sdk Minimal@deepseek-ai/dsh-sdk-minimalThe standalone minimal SDK profile bundle: JSON-RPC, one DeepSeek adapter, persistent shell, and JSONL sessionsSdk App@deepseek-ai/dsh-sdk-appThe dsh SDK profile bundle: stdio JSON-RPC serving and process lifecycle over dsh-baseSubagent Codex@deepseek-ai/dsh-subagent-codexOne-shot Codex subagent provider over the official app-server protocol

README

dsh-plugin-trellis-workflow

Trellis workflow enforcement for the DeepSeek Harness (dsh): per-turn workflow state injection plus a trellis-start entry gate, replacing the session-start and user-prompt hooks dsh does not ship.

The gap it closes

Trellis classifies dsh as a class-2 pull-based platform and ships hasHooks: false. It writes skills and scripts, but no SessionStart hook and no UserPromptSubmit hook. On dsh that means:

  • nothing reminds the agent that a Trellis task workflow is in force, so the workflow is skipped unless the user names a skill;
  • trellis-start is a user-invocable skill that never fires on its own.

Trellis's own generated .dsh/DSH.md says as much: "no session-start hook auto-injects workflow context, so the agent loads the Trellis skills on demand."

This plugin supplies the missing channel with dsh-native mechanisms — no hooks required:

Missing Trellis channelMechanism used here
SessionStart context injectionagent/created and agent/inbox/inserted listeners refresh state
UserPromptSubmit breadcrumba systemPrompt.context contribution whose text is a function, re-evaluated on every model step
Entry routing to trellis-startthe rendered state block itself, gated on no_task

Behaviour

  • Project-aware. Resolves the Trellis project root by walking up from session.header.cwd, confirming directory containment through the composed filesystem service. A workspace with no .trellis/ gets no injection at all, so unrelated projects are untouched.
  • Read-only. Reads the session-scoped active-task pointer at .trellis/.runtime/sessions/<sessionId>.json, then that task's task.json. It never writes to .trellis/ and never runs shell commands.
  • States. Contributes one block per step: task_active (task path and status), no_task (the trellis-start entry gate), task_error (unreadable pointer), unknown (state could not be measured). It contributes nothing until the first measurement completes rather than inventing a status.
  • Session-isolated. State is keyed per session, so concurrent sessions cannot cross-contaminate.
  • Cheap. One cached lookup per session, refreshed when the pointer can have moved (session start, a new user message, or the step before a model call).

The rendered block looks like this:

[trellis-workflow-state]
project=/path/to/trellis-project
status=task_active
task=.trellis/tasks/09-18-example
task_status=in_progress

强制路由:本任务处于 Trellis 任务流程中。
- 动手改代码前:先加载 trellis-before-dev,读 .trellis/spec/ 对应层规范。
- 改完代码:走 trellis-check。
- 收尾:走 trellis-finish-work 归档任务并写 journal。

状态来源=dsh 主机侧缓存。确切当前态:
  python3 ./.trellis/scripts/task.py current --source
本平台没有 SessionStart / UserPromptSubmit hook,此块即官方面包屑的等价物。

The routing text is written in Chinese to match the target project's convention; the rest of the block is language-neutral.

Requirements

  • dsh with the systemPrompt service composed (present in the shipped base bundle)
  • A Trellis-managed workspace (a project containing .trellis/)
  • Node.js >= 20

Install

dsh plugin --profile <profile> add dsh-plugin-trellis-workflow

No profile file edit is needed. The command writes the dependency, appends the package to dsh.profile.bundles, and the profile boot merges this package's cordis.patch.yml as one insert.

Restart the profile afterwards. Node caches imported modules, so a restart is also required after editing src/index.js.

Configuration

Row config is set in the composition, not through a settings page:

keydefaultmeaning
enabledtruefalse keeps the row mounted but contributes nothing
contextOrder900position among prompt runtime contexts; dsh's built-ins sit at 110 / 115 / 120, so this block renders after the sandbox, approval, and delegation notices. Must be a finite number.

To override, patch the row in the profile's own cordis.patch.yml:

- id: trellis-workflow
  config:
    contextOrder: 950

Uninstall

dsh plugin --profile <profile> remove dsh-plugin-trellis-workflow

Development

git clone git@github.com:elmersky/dsh-plugin-trellis-workflow.git
cd dsh-plugin-trellis-workflow
npm test                                  # smoke test
npm publish --dry-run                     # inspect the publish payload

Mount a checkout directly into a profile. pnpm records an absolute file: spec and links the directory, so edits to src/index.js are visible to the profile immediately — a restart is still needed to reload the module:

dsh plugin --profile <profile> add /absolute/path/to/dsh-plugin-trellis-workflow

Verify what actually composed:

dsh --profile <profile> --dump-config | grep -A4 trellis-workflow

Expect a # == dsh-plugin-trellis-workflow layer marker and exactly one trellis-workflow row. Two rows mean a stale hand-written mount line is still present alongside this bundle.

Package layout and why it is shaped this way

package.json declares dsh.bundle.patch, which is what makes this package a profile bundle rather than a plain dependency. The same declaration serves both the npm install and the local file: install, so publishing changes only the dependency spec — never the composition.

The row id equals the package name on purpose: the row resolves its module by package name through the profile's node_modules, so keeping the two identical makes the composed row and the dependency line correspond at a glance.

The prompt context is registered inside ctx.inject(['systemPrompt'], scope => …) rather than directly from apply(). This is not stylistic. systemPrompt.context() files the contribution into the layer belonging to the calling context's scope, and an agent assembles its prompt by merging the global layer plus the layers along its own scope-parent chain. A profile-row plugin's own context is not on that chain, so registering during apply() stores the contribution somewhere the agent never reads: the row activates, logs nothing, and injects nothing. Injecting the service instead yields a context already scoped per agent — the same route dsh's own sandbox:policy and approval:policy contexts take. test/smoke.js asserts the injection form so a regression here fails without a restart.

Status

0.1.0 — first release. Verified: composition resolves, the module loads, and the behaviour above is exercised by test/smoke.js plus the runtime contracts of systemPrompt.context and assemble.agent.session. Not yet verified on a public registry install; see the repository issues for tracking.

Licence

MIT