05 - Hooks 设计
Hooks 是什么
Hooks 很容易被当成”自动运行的脚本”,但用下来觉得它更像是把一些不能交给 Claude 临场发挥的事情,重新收回到确定性的流程里。
格式化要不要跑、保护文件能不能改、任务完成后要不要通知——这些事不要指望 Claude 每次都自己记得。
支持的 Hook 点
| Hook 点 | 适合 |
|---|---|
| PostToolUse | Edit 后自动格式化/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 使用