Hooks(自動化規則引擎)
Claude Code 的自動觸發規則——Claude 觸發某事件時自動執行的程式,不需手動同意。
四種 Hook 類型
| 類型 | 觸發時機 | 用途 |
|---|---|---|
PreToolUse | Claude 用工具前 | 驗證、權限檢查 |
PostToolUse | Claude 用工具後 | 自動格式化、跑測試 |
Stop | 任務完成 | 清理、報告、final check |
PostCompact | 上下文壓縮 後 | 重貼關鍵規則、存檔摘要、推 Channels |
範例 1:自動 Prettier 格式化
.claude/hooks.json:
{
"hooks": [
{
"name": "auto-format",
"trigger": "PostToolUse",
"tools": ["write_file"],
"script": "prettier --write {file_path}",
"continueOnError": true
}
]
}效果:每次 Claude 寫 .ts / .js 檔,自動跑 prettier。
範例 2:停止前先跑測試
{
"name": "test-before-stop",
"trigger": "Stop",
"script": "npm test",
"failMessage": "❌ Tests failed - 請修復後再 Stop"
}範例 3:危險指令攔截
{
"name": "block-rm-rf",
"trigger": "PreToolUse",
"tools": ["bash"],
"condition": "command.contains('rm -rf')",
"script": "echo '❌ rm -rf 已被 hook 攔截'",
"block": true
}為什麼用 Hook
- 強制紀律:每次寫檔都格式化,不靠 Claude 自願
- 降低錯誤:commit 前必跑測試
- 保護:危險指令自動攔截
- 客製化:每個專案不同規則
範例 4:PostCompact 重貼規則
{
"name": "reinject-pam-rules",
"trigger": "PostCompact",
"script": "cat .claude/rules/grading-service.md | claude-inject"
}效果:上下文壓縮 後 Claude 仍記得「等第計算只能呼叫 GradingService」這條紅線——壓縮不會把它丟掉。
Hook 作為反饋機制
Boris Cherny(Boris Cherny 13 條心法 第 7 條)把 PostToolUse 鉤子歸類為「處理專案最後 10%」的工具——但更深的價值是它構成 反饋循環 的具體實作層。
為什麼 Hook 是反饋的關鍵:LLM 的盲點在於「寫完就走」,沒看到自己 code 跑起來的結果。PostToolUse 把「寫完 → 跑 → 看結果」這個迴圈寫進規則裡,每次 Claude 動工具就強制完成一輪。
反饋通道對照:
| Hook 類型 | 反饋給誰看 | 例子 |
|---|---|---|
| PostToolUse | Claude 自己(下一輪 prompt 看得到) | prettier --write / eslint --fix 失敗訊息回灌 |
| Stop | Claude 在收工前檢查 | npm test 失敗就擋下 Stop |
| PreToolUse | Claude 動手前 | lint-before-edit.sh 攔下會踩雷的 Edit |
| PostCompact | Claude 壓縮後 | 重貼紅線規則,避免「忘了」 |
搭配反饋循環的最強組合:
Edit code ─[PostToolUse: prettier]─▶ format
─[PostToolUse: tsc]──────▶ type check
─[PostToolUse: vitest]───▶ unit test
│ 失敗 → fail message 回灌 prompt
│ Claude 看到錯誤 → 自我修正
↓
再 Edit ─▶ 再 PostToolUse ─▶ ...
→ 這就是 Boris 說的「反饋循環讓品質提升 2-3 倍」的具體機制。沒有 Hook,反饋要靠人類眼睛;有 Hook,Claude 自己看得到自己的錯。
對 PAM 的應用
可以加:
- 寫完 .cs 自動跑
dotnet format - commit 前自動跑 xUnit 測試
- 改 EF migration 前先 dry-run
- 寫 SQL 前自動檢查有沒有 string concat
- PostCompact 後重貼 CLAUDE.md 紅線
- Stop hook:Channels 推 Telegram 完成通知
相關概念
強連結(原文明確提及)
- Claude Code
- Slash Commands
- CLAUDE.md(專案手冊)
- 上下文壓縮 — PostCompact 配合
- Channels — Stop hook 推送
- Tasks 任務管理 — Hook 可在 task 切換時觸發
- Boris Cherny 13 條心法 — Boris 第 7 條:PostToolUse 收尾
- 反饋循環 — Hooks 是反饋循環的具體機制
深入閱讀(外部資源)
- 深入閱讀:09-Claude Code 建置與使用
← 回到 wiki