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 testpnpm lintcargo 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

汇智网翻译整理,版权归原作者所有