最小 Loop:让 Claude 自己跑测试、修 Bug,3 个文件告别"USB 线"工作流
标签: Claude Code / Claude Agent / AI 编程 / Loop 工作流 / 自动测试 / Claude Code / hooks / Fixer Agent
原文: 微信公众号「老金独立开发」https://mp.weixin.qq.com/s/14dyKA7188NfMvL0xwK7Ow
问题:AI 编码中你在做的事是"USB 线"
每天晚上的工作流程:
让 Claude 写代码 → 跑测试 → 3 个失败 → 把报错粘贴给 Claude → 它修了一个、又破了另一个 → 再粘贴 → 再修 → 再破……
一个晚上就这么过去了。
问题在哪? 你做的事情是纯机械的:Claude 写代码,你跑测试,你读错误,你再粘给 Claude。你就是个 USB 线。
这完全可以被自动化掉,只需要 3 个文件。
核心思路:把直线弯成循环
默认的 Claude Code 工作方式是一条直线:
你发任务 → Claude 写代码 → Claude 停下来 → 等你
它不会主动跑测试。"完成"在它的默认定义里就是"写完了"。
解决思路:把直线弯成循环:
写代码 → 跑检查 → 有失败?修它 → 再跑检查 → 直到通过
文件 1:CLAUDE.md —— 循环协议
在项目根目录的 CLAUDE.md 里加入循环协议:
循环协议
每个任务作为循环运行,不是直线:
1. 写变更。
2. 运行检查:测试 + linter + 类型检查。
3. 有失败?读错误,找原因,修它,回到第 2 步。
4. 最多循环 5 次。
停止条件:
· 所有检查通过 → 报告"完成",附上通过输出作为证明。
· 5 次用完 → 停下来,报告还剩什么没过。
· 同一个错误连续出现两次 → 立刻停。你在猜,不是在修。
禁止:在没有检查输出的情况下报告"完成"。
禁止:通过删断言、弱化测试来让测试通过。修代码,不修记分牌。
两条"禁止"是最关键的部分。 第一次没加,结果 Claude 在第 3 次迭代里把一个断言直接删掉了——测试绿了,bug 还在。它在作弊,而且作弊得很自然。
文件 2:.claude/settings.json —— 硬约束钩子
Claude 会"忘记"CLAUDE.md 里写的协议。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 | 每次改完文件 | 立刻跑类型检查,边写边纠 |
| Stop | Claude 想说"完成了"时 | 先跑完整测试套件,失败则强制再来一次 |
Python 项目换
pytest -q+pyright,Rust 项目换cargo test --quiet+cargo check。
文件 3:.claude/agents/fixer.md —— 打破死局
有些问题在同一个上下文窗口里修不好。它已经试了 4 次,上下文里全是失败记录,思路被锁死了。这时候需要一个干净的上下文:
name: fixer
description: 当同一个测试在 2 次修复尝试后仍然失败时调用。
tools: Read, Edit, Grep, Glob, Bash
model: opus
你修复失败的检查。你不允许猜测。
1. 自己运行失败的检查,读完整错误。
2. 从头到尾读失败路径里的每个文件。
3. 写一句话:实际原因是什么。
4. 只修那个原因,不要顺手重构。
5. 再次运行检查,报告修复前后的输出。
禁止:删测试、放宽断言、用 try/catch 压错误、把测试标记为 skip。
主会话里用 @fixer 调用。它没有之前 4 次失败的记忆,重新从零诊断,经常一次就过。
配起来:3 步搞定
- 把循环协议贴进
CLAUDE.md - 创建
.claude/settings.json放钩子配置 - 创建
.claude/agents/fixer.md
# 目录结构
project/
├── CLAUDE.md
├── .claude/
│ ├── settings.json
│ └── agents/
│ └── fixer.md
给 Claude 一个真实任务,看循环跑起来。
效果
配置完之后你会发现:
- ✅ 你不再需要盯着终端复制粘贴报错了
- ✅ Claude 自己跑、自己看、自己修
- ✅ 修不动了叫
@fixer - ✅ 你只需要最后看一眼 diff
总结
| 文件 | 作用 | 核心配置 |
|---|---|---|
CLAUDE.md | 循环协议 | 禁止作弊(删断言/弱化测试) |
.claude/settings.json | 硬约束钩子 | PostToolUse(边写边纠)+ Stop(完成前强制测试) |
.claude/agents/fixer.md | 死局打破者 | 新上下文,重新诊断,禁止猜测 |
核心价值:把"你当 USB 线"的纯机械流程自动化掉,让 Claude 自己跑、自己修、修不动了叫 fixer。你只需要最后看一眼 diff。
Keywords: Claude Code, Claude Agent, 最小Loop, AI编程, 自动测试, hooks, Fixer Agent, Loop工作流, 自动化测试, Claude Code配置