🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI
广告☁️ 云服务器特惠阿里云首购 8 折 · 腾讯云合作特惠
DeepSeek Harness Hub
← 返回列表

nightosong/gord-dsh-worktree

DeepSeek Harnessspec-screened扫描:中风险在 GitHub 查看 ↗
⚠ 装前注意

为 DeepSeek Harness 提供 Git worktree 管理:把并行开发

基本兼容但装前注意:未发布到 npm registry,仅可从源码安装 · 最近上游提交 2026/9/24 · 已提供中文文档

DeepSeek Harness 的 Git worktree:五个 agent 工具(list、create、inspect、remove、prune),以及 New Session 行中的工作位置选择器和设置面板。拒绝移除有未提交或未跟踪更改的 worktree,并且从不移除主 worktree。

综合分
31.4
GitHub 分
31.4
用户评分
—
★ Stars
2
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add nightosong/gord-dsh-worktree
未发布到 npm registry,仅可从源码安装,改用 GitHub 源安装
信任档位:已验证本站已于 2 天前真实安装成功(L4 · 真实安装)
是什么
dsh 原生插件 · browser
装得上吗
本站已真实安装成功(L4 · 真实安装,非静态推断)
安全吗
本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
还在维护吗
活跃:最近一次提交在 1 天前

档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →

🟢实装验证通过· 2026/9/23
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/25(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查⚠ 装前注意

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包gord-dsh-worktree(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

未发布到 npm registry,仅可从源码安装

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/22 15:31:50

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-settings@deepseek-ai/dsh-tools@deepseek-ai/schemastery
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

由 DeepSeek 最新模型翻译生成
gord-dsh-worktree

为 DeepSeek Harness 提供 Git worktree 管理:把并行开发
放进各自独立的目录与分支。

English

功能

1. 创建工作树 —— 一条原子命令同时建好隔离检出与分支;Agent(worktree_list、worktree_create、
worktree_status、worktree_remove、worktree_prune)和 设置 → 工作树 都能建。
2. 在 worktree 中开会话 —— 新会话行带工作位置选择器:留在当前工作树,或新建一个并直接在其中开会话。
3. 查看改动 diff —— 右侧边栏的 变更 标签页显示本会话所在目录的未提交改动:每个改动文件及其增删
行数,以及选中文件的补丁。
4. 管理归档会话 —— 设置 → 工作树 列出本机所有已归档的会话,每行可 取消归档 或单独删除,整体可
全部删除。
5. 双击重命名 —— 直接双击侧栏的会话行重命名,不用走菜单。

新会话行上的工作树选择器,展开态:当前工作树与新建工作树

会话运行在 worktree 中,新会话行显示工作位置选择器

工作树设置页:仓库、新建表单、带操作的工作树列表,以及归档的会话卡片

安装

dsh plugin --profile web add github:nightosong/gord-dsh-worktree

然后重启 dsh web(bundle 进入层栈后重新加载即可),打开 设置 → 工作树。无需手工编辑任何 profile
文件:包内声明了 dsh.bundle.patch,CLI 会自己把它加入 bundle 堆栈。

需要 dsh 0.1.5-rc.1 或更新版本。

详细说明

在侧栏里看改动

右侧边栏的 变更 标签页显示本会话所在目录的未提交改动:与 HEAD 不同的每个文件、状态与增删行数,
以及选中文件的补丁(含两侧行号栏)。它是工作区对 HEAD 的差异——暂存与未暂存一起——而不是会话
自己的编辑,因为提交前要审的是磁盘上的内容,无论它是谁写的:Agent 的文件编辑、格式化工具,还是你另
一个窗口里的编辑器。会话自己的编辑已经在对话里内联显示,来自工具自身的上报。

对它来说 worktree 就是一个普通仓库。标签页向宿主询问的是会话所在的目录,所以会话进入 worktree 后
它会自动跟随,不需要任何额外告知。

变更标签页:六个改动文件及其状态与行数,以及选中文件的补丁

它通过内置文件树与文档预览所用的同一个 sidebarRightTabs 注册表注册,两个插槽(面板与标签标题)都
在子 scope 里注入,因此没有组合右侧边栏的 profile 只是少一个标签页,而不会让整个插件 apply 失败。
在右侧边栏的起始页里打开它,它和 工作区文件 并列。

归档

DSH 归档一个会话,就是往工作区注册表的某一个数组里塞一个 id,而它没有留回头的路:远端契约里只有
一个归档方法、别无其他,CLI 完全不碰它,也没有任何界面列出归档了什么——整个客户端只带一条归档相
关的文案,就是执行归档的那个菜单项。会话一旦被归档,就从所有分组界面消失,既没有记录可查,也没有
控件可撤销。

设置 → 工作树 现在以一张 归档的会话 卡片收尾,列出本机所有已归档的会话,最近的归档在前:标题、
所在项目、创建时间、归档时间,以及日志在磁盘上占多大。每行带 取消归档,卡片右上角带 全部删除。

取消归档走的是注册表自己的串行操作队列与它的 setState——也就是 archiveSession 自己用的那一对——
所以改动既是持久的,又立刻上屏:侧栏把会话放回原来的位置,不用重启。归档本来就只是把它藏起来,
没有移动或删除任何东西。

全部删除 是本插件里唯一不可逆的控件。它会删掉所列出每个会话的日志目录、缓存投影与工作区归属,
并且藏在一条报出数量的确认之后。每行还有一个同样的删除图标,对应「只误归档了一条」这个远更常见的
情形。两者回传的都是自己列出过的那些确切 id,而不是一个「删掉一切」的开关,因此在列出与点击之间才被
归档的会话不会被顺手带走。仍在运行的会话会被跳过并如实上报,而不是把日志从一个正在跑的 agent 底下抽走。

删除唯一保留的就是归档条目本身。核心「不要显示这个会话」的开关只有归档集合——sessionVisible
每次渲染都查它——而核心完全无法表达「这个会话已经没了」。一个日志已删、却不再归档的 id 会掉出它所属
的工作区,落进浏览器的 未分组 桶里,变成一个空分组,直到刷新页面才消失。保留条目正是让会话立刻、且
在每次刷新后都保持隐藏的原因;而插件自己的列表会把这些 id 排除,因为已经没有东西可列了。

每行只显示一个时间,就是该会话的最后一次写入——在量大小的同一次目录扫描里,取日志目录中最新的
mtime。这才是「这个东西最后一次用是什么时候」的诚实答案,而一份归档列表真正会被问的就是这个问题。投影
本来能给出 lastPromptAt,那也是侧栏自己排序用的字段,但只有投影缓存里有行的会话才有它,冷读其余的
每个会话都要读整份日志——所以创建之后从未再写入的会话回退显示自己的创建时间,而这也就是一行会显示
创建时间的唯一情况。

归档时间同样不是 DSH 能给的东西:归档集合就是一个裸 id 数组,哪儿都没有时间戳。插件从加载那一刻
起自己记,记在 $DSH_HOME/gord-dsh-worktree/archived-at.json,并用它把列表按「最近归档在前」排序。
它不显示在行上是有意的:那是插件自己的记账,不是会话本身的事实,而一行一个时间比三个时间好读得多。

侧栏补丁:嵌套与双击重命名

侧栏有两件本该做而没做的事:把 worktree 的会话显示在它切出来的项目之下,以及双击会话行即可重命名。
两件都由本仓库打补丁进 DSH:

npm run patch:sidebar     # 之后重启 dsh web
npm run unpatch:sidebar   # 还原出厂 bundle

嵌套只改一个函数 groupByWorkspace——侧栏分组的全部逻辑——让 worktree 的会话折进项目分组,
worktree 不再是独立分组。父级由两条规则决定:目录位于另一个工作区之内的,以及插件为放在项目之外
的 worktree 发布的父级映射(后者正是默认情形,$DSH_HOME/worktree/)。映射从 localStorage
读取,因为重新加载后的第一次渲染就需要答案,走 fetch 来不及。

双击重命名只给会话行加一个 prop,调用的正是该行自带菜单已经在调的那个 handler——因此弹窗、校验和
报错文案都是核心的,而不是第二份副本。空白会话被跳过,与该菜单一致(它对空白会话隐藏全部操作):空白
会话还没有标题可改(弹窗会以空输入框打开),而第一条消息之后会重新命名它,改了也会被覆盖。

之所以用补丁而不是插件:客户端插件只能靠接管整个 sidebar.workspaces 插槽来实现嵌套,而该插槽是
single 的,拥有分区标题、搜索框、每一行会话以及全部工作区对话框——14 个组件,还带拖拽排序、重命名、
归档与分叉。接管它意味着把它们全部重写,并在每个版本上与核心漂移。而分组函数只有十几行,重命名钩子
只有一个 prop。

DSH 升级会覆盖该文件,升级后请重跑 npm run patch:sidebar。 脚本是幂等的,第一次打补丁前会把出厂
bundle 存为 client.js.orig;若代码不是它预期的形状就拒绝动手,而不是硬套。每个补丁带自己的标记,因此
已经打过其中一个的安装仍能拿到另一个;且只有当一个补丁需要的全部替换点都找到时才会写入。
npm run patch:sidebar -- --check 会逐个补丁打印一行,全部已打才返回 0。

从 dsh-worktree 改名而来

现在的包名、模块 id、HTTP 路由与设置命名空间统一为 gord-dsh-worktree。若你装的是旧名字:

dsh plugin --profile web remove dsh-worktree
dsh plugin --profile web add github:nightosong/gord-dsh-worktree

工具

| 工具 | 作用 |
| ---- | ---- |
| worktree_list | 列出仓库全部 worktree:路径、分支、HEAD,以及当前/游离/锁定/失效状态。 |
| worktree_create | 一条命令同时建目录与分支;分支已存在时改为检出,不重复创建。 |
| worktree_status | 单个 worktree 的分支、上游信息与改动文件。 |
| worktree_remove | 删除 worktree。存在未提交或未跟踪改动时默认拒绝,显式 force 才会丢弃。 |
| worktree_prune | 清理目录已被删除的 worktree 记录,不删除任何文件。 |

五个工具默认以会话目录作为仓库,也可用 workdir(或 repo)指定其它仓库。

安全约定

- 主工作树永远不可删除。
- 有改动时不会删除——且「有改动」包含未跟踪文件,因为 worktree remove --force 会一并删掉它们。
- 已锁定的 worktree 只做提示,不会静默解锁。
- 分支名交给 git check-ref-format 校验;所有路径都以位置参数传给 git,不经过 shell,名称无法变成参数。
- 面板使用的 HTTP 接口会在本机执行 git,因此写操作只接受同源与本机调用,它不是对外 API。
- 删除归档会话是唯一与 git 无关、也是唯一不可撤销的破坏性操作。它藏在一次明确确认之后,只删掉被明确
交来的那些 id,并且拒绝碰仍在运行的会话。

配置

| 字段 | 默认值 | 含义 |
| ---- | ------ | ---- |
| defaultParent | 空 | 新建 worktree 的父目录。留空用 $DSH_HOME/worktree/。 |

开发

插件是纯 ESM,没有构建步骤:lib/index.js 是 Host 半区,lib/client.js 是浏览器端 bundle(经
window.__ModuleLoader__ 加载),lib/service.js 与 lib/worktree.js 放两端共用的 git 逻辑。

把本地检出作为实时依赖装进某个 profile
dsh plugin --profile web add /absolute/path/to/gord-dsh-worktree

按路径安装的检出会从自身目录解析 Node 依赖,而 DSH 的包从 profile 解析,因此 Host 半区看不到
@deepseek-ai/dsh-tools,除非检出自己能找到它们。在本地检出里一次性链接(已被 gitignore):

mkdir -p node_modules/@deepseek-ai
SRC=$(dirname "$(readlink -f "$(which dsh)")")/../node_modules/@deepseek-ai
for p in schemastery dsh-tools dsh-settings cordis; do
ln -sfn "$SRC/$p" "node_modules/@deepseek-ai/$p"
done

从 GitHub 或 npm 装进 profile 则不需要这一步:那时 peer 依赖经由 profile 自己的 node_modules
解析,和其它插件完全一致。

Host 半区作为 bundle 层挂载,改动需要重启 dsh web;客户端改动随 GUI 的模块重载生效。

npm test 会跑两个冒烟测试:Host 侧针对一个临时 git 仓库,客户端侧针对一个极简 React 运行时,
无需安装任何测试框架。

许可证

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入社群

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

DPharness QQ 群二维码,QQ 扫码进群
QQ 扫码进群
DPharness 飞书群二维码,飞书扫码进群
飞书扫码进群