dsh-diff-review:在落盘前审查模型对文件的改动

前言

在 DeepSeek Harness(DSH)里让模型改文件,常见流程是:模型调用 write / edit 或 pwsh 里的写入、删除命令,改动直接落盘,你只能从对话里事后翻 diff,发现不对再手动回滚。错误一旦写入,回滚成本取决于你是否开了版本控制、文件是否已被后续步骤覆盖。

dsh-diff-review 把审查关口前移到动手之前:模型要写、改、删文件时先暂停,右侧边栏展示原文与新文的对比,你点「接受」才真正落盘;点「拒绝」则文件一个字节都不动,模型会收到拒绝原因。下面介绍这个插件的定位、能力、安装与配置。

这是什么

DeepSeek Harness 插件;自述为零运行时依赖,不改宿主任何内置插件。插件以当前 DSH 进程的权限运行,安装前宜自行核对源码与许可证。

核心功能

写入前闸门

拦截发生在落盘之前,而不是写完再回滚:

模型:我要把 greet.js 的第 4 行换掉
插件:↓ 暂停,不落盘
      右侧边栏显示 —— 第 4 行红底删除、第 4~5 行绿底新增
      改动到的字符再加一层深色高亮
你:  [接受]  → 才真的写进去
      [拒绝]  → 文件未动,模型收到拒绝原因

审查界面

  1. 改动视图(默认):统一 diff,左右两列行号,+ / - 标记,未改动处可折叠;被改写的行除整行底色外,变动字符另有更深底色。
  2. 全文视图:原文与新文左右并排,行号与文件一致;拖滚一侧时另一侧行、列同步;大段替换时删行与增行在各自栏内对齐。
  3. 命令级审查:当命令要碰的路径或内容只能由 shell 运行时才知道时,面板展示完整命令行,并说明为何无法算出 diff。
  4. 删除级审查:对 Remove-Item、rm、[IO.File]::Delete 等删除类命令,逐行标红列出将被删掉的原文,并附带原始命令行。

顶栏含操作徽章(新增 / 修改 / 删除 / 命令)、文件名与目录、+N -N、视图切换、拒绝与接受。多条待审项在左侧列表纵向排列,可逐条决定。

拦什么、不拦什么

操作 是否拦截 面板表现
write 新建 / 覆盖 拦 新增或修改,全文 +N -N
edit 改文件 拦 统一 diff 或全文双栏
pwsh 中删除、覆盖类命令 拦 命令原文 + diff(能确定时)
read / glob / grep 等只读 不拦 —

对 pwsh 的识别不按固定命令名单,而按「可能改写文件」的形状(PowerShell 动词-名词、.NET 文件 API、把代码交给外部解释器、原地改文件的外部工具等)。脚本块内的删除同样会被审查。只读管道、git status / git diff 等放行。

什么不会拦(在配置默认的前提下):只读工具;系统临时目录;工作区下整个 .dsh/;插件自身源码(避免自锁)。除此之外,落盘前一般会先询问。

「全部允许」

本对话内可一键放行后续写入类操作,直到再次关闭(重启 DSH 会恢复询问)。放行时顺带接受当前屏上那一条。即使开启全部允许,文件被删除、改名、移走仍会弹窗;写出临时文件再删掉这类「本来就不存在的文件」整条命令可直接过。

安全阀与边界

无人可审批时不能把 agent 卡死:侧边栏未打开、页面已关闭、审查超时(默认 5 分钟未答复)等情形会放行。二进制或超大文件读不出 UTF-8 时降级为仅统计,不假装能 diff。运行期才确定内容的单文件写入,在看不见字节时会直接放行;删除、多目标、iex / node -e 等仍会询问。

审查按对话隔离:待审队列在进程内共享,但每个标签页只处理自己会话的改动,服务端按 sessionId 校验。

安装与启用

兼容的 DSH 版本见 engines.dsh:>=0.2.1-rc.1 <0.3.0-0(整个 0.2.x)。不匹配时插件会拒绝加载。

官方安装命令(来自 README):

dsh plugin add https://github.com/wyk4447/dsh-diff-review.git
# 或简写
dsh plugin add github:wyk4447/dsh-diff-review

装完后在 profile 的 package.json 里体现版本或仓库形态,与其它插件一致。改插件代码后需重装一次。Fork 自用请将命令中的 wyk4447 换成自己的用户名。

配置

在 ~/.dsh/profiles/<profile>/cordis.patch.yml 中为对应条目增加 config:(键均可省略,缺省如下):

- id: diff-review
  name: dsh-diff-review
  config:
    files: true          # 拦 write/edit
    shell: true          # 拦 pwsh 里的破坏性命令
    skipTemp: true       # 跳过系统临时目录
    skipScratch: true    # 跳过工作区 .dsh 整个目录
    skipSelf: true       # 跳过插件自身(强烈建议保持 true)
    trace: true          # 写诊断日志到 ~/.dsh/logs/diff-review.log
    timeoutMs: 300000    # 文件审查超时(毫秒)
    shellTimeoutMs: 120000

类型不符的键会被忽略;插件自述零依赖、不做强制校验。

典型用法

  1. 安装插件并重启 DSH,在右侧边栏打开 diff 审查面板。
  2. 在对话中让模型修改工作区文件;弹出审查时切换「改动视图」或「全文视图」核对 diff。
  3. 确认无误点「接受」;若模型路径或改动不符合预期,点「拒绝」并可在后续消息中说明原因。
  4. 若本对话内信任模型批量改代码,可开「全部允许」,仍在删除、重命名等操作上保持拦截。

仓库提供离线自测(不连 GUI、不写真文件):

node test\gate.test.mjs
node test\render.test.cjs

适用场景与注意

适合谁:希望在 DSH 里保留「人机共管写盘」的团队或个人;尤其担心模型误删文件、误覆盖未提交改动、或通过 pwsh 绕道改盘的场景。分类落在 admin-security,侧重写操作审批而非事后审计。

注意:

  • 插件与 DSH 同进程权限;拒绝只保证「未接受前不落盘」,不能替代操作系统级权限隔离。
  • 社区插件目录(如 skillhub.cn)为独立站点,与 DeepSeek / 幻方无官方从属关系;安装来源以 GitHub 仓库为准,安装前请自行审阅源码。
  • 本地软链开发时,在 profile package.json 的 dependencies 与 dsh.profile.bundles 中引用 link: 路径,改 lib/*.js 需重启 DSH。

卸载

  1. 删除 cordis.patch.yml 里 - id: diff-review 段(若手动添加过)。
  2. 从 profile package.json 的 dsh.profile.bundles 与 dependencies 中移除。
  3. 重启 DSH。

自述未关闭任何内置插件,卸载不留 disabled 副作用。

结尾

dsh-diff-review 把文件改动的确认从「事后翻对话」变成「落盘前看 diff」:支持 write / edit 与可解析的 pwsh 写删命令,并提供命令级、删除级降级展示。若你正在用 DSH 0.2.x 且希望默认多一道写盘闸门,可按上文命令安装,并在 cordis.patch.yml 中按需调整 files、shell 与超时。

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

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

Xiaoye