Hooks 非常強大,但也容易出錯。以下是一些常見的“坑”:
1. 無限循環
如果你在 PostToolUse 裡執行了一個命令,而這個命令又觸發了 Claude 的某種反應(雖然 Hook 執行的命令
通常不視為 AI 操作,但如果 Hook 腳本調用了 Claude API 則另當別論),要小心循環調用。
更常見的是邏輯死循環:Lint Hook 修改了代碼 -> 觸發 Edit -> 再次觸發 Lint Hook。
解決方案:確保 Hook 中的命令(如 Lint)不會再次觸發監視機制,或使用無副作用的命令。
2. 超時與性能
Hooks 是同步執行的。Claude 會等待 Hook 結束才繼續下一步。如果你掛了一個跑 5 分鐘的測試套件, 你的交互體驗會變得非常卡頓。 解決方案:只運行快速的單元測試,與完整的集成測試分離。
3. 輸出干擾
Hook 的標準輸出(stdout)和標準錯誤(stderr)會被注入到 Claude 的上下文中。 如果輸出太多垃圾資訊,會佔用 Token 上限並干擾 Claude 的判斷。 解決方案:讓 Hook 腳本保持安靜 (silent),只在出錯時輸出關鍵資訊。
4. 輸入結構變化
Hook 接收的輸入數據結構(JSON)可能會隨 Claude Code 版本更新而變化。
{
"tool_use_id": "toolu_01...",
"tool_name": "Edit",
"tool_input": { ... },
"tool_result": { ... }
}
編寫解析腳本時要做好容錯處理。