Claude Code 中的 Hooks


🏦 台灣Pay 銀行轉帳 💙 PayPal
介紹 hooks 如何在 Claude Code 生命週期的固定時間點執行指令,一定會跑
- 00:04 Hooks 讓你在 Claude Code 生命週期的不同時間點執行指令
- 01:34 指令會檢查副檔名再跑對應的 formatter,例如 TypeScript 用 prettier、Go 用 Go format、Python 用 Ruff,看你的專案用什麼
- 03:06 如果某件事必須每次都發生、不能出錯,就不要寫在 prompt 裡,要寫成 hook
💡 你可以怎麼用:把你老是要提醒 Claude 的事列出來(例如改完要排版、做完要通知你),挑一件在 Claude Code 輸入 /hooks 設成 hook;「不准碰某個資料夾」這類禁令就用 Pre-tool use 來擋。不會寫腳本也沒關係,可以直接請 Claude 幫你寫好 hook 設定。
看全部 18 條重點
🧑🏫 這支影片介紹 Claude Code 的 hooks。Claude Code 是 Anthropic 出的 AI 寫程式工具,hook 就是你事先設好「某個時間點一到,就自動跑某個指令」。它和平常用文字交代 AI 最大的不同是:hook 保證每次都會執行,不靠 AI 記得。想把某些規則定死的人,很值得看。
- 00:04 Hooks 讓你在 Claude Code 生命週期的不同時間點執行指令↳ Hook 是一種自動觸發的設定:在 Claude Code 做事流程的某個時間點,自動跑你指定的指令。這些時間點合稱 life cycle(生命週期),例如你送出訊息時、它改完檔案時。
- 00:04 Hooks 和前面介紹的其他功能最大的差別是 hooks 是確定性(deterministic)的,每次都一定會執行↳ 最關鍵的是 deterministic(確定性):時間點一到就一定跑,沒有例外。其他功能大多是「請 Claude 照做」,它會盡量配合,但不保證每次都做到。
- 00:04 舉例:在 claude.md 要求 Claude 每次編輯檔案後跑 prettier,大多數時候它會照做,但有時不會;改用 hook 就每次都會執行,沒有例外↳ claude.md 是寫給 Claude 看的說明檔,prettier 是把程式碼自動排整齊的工具。規則寫在說明檔裡,Claude 偶爾會漏掉;做成 hook,就由系統自動跑,不靠它記得。
- 00:34 常見用途:編輯檔案後自動排版、記錄所有執行過的指令以符合合規要求、封鎖危險操作(例如修改 production 檔案)、Claude 完成任務時通知自己↳ 常見四種用法:改完檔案自動排整齊;記下 Claude 跑過的每個指令,方便公司查核;不讓它改 production(正式上線、真的有人在用的系統)的檔案;做完事通知你。
- 00:34 Hooks 設定在 settings.json:選一個事件,可以另外設定 matcher 指定套用在哪個工具上,再提供要執行的指令↳ settings.json 是 Claude Code 的設定檔。設定 hook 分三步:選一個 event(事件,也就是觸發時機);可以另外填 matcher,限定只在某些工具動作時觸發;最後寫上要跑的指令。
- 00:34 事件 User prompt submit:你送出 prompt 後、Claude 處理之前執行↳ User prompt submit:你按下送出之後、Claude 開始處理之前就會先跑。等於在你的話交到 Claude 手上之前,先多一道關卡。
- 01:04 事件 Pre-tool use 在工具呼叫前執行;Post-tool use 在工具呼叫完成後執行↳ 這裡的「工具」是 Claude 實際動手做的事,例如改檔案、跑指令。Pre-tool use 在動手前觸發,Post-tool use 在做完後觸發:一個負責事前把關,一個適合事後收尾。
- 01:04 事件 Notification 在 Claude 發出通知時執行;Stop 在 Claude 回應完畢時執行↳ Notification 在 Claude 發出通知時觸發;Stop 在它整段回應結束時觸發,很適合設成「做完了叫我」,你就不用一直盯著螢幕。
- 01:04 最常見的 hook 是編輯後自動排版:設定 post-tool use hook,matcher 設為 edit 或 multi-edit,Claude 修改檔案時就會觸發↳ 最多人用的是「改完就排版」:事件選 Post-tool use,matcher 填 edit 或 multi-edit(改檔案的動作),這樣只有 Claude 改檔案時才會觸發,做別的事不會。
- 01:34 指令會檢查副檔名再跑對應的 formatter,例如 TypeScript 用 prettier、Go 用 Go format、Python 用 Ruff,看你的專案用什麼↳ 每種程式語言有各自的 formatter(自動排版工具)。指令會先看副檔名判斷是哪種檔案,再叫對應的工具:TypeScript 用 prettier、Go 用 Go format、Python 用 Ruff,照你的專案換。
- 01:34 Pre-tool use hooks 可以在工具呼叫執行前把它擋下;hook 會從 stdin 收到 JSON 格式的工具名稱和輸入內容↳ Pre-tool use 可以在 Claude 動手前喊停。它會從 stdin(程式接收輸入的管道)收到一份 JSON(有固定格式的文字資料),寫著要用哪個工具、打算做什麼,讓你的腳本判斷要不要放行。
- 01:34 hook 若以 exit code 2 結束,該動作會被封鎖,stderr 訊息會回傳給 Claude 當作回饋,讓 Claude 知道為什麼被擋並調整做法↳ exit code 是程式結束時回報的數字。hook 回 2,這個動作就被擋下,寫在 stderr(程式輸出錯誤訊息的管道)裡的說明會交給 Claude,讓它知道為什麼被拒,然後換個做法。
- 02:05 Exit code 0 代表繼續執行,exit code 2 代表封鎖;這是強制執行硬性規則的方式↳ 規則很單純:回 0 代表「沒問題,繼續」,回 2 代表「不准」。靠這個開關,「絕對不能做」的事就從口頭交代變成系統層級的硬規定。
- 02:05 硬性規則例子:封鎖寫入 production config 目錄、封鎖含 rm -rf 的 bash 指令、封鎖 commit 到 main,也就是團隊需要「保證」而不只是「建議」的事↳ 適合做成硬規則的例子:不准改正式環境的設定檔、不准跑 rm -rf(強制刪光整個資料夾的指令)、不准直接 commit(存入版本)到 main 主線。也就是團隊需要「保證」而不只是「建議」的事。
- 02:05 設定在 .Claude/settings.json 的 hooks 屬於專案層級,可以 check in 進 repo,整個團隊就會自動套用同一套 hooks↳ 把 hooks 寫在專案裡的 .claude/settings.json,就只套用在這個專案。把它 check in(提交)進 repo(放程式碼的共用倉庫)後,同事拿到專案就自動套用同一套規則,不用每個人各自設定。
- 02:36 在指令中使用 Claude project dir 環境變數來指向專案裡的腳本,這樣不管 Claude 當下的工作目錄在哪裡都能正常運作↳ Claude 做事時所在的資料夾可能會換,路徑寫死容易找不到腳本。改用 environment variable(環境變數,系統提供的現成設定值)CLAUDE_PROJECT_DIR,它固定指向專案資料夾,路徑就不會跑掉。
- 02:36 總結:post-tool-use 用來自動排版和記錄,pre-tool-use 用來封鎖危險操作;可以在 /hooks 或 settings.json 設定,並 check in 進 repo 讓團隊共用↳ 分工一句話:Post-tool use 負責事後排版和記錄,Pre-tool use 負責事前擋危險動作。可以在 Claude Code 輸入 /hooks 設定,或直接改 settings.json,再放進 repo 讓全隊共用。
- 03:06 如果某件事必須每次都發生、不能出錯,就不要寫在 prompt 裡,要寫成 hook↳ 判斷原則:寫在 prompt(你給 AI 的指示)裡,是「拜託」;寫成 hook,才是「規定」。只要某件事一次都不能漏,就做成 hook。
📘 術語
Hook(掛鉤):在 Claude Code 生命週期的不同時間點執行指令的機制,每次都一定會執行
Deterministic(確定性的):一定會執行、沒有例外;相對於寫在 claude.md 裡的指示,Claude 有時不會照做
Life cycle(生命週期):Claude Code 運作過程中的各個時間點,hooks 可以掛在這些時間點上執行
claude.md(claude.md 檔案):可以在裡面寫指示要 Claude 做事,但不保證每次都照做
settings.json(設定檔):設定 hooks 的檔案;放在 .Claude/settings.json 屬於專案層級,可以 check in 進 repo
Matcher(比對條件):非必填的設定,指定 hook 套用在哪個工具上,例如 edit 或 multi-edit
Event(事件):hook 觸發的時間點,例如 User prompt submit、Pre-tool use、Post-tool use、Notification、Stop
Pre-tool use(工具呼叫前):在工具呼叫前執行的事件,可以把工具呼叫擋下來
Post-tool use(工具呼叫後):在工具呼叫完成後執行的事件,適合拿來自動排版和記錄
Formatter(排版工具):依副檔名自動排版程式碼的工具,例如 prettier、Go format、Ruff
stdin(標準輸入):Pre-tool use hook 從這裡收到 JSON 格式的工具名稱和輸入內容
Exit code(結束代碼):hook 結束時回傳的代碼:0 代表繼續執行,2 代表封鎖
stderr(標準錯誤輸出):被封鎖時,這裡的訊息會回傳給 Claude 當作回饋,讓它知道原因並調整
Environment variable(環境變數):用 Claude project dir 環境變數指向專案裡的腳本,不受目前工作目錄影響
Deterministic(確定性的):一定會執行、沒有例外;相對於寫在 claude.md 裡的指示,Claude 有時不會照做
Life cycle(生命週期):Claude Code 運作過程中的各個時間點,hooks 可以掛在這些時間點上執行
claude.md(claude.md 檔案):可以在裡面寫指示要 Claude 做事,但不保證每次都照做
settings.json(設定檔):設定 hooks 的檔案;放在 .Claude/settings.json 屬於專案層級,可以 check in 進 repo
Matcher(比對條件):非必填的設定,指定 hook 套用在哪個工具上,例如 edit 或 multi-edit
Event(事件):hook 觸發的時間點,例如 User prompt submit、Pre-tool use、Post-tool use、Notification、Stop
Pre-tool use(工具呼叫前):在工具呼叫前執行的事件,可以把工具呼叫擋下來
Post-tool use(工具呼叫後):在工具呼叫完成後執行的事件,適合拿來自動排版和記錄
Formatter(排版工具):依副檔名自動排版程式碼的工具,例如 prettier、Go format、Ruff
stdin(標準輸入):Pre-tool use hook 從這裡收到 JSON 格式的工具名稱和輸入內容
Exit code(結束代碼):hook 結束時回傳的代碼:0 代表繼續執行,2 代表封鎖
stderr(標準錯誤輸出):被封鎖時,這裡的訊息會回傳給 Claude 當作回饋,讓它知道原因並調整
Environment variable(環境變數):用 Claude project dir 環境變數指向專案裡的腳本,不受目前工作目錄影響
✏️ 小考一題
Pre-tool use hook 要用哪個 exit code 結束,才能擋下這次工具呼叫,並把 stderr 訊息回傳給 Claude?
A. 1B. 2C. -1D. 0看答案
答案:B。字幕 [01:34] 說 hook 以 exit code 2 結束時動作會被封鎖,stderr 訊息會回傳給 Claude;[02:05] 再強調 exit code 0 代表繼續執行,exit code 2 代表封鎖。
💛 覺得有幫助?支持一下


課本免費、沒有廣告,支持與否都能照常讀 🐰