在Claude Code中搭建代码自动修复循环

0x_rody 发布于 2026-06-11 阅读 132

这篇文章介绍了一个让Claude Code自动修复代码错误的循环系统。通过三个文件配置:CLAUDE.md中的循环协议、.claude/settings.json中的Hook设置(在停止时运行测试、在编辑后运行类型检查),以及一个专门的修复子代理(fixer)。该循环机制让Claude在写代码后自动运行检查、发现错误、修复,直到全部通过或达到5次重试上限。文章还指出了常见错误(如无重试限制、允许修改测试等)并提供了5分钟快速设置指南。

图像

Claude 写好代码交给你,然后 3 个测试挂了。

你把错误信息贴回去,它修好一个地方,又弄坏了另一个地方。结果你整晚都在 Claude 和终端之间当信使。

大多数开发者接受这就是工作流程。

解决方案是一个循环:让 Claude 自行检查自己的成果,不断重试直到所有测试通过,不需要你在中间来回传话。

以下是完整的配置方案 👇

图像

循环如何工作

默认的 Claude Code 流程是一条直线:你提问,Claude 写代码,Claude 停下。代码能不能跑是你的事。

循环把直线收拢成一个圆圈。Claude 写代码,运行检查,查看哪些测试失败,修复问题,再次运行检查。它只在两种情况下停下:所有测试都通过,或者达到重试次数上限并准确报告哪些地方仍有问题。

你从信使变成了审查者。配置只需 3 个文件。

图像

文件 1:CLAUDE.md 中的循环协议

这个文件告诉 Claude,“完成”意味着“已验证”,而不是“已写完”。把它放在项目根目录:

## 循环协议

每个任务以循环方式运行,而不是直线:

1. 编写变更。
2. 运行检查项:测试、代码检查器、类型检查器。
3. 如果有任何失败,阅读错误信息,修复原因,返回步骤 2。
4. 最多重复 5 次。

停止条件:
- 所有检查通过:报告“完成”,并附上通过时的输出作为证明。
- 已尝试 5 次:停止,并报告仍然失败的内容以及你尝试过的方法。
- 同一错误连续出现两次:停止。你只是在猜测,而不是在修复。

没有本次会话的检查输出,永远不要报告“完成”。
永远不要通过削弱测试来通过检查。修复的是代码,而不是测试。

最后一行最为重要。没有它,Claude 最终可能会通过删除断言来“通过”测试。循环应该改进代码,而不是改进记分板。

文件 2:闭合循环的 Stop Hook

协议要求 Claude 检查自己。而 Hook 让检查变成实际行动。放入 .claude/settings.json:

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          { "type": "command", "command": "npm test --silent 2>&1 | tail -20" }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          { "type": "command", "command": "npx tsc --noEmit --pretty false 2>&1 | head -10" }
        ]
      }
    ]
  }
}

PostToolUse Hook 在每次编辑后反馈类型错误,让 Claude 在任务过程中自行纠正。

Stop Hook 在 Claude 试图结束任务时运行测试套件。失败的输出直接返回会话中,循环协议迫使进行另一次迭代,而不是虚假的“完成”。

对于 Python,将命令换成 pytest -q 和 pyright。对于 Rust,换成 cargo test --quiet 和 cargo check。

文件 3:修复子代理

对于顽固性失败,用一个全新的代理来解决问题,比让疲惫的会话重试第 5 次更有效。放入 .claude/agents/fixer.md:

---
name: fixer
description: 当同一测试在两次修复尝试后仍然失败时调用。在碰代码之前先诊断根本原因。
tools: Read, Edit, Grep, Glob, Bash
model: opus
---

你负责修复失败的检查。不允许猜测。

1. 自己运行失败的检查。阅读完整的错误信息。
2. 通读失败路径中的每一个文件,从开头读到结尾。
3. 写一句话:实际原因是什么。
4. 只修复那个原因。不要顺手重构。
5. 再次运行检查。报告修改前后的输出。

禁止:删除测试、放宽断言、添加 try/catch 来消除错误、将测试标记为跳过。

主会话在循环卡住时通过 @fixer 调用它。一个全新的上下文窗口,不带之前失败尝试的负担,能解决第 4 次重试无法解决的问题。

图像

常见错误

没有重试上限。如果没有“最多 5 次”的限制,Claude 可能会在一个错误上花上一个小时。限制将无限循环变成了一个报告。

测试运行太慢,不适合循环。如果测试套件需要 90 秒,每次迭代都会变得很慢。将 Stop Hook 指向单元测试,把集成测试留给 CI。

允许 Claude 在循环中编辑测试。这是最大的作弊路径。协议禁止这样做,但还是要检查 diff 中是否涉及了测试文件。

没有“同一错误两次”的规则。连续两次相同的失败意味着 Claude 在猜测。这时应该调用 @fixer 或者你来介入,而不是重试第 3 次。

5 分钟设置

1 分钟:将循环协议复制到 CLAUDE.md。

2 分钟:将 Hook 添加到 .claude/settings.json。

1 分钟:创建 .claude/agents/fixer.md。

1 分钟:给 Claude 一个真实的任务,观察循环运行:编写、失败、修复、通过。

你不再需要充当 Claude 和终端之间的信使。模型并没有变得更聪明,只是不再被允许提前退出。

感谢阅读!

图像

  • 原文链接: x.com/0x_rody/status/206...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论