dsh-task-worktree:在 DSH 裏按任務隔離 Git worktree

前言

在 DeepSeek Harness(DSH)裏讓模型改代碼,常見做法是直接在主工作區裏動文件。多個任務並行、或希望主分支保持乾淨時,容易互相干擾,回滾和合並也費事。Qoder、Codex、Claude Code 等環境都有「每個任務單獨 checkout」的 worktree 工作流;DSH 本身是插件化宿主,社區插件可以把同類能力接進來。

下面介紹 dsh-task-worktree(維護者 epik7th),它是面向 DSH 0.2.0 宿主線 的 Git worktree 插件,fork 自 Letter2025/dsh-task-worktree,在目錄 SkillHub 中歸類爲工作流。每個任務在獨立 worktree 和分支上開發,狀態寫入 per-repo manifest,會話重啓後仍可恢復;主工作區不被自動註冊爲新 workspace,會話標題上的 branch badge 標明當前對話綁定的 worktree。

這是什麼

dsh-task-worktree 爲 DSH 提供完整的、任務粒度的 git worktree 支持:創建隔離 checkout、列出與查看狀態、把改動合併回主分支或在 worktree 分支上提交、清理目錄與分支。設計參考 Qoder 的 Worktree 執行環境、Codex 的 codex worktree create --permanent、Claude Code 的 --worktree 會話,並適配 DSH 的 session / workspace 模型。

與上游 npm 包 dsh-task-worktree@0.4.3 的關係:上游聲明的宿主 peer 與 dsh 0.2.0 不兼容,且瀏覽器端仍依賴 dsh 0.1.6 已移除的 sessions.current 字段;本 fork 提高 peer 範圍,並從主視圖 retention 推導當前會話(與 shell 一致)。工具、命令與安全模型沿用上游設計,詳見倉庫內 遷移記錄。

Worktree 物理路徑在 <repo>/.dsh-worktrees/;每個任務通常對應 worktree/<name> 形式的分支與相對路徑(名稱可含斜槓)。

核心功能

與常見產品的概念對應

本插件 Qoder Codex Claude Code
任務級隔離 checkout Worktree 執行環境 codex worktree create --permanent claude --worktree <name>
目錄 <repo>/.dsh-worktrees/ 後臺 worktree .codex/worktrees/ .claude/worktrees/
持久化註冊表 按會話 全局索引 會話綁定
每任務獨立分支 分支選擇器 — worktree-<name>
會話標記 session badge — —
合併回主分支 Move to local — 退出/清理提示
在 worktree 分支直接提交 Review & commit worktree 內提交 worktree 內提交

模型可調用的工具

交付與清理(finish / bring-back / remove)僅人類可操作,模型無法調用。

工具 作用
worktree_create {name, baseCommit?, includeUncommitted?} 創建任務 worktree;可選把主工作區未提交改動帶入
worktree_list 列出倉庫內受管理的 worktree(狀態 / 髒否 / 分支)
worktree_status {name?} 查看指定或當前會話所在 worktree 的狀態

人類命令(節選)

收尾、合併、刪除等操作通過 slash 命令完成,例如:

  • /worktree bring-back worktree/<name>:將分支合併進主分支(要求主工作區乾淨)
  • /worktree finish worktree/<name> <msg>:在 worktree 分支提交併保留
  • /worktree remove worktree/<name> --force:刪除 worktree 與分支(--force 會丟棄未提交改動)
  • /worktree list、/worktree status、/worktree prune:查看與清理(prune 也會去掉已刪除 checkout 的 stale workspace 註冊)

空白對話可在 dock 勾選 worktree 並選基準分支;等價地也可直接對模型說「用 worktree 隔離幹活,任務叫 xxx」,由模型調用 worktree_create。

安裝與啓用

在運行 Web GUI 的 profile 中,從公開 Git 倉庫安裝(包名 dsh-task-worktree):

dsh plugin --profile desktop add github:epik7th/dsh-task-worktree

插件管理器的 install 字段也可填同一地址:github:epik7th/dsh-task-worktree。執行插件需要已 compose 的 dsh.bundle patch,add 會一併接線。

環境要求(README 原文):

  • DeepSeek Harness 0.2.0-rc.1 宿主線(含 rc.2 與 0.2.0 正式版)
  • Git 2.31+
  • Node 20+

注意:不要與上游 npm 包 dsh-task-worktree@0.4.3 同時安裝;宿主按包名解析 client bundle,兩個來源解析到同一包名會被拒絕。應先卸載其一再裝另一。

當前倉庫 package.json 版本爲 0.6.4,許可證 MIT。

典型用法

從空白對話進入 worktree 模式

  1. 在尚未發送消息的空白對話裏,dock 會出現 worktree 複選框和分支選擇器。選擇器默認展示新任務 worktree 的起始分支(一般爲倉庫當前分支),可搜索本地與 remote-tracking 分支;勾選後相當於 mode-on --base <branch>,並固定爲 worktree_create 的 baseCommit。
  2. 發送第一條消息後,宿主會在你的消息前注入一條 instructions 上下文(界面顯示爲 injected-context 行),引導模型在本輪調用 worktree_create,在 worktree/ 前綴分支下創建 worktree,並在 checkout 內用絕對路徑工作;結束時提醒可用的清理命令。
  3. 底層等價於執行類似:
git worktree add -b worktree/<name> <repo>/.dsh-worktrees/worktree/worktree/<name> <base>

不會註冊新 workspace,也不會切換對話;會話標題 badge 顯示綁定的分支名。模型在 worktree 目錄內繼續改代碼。

不用 GUI,直接口述任務

對模型說明例如:「用 worktree 隔離幹活,任務叫 xxx」。模型調用 worktree_create;name 同時作爲分支名與相對路徑。

任務結束後

由人選擇其一:

  • 合併回主分支:/worktree bring-back worktree/<name>
  • 在 worktree 分支提交保留:/worktree finish worktree/<name> <msg>
  • 強制刪除:/worktree remove worktree/<name> --force

用 /worktree list 與 /worktree status 覈對狀態;長期維護可用 /worktree prune 清理陳舊項。

適用場景與注意

適合:同一倉庫上並行多個 Agent 任務、希望主工作區目錄保持不動、需要可恢復的 worktree 註冊表、習慣 Qoder/Codex/Claude Code 式「一任務一 checkout」的 DSH 用戶。

分支選擇器限制:依賴 shell 的 workspaceFiles Remote 讀取 <repo>/.git;若服務不可用,或會話所在 checkout 的 loose refs 不在 workspace 根下,選擇器會提示並回退到 HEAD。非 Git 倉庫的工作區在 ref 讀取完成後不會提供 worktree 模式。

安全與信任:插件以當前 DSH 進程權限執行 Git 與子進程操作;安裝前請自行審閱 GitHub 源碼 與 MIT 許可證。DSH 生態強調「一切皆插件」;SkillHub 等社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。

與上游並存:僅需 dsh 0.2.0 宿主線時請使用本 fork;若仍停留在上游所聲明的 ^0.1.7-rc.2 宿主 peer,應使用上游包而非本 fork。

結尾

dsh-task-worktree 把「按任務隔離的 Git worktree + 持久 manifest + 會話 badge + 人工控制的合併/提交/刪除」接到 DSH 0.2.0 上,主 sidebar 不堆 workspace,任務邊界卻清晰可追蹤。

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

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

小夜