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.

DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins

dsh-todo-progress-guard

Todo Progress Guard

DSH host plugin that keeps todo_write progress in sync: it nudges the agent mid-turn and completes stranded tasks when a turn finishes normally.

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

npx -y @deepseek-ai/dsh plugin --profile web add dsh-todo-progress-guard@1.0.2
READMECompatibilityVersions

Compatibility and provenance

Todo Progress Guard is published as dsh-todo-progress-guard and currently resolves to version 1.0.2. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
any
Release source
npm
Registry updated
10/28/2026

Versions

1.0.2stable
10/28/2026

Related plugins

Loading related plugins…

Latest
1.0.2
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
33 kB
Files
10
Surface
any
License
MIT
Source
npm
GitHub
★ 1
Weekly downloads
0
Last push
10/28/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 productivity-workflow.

Web All@linxin666/dsh-web-allDSH Web UI 全家桶聚合插件:一键安装全部功能插件(task-board / pet / web-ui-settings / skin-center / community-plugins / compat shim)。compat 桥接层已并入本包(src/client),无需独立 compat npm 包。Remotedsh-remoteRemote-work assistant for DeepSeek Harness: connect SSH (password/key/agent/keyboard-interactive, multi-hop ProxyJump), list hosts from ~/.ssh/config, pick a remote workspace, operate on it with 21 rw_* tools, conflict-aware mirror sync, an embedded PTY tRewind Plugindsh-rewind-pluginIn-window conversation rewind with workspace file restoreModel Router@ljwei-stak/dsh-model-routerA unified DS Bot workspace for DeepSeek Harness Desktop: model and Bot routing, private libraries, recorded desktop routines and scoped remote computer control.

README

dsh-todo-progress-guard

English | 中文

Gives the DeepSeek Harness (DSH) todo list a way to advance on its own: it nudges the model to refresh todo_write during multi-step tool work, and completes stranded tasks when a turn ends normally.


The problem

DSH's todo_write replaces the whole list, and the list is only a session projection:

// @deepseek-ai/dsh-tool-todo
apply: (state, event) => {
  if (event.type === "todo/write") return event.data.todos;
  if (event.type === "turn/start") return null;
  return state;
}

So the panel only changes when the model calls todo_write again. Long tool-heavy turns show two familiar symptoms:

  1. Frozen mid-turn — the model writes a plan once, then runs dozens of bash / read / edit calls while its attention stays on tool output. The panel keeps showing the first item as in_progress for the rest of the turn.
  2. Stuck after the answer — the model finishes the work and answers in a step with no tool calls, so it never gets to send one last todo_write. The turn is over and the panel still reads 1 in progress · N pending.

This bundle closes both gaps with one Host-side Cordis plugin. It changes no DSH core package and invents no new session event types.

Two mechanisms

1. Mid-turn reminder (tools/post-execute)

When the current turn owns an incomplete todo list and the model spends several steps or tool calls without calling todo_write, the plugin injects one context message (source.kind = "todo-progress-reminder", form: "notice", rendered as a collapsible injected row in the chat stream) after the last tool result of that step.

The body repeats the current list verbatim, because todo_write replaces the whole list — the model can copy it forward without re-reading distant history:

Task progress reminder (1/3 completed; 2 step(s) / 4 tool call(s) since the last todo_write):
1. [completed] Recon the repository
2. [in_progress] Implement the fix
3. [pending] Run the test suite
If any task above is now completed or in progress, call `todo_write` with the COMPLETE
updated list in your next step. It can run in parallel alongside your next tool call at no
extra step cost, or mark every finished task `completed` before your final reply.

2. Turn-end completion (agent/turn-stopping)

As a turn ends normally — before turn/end is written, while the turn is still legitimately open — any leftover in_progress / pending items are written back as completed through one final todo/write snapshot. The panel can never outlive the work it describes.

Install

The Web UI is the recommended path: open Plugins → Install and paste any spec below. It adds the dependency and selects the bundle, so the patch applies immediately with no restart:

github:LaochenFEIZHAI/dsh-todo-progress-guard   # straight from GitHub (this repository)
/absolute/path/to/dsh-todo-progress-guard        # a local checkout; edits take effect immediately
dsh-todo-progress-guard                          # from npm once published

The CLI only installs the package (dsh plugin is a pnpm passthrough and does not select bundles):

dsh plugin --profile web add github:LaochenFEIZHAI/dsh-todo-progress-guard

After that, enable dsh-todo-progress-guard once in the Plugins page (equivalent to adding it to dsh.profile.bundles in ~/.dsh/profiles/<name>/package.json); only then is the bundle's cordis.patch.yml applied.

Configuration

Defaults are usable as-is. To tune them, override this row's config by id in the profile's own cordis.patch.yml (a patch layer replaces config wholesale, so restate all three keys):

- id: todo-progress-guard
  config:
    stepThreshold: 2
    callThreshold: 5
    autoCompleteOnTurnEnd: true
FieldDefaultMeaning
stepThreshold2Remind after this many model steps without a todo_write
callThreshold5Remind after this many other tool calls without a todo_write (needs at least one step)
autoCompleteOnTurnEndtrueComplete leftover items when a turn ends normally

The two thresholds are OR-ed: whichever is reached first reminds. At most one reminder per step, and counters reset at every turn boundary. Invalid values (non-positive integers, non-booleans) fall back to the defaults instead of failing activation.

Safety boundaries

Completion only happens when the turn really did work. The plugin appends nothing when:

  • the turn was aborted (signal.aborted) or the last assistant message was interrupted;
  • a next step is already queued (agent.inbox.nextStep is non-empty) — the turn is not over;
  • the step called ask_user_question or exit_plan_mode — the turn is waiting on a human, who alone can decide whether the work is done;
  • every item is already completed;
  • the list was just created and no other tool ran yet — that is a stated plan, not a result.

The plugin only appends todo/write events, never rewrites history, and always writes inside a legitimately open turn, so it stays compatible with the durable-log invariants owned by @deepseek-ai/dsh-tool-todo.

Compatibility

  • Requires the Host sessions and sessionProjections services; the plugin stays inactive where they are absent (plain inject semantics) instead of failing the composition.
  • Verified on DSH 0.2.0-rc.2. Every extension point it uses — additionalContexts on tools/post-execute, agent/turn-stopping, and the todos projection — is public contract there.
  • Zero runtime dependencies: the plugin imports no DSH package, so a link: checkout and a registry install behave identically. (Exporting a Schemastery Config would break link: installs, because a symlinked realpath cannot resolve DSH packages; configuration is therefore validated inside the plugin.)

Development

npm test        # node --test; 13 cases cover reminders, completion and every boundary

The tests drive the real plugin code through a minimal Host stand-in (session log + todos projection + tool waterfall) and import nothing from DSH.

License

MIT