中文EN

dsh-worktree-space

git已测通过npmMIT

Worktree Space:将一个可包含多个 Git 仓库的工作区任务放进独立的任务空间目录——参与的每个仓库使用同一个任务分支各开一个 worktree;空间自动注册为 DSH 工作区,会话直接在其中开工,多个任务并行推进、互不干扰。收尾时可合并回各仓库目标分支、移除 worktree,并把 Git 未跟踪的文件归档到指定目录;结束任务时可选把未提交的变更和合并冲突交给 agent 处理。

下载量 / Downloads
3,532
依赖体积 / node_modules
10.55 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

安装

dsh plugin --profile web add dsh-worktree-space

沙箱测试结果

阶段结果
1 安装✓
2 列装✓
3 挂载✓
4 启动—

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

<a id="chinese"></a>

Worktree Space

简体中文 · [English](#english) · [更新日志](docs/CHANGELOG.md)

Worktree Space:一任务一空间,工作多路并行。把一个涉及一个或多个 Git 仓库的工作任务放进独立的任务空间目录——参与的每个仓库都在同一个任务分支上各开一个 worktree;任务空间自动注册为 DSH 工作区,会话直接在任务空间里开工;多个任务各建一个任务空间并行推进、互不干扰。建空间时可以定下这个任务要不要部署验收,勾了它,一条通过的冒烟记录就是收尾合并的闸门。任务结束时把任务分支合并回目标分支、移除 worktree,并把空间里遗留的文档归档到指定目录;也可以把未处理的提交和合并冲突交给一个 agent 会话处理。

两条路各有侧重,可以只看其中一条:在面板上手动点完全程([使用](#-使用)),或者让 Agent 用工具自动编排([进阶用法](#-进阶用法让-agent-全自动编排))。完整步骤、异常流程与错误码都在 [《Worktree Space 使用指南》](USAGE.md)。

![dshfind](https://dshfind.com/zh/plugins/kangtsang/dsh-worktree-space?ref=badge)

<img src="docs/img/isolation-model.png" alt="Worktree Space隔离模型" width="960">

<img src="docs/img/user-story-flow.png" alt="Worktree Space使用流程" width="960">

📺 视频介绍:Worktree Space 插件介绍(B 站)

📑 目录

  • [🚀 安装](#-安装)
  • [🔧 环境要求](#-环境要求)
  • [⚡ 快速开始](#-快速开始)
  • [✨ 功能](#-功能)
  • [📂 任务目录结构](#-任务目录结构)
  • [🛠️ 使用](#-使用) 面板手动流程:[➕ 创建](#-创建-worktree-space) · [🗂️ 管理](#-管理-worktree-space) · [🚢 部署验收](#-部署验收) · [🏁 结束](#-结束-worktree-space)([组合行为](#各选项组合的行为))
  • [🤖 进阶用法:让 Agent 全自动编排](#-进阶用法让-agent-全自动编排)
  • [🤖 把提交与冲突交给 agent](#-把提交与冲突交给-agent)
  • [⚙️ 插件配置](#-插件配置)
  • [🔐 权限与失败边界](#-权限与失败边界)
  • [📝 操作日志](#-操作日志)
  • [📄 配套文档](#-配套文档)

🚀 安装

网页端,从命令行安装:

dsh plugin --profile web add dsh-worktree-space

卸载:dsh plugin --profile web remove dsh-worktree-space;更新时先卸载再重新安装。

桌面端在插件管理页里操作:侧边栏 → 插件,在「插件包名」填 dsh-worktree-space,点「安装」;

卸载时在插件列表里点开 Worktree Space,进「插件详情」页,右上方点「卸载」按钮。

🔧 环境要求

  • Node.js >=22.19.0
  • Git:所有 worktree 与分支操作都由它执行,不随插件分发,需在 PATH 上
  • DSH >=0.2.0-rc.1 <0.3.0-0,即 0.2.x(下界自 0.2.0-rc.1 起,不含 0.3.0 线的预发布)
  • 客户端:网页端与桌面端均可用;桌面端由人工验证,命令行矩阵未覆盖

五个官方版本逐个实测通过:0.2.0-rc.1、0.2.0-rc.2、0.2.1-rc.1、0.2.1-rc.2、0.2.1-rc.3,

每个版本都用该版本自己的 DSH CLI 在一次性 profile 里跑通了安装、启动、卸载、回滚。这套验证覆盖的是

命令行与网页端的路径;桌面端(Electron)只做了人工安装可用性确认,未纳入脚本矩阵。逐条记录见

[docs/store-evidence.md](docs/store-evidence.md)。

DSH 会强制校验清单里 peerDependencies 声明的 DSH 版本范围:运行时的版本不满足,就在安装前或启动时

拒绝加载,并给出 dsh plugin allow-version 的精确豁免命令。engines.dsh 之类的字段只是声明,不会阻止加载。

实测范围之外的版本一律按未知处理,不拿宽泛范围冒充证据;遇到版本相关的问题请到

Issues 反馈。

⚡ 快速开始

一次完整任务的最短路径:在仓库工作区里与 Agent 确认需求,由它在任务空间内完成修改,

你验收后合并回各仓库当前检出的分支。全程无需手动执行 git 命令。

第一步:在仓库工作区与 Agent 理清需求

先在本仓库的工作区会话中说明任务范围:涉及哪些仓库、要达到什么效果、以什么标准判定完成。

这一步必须早于任何 git 操作——需求未定时创建任务空间,中途变更方向意味着已建的 worktree

与已产生的提交都要重来。

需求明确后,Agent 会逐项确认任务空间的位置、参与的仓库、起点分支以及是否启用部署验收。

其中是否部署验收在创建任务空间时即固定,事后无法追加或更改,须在此步一并确定。

第二步:发送提示词,创建任务空间并派单

需求确定后,向该会话发送:

创建一个任务空间并派单,将已确定好的需求通过 worktree 方式检出并执行修改实现;
修改完成后通知我验收,验收通过后再合并。

Agent 据此创建任务空间——每个参与仓库一份 worktree,共用一条任务分支——并开启一个任务会话,

把需求作为任务书交付。任务会话在独立目录中修改代码,不影响各仓库当前的检出。

第三步:验收后提交合并

任务会话完成修改后通知你。先验收:在所给 worktree 中确认实现是否符合需求、测试是否通过。

验收通过后,回到派单的会话发送:

现在验收通过,请合并到各仓库当前检出分支,并删除任务空间。

Agent 执行合并、移除 worktree、归档遗留内容,并按需删除分支。若某个仓库停在冲突或未提交的改动上,

它不会强制继续,而是指出受阻的仓库,待对应会话处理后再合并。

✨ 功能

  • 从会话里建任务空间。 勾选要参与的仓库(默认全选)、给任务起名、定分支前缀、指定任务空间放哪。

每个参与的仓库都会得到一份位于 <分支前缀><任务名> 的 worktree(前缀默认 task/)。起点默认是各仓库

当前的 HEAD;面板另有一个下拉,列出所有已勾选仓库共有的分支,没有单独指定起点的仓库都从这里开始,

而每张卡片也可以只给那一个仓库另选起点。走工具调用时,baseRef / baseRefs 接受任意 ref(含提交)。

  • 唯一一项交付选择:这个任务要不要部署验收。 任务信息最后就是一个勾选框 —— 部署到 Docker,

勾上后会多出一个 部署脚本 输入框(留空则用 工作区/.worktree-space/deploy/deploy.sh)。

它之所以在建的时候就问,是因为交付策略只在创建时落一次,事后没有入口能加、能改:没勾等于定了

「这个任务不做验收」,之后也不会有任何东西再提起这件事。反过来,勾了却找不到可用的入口脚本时

创建会被直接拒绝,而不是留一个永远部署不起来的任务空间。

其余收尾时的决定 —— 合到哪条分支、要不要删分支、冲突怎么办、遗留文档怎么处理 —— 都不在这里预定,

留给结束任务那一刻当场决定。

  • 部署验收(勾了才有)。任务空间自带一个部署根:源码根的 .worktree-space/deploy/ 会被复制进来,

入口脚本提供 up(起环境、写验收地址)与 smoke(跑冒烟、把结果写进 .state.json)。

每个任务的环境身份互不相同,任务之间不会互相顶掉。合并之前有一道闸门:<部署根>/.state.json

里没有一条 result: "pass" 的 lastSmoke,合并就被拒;面板会问「冒烟还没过,仍要结束吗?」,

这份豁免只有人能给。

  • 注册成工作区,名字是 <上级>/<任务名>,同时开一个会话,工作目录就是这个任务空间 —— 在任务空间里

改代码,不会动到源码检出。

  • 管理页面,分三个视图(入口见「管理 Worktree Space」一节):
  • 工作区视图:哪些工作区可以建任务空间,以及每个工作区里有几个仓库;
  • Git 仓库视图:扫到的每个 Git 仓库,以及它链接的 worktree;
  • 任务空间视图:把每个任务下面的仓库列在一起(分支、改动数、是否被锁定、是否可清理),

任务行下面就是它的部署卡片。

  • 给任务补仓库:任务进行到一半才发现少一个仓库时,在任务行上点「添加仓库」—— 候选就是 Git 仓库视图里

那一列,任务已经有的不会重复列出;也可以直接填一个仓库目录,它会注册成工作区,因此同样进入 Git 仓库视图。

新仓库在任务现有分支上开 worktree,起点默认各仓库当前的 HEAD,也可指定分支或提交。新仓库可以位于不同目录

甚至不同磁盘;只有在把提交交给 agent 时才可能需要批准提权(见使用指南)。本版本不支持从任务里移除仓库。

  • 结束任务:在任务行上点「结束任务」,默认把各仓库的分支合并回它的目标分支、删掉 worktree、把任务

空间里的文档归档到选定的目录,最后注销这个工作区;任务空间里还有会话在干活时先拒绝。合并往哪儿做、

冲突怎么办,见「结束 Worktree Space」。

  • 新建任务空间与结束任务空间也在工作区列表自己的 ⋯ 菜单里 —— 前者只对包含代码仓库的工作区显示,

后者只对确属任务空间的目录显示,点开的就是同一个对话框。

  • 界面跟随 DSH 的语言设置,管理页、对话框、配置项与错误提示均有中英文。

勾了「部署到 Docker」的任务另有一层前提:这台机器上要有可用的容器引擎,见[部署验收](#-部署验收)。

📂 任务目录结构

术语:Worktree Space 容器(下称容器)=插件存放任务空间的专用目录,也就是容器根目录
worktree-space/。下文每段第一次提到容器时写全称,同段之后用简称。
容器根是容器根目录的简称,指同一个目录:既指那个目录本身(区域),也指设置项里要填的路径(路径)。
~/workspace/                           根工作空间:项目都挂在这一层,也存放 Worktree Space 容器根目录
├── repo-x/                            项目 x 的主工作区(本身就是仓库)
├── project1/                          项目 1 的主工作区(下面若干仓库)
│   ├── repo-a/
│   └── repo-b/
├── deep-path/project2/                项目 2 的主工作区,目录位置埋得更深
│   ├── repo-c/
│   └── repo-d/
└── worktree-space/                    容器根目录:插件专用区
    ├── repo-x/                        项目层,名字就是源工作区目录名
    │   └── task-x/                    任务空间 —— 同时是会话的工作目录
    │       ├── .worktree-space/       插件专属目录:插件自己的东西全在这里
    │       │   ├── worktree-space.json  任务的记录:分支、起点、项目、仓库、部署策略与创建时间
    │       │   ├── worktree-space.md    由上面的记录渲染出来,给人读的分支、起点与约定
    │       │   └── deploy/              部署根:源码根 .worktree-space/deploy/ 的副本,.state.json 在这里
    │       └── repo-x/                位于 <分支前缀>task

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:23,最后更新 2026-11-03

链接

GitHub · Homepage · npm

同类插件