即使在 CLAUDE.md 寫著「編輯後一定要執行格式化工具」,AI 也可能有忘記的時候。畢竟指示終究只是請求。
凡是必須發生的事,都應該做成裝置,而不是請求。在 Claude Code 中,這個裝置就是 Hook。
Hook 是由使用者定義的 Shell 命令。它會在 Claude Code 運作的特定時機自動執行,不論模型選了什麼,都能以決定性的方式介入。
如果說到 Claude Code 第 10 集為止的命令需要手動設定,Hook 就是會自行啟動的自動裝置。
5 分鐘建立第一個 Hook
Hook 要寫在 settings.json 的 hooks 區塊中。以下看看 Claude 等待輸入時顯示 macOS 通知的範例。
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"需要輸入\" with title \"Claude Code\"'"
}
]
}
]
}
}
儲存後輸入 /hooks,就會看到已註冊的 Hook 清單。這個畫面是唯讀的;要修改時,直接編輯 settings.json,或請 Claude 代為處理即可。
可以在哪些時機介入?
依據 官方 Hook 指南,常用事件如下。
SessionStart:工作階段開始或恢復時UserPromptSubmit:送出提示後、Claude 處理前PreToolUse:工具呼叫前;可以阻擋呼叫PostToolUse:工具呼叫成功後Stop:Claude 的回合結束時Notification:Claude 等待輸入時
使用 matcher 縮小目標範圍。寫成 "matcher": "Edit|Write" 時,只有使用檔案編輯工具才會觸發 Hook。
三種代表性用法
編輯後自動格式化。在 PostToolUse 上設定 Edit|Write matcher 並執行 prettier。無論 AI 修改哪個檔案,都會強制格式化。
阻擋受保護檔案。PreToolUse Hook 會檢查特定路徑,以結束碼 2 結束時就會阻擋該編輯。不能使用任意失敗碼,必須是 2。不同於 CLAUDE.md 的指示,即使模型忘記,也無法繞過。
完成時通知。就像前面的 Notification 範例,不必一直盯著終端機。
需要判斷時使用 prompt Hook
有些條件很難用 Shell Script 判斷,例如「要求的工作是否全部完成?」
這時使用 type: "prompt" Hook。不要寫 Shell 命令,而是寫下判斷標準,基本的 Haiku 模型就會以 yes/no 判定。
在 Stop 事件上設定 prompt Hook,就會變成「還沒完成就繼續工作」。其實 第 6 集介紹的 /goal正是這種結構的工作階段專用包裝器。
Hook 會直接執行 Shell
能力越強,風險也越高。因為這種架構會以我的權限自動執行任意 Shell 命令。
專案 settings.json 中的 Hook 會要求確認是否信任該儲存庫。開啟他人的儲存庫時,別輕率略過這項確認。
在 Hook 命令中,變數要用引號包住;未經驗證不要執行外部輸入,這些基本原則也必須遵守。
總結
Hook 是把「必須發生的事」從模型的記憶力中抽離,交給系統處理的裝置。
先從強制格式化、阻擋受保護檔案、完成通知開始吧。需要判斷的條件則可擴充為 prompt Hook。
下一集將介紹按固定間隔重複執行提示的 /loop。如果 Hook 是事件自動化,/loop就是時間自動化。
來源與確認標準
- Claude Code 官方文件 — 使用 Hooks 自動化動作(Anthropic,2026-08-14 確認)
- Claude Code 官方文件 — Hooks 參考(Anthropic,2026-08-14 確認)

![[Claude Code #11] Hooks:別求它,改用裝置自動化 封面圖](/assets/images/posts/76a987e0-498d-44b4-88a8-e737861f7f2a/claude-code-hooks-automation.jpg)