dsh-protect-generated-files:拦截智能体对手改 lockfile 与生成代码的编辑

前言

在 DeepSeek Harness(DSH)里让智能体改代码时,常见一类「看起来改对了、下次构建或安装就翻车」的操作:直接在 pnpm-lock.yaml 里改版本号、在 user.pb.go 里修 typo、或在 Prisma 生成客户端里「纠正」类型。这些改动往往在下一次 pnpm install 或 protoc 运行时被覆盖;更糟的是 lockfile 与 package.json 不一致,排查要耗掉大半天。

单靠提示词很难稳定约束这类行为。社区插件 dsh-protect-generated-files(维护者 acus9345,分类 admin-security)在工具调用层拒绝对手写 lockfile 与生成文件的 write / edit,并拦截通过 shell 原地改文件的写法;拒绝时会给模型说明应改哪份源文件、应执行什么再生成命令。下面介绍它的判定方式、安装步骤与配置要点。

这是什么

dsh-protect-generated-files 是 DeepSeek Harness 插件:阻止智能体手改 lockfile 与生成代码,并告知如何按正确流程再生成。源码与说明见 GitHub,目录页见 SkillHub。许可证为 MIT;package.json 中当前版本为 0.2.3。DSH 生态强调「一切皆插件」;社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

拦截编辑类工具调用

插件会拒绝针对受保护路径的 write 与 edit。拒绝信息不是单纯的「不行」,而是说明文件为何不应手改,并给出替代做法。README 中的示例形如:

dsh-protect-generated-files blocked this edit to db/query.sql.go: its header says it is
generated (`// Code generated by sqlc. DO NOT EDIT.`). A hand edit will be overwritten
the next time it is regenerated, or leave it out of sync with its source.
Instead: edit the SQL queries/schema and run `sqlc generate`.

拦截 shell 原地改文件

除文件工具外,插件还会监视通过 shell 直接改写受保护文件的行为,例如 sed -i、perl -pi、> file、tee file。在 Windows 上 DSH 经 PowerShell 执行命令时,还会监视 Set-Content、Add-Content、Out-File、Tee-Object。配置项 guardShell 默认为 true,shellTools 默认包含 bash 与 pwsh。

三类「视为生成/锁定」的判定

  1. 按文件名识别 lockfile
    包括但不限于:package-lock.json、pnpm-lock.yaml、yarn.lock、bun.lock / bun.lockb、deno.lock、Cargo.lock、go.sum、poetry.lock、uv.lock、pdm.lock、Pipfile.lock、Gemfile.lock、composer.lock、mix.lock、pubspec.lock、Podfile.lock、flake.lock、gradle.lockfile、packages.lock.json、conan.lock。每种 lockfile 会附带对应包管理器的提示,例如通过 cargo add / cargo update -p <crate> 改依赖。

  2. 已知输出路径
    Protobuf 输出(如 *.pb.go、*_pb2.py)、Dart build_runner 输出、.Designer.cs、压缩产物与 source map,以及 node_modules/、__generated__/、.venv/、site-packages/ 内文件。构建输出目录(dist/、target/、.next/、vendor/ 等)仅在与项目清单(如 package.json、Cargo.toml、go.mod)同级时才计入,避免误伤名为 target 的源码目录。

  3. 文件头声明
    读取文件前 headerLines 行(默认 15 行),匹配 Code generated ... DO NOT EDIT、@generated、DO NOT EDIT、auto-generated、This file was generated、<auto-generated> 或 Generated by <tool> 等注释。若头注明可编辑(如 edit freely、safe to edit),或带条件的 DO NOT EDIT without ...,则不视为生成文件。「Generated by hand」「generated by ChatGPT」等不计入。头注释仅对已存在文件生效;按名称与路径的规则也覆盖新建文件(手写的 lockfile 同样不应出现)。

头注释若指向插件已识别的工具,提示中会点名工具与再生成方式,涵盖 protoc/buf、Prisma、GraphQL Codegen、OpenAPI 生成器、sqlc、go generate、Drizzle、Alembic 等。

确需手改时的放行

合并 lockfile 冲突、在等待上游时对 vendored 代码做一行热修等情况仍会出现。模型可用完全相同的调用再试一次以确认,该次可通过。若希望由人审批,可将 mode 设为 ask。若某目录看起来像生成物但实际手写维护,可加入 ignore。

安装与启用

官方安装命令(以 web profile 为例,dsh web 使用的浏览器 UI):

dsh plugin --profile web add dsh-protect-generated-files

若以脚本或 CI 跑 DSH,将 --profile web 换成 headless;编辑器集成用 acp。每个 profile 维护独立插件列表,用到的 profile 都要添加。安装后下一笔工具调用即生效。移除:

dsh plugin --profile web remove dsh-protect-generated-files

本地试改插件时,README 给出从克隆构建 tarball 再安装的路径(需自行 git clone 与 npm pack);日常使用以上述 dsh plugin add 为准即可。

配置

可在 DSH 侧栏 Plugins 中点开 dsh-protect-generated-files,修改后 Save,下一笔工具调用生效,无需重启。

也可在 ~/.dsh/profiles/<profile>/cordis.patch.yml,或全局 ~/.dsh/cordis.patch.yml 中追加片段(未写的键保持默认):

- id: protect-generated-files
  config:
    mode: deny                    # 或 ask:弹出审批
    extraGlobs:                   # 自定义生成路径及给模型的提示
      'src/api/client/**': 'edit openapi.yaml and run `npm run gen:api`'
    ignore: ['vendor/**']         # 永不视为生成物
    defaultGlobs: true            # false 时仅 lockfile、头注释与 extraGlobs
    headerLines: 15
    guardShell: true
    allowIdenticalRetry: true     # false 时拒绝后不可同参重试
    shellTools: [bash, pwsh]

README 建议优先配置 extraGlobs,写明再生成脚本,避免模型猜测。

适用场景与注意

适合在 DSH 中频繁让智能体改依赖、跑代码生成、或触碰多语言 lockfile 的团队与个人:在 agent 层统一挡掉手改生成物,并把操作导向「改源 + 再生成」。

安装前请自行查看 GitHub 仓库 源码与 MIT 许可证。插件以当前 dsh 进程权限运行,与 DSH 本身权限边界一致;勿在未审阅的情况下假定其覆盖你仓库里所有自定义生成路径,未覆盖部分应通过 extraGlobs 补充。

结尾

dsh-protect-generated-files 把「不要手改 lockfile 与生成代码」从提示词约定变成工具层拦截,并在拒绝时给出可执行的再生成指引。需要时可从 SkillHub 目录页 进入说明,或直接查阅 GitHub 仓库 的安装与配置细节。

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

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

Xiaoye