dsh-worktree-guard:用会话根与常开网约束 DSH 里的 Git worktree

前言

在 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 时走人闸授权。

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

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

Xiaoye