文章通过 Claude Code Hooks 在文件修改后运行 ESLint,并用类型检查与测试约束任务结束。它特别指出阻断反馈需要退出码 2,检查工具返回的退出码 1 需要包装处理。
大多数开发者以为,在 CLAUDE.md 里写上“完成前始终运行测试”就够了。其实不够。CLAUDE.md 提供的是上下文,并不强制执行。Agent 会读它,而且大多数时候会照做。但“大多数时候”算不上质量门禁。会话一长、上下文一多,再碰上一个棘手的修复,Agent 就可能突然说“Done ✅”,而你的构建还在报错。如果某项检查很重要,就别只是要求它执行,要强制执行。
Hooks 是 Claude Code 在指定时机自动运行的 shell 命令。Agent 无法跳过它们、忘掉它们,也无法靠解释蒙混过关。下面是在 .claude/settings.json 中建立真正质量门禁的方法:
Matcher:Edit|Write。只对刚修改的文件运行 eslint --fix。文件路径通过 stdin 传入,因此检查范围明确,执行也快。
运行完整的类型检查和测试:tsc --noEmit && vitest run。如果检查失败,Agent 就无法结束当前轮次。它会收到错误信息,必须修复这些错误。
只有 exit code 2 才会阻止 Agent 继续结束,并把错误反馈给它。tsc 和 vitest 失败时返回的退出码是 1,所以 Agent 还是会继续往下走。给命令加一层包装:(tsc --noEmit && vitest run) >&2 || exit 2
Agent 写代码 → 检查失败 → Agent 读取错误 → 修复错误 → 再次尝试。你不再需要充当 Agent 的测试执行员。CLAUDE.md 告诉 Agent 你想要什么,Hooks 确保这些要求真正得到执行。
如果需要采取进一步措施,可以考虑屏蔽此人和/或举报滥用行为。

这里是程序员分享知识、了解最新动态并发展职业生涯的社区。