Claude Code:用Hooks自动化
停止点击批准按钮并失去心流状态。这些 Hook 将 Claude Code 从礼貌的助手转变为团队成员。
你知道那个一切都很顺畅的时刻。
你已经把问题装在脑子里。解决方案已经形成了一半。你的手指移动得比你有意识地思考还要快。这是编码的美好部分。难得的部分。
然后……
Claude 想要写入文件的权限。*点击批准。*Claude 想要运行命令。*点击批准。*Claude 编辑了文件但没有格式化。*点击批准。*Claude 想要运行测试。点击批准。
二十次微小的中断之后,思路消失了。不是戏剧性的。不是一次性消失。只是……稀释了。你仍在编码,但敏锐度不见了。心流状态在你没注意的时候溜走了。
这就是 Claude Code Hook 解决的真正问题。 不是速度。 不是智慧。 是摩擦。
一旦你认清它们的本质,就很难回去了。
1、我们不谈的心理税
这是我大量使用 Claude Code 后注意到的一点。
最高的成本不是等待。这是上下文切换。
每个批准对话框都迫使你的大脑回答一个它已经知道答案的问题。"是的,格式化没问题。""是的,运行测试是安全的。""是的,写入文件。"
这些决定是微不足道的,但它们仍然是决定。决定会打破心流。
Hook 让你将这些决定从脑海中移出,转移到配置中。你决定一次。Claude 永远执行。
把 Hook 想象成反射。对可预测情况的自动响应。不需要思考。
在我们深入之前,这是最小的 Hook,可以立即带来价值。
添加到 .claude/settings.json:
{
"hooks": {
"PostToolUse": [{
"matcher": "Write|Edit",
"hooks": [{
"type": "command",
"command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\""
}]
}]
}
}
就这样。
Claude 写入或编辑的每个文件现在都会自动格式化。不批准。不提醒。"我以后再修复"
你继续思考功能。Claude 担心空白。
一旦你感受到这有多流畅,你就会想要更多。
2、Claude Code Hook 到底是什么
在机械层面,Hook 很简单。
它们监听 Claude Code 中的事件,并在这些事件发生时执行shell 命令。就这样。没有魔法。没有隐藏状态。
但杠杆来自这些事件何时触发。
作为快速参考,这是完整的集合:
| Hook | 触发时机 | 最佳使用场景 |
|---|---|---|
| PreToolUse | 任何工具运行之前 | 阻止危险操作 |
| PostToolUse | 工具完成后 | 自动格式化、lint、记录 |
| PermissionRequest | 权限对话框之前 | 自动批准安全命令 |
| SessionStart | 会话开始 | 注入上下文(git 状态、TODO) |
| Stop | Claude 完成响应时 | 运行测试、验证输出 |
| PreCompact | 上下文压缩之前 | 备份转录 |
| SubagentStop | 子代理完成 | 验证代理输出 |
| UserPromptSubmit | 你按回车时 | 注入指令、验证输入 |
如果这个表格让你觉得抽象,别担心。一旦你看到真实的用例,它就会明朗起来。
所以让我们来看看真正改变编码体验的五个 Hook。
Hook 1:每次写入时自动格式化
我们已经看到了基本版本;让我们扩展它。
当你堆叠格式化和 lint 时,它是这样的:
{
"hooks": {
"PostToolUse": [{
"matcher": "Write|Edit",
"hooks": [
{"type": "command", "command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\""},
{"type": "command", "command": "npx eslint --fix \"$CLAUDE_TOOL_INPUT_FILE_PATH\""}
]
}]
}
}
一个微小但重要的细节:多个 Hook 并行运行。
所以 Claude 写入文件。 Prettier 格式化它。 ESLint 修复它能修复的。 然后你才看到响应。
你读到的代码已经是干净的。
没有"我们以后再整理"。 没有标准随时间的缓慢衰减。 只是一个安静的保证,即每次编辑都符合你的基准。
说实话,仅这个就值得使用 Hook。
Hook 2:会话上下文注入
AI 编码工具的一个微妙挫败是每个会话都是从头开始。
你知道仓库的状态。 Claude 不知道。
Hook 可以解决这个问题。
使用 SessionStart Hook,你可以在说一个字之前自动注入上下文:
{
"hooks": {
"SessionStart": [{
"hooks": [{
"type": "command",
"command": "echo '## Current State' && git status --short && echo '## Active TODOs' && grep -r 'TODO:' src/ --include='*.ts' | head -5"
}]
}]
}
}
现在,当会话开始时, Claude 看到:
- 未提交的更改* 哪些文件是脏的* 活跃 TODO 的快照
你不必解释昨天在做什么。或者提醒 Claude auth.ts 中有未完成的工作。
这就像走进一个对话,对方已经知道你们上次在谈论什么。
这本身就改变了交互的基调。
Hook 3:自动批准你已信任的命令
这是 Hook 开始感觉有点叛逆的地方。
权限对话框是为了保护你。这是好事。 但第 400 次批准 npm test 不是安全。这是一个仪式。
输入 PermissionRequest。
{
"hooks": {
"PermissionRequest": [{
"matcher": "Bash(npm test*)",
"hooks": [{
"type": "command",
"command": "echo '{\"decision\": \"approve\"}'"
}]
}]
}
}
这个 Hook 拦截权限请求并用 JSON 响应:
{ "decision": "approve" }
不中断。测试直接运行。
是的,你应该小心。 只自动批准你真正信任的命令。
但对于 npm test、pnpm lint 或 cargo test 这样的东西,这是纯粹的信号超过噪音。
你的注意力保持在它应该在的地方。
Hook 4:当 Claude 完成时自动运行测试
这是一个你使用后才会觉得微小的 Hook。
Stop Hook 在 Claude 完成响应时运行。
验证刚刚改变的内容的完美时机。
{
"hooks": {
"Stop": [{
"hooks": [{
"type": "command",
"command": "npm test --passWithNoTests 2>&1 | tail -20"
}]
}]
}
}
每次 Claude 完成后:
- 测试运行* 失败立即出现
- 输出被修剪到有用的部分
你不必记得运行测试。 你不必要求 Claude 这样做。 反馈是自动的。
这以一种难以言表的方式收紧循环。Bug 不会传播很远。错误的假设很早就被捕获。你无需额外努力就能保持诚实。
它相当有纪律。
Hook 5:无需依赖记忆的技能激活
这个更高级一些,但很强大。
想法很简单:在 Claude 看到你的提示之前,你自动附加额外的指令。
这就是 UserPromptSubmit 的用途。
{
"hooks": {
"UserPromptSubmit": [{
"hooks": [{
"type": "command",
"command": "node .claude/hooks/SkillActivationHook/skill-activation-prompt.mjs"
}]
}]
}
}
现在,当你输入模糊的内容时:
"实现一个功能"
Claude 还会看到关于激活哪些技能的内部指导。架构模式。重构模式。调试模式。无论你定义了什么。
没有提示技巧。 不依赖长期记忆。 只是一致的行为。
这是一种安静的方式来引导模型而不 micromanaging it。
4、Hook 在哪里
你可以在三个地方配置 Hook:
| Location | Scope | Use Case |
|---|---|---|
| .claude/settings.json | Project | (shared)Team standards |
| .claude/settings.local.json | Project | (personal)Your preferences |
| ~/.claude/settings.json | All projects | Global defaults |
项目设置覆盖用户设置。
这比听起来更重要。它让团队在不可协商的事情上达成一致(格式化、测试),同时个人保持个人优化。
Hook 在社交上出人意料地扩展得很好。
5、当事情出错时
一些来之不易的经验教训。
Hook 不触发?检查 matcher。 Write|Edit 可以。 Write | Edit(带空格)不行。
命令静默失败?添加日志:
your-command 2>&1 | tee ~/.claude/hook-debug.log
一切都感觉慢?Hook 有 60 秒超时。如果有东西很重,在后台运行它或修剪输出。
Hook 很强大,但它们仍然只是 shell 命令。像生产代码一样对待它们。因为它们有点像。
6、从一个开始。说真的。
如果所有这些感觉很多,没关系。不要沸腾海洋。
选择你最烦恼的摩擦:
- 持续格式化 —
PostToolUse - 无尽的批准 —
PermissionRequest - 缺少上下文 —
SessionStart - 忘记测试 —
Stop
修复一件事。
然后使用几天。你会感受到不同。一旦你这样做了,添加下一个 Hook 不会感觉像配置。它会感觉像解脱。
原文链接:Claude Code Hooks: 5 Automations That Eliminate Developer Friction
汇智网翻译整理,版权归原作者所有