前言¶
在 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 一致)。
- 写入目标落在
<受保护根>/成果区/⇒ deny,错误信息中会说明应改写到草稿区。 - 受保护根 =
roots.json里配置的根列表 ∪ 当前会话的 cwd(cwd 作兜底,避免配置丢失时完全失去保护)。 - 只检查
write、edit、str_replace_editor,其他工具不拦截。 - 配置每次调用现读;增删
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。目录与源码: