我让 AI 改代码,
它悄悄删了测试、放大了 CI 权限,
所以我做了 PatchBrake


最近用 Claude Code、Codex、Cursor 这类工具写代码,我越来越明显地感觉到一件事:AI 写代码是真的快,但 review 并没有变轻松。

现在很多人的 AI 编码流程大概是这样:先和 AI 讨论需求、拆实现方案,然后让 Codex、Claude Code、Cursor 或 Copilot 直接改本地代码。AI 改完后,如果项目能跑、页面看起来没问题,很多人就准备提交了。问题恰恰出在这里。

以前 review 代码,主要看逻辑对不对、命名清不清楚、有没有明显 bug。现在 AI 一次能改很多文件,而且改得很自然,很多风险不是“代码完全不能跑”,而是混在 diff 里,看起来没那么刺眼。

比如:代码能跑,但测试被删了;功能能过,但权限判断被弱化了;CI 还能跑,但 GitHub Actions 权限被放大了;配置文件看起来正常,但 secret 被写进了代码;甚至 AGENTS.md、CLAUDE.md、Cursor rules 这类文件被改了,后续 AI 的行为规则也跟着变了。

这些问题不一定马上炸,但很适合藏进一次普通提交里。所以我做了一个很小的工具:PatchBrake

项目地址:https://github.com/RyanCoreAI/patchbrake

Demo 在线体验:https://raw.githubusercontent.com/RyanCoreAI/patchbrake/main/assets/demo.gif

1. PatchBrake 是什么?

PatchBrake 的定位很窄:AI 改完代码后,在提交前扫描这次 diff,看看有没有明显危险信号。

它不是 AI Reviewer,也不调用 LLM。它不会上传你的代码,不会接 SaaS,不会做 Web Dashboard,也不会替你判断业务逻辑。它做的事情更像是提交前的一脚刹车:在代码进入 commit 之前,先把一些高风险 diff 提醒出来。

我反而是故意把它做得很“笨”:只看 diff、只跑本地规则、只报能解释清楚的风险。 因为很多 AI 编码带来的问题,并不需要另一个 AI 来推理,它们本来就是很直接的信号。

比如 staged diff 里出现:

+ permissions: write-all

或者测试被删掉:

- test("rejects anonymous users", () => {
-   expect(() => requireAdmin(null)).toThrow("Unauthorized");
- });

再或者配置里出现:

+ OPENAI_API_KEY="sk-..."

这些不是复杂安全研究问题,而是提交前就应该被提醒的问题。

2. 怎么安装和使用?

先说前提:需要已经安装 Node.js 20+

npx 本身是 npm 附带的工具。也就是说,如果你的电脑里没有 Node.js / npm,通常也就没有 npx,这时直接运行下面的命令会失败:

npx patchbrake scan --staged

所以第一次使用前,可以先在终端里检查一下:

node --version
npm --version
npx --version

如果这三个命令不存在,先安装 Node.js 20+。安装完成后,一般会自带 nodenpmnpx

环境没问题后,就不需要手动安装 PatchBrake 了,直接用 npx 运行:

npx patchbrake scan --staged

如果你想全局安装,也可以:

npm install -g patchbrake
patchbrake scan --staged

实际使用流程很简单。AI 改完代码后,先把准备检查的改动放进 staged 区域:

git add <changed-files>

如果你确认这次所有改动都属于同一个任务,也可以:

git add .

然后运行:

npx patchbrake scan --staged

这里的 staged 不是让你必须立刻提交。它只是告诉 PatchBrake:请检查我准备提交的这批改动。

如果你用的是 Codex 桌面版,也一样。PatchBrake 不关心代码是 Codex 桌面版改的、Claude Code 改的,还是 Cursor 改的。只要最后文件落在本地 Git 仓库里,就可以在项目目录打开终端,先 git add,再运行:

npx patchbrake scan --staged

如果扫出 error,就先修掉,再重新扫描;没有明显风险后,再正常提交。

3. 实际效果

我做了一个测试 diff:新增一个疑似 OpenAI API key、删除一个测试文件、把 GitHub Actions 权限改成 write-all。PatchBrake 扫出来是这样:

PatchBrake 本地真实测试输出

这个输出里可以看到三类风险:

  • secret-leak:新增了疑似 API key,并且输出里已经脱敏
  • deleted-tests:测试文件被删除
  • workflow-permissions:GitHub Actions 权限被放大到 write-all

这就是我想要的效果:它不需要理解整个业务,只要能在提交前把这些明显风险拦一下,就已经很有价值。

4. 为什么只扫 diff?

因为 AI 编码真正容易出问题的地方,经常不是“整个仓库历史上有没有漏洞”,而是:这一次 AI 到底改了什么。

你让 AI 重构认证模块,它可能顺手删掉一个断言;你让 AI 改 release workflow,它可能把权限放大;你让 AI 补配置,它可能把 token 写进文件;你让 AI 整理项目规则,它可能改掉 agent 的约束。

这些变化如果进了主分支,后面再查就麻烦了。所以 PatchBrake 的位置很靠前:在 commit 前,多做一次本地 diff 质检。

5. 现在能检查什么?

目前 PatchBrake 主要覆盖这些风险:

  • secret-leak:新增 API key、token、private key、.env 风险
  • deleted-tests:测试文件、测试用例或断言被删除
  • workflow-permissions:GitHub Actions 权限被放大
  • migration-risk:危险 migration,比如 DROPTRUNCATE、无 WHEREDELETE
  • prompt-config-drift:AGENTS.md、CLAUDE.md、.cursor/rules、prompt 配置变化
  • beta 规则:auth guard 删除、危险 npm script、危险 shell 命令、依赖风险等

它不追求覆盖所有漏洞。我更在意的是,先抓住 AI 改代码时最容易被忽略、但提交前最值得停一下的那几类问题。

6. 它和 Gitleaks / Semgrep / CodeQL 是什么关系?

PatchBrake 不是用来替代这些工具的。

Gitleaks、TruffleHog 更专注 secret scanning;Semgrep、CodeQL 更接近静态分析和 SAST;zizmor 对 GitHub Actions 安全检查更深入。PatchBrake 的目标更小:把 AI 生成代码中常见的 diff 风险,用一个本地 CLI 在提交前统一拦一下。

它更像是 AI coding workflow 前面的一道轻量 safety gate,而不是完整安全平台。

7. 现在还很早

PatchBrake 还是早期版本。我最想要的反馈不是泛泛夸奖,而是这三类:

  • false positive:它误报了什么?
  • real bad diff:你真的遇到过哪些 AI 生成的危险 diff?
  • rule request:你希望它多检查什么?

如果你经常用 Codex、Claude Code、Cursor 或 Copilot 改代码,可以拿自己的项目跑一次:

npx patchbrake scan --staged

如果它帮你拦下过一次低级但严重的 diff 风险,欢迎给个 star,或者直接提 issue,把你的 bad diff case 留下来。


文章作者: Ryan Guo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ryan Guo !

评论

有问题欢迎留言,看到都会回~

 本篇
我让 AI 改代码,它悄悄删了测试、放大了 CI 权限,所以我做了 PatchBrake 我让 AI 改代码,它悄悄删了测试、放大了 CI 权限,所以我做了 PatchBrake
AI 改完代码后,最危险的地方往往不是项目能不能跑,而是这一次 diff 里有没有测试被删、权限被放大、secret 被写进代码。PatchBrake 就是我为这个场景做的提交前本地质检工具。
下一篇 
简喵 03:产品流程——一份简历如何从"能写"变成"能投" 简喵 03:产品流程——一份简历如何从"能写"变成"能投"
简喵的产品流程不是把功能按顺序排起来,而是回答用户从打开工具到导出一份敢投的简历,中间每一步应该做什么、系统在背后处理什么、AI的建议如何被理解、遇到问题时怎么继续。
  目录
 目录