05 - Hooks 设计

Hooks 是什么

Hooks 很容易被当成”自动运行的脚本”,但用下来觉得它更像是把一些不能交给 Claude 临场发挥的事情,重新收回到确定性的流程里。

格式化要不要跑、保护文件能不能改、任务完成后要不要通知——这些事不要指望 Claude 每次都自己记得。

支持的 Hook 点

Hook 点适合
PostToolUseEdit 后自动格式化/lint/轻量校验
Notification任务完成后推送通知
SessionStart注入动态上下文(Git 分支、环境变量)
PreToolUse阻断修改受保护文件

不适合用 Hooks 的场景:

  • 需要读大量上下文的复杂语义判断
  • 长时间运行的业务流程
  • 需要多步推理和权衡的决策(这些该在 Skill 或 Subagent 里)

配置示例

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "pattern": "*.rs",
        "hooks": [
          {
            "type": "command",
            "command": "cargo check 2>&1 | head -30",
            "statusMessage": "Running cargo check..."
          }
        ]
      }
    ],
    "Notification": [
      {
        "type": "command",
        "command": "osascript -e 'display notification \"Task completed\" with title \"Claude Code\"'"
      }
    ]
  }
}

在 100 次编辑的会话中,每次节省 30-60 秒,累积节省 1-2 小时。

注意:限制输出长度(| head -30),避免 Hook 输出反而污染上下文。

Hooks + Skills + CLAUDE.md 三层叠加

层级职责
CLAUDE.md声明”提交前必须通过测试和 lint”
Skill告诉 Claude 在什么顺序下运行测试、如何看失败、如何修复
Hook对关键路径执行硬性校验,必要时阻断

三样少任何一层都会有漏洞:

  • 只写 CLAUDE.md 规则 → Claude 经常当没看见
  • 只靠 Hooks → 细节判断做不了
  • 放在一起才比较稳

Prev: 04 - 工具设计哲学 | Next: 06 - Subagents 使用