用途
Grind Until Pass 用于让 AI 编程智能体在达成某个明确目标之前持续自主工作,而不是尝试一次就停下。目标可以是:所有测试通过、构建成功,或 lint 检查干净。智能体会在「修复 → 运行 → 检查 → 重复」的紧凑循环中反复迭代,直到目标达成。
主要能力
- 定义目标命令:即用退出码判定成败的命令,例如测试用 npm test 或 npx vitest run,构建用 npm run build,lint 用 npm run lint,类型检查用 npx tsc --noEmit,也可以组合为 npm run lint && npx tsc --noEmit && npm test && npm run build。
- 运行命令并捕获输出。
- 失败时分析并修复:仔细阅读错误输出,识别根因(失败的测试断言、类型错误、lint 违规、导入错误等),做最小修复而不重构,然后回到运行步骤。
- 通过后停止并汇报:说明修复了什么、经过多少次迭代,并总结所做的改动。
使用方式
按以下步骤执行:
- 定义目标命令——其退出码决定成功与否。
- 运行该命令并捕获输出。
- 如果失败,分析并修复:阅读错误输出、定位根因、做最小修复,然后返回第 2 步。
- 如果通过,停止并汇报修复内容与迭代次数,总结改动。
循环规则:
- 最多迭代 10 次——若 10 次后命令仍失败,停止并报告阻塞进展的原因,说明存在根本性问题,需要人工介入。
- 一次只修一个问题——不要试图一次修复所有错误。先修第一个错误,重新运行,看该修复是否也解决了下游错误。
- 不要删除测试——如果测试失败,应修改代码使其通过。除非测试本身明显有误(在测试已被有意更改的旧行为),否则不要修改测试。
- 不要抑制错误——不要添加 @ts-ignore、eslint-disable 或 any 类型来消除错误,要修复实际问题。
- 跟踪进展——如果错误数量不降反增,停止并重新评估方法。
适用场景
- 大型重构后破坏了多个测试。
- 升级依赖后引入了类型错误。
- 合并分支后产生冲突需要解决。
- 当你只想「让它变绿」,并信任智能体自行反复打磨时。
高级用法:Cursor Hooks 集成
可以通过 .cursor/hooks.json 中的 Cursor hook 自动化此流程:在智能体回合结束后触发,检查测试是否通过,若未通过则发送后续消息。示例配置:
{ "hooks": [ { "event": "stop", "command": "bash .cursor/scripts/check-tests.sh", "description": "Re-run tests after agent stops and send follow-up if failing" } ] }
该脚本检查退出码,如果测试仍然失败则返回 followup_message。
限制
- 最适合测试套件运行较快的项目。如果测试需要 5 分钟以上,循环会很慢。
- 可使用 --bail 或 --fail-fast 标志在首个失败处停止,以加快迭代。
- 智能体会很彻底但不具创造性——如果修复需要设计层面的改动,仍需人工指导。