dsh-parallel-worktree: Git Multi-branch Parallel Development with DSH

前言

在 DeepSeek Harness(DSH)里用 Agent 改代码,常见做法是同一仓库上开多个任务:一个会话做功能 A,另一个做 Bugfix B。Git 本身支持 git worktree,DSH 也内置 create_worktree,但内置能力通常只完成「建一个检出」——检出路径、注册信息、环境文件、未提交改动如何带进新目录、以及合并后如何清理,仍要人工记步骤、手工维护。

下面介绍的 dsh-parallel-worktree(维护者 wang-yi-bit64)是社区「工作流」类插件,在 DSH 上补一层工程化:注册表、目录布局约定、环境引导,以及同步、合并、清理的闭环;同时提供 /worktree 斜杠命令、模型工具(worktree_create、worktree_list 等)和会话 composer dock 里的只读面板。插件在 SkillHub 目录 可检索;源码与文档在 GitHub(MIT 许可证,Node >= 20)。

这是什么

一句话:给 DSH 加上「多分支并行开发」——为每个任务开一个独立的 git worktree,让多个 Agent 或多个终端在同一仓库上并行工作,互不污染主工作区。

它与内置 create_worktree 的分工是:内置工具负责建检出;本插件负责注册表(registry.json)、布局(默认仓库外 <repo>.wt/,或可选仓库内 .worktrees/)、环境引导(可选携带未提交改动、复制 .env、junction/symlink 复用 node_modules),以及 list / sync / merge / remove / prune 等可重复操作。写操作集中在命令与工具;UI 面板只读,避免误点丢掉未提交改动。

界面与可见性

装好插件并完全退出后重启 DSH Desktop,在 设置 → 插件 列表中会出现卡片:中文标题「并行 Worktree(多分支并行开发)」,英文为 Parallel Worktrees;文案与 icon.svg 来自包内 locale/ 与图标文件,未启用插件时列表也会显示这些信息。

会话界面在 composer dock(输入框下方)始终有一个 worktree 徽标:当前目录在受管 worktree 内时显示名字与分支;否则显示「并行 worktree」及该仓库 worktree 数量。点开弹出只读面板,数据来自 /worktree status --json 与 /worktree list --json,展示分支、路径、脏状态、相对基线的领先/落后等;面板不提供新建、删除、合并按钮。

核心功能

以下能力均来自插件 README 与包说明,可按场景选用。

创建

  • 模型工具:worktree_create
  • 命令:/worktree create <name>(可配合基线分支、携带未提交改动等选项)
  • 自动 git worktree add、建分支(默认命名如 wt/<name>)、写入注册表

布局

  • 默认:worktree 放在仓库外兄弟目录 <repo>.wt/,主仓库 git status 不被额外目录污染
  • 可选 inside:<repo>/.worktrees/,并维护 .gitignore

环境引导

  • 可选把主仓库未提交改动(binary diff + apply --3way)和未跟踪文件带进新 worktree
  • 自动复制 .env / .env.local
  • 可选 junction(Windows)或 symlink 复用 node_modules

可见性与状态

  • worktree_list 工具与 /worktree list:表格化列出分支、路径、是否存在、是否脏、HEAD、相对基线领先/落后
  • /worktree path <name>:只打印路径,便于复制

同步与收尾

  • /worktree sync:把基线合入当前 worktree(默认 rebase --autostash,可切 merge);冲突会 abort 并报 MERGE_CONFLICT
  • /worktree merge:在主仓库 merge --no-ff,可选 --remove、--delete-branch;主仓库脏或 HEAD 分离时会拒绝
  • /worktree remove(脏目录需 --force)、/worktree prune(清理目录已消失但注册表仍存在的项)

并发安全

  • 注册表写入采用 tmp + rename;跨进程使用 registry.lock;批量创建共用同一把锁

合并、删除等收尾动作在文档中说明没有对应的模型工具,需通过 /worktree 命令自行执行。

版本与发布

渠道 版本 说明
npm dsh-parallel-worktree 0.2.2(2026-11-03) latest 指向 0.2.2
GitHub Releases v0.2.2(2026-11-04) 含源码 tarball/zip

跟仓库 main 未发布提交时,资料给出的安装方式为:

dsh plugin --profile desktop add github:wang-yi-bit64/dsh-parallel-worktree

安装前请确认 dsh.profile.bundles 中包含该包名。

安装与启用

