前言¶
在 DSH 裏做長任務,常見的協作方式是「模型出計劃、人在上面看進度」。這個模式有兩個具體問題。
一是計劃永遠由模型擬定。Harness 自帶的任務面板是隻讀的,數據來自會話投影 todos,你只能看,不能改。二是新會話里根本沒有入口:todos 投影爲空時,那個組件直接 return null,模型寫下第一條任務之前,面板壓根不存在。
lmk2215/dsh-todo-editor 就是衝着這兩點來的。它把方向反過來——你下清單,模型執行。
這是什麼¶
一個給 DeepSeek Harness 客戶端裝的可編輯任務流程面板,維護者 lmk2215,package.json 版本 0.1.0,許可證 MIT,社區目錄裏歸在「工作流」分類。
它做的事:把清單入口掛到會話頭部,你在裏面寫節點、改狀態,點保存後直接把清單寫進會話,輸入框上方的原生任務面板立刻更新——不產生用戶消息,不走模型回合,不消耗 token。之後你正常發材料,模型按清單逐個節點執行。
核心功能¶
以下能力均來自 README。
- 頭部按鈕加未完成數量角標,空列表也能打開(入口常駐在
conversation.session.header.actionsslot)。 - 逐行改文字、
+追加、×刪除。 - 點狀態標籤在「待處理 → 進行中 → 已完成」之間循環,同時只允許一個進行中,與宿主默認策略一致。
- 保存走宿主命令
/todo-apply,直接寫會話,沒有模型回合。 - 雙端校驗:空內容、重複條目、非法狀態在進入會話日誌之前就被擋掉。
- 降級路徑:命令通道缺失時(例如宿主半邊沒重啓),保存自動回退成發一條
[任務流程]消息,功能不中斷。
安裝與啓用¶
環境要求:DeepSeek Harness >= 0.2.0(依賴客戶端 slot 註冊表和 dsh-commands),需要 @deepseek-ai/dsh-client-ui-conversation 提供的 conversation.session.header.actions slot。插件無需構建——lib/client.js 是手寫 bundle,只從宿主模塊表取 react 和 react-dom。
方式 A,有 pnpm 的環境用插件管理器:
dsh plugin --profile desktop add dsh-todo-editor
方式 B,手動掛載。DSH 的 profile 就是普通目錄,本地包可以手工鏈進去。
-
把倉庫放到固定位置,例如
~/.dsh/local-plugins/dsh-todo-editor。 -
鏈接進 profile 的
node_modules:
# Windows:junction 不需要管理員權限
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
-
在
~/.dsh/profiles/desktop/package.json裏登記:dsh.profile.bundles追加"dsh-todo-editor";dependencies追加"dsh-todo-editor": "link:<本倉庫絕對路徑>"。 -
重啓 Harness。注意刷新頁面不夠——客戶端 bundle 在宿主啓動時快照。
上面這一整套也有腳本:
node scripts/install.mjs # 安裝 / 修復
node scripts/install.mjs --revert # 卸載
默認值和你的目錄結構不匹配時,用 --profile <dir> 或 --dsh <app/dsh 目錄> 指定。卸載命令會一併撤銷 profile 裏的鏈接、package.json 的兩處登記和宿主補丁(從 .bak-todoeditor-* 備份還原),之後同樣需要重啓。
典型用法¶
- 點會話頭部的清單圖標。
- 寫節點,點狀態標籤切狀態。
- 點保存——輸入框上方的任務面板立刻變成你這份清單。
- 把材料發出去,模型按清單逐個節點執行並更新狀態。
按鈕角標顯示還有多少條未完成。
可選:配套宿主補丁¶
@deepseek-ai/dsh-tool-todo 的 todos 投影會在每次 turn/start 清空。這意味着你定好的清單,發出下一句話就會消失,等模型重寫一次纔回來。
patches/tool-todo-survive-turn-start.md 記錄了一行改動:有未完成節點就跨輪保留,全部完成後仍然清空,避免陳舊進度常駐。scripts/install.mjs 會帶時間戳備份地應用它,--revert 從備份還原。不打補丁插件照樣能用,只是面板會先閃空、等模型重發。
實現結構¶
命令 handler 直接跑在接收 agent 上、不產生模型消息,這是保存即時且靜默的原因;recordInput: false 讓編碼後的載荷不落進會話日誌。
| 層 | 位置 | 作用 |
|---|---|---|
| 客戶端 | lib/client.js |
註冊 slot conversation.session.header.actions(id: todo-editor,order: 5),用 react-dom portal 渲染浮層 |
| 客戶端 | getTodosFace |
讀 session.projections.faceOf("todos") 並訂閱變化 |
| 客戶端 | applyTodos |
調 session.command("/todo-apply <encodeURIComponent(JSON)>") |
| 宿主 | lib/index.js |
註冊 /todo-apply,handler 執行 agent.session.append("todo/write", { todos }),返回不含 text 的 { kind: "success" } |
| 宿主 | @deepseek-ai/dsh-tool-todo |
持有 todos 投影,面板實際渲染它 |
適用場景與注意¶
適合想把計劃權拿在自己手裏、任務又能拆成有序節點的場景:先寫好清單再讓模型執行,模型負責執行和更新狀態,而不是替你立項。
已知限制,來自 README:
- 保存不是鎖:模型一次
todo_write會整表替換,包括你改過的內容。 - 狀態標籤在命令路徑下按你設定的狀態原樣寫入;只有回退路徑才經由提示文本表達。
- 浮層是 fixed 定位的 portal,錨定按鈕,容器滾動不重算位置(頭部本身不滾動)。
- 不支持拖動排序,行內編輯、末尾追加。
安裝前建議做兩件事:確認版本與 >= 0.2.0 的宿主匹配;通讀源碼。插件以當前 dsh 進程的權限運行,能力邊界取決於它註冊的命令和你的環境。許可證是 MIT。
結尾¶
它的價值很具體:把「計劃由誰定」這個問題從模型側挪回人側,同時不佔用任何模型回合。如果你習慣先列清單再派活,這是目前最貼近這個習慣的做法。