Introduction¶
When working on long tasks in DSH, the common collaboration pattern is “the model generates a plan, and humans monitor progress on it.” This pattern has two specific issues.
First, the plan is always proposed by the model. The task panel built into Harness is read-only; its data comes from the todos session projection, so you can only view it, not edit it. Second, there is no entry point in new sessions. When the todos projection is empty, that component simply return null; before the model writes the first task, the panel doesn’t exist at all.
lmk2215/dsh-todo-editor is designed to address these two points. It reverses the flow—you provide the checklist, and the model executes it.
What is it¶
An installable, editable task flow panel for the DeepSeek Harness client, maintained by lmk2215. It has a package.json version of 0.1.0 and is licensed under MIT. It is categorized under “Workflow” in the community directory.
What it does: It hooks the checklist entry to the session header. You write nodes and change statuses within it. After clicking save, the checklist is directly written into the session, and the native task panel above the input box updates immediately—without generating a user message, without a model turn, and without consuming tokens. Afterwards, you can send content as usual, and the model will execute node by node according to the checklist.
Core Features¶
The following capabilities are all from the README.
- The header button adds a badge showing the count of unfinished items; the panel can even be opened with an empty list (the entry point is permanently located in the
conversation.session.header.actionsslot). - Edit text line by line, append with
+, delete with×. - Clicking a status label cycles it through “Pending → In Progress → Completed”, while ensuring only one item is “In Progress” at a time, consistent with the host’s default strategy.
- Saving uses the host command
/todo-apply, writing directly to the session without a model turn. - Dual validation: empty content, duplicate entries, and illegal states are blocked before being logged to the session.
- Fallback path: when the command channel is missing (e.g., the host was partially restarted), saving automatically falls back to sending a
[Task Flow]message, ensuring the functionality remains uninterrupted.
Installation and Setup¶
Environment requirements: DeepSeek Harness >= 0.2.0 (depends on the client slot registry and dsh-commands), and the conversation.session.header.actions slot provided by @deepseek-ai/dsh-client-ui-conversation. The plugin does not require building—lib/client.js is a hand-written bundle that only pulls react and react-dom from the host’s module table.
Method A: For environments with pnpm, use the plugin manager:
dsh plugin --profile desktop add dsh-todo-editor
Method B: Manual mounting. A DSH profile is just a regular directory, so local packages can be manually linked in.
-
Place the repository in a fixed location, for example
~/.dsh/local-plugins/dsh-todo-editor. -
Link it into the profile’s
node_modules:
# Windows: junction does not require administrator privileges
cmd /c mklink /J "%USERPROFILE%\.dsh\profiles\desktop\node_modules\dsh-todo-editor" ^
"%USERPROFILE%\.dsh\local-plugins\dsh-todo-editor"
# macOS / Linux
ln -s ~/.dsh/local-plugins/dsh-todo-editor ~/.dsh/profiles/desktop/node_modules/dsh-todo-editor
-
Register it in
~/.dsh/profiles/desktop/package.json: append"dsh-todo-editor"todsh.profile.bundles; append"dsh-todo-editor": "link:<absolute path of this repository>"todependencies. -
Restart Harness. Note that refreshing the page is not enough—the client bundle is snapshotted when the host starts.
There are also scripts for the entire process above:
node scripts/install.mjs # Install / Fix
node scripts/install.mjs --revert # Uninstall
When the default values do not match your directory structure, specify using --profile <dir> or --dsh <app/dsh directory>. The uninstall command will undo the links in the profile, the two registrations in package.json, and the host patch (restoring from .bak-todoeditor-* backups). Restart is required afterwards as well.
Typical Usage¶
- Click the checklist icon in the session header.
- Write nodes and click status labels to switch statuses.
- Click save—the task panel above the input box immediately becomes your checklist.
- Send the content; the model will execute and update statuses node by node according to the checklist.
The button badge shows how many unfinished items remain.
Optional: Companion Host Patch¶
The todos projection of @deepseek-ai/dsh-tool-todo clears on every turn/start. This means the checklist you set will disappear after sending the next sentence, only to return after the model rewrites it once.
patches/tool-todo-survive-turn-start.md records a single-line change: it preserves unfinished nodes across rounds, but still clears them after all are completed, preventing stale progress from persisting. scripts/install.mjs applies this with a timestamped backup, and --revert restores it from the backup. The plugin works without the patch, but the panel will flash empty first and wait for the model to resend.
Implementation Structure¶
The command handler runs directly on the receiving agent without generating a model message, which is why saving is instant and silent; recordInput: false ensures the encoded payload is not logged to the session.
| Layer | Position | Function |
|---|---|---|
| Client | lib/client.js |
Registers the conversation.session.header.actions slot (id: todo-editor, order: 5) and renders a floating layer using a react-dom portal. |
| Client | getTodosFace |
Reads session.projections.faceOf("todos") and subscribes to changes. |
| Client | applyTodos |
Invokes session.command("/todo-apply <encodeURIComponent(JSON)>"). |
| Host | lib/index.js |
Registers /todo-apply, and the handler executes agent.session.append("todo/write", { todos }), returning { kind: "success" } without text. |
| Host | @deepseek-ai/dsh-tool-todo |
Holds the todos projection, which is actually rendered by the panel. |
Applicable Scenarios and Notes¶
Suitable for scenarios where you want to take control of the planning process, and tasks can be broken down into ordered nodes: write the checklist first, then let the model execute; the model is responsible for execution and status updates, not for proposing items for you.
Known limitations, from the README:
- Saving is not a lock: a single
todo_writefrom the model replaces the entire table, including content you have edited. - Status labels are written exactly as you set them under the command path; only the fallback path expresses them via prompt text.
- The floating layer is a fixed-position portal anchored to the button; scrolling the container does not recalculate its position (the header itself does not scroll).
- Does not support drag-and-drop sorting, inline editing, or appending at the end.
Before installing, it is recommended to do two things: confirm that the version matches a host of >= 0.2.0; and read through the source code. The plugin runs with the permissions of the current DSH process, and its capabilities are determined by the commands it registers and your environment. The license is MIT.
Conclusion¶
Its value is very concrete: it moves the question of “who makes the plan” from the model side back to the human side, without consuming any model turns. If you are accustomed to listing a checklist before assigning work, this is currently the approach that best fits that habit.
Directory page: https://www.skillhub.cn/plugins/lmk2215/dsh-todo-editor
Code & Docs: https://github.com/lmk2215/dsh-todo-editor