dsh-git-guard
Git-aware write guard plugin for DeepSeek Harness: blocks whole-file writes that would overwrite the user's uncommitted changes, and reports what happened to protected files at turn end
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:bibibala/dsh-git-guard说明文档
阅读完整 README ↗dsh-git-guard
为 DeepSeek Harness 打造的 git 感知写入守护插件。它阻止 agent 静默破坏用户的未提交工作:每个回合开始时,它会快照会话工作区所在仓库中所有带未提交改动的文件(暂存、未暂存或未跟踪)并保存备份;针对此类文件的整文件替换工具调用(默认为 write 工具)会在 tools/pre-execute 被拒绝并附带纠正性反馈;回合结束时,受保护文件会被重新校验,结果作为插件来源的通知写入会话日志。守护进程运行自己的凭据清洗 git 子进程——绝不使用模型的 shell。
安装
插件以组合包(bundle)形式分发:一个带 dsh.bundle manifest、贡献一个配置层的 npm 包。
dsh plugin --profile web add dsh-git-guard
git 安装(不经过 npm):dsh plugin --profile web add github:you/dsh-git-guard —— 首次 add 会失败,直到你在该 profile 的 pnpm-workspace.yaml 中允许包的构建脚本(allowBuilds: dsh-git-guard: true),因为 pnpm 默认拒绝运行 git 依赖的 prepare。锁定 commit(#),只授权你信任源码的包。
启动前先验证该层:
dsh --profile web --dump-config # 显示 "# == dsh-git-guard" 层
移除:dsh plugin --profile web remove dsh-git-guard。
配置
- id: git-guard
name: dsh-git-guard
config:
mode: block # block | warn | off;默认 block
includeUntracked: true # 是否保护未跟踪文件和目录
maxBackupBytes: 1048576 # 每个受保护文件的哈希/备份上限
backupRoot: ~/.dsh/git-guard/backups # 默认:harness 主目录
mode: block拒绝针对受保护文件的整文件写入,拒绝原因指明路径与修复方式(定点编辑,或先 commit/stash)。warn放行写入并附加通知。off关闭拦截但保留回合结束报告。- 配置加载时快速失败:非整数或非正数的
maxBackupBytes、相对的backupRoot、重复或空的blockTools条目都会抛出异常。
工作原理
- 受保护集合 — 在
turn/start时解析包含会话 cwd 的仓库中的git status --porcelain=v1 -z,保护所有脏路径,减去本进程内 agent 整文件写入过的文件。受保护文件在符合maxBackupBytes时被哈希并复制到backupRoot///;未跟踪目录按其前缀保护子树。 - 拦截 —
tools/pre-execute等待回合快照(回合首次工具调用不会与哈希竞争),按会话 cwd 解析目标路径并规范化符号链接,目标受保护时拒绝或警告。对未被认领文件的受守护写入会将其认领为后续回合的 agent 自有文件。 - 回合结束报告 — 重新哈希每个受保护文件,并对已跟踪文件执行
git diff --quiet HEAD:modified(仍有未提交改动)、lost(工作区等于 HEAD 或文件消失,附备份路径)、或blocked。报告作为插件来源的user/message通知追加,被记录且对模型可见,无需新增会话事件类型。git 仓库之外的会话保持不活跃。
模型体验
拒绝是命名受保护路径与修复方式的工具错误;回合结束报告是 形式上下文,单行摘要限制在 120 字符内。两者都是该 agent 的保留历史,跟在可复用请求前缀之后(仅追加,不会使既有 KV-cache 条目失效)。