dsh-todo-editor:清單由你寫,模型照着執行

前言

在 DSH 裏做長任務,常見的協作方式是「模型出計劃、人在上面看進度」。這個模式有兩個具體問題。

一是計劃永遠由模型擬定。Harness 自帶的任務面板是隻讀的,數據來自會話投影 todos,你只能看,不能改。二是新會話里根本沒有入口:todos 投影爲空時,那個組件直接 return null,模型寫下第一條任務之前,面板壓根不存在。

lmk2215/dsh-todo-editor 就是衝着這兩點來的。它把方向反過來——你下清單,模型執行。

這是什麼

一個給 DeepSeek Harness 客戶端裝的可編輯任務流程面板,維護者 lmk2215,package.json 版本 0.1.0,許可證 MIT,社區目錄裏歸在「工作流」分類。

它做的事:把清單入口掛到會話頭部,你在裏面寫節點、改狀態,點保存後直接把清單寫進會話,輸入框上方的原生任務面板立刻更新——不產生用戶消息,不走模型回合,不消耗 token。之後你正常發材料,模型按清單逐個節點執行。

核心功能

以下能力均來自 README。

  • 頭部按鈕加未完成數量角標,空列表也能打開(入口常駐在 conversation.session.header.actions slot)。
  • 逐行改文字、+ 追加、× 刪除。
  • 點狀態標籤在「待處理 → 進行中 → 已完成」之間循環,同時只允許一個進行中,與宿主默認策略一致。
  • 保存走宿主命令 /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 就是普通目錄,本地包可以手工鏈進去。

  1. 把倉庫放到固定位置,例如 ~/.dsh/local-plugins/dsh-todo-editor。

  2. 鏈接進 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
  1. 在 ~/.dsh/profiles/desktop/package.json 裏登記:dsh.profile.bundles 追加 "dsh-todo-editor";dependencies 追加 "dsh-todo-editor": "link:<本倉庫絕對路徑>"。

  2. 重啓 Harness。注意刷新頁面不夠——客戶端 bundle 在宿主啓動時快照。

上面這一整套也有腳本:

node scripts/install.mjs            # 安裝 / 修復
node scripts/install.mjs --revert   # 卸載

默認值和你的目錄結構不匹配時,用 --profile <dir> 或 --dsh <app/dsh 目錄> 指定。卸載命令會一併撤銷 profile 裏的鏈接、package.json 的兩處登記和宿主補丁(從 .bak-todoeditor-* 備份還原),之後同樣需要重啓。

典型用法

  1. 點會話頭部的清單圖標。
  2. 寫節點,點狀態標籤切狀態。
  3. 點保存——輸入框上方的任務面板立刻變成你這份清單。
  4. 把材料發出去,模型按清單逐個節點執行並更新狀態。

按鈕角標顯示還有多少條未完成。

可選:配套宿主補丁

@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。

結尾

它的價值很具體:把「計劃由誰定」這個問題從模型側挪回人側,同時不佔用任何模型回合。如果你習慣先列清單再派活,這是目前最貼近這個習慣的做法。

目錄頁:https://www.skillhub.cn/plugins/lmk2215/dsh-todo-editor

代碼與文檔:https://github.com/lmk2215/dsh-todo-editor

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