dsh-staging-guard: Making the "Results Area" Read-only with Pre-execute Hooks

前言

在 DeepSeek Harness(DSH)里跑 agent 时,工作区往往同时放着已定稿的产出和还在改的草稿。模型一旦把 write、edit 或 str_replace_editor 直接写到定稿目录,事后用 diff 或版本历史回滚成本很高。常见做法是口头在系统提示里约定「只写某子目录」,但提示无法强制执行。

dsh-staging-guard 是 mdl233 维护的 DSH 插件,分类为 admin-security。它在 tools/pre-execute 阶段拦截对上述三个工具的写入:若目标路径落在「受保护根」下的 成果区/(目录名可配置),则拒绝并提示应写入 草稿区/。定稿进入成果区只能通过宿主进程外的人工脚本放行,模型侧没有解锁入口。

这是什么

一句话:dsh-staging-guard 是 DSH 的 pre-execute 钩子,拒绝写入受保护根下的只读成果区,其余写入一律放行。

维护者:mdl233。源码与说明见 GitHub 仓库;社区目录页:SkillHub(独立站点,与 DeepSeek / 幻方无官方从属关系)。许可:MIT(package.json 版本 1.0.0)。

核心规则与行为

下面介绍钩子实际判定的几条规则(与 README 一致)。

  1. 写入目标落在 <受保护根>/成果区/ ⇒ deny,错误信息中会说明应改写到草稿区。
  2. 受保护根 = roots.json 里配置的根列表 ∪ 当前会话的 cwd(cwd 作兜底,避免配置丢失时完全失去保护)。
  3. 只检查 write、edit、str_replace_editor,其他工具不拦截。
  4. 配置每次调用现读;增删 roots.json 不必重启宿主(修改 lib/index.js 才需要重启 DSH)。

插件挂接方式见仓库内的 cordis.patch.yml,入口为 lib/index.js。

安装与启用

官方 README 给出两种安装方式,任选其一。

# 方式一:在插件仓库目录执行
node install.mjs

# 方式二:npm(若有发布)
dsh plugin add dsh-staging-guard

install.mjs 会先备份 profile/package.json 基线,再写入 dependencies 与 dsh.profile.bundles 各一行,最后执行 pnpm install。装完后若宿主不支持热加载,需要重启 DSH。回滚可用仓库中的 rollback.bat(还原 package.json 基线,不依赖 DSH / node / pnpm)。

配置

环境变量均可覆盖默认值:

变量 默认 作用
DSH_STAGING_GUARD_DIR ~/.dsh/staging-guard/ 状态目录(日志、roots.json、应急开关)
DSH_STAGING_GUARD_RESULT_DIR 成果区 只读区目录名
DSH_STAGING_GUARD_DRAFT_DIR 草稿区 草稿区目录名
DSH_PROFILE_DIR ~/.dsh/profiles/desktop 安装目标 profile

受保护根写在状态目录下的 roots.json,例如:

{ "roots": ["D:\\projects\\alpha", "E:\\projects\\beta"] }

典型用法:草稿、放行与应急

1. 日常写作路径

agent 应把变更写到各受保护根下的 草稿区/(默认目录名)。钩子不会拦成果区以外的路径。

2. 人工放行进成果区

promote.mjs 必须在宿主进程之外由人启动;插件本身没有任何放行 API。

node promote.mjs <工作区根> [--check]

脚本读取 草稿区/待定/清单.md,对每条内容用 git diff --no-index 展示差异,只有输入 y 才复制到成果区,随后归档草稿并记账。

3. 应急开关与自检

在状态目录创建 disabled 文件后,钩子立即全放行,无需重启:

# Windows 示例路径
"%USERPROFILE%\.dsh\staging-guard\disabled"

仓库还提供 emergency-allow-all.bat / emergency-restore-guard.bat。创建 throw-now 可验证「钩子抛异常 = fail-closed」:下一次写操作会故意失败;可用 clear-v2-flag.bat 清除该标记。

离线验证判定逻辑:

node test-scope.mjs

适用场景与限制

适合谁:希望把「只读真源(成果区)」和「agent 可写草稿」在工具层分开、又愿意配合人工 promote.mjs 定稿的 DSH 用户。

务必知晓:

  • 插件以当前 DSH 进程权限运行;安装前应自行审阅 lib/index.js 与 MIT 许可证。
  • 这是防手滑的软边界,不是安全边界:pwsh、脚本、git 等方式仍可写文件;钩子异常时 fail-closed(当次调用失败),但不拖垮宿主。它主要防「模型忘了规矩」,不防恶意绕过。

结尾

dsh-staging-guard 用 pre-execute 在三个写工具上守住成果区只读,把定稿权留在宿主外的 promote.mjs。目录与源码:

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

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

Xiaoye