前言¶
在 DeepSeek Harness(DSH)里让模型改代码,常见做法是开 git worktree 做副本、在副本里动刀,主 checkout 尽量不动。难点不在「会不会用 worktree」,而在于隔离和安全往往依赖模型自觉:写错根目录、跨副本改文件、动 .git、往 main/master 推代码,都可能在一轮工具调用里发生。
dsh-worktree-guard 是面向 DSH 的可选插件,维护者为 earneet,社区目录分类为 admin-security。它把 worktree 从「模型的自觉」收成「宿主的结构」:会话以副本为根时由沙箱锚定写隔离;无论是否绑定 worktree,一层常开的 git 安全网拦截高危操作;需要写主 checkout 时走带 TTL 的机械人闸,模型不能自授权限。
这是什么¶
一句话:Git worktree 守卫插件——会话根隔离、常开 git 层安全网、主分支授权的机械人闸。
设计文档见仓库 doc/design.md v1.1;当前 npm 包版本为 0.2.1(MIT,Node ≥20,零依赖纯 ESM,Windows 优先适配)。
核心功能¶
会话根模式¶
worktree_create 创建副本后,以副本为会话根新开 DSH 会话,沙箱自动锚定,写隔离由结构保证,而不是靠提示词约束。
常开安全网¶
未绑定 worktree 的会话不会注入 worktree 相关行为,但下列防护在安装插件后始终生效(README 表述为「是否绑定都生效」):
- 跨 worktree 写入
- 写
.git或状态区 - 向受保护分支(默认
master/main)push - 删除 worktree 分支
git -C定向到主 checkout 根
被拦截时返回 deny,并附带单轮可执行的「下一步」指引。
读域守卫¶
绑定状态下若从副本去读主 checkout:默认 warn 并打溯源标记,或在 strict 策略下 deny,避免「写对地方、改错东西」。
机械人闸¶
worktree_authorize_main、worktree_allow 经 pre-execute ask 门,需人确认,模型无法自行授权。
收尾¶
merge-base 证明式「已合并」判定、死绑定 prune、全树摘链接后再删副本(防 junction 穿透),减少 worktree 用完后留下的分支与目录债。
守卫等级与边界¶
README 对能力做了诚实分级(P6):
| 等级 | 覆盖 |
|---|---|
| 结构拒绝 | 会话根沙箱写隔离;authorize ask 门 |
| 词法启发 | pwsh 命令文本、路径归一化判域、读域守卫(短名/变量拼接等可绕——提高门槛,非硬边界) |
| 纯纪律 | danger-full-access 下的一切 |
已知边界见设计文档 §14。插件以当前 dsh 进程权限运行,安装前应自行查看源码与许可证。
安装与启用¶
插件通过 package.json 的 dsh.bundle.patch 挂载 cordis.patch.yml。发布到 npm 后,按官方 README 安装:
# 安装到 profile(CLI)
dsh plugin --profile web add dsh-worktree-guard
也可在 GUI:设置 → 插件 → 安装 bundle,填写 dsh-worktree-guard。
验证是否挂载成功(应能看到 worktree-guard 相关条目):
dsh web --dump-config
安装后的变化:未绑定会话零注入、行为与未装插件时一致;绑定后会出现 worktree_* 工具;push 主干、删 worktree 分支、写 .git 等误毁防护常开生效。
配置¶
主 checkout 根目录下的 sidecar 文件:<repo>/.dsh/worktree-guard.json。
README 列出的字段包括:protected_branches、read_policy、branch_prefix、main_write_whitelist、sync.*、TTL 等;snake_case 与 camelCase 键均可(设计文档 §13)。
注意 main_write_whitelist 为 glob 全路径匹配(例如 "docs/*"、"gen/**");仅写目录前缀且不带通配符(如 "docs/")不会命中。
典型用法¶
CLI(与原生工具同一 core)¶
node wt.mjs create fix-login --brief "修复登录"
node wt.mjs status
仓库提供 wt 命令(package.json 的 bin 指向 wt.mjs),可在不经过 DSH 会话时操作 worktree。
会话内工具¶
插件加载后,在 DSH 会话中使用 worktree_create、worktree_enter、worktree_exit、worktree_status 等工具。若命令被拦截,按 deny 消息中的下一步处理,或调用 worktree_status 查看当前绑定与策略状态。
适用场景与注意¶
适合在 DSH 里长期用 git worktree 做任务隔离、又希望 git 高危操作有统一兜底的团队或个人。谱系上融合了 opencode-worktree-isolation、zcode-worktree-guard、chuck-ma 的 opencode-worktree-guard 等思路,并按 DSH 实测契约(不可改写入参)重构为结构优先形态,详见 doc/design-review.md。
社区目录 skillhub.cn 与 GitHub 仓库由社区维护,与 DeepSeek / 幻方无官方从属关系;DSH 生态本身是「一切皆插件」,安装 bundle 前请核对来源与权限模型。
开发侧回归:node --test(决策表单测、临时仓库集成测、对抗审查回归,见 test/)。
链接¶
- 社区目录:https://www.skillhub.cn/plugins/earneet/dsh-worktree-guard
- GitHub:https://github.com/earneet/dsh-worktree-guard
经过上面的步骤,你可以在 DSH 里把 worktree 隔离写成会话结构,用常开网挡住常见 git 误操作,再在必须动主 checkout 时走人闸授权。