DSH 插件生效需要:包声明 dsh.bundle(本包含 cordis.patch.yml)、包名出现在 profile 的 dsh.profile.bundles、且包文件能被 DSH 从 node_modules 解析。装完后必须完全退出并重启 DSH Desktop(仅关窗口不够);profile 启动时 compose。路线 B 的 install.mjs 应在桌面退出后执行。

A. 从 npm 安装(推荐)

在 DSH:设置 → 插件 → 添加插件,输入包名 dsh-parallel-worktree 确认。插件管理器会在 profile 目录执行 pnpm add,写入 dependencies(当前精确版本 0.2.2),并登记到 dsh.profile.bundles。

命令行等价:

dsh plugin --profile desktop add dsh-parallel-worktree

若只跑了上述命令而未通过管理器登记 bundles,需手动把包名加入 <profile>/package.json:

{ "dsh": { "profile": { "bundles": ["...", "dsh-parallel-worktree"] } } }

包文件位于 <profile>/node_modules/dsh-parallel-worktree,须作为 dependencies 的真依赖,否则后续 pnpm install 可能清理掉未声明的目录。

B. 离线 / 源码目录(install.mjs)

无 npm 网络或不想让 profile 的 pnpm 工程管理该包时,在插件仓库根目录执行:

node install.mjs
node install.mjs --dry-run
node install.mjs --profile desktop

脚本将插件复制到 <DSH_HOME>/node_modules/dsh-parallel-worktree(默认 %USERPROFILE%\.dsh\node_modules\),并把 dsh-parallel-worktree 追加进 dsh.profile.bundles。资料明确说明:不要只手工往 dependencies 里加包名却不跑 pnpm,否则 lock 与目录不一致,仍可能被清理。

验证:在任意 git 仓库会话中执行 /worktree help,能看到子命令列表即注册成功。命令未出现时,可查看 <profile>/.plugin-manager/logs;常见错误包括包未解析到位、dsh.bundle 声明缺失等。

典型用法

斜杠命令上手

在主工作区或已有 worktree 的会话里:

/worktree create feature/login
/worktree list
/worktree path feature/login

create 成功后会输出分支名、磁盘路径、起点提交与 registry.json 位置;之后 cd 到该路径,或在 DSH 新建会话并将工作目录设为该路径。

让 Agent 创建 worktree

自然语言示例(可直接粘贴):

帮我为「登录页改版」开一个独立的 worktree:从 main 拉,名字用 feature/login,
并把主工作区当前未提交的改动一起带过去。之后所有改动都只在这个目录里做。

Agent 可调用:

{ "name": "feature/login", "base": "main", "carryUncommitted": true }

返回 JSON 中含 path、branch、manifestPath 等字段;会话侧再切换到 path 继续改文件(插件本身不自动改会话工作目录)。

其它文档示例(节选)

  • 新任务 + 复用 node_modules:worktree_create({ name: "feature/pay-retry", base: "release/1.8", linkNodeModules: true })
  • 查看全部 worktree 与脏状态、落后 main 多少:worktree_list({})
  • 基线更新后合入:/worktree sync(冲突时需人工处理后再继续)

完整场景说明见 GitHub README。

适用场景与注意

适合谁

  • 同一仓库上并行多个 Agent 任务或终端会话,且希望主仓库目录保持干净
  • 需要可查询的 worktree 清单、同步基线、合并后一键 remove/删分支等 repeatable 流程
  • 希望在新 worktree 里快速带上 .env、未提交改动或共享 node_modules

使用前请注意

  • 插件以当前 DSH 进程权限执行 git 与文件操作;安装前应阅读源码与 MIT 许可证,确认行为符合你的安全策略
  • merge 等写操作会改动主仓库与分支历史;执行前确认主仓库无未预期脏状态
  • SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系;星标与版本以 GitHub / npm 页面为准

结尾

dsh-parallel-worktree 把「开一个 worktree」扩展成带注册表与收尾闭环的并行开发工作流:命令、工具与 composer dock 面板读同一套数据,适合在 DSH 里长期跑多任务协作。当前 npm 与 GitHub Release 均为 0.2.2。

  • 目录页:https://www.skillhub.cn/plugins/wang-yi-bit64/dsh-parallel-worktree
  • GitHub:https://github.com/wang-yi-bit64/dsh-parallel-worktree
羽毛球分组比赛记分
小程序二维码

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

Xiaoye