如何构建一个能自动循环修复 Bug 的 Claude Code Agent(内含详细设置指南)

@zodchiii
英语4周前 · 2026年6月17日
143K
141
18
14
332

TL;DR

本指南提供了创建自修复 Claude Code Agent 的完整方案,涵盖自定义命令与钩子(hooks)的设置。通过实施错误分类协议,Agent 可以自主诊断并修复代码故障。

Claude 写代码,测试报错,然后把错误扔回给你处理。

而一个自修复 Agent 不会这样:它会读取自己的失败,修补原因,然后重新运行直到通过。

只需设置一次,你就再也不用当自己 Agent 的免费调试员了。

以下是完整的设置步骤 👇

在深入之前,我每天会在我的 Telegram 频道分享关于 AI 和 Vibe Coding 的日常笔记: https://t.me/zodchixquant🧠

darkzodchi - inline image

为什么一次不够

默认情况下,Claude 只运行一次任务。测试失败,它报告错误并等待。你阅读错误,把它粘贴回去,告诉它再试一次。你正在做调试工作,它只是在打字。

而自修复 Agent 则翻转了这种模式。它会读取自己的失败,弄清楚是哪类错误,修复原因,然后重新运行,就像调试器思考的方式一样。你只在它通过测试或真正卡住时才介入。

文件 1:修复命令

这是你实际运行的循环。将其放入 .claude/commands/fix.md 中:

yaml
1---
2description: 运行一个任务并自修复,直到所有测试通过
3argument-hint: <task>
4allowed-tools: Read, Write, Edit, Glob, Grep, Bash
5model: sonnet
6---
7
8任务:$ARGUMENTS
9
10循环:
111. 实现任务。
122. 运行测试套件:`npm test`(或 pytest、cargo test)。
133. 如果所有测试通过:停止并向显示结果。
144. 如果测试失败:对错误类型进行分类,指明根本原因,
15 修复该原因,然后返回步骤 2。
165. 最多尝试 5 次。每轮都公布尝试次数。
17
18先分类后修复的顺序是整个方案的关键。每轮都是先诊断后编辑。
19绝不要为了通过测试而削弱测试,要修复代码本身。

你输入 /fix add pagination to the users endpoint,Agent 就会编写代码、测试并自我修复,直到测试套件全部通过。

文件 2:自动检查钩子

上面的命令是按需工作的。而这个钩子能让每次编辑都自动进行自我检查。

将其添加到 .claude/settings.json 中:

json
1{
2 "hooks": {
3 "PostToolUse": [
4 {
5 "matcher": "Write|Edit",
6 "hooks": [
7 { "type": "command", "command": "npm test --silent 2>&1 | tail -5 || echo 'TESTS FAILING, fix before continuing'" }
8 ]
9 }
10 ]
11 }
12}

现在,每次 Claude 编辑文件后,测试都会运行,并且结果会返回到它的视图里。

失败会立即显示出来,所以 Agent 会在同一个流程中修复问题,而不是继续进行并在已损坏的代码上堆叠更多更改。

文件 3:教会它读取错误

这个文件是真正调试器与猜测者的分水岭。大多数 Agent 看到“测试失败”就开始随机编辑。

一个好的 Agent 会首先读取错误类型,因为每种类型都指向不同的原因。将其放入 CLAUDE.md 中:

markdown
1## 如何在修复前读取错误
2
3始终先指明错误类型。每种类型都有不同的含义:
4
5- 断言失败(期望 X,得到 Y):逻辑错误。
6 从断言点回溯到构建该值的位置。
7 修复计算逻辑,而不是测试的期望值。
8
9- 类型错误 / undefined is not a function:形状不匹配。
10 某个值为 null,或者错误类型到达了这行代码。
11 找到该值的来源,在那里进行保护或修正。
12
13- 超时 / 挂起:缺少 await,或者 Promise 从未 resolve。
14 查找没有 await 的异步调用,或者一个永远不会翻转的条件。
15
16- 导入 / 模块未找到:路径或依赖问题,不是逻辑错误。
17 修复路径或进行安装,不要修改使用该模块的代码。
18
19- 不稳定(有时通过):共享状态或时序问题,绝不是随机。
20 查找顺序依赖的测试或未模拟的时间/网络。
21
22规则:在编辑之前,口头说出类型和一句话的根本原因。
23如果无法指出原因,你就是在猜测。停止。

类型错误和断言失败需要相反的操作:一个是上游的数据形状问题,另一个是当前点的逻辑错误。先进行分类,Agent 就能修复正确的问题。

跳过分类,它就会随机编辑直到红灯消失,这会导致你得到一个看似通过但实际已悄悄损坏的测试套件。

你实际会看到的效果

你只需输入一行:

text
1/fix the date formatter returns wrong timezones

然后它就会自主工作:

text
1Attempt 1
2 ran tests → FAILED
3 type: assertion (expected 5, got 11)
4 cause: page size not applied to the query
5 fixed the LIMIT clause
6
7Attempt 2
8 ran tests → FAILED
9 type: type error (offset is undefined)
10 cause: page 1 sends no offset, defaulted wrong
11 added offset = (page-1)*size
12
13Attempt 3
14 ran tests → ALL GREEN (7/7)
15
16Fixed in 3 attempts. Review the diff?

你从未粘贴过错误信息回来。它读取了自己的失败,指出了每个原因,并不断修复直到测试套件通过。

常见错误

在诊断之前就进行修复。 这是最大的错误。在指明错误类型之前就进行编辑的 Agent 是在猜测,而猜测把红灯变绿靠的是运气,不是靠修复。先分类的规则是唯一的防御手段。

以同样的方式对待每个错误。 超时和断言失败毫无共同之处,但如果没有错误类型指南,Agent 会把两者都当作“出了问题”并编辑最近的代码行。你一半的修改都会落在错误的文件里。

只修补症状。 在抛出的调用外包裹 try/catch 能让测试通过,但会留下 bug。协议禁止为了这个原因而压制错误。

让它削弱测试。 允许编辑测试的 Agent 最终会删除失败的测试以达到全绿。一个不能证明任何东西的通过套件是最糟糕的结果,所以这条规则没有商量余地。

5 分钟设置

2 分钟:创建 .claude/commands/fix.md

1 分钟:将 PostToolUse 钩子添加到 settings.json

1 分钟:将自调试协议添加到 CLAUDE.md。

1 分钟:在已知 bug 上运行 /fix,观察它如何一次次地修复根本原因。

你不再是那个传递错误信息的人类。Agent 会读取自己的红灯,并不断修复直到变绿。它并没有变得更聪明,它只是不再把问题抛回给你。

感谢阅读!

我每天在我的 Telegram 频道分享关于 AI、金融和 Vibe Coding 的日常笔记:https://t.me/zodchixquant

darkzodchi - inline image
一键保存

使用 YouMind AI 深度阅读爆款文章

保存原文、追问细节、总结观点,并在一个 AI 工作空间里把爆款文章沉淀成可复用笔记。

了解 YouMind
写给创作者

把你的 Markdown 变成干净的 𝕏 文章

图片上传、表格、代码块,往 𝕏 上手动重排太痛苦。YouMind 把整篇 Markdown 一键转成干净、可直接发布的 𝕏 文章草稿。

试试 Markdown 转 𝕏

更多可拆解样本

近期爆款文章

探索更多爆款文章