DMBlog onepage/ Rahul/ Claude Code Hooks
Rahul · X Article · 2026-06-24

Claude Code Hooks:把 AI Agent 的行為約束寫成程式

Rahul 的文章把 Hooks 定位成 Claude Code 最常被忽略、卻最能改變實務可靠性的功能。它不是再多寫一段提醒模型要小心,而是在工具呼叫、權限請求、停止事件與通知事件上,插入由程式碼執行的檢查點。

Source: X Article / 2026-06-24 X source X Article
Source type
X Article
Published
2026-06-24
Core topic
Claude Code
Use case
Agent guardrails
Mental model

Hooks 解決的不是「提醒」,而是「執行前控制」

一般專案會把行為規則寫在 CLAUDE.md 或團隊文件中,例如不要碰 production env、修改後要跑測試、提交前要檢查 lint。問題是這些規則仍然要靠模型在每一輪都理解、記得、並主動遵守。上下文變長、任務變複雜、工具變多時,提醒就會變成脆弱的安全機制。

Hooks 的差別在於它們跑的是預先寫好的程式。當 Claude Code 即將呼叫工具、寫檔、執行命令或結束任務時,Hook 可以先檢查輸入、決定是否放行,或把結果同步到外部系統。這讓「不要做某件事」從提示詞變成可測、可審查、可重複執行的控制層。

01 / Safety

阻擋高風險操作

在寫入 production config、執行破壞性 shell 命令或碰敏感路徑之前,由 Hook 先判斷並拒絕。

02 / Quality

把檢查接進流程

在檔案修改後自動跑測試、提示更新任務狀態,或在停止前執行最後驗證。

03 / Operations

補上事件橋接

記錄 session 成本、推送 Slack 或桌面通知、保存可觀測資料,讓 agent 工作不只停在終端機裡。

Hook anatomy

設定檔其實有三層:事件、匹配規則、實際動作

文章最實用的部分,是把 Hooks 的設定拆成三層來看。第一層是事件 registry,決定要在哪個時間點介入;第二層是 matcher,決定哪些工具或情境會被這組 Hook 處理;第三層才是實際 Hook,也就是要執行的 command、HTTP call 或 MCP tool。

Layer 01

Event registry

例如 PreToolUse 在工具使用前介入,PostToolUse 在工具完成後介入,Stop 在 session 準備結束時介入。

Layer 02

Matcher

用 matcher 對準特定工具或動作,例如只針對 Write、Edit、Bash 執行,避免所有事件都跑同一段檢查。

Layer 03

Hook action

真正執行的邏輯。它可以是一段 shell script、一個 HTTP endpoint,或交給 MCP tool 處理更結構化的任務。

Decision

允許、拒絕、要求確認或改寫輸入

阻擋型 Hook 不只是回傳錯誤。更好的做法是輸出結構化決策,告訴 Claude Code 這是政策拒絕,並提供可讀原因。

Scope

使用者、專案、plugin、skill、subagent 都可能有 Hook

不同層級的 Hook 生命週期不同。長駐規則適合放在 settings;臨時任務規則則更適合跟 skill 或 subagent 一起啟用。

Event classes

主流程事件能擋下操作,旁路事件適合觀測與通知

Rahul 特別提醒一個容易混淆的點:事件不是父子關係。PreToolUse 和 PermissionRequest 可能接連發生,但它們是不同的介入點。設計 Hooks 時要先分清楚,這個事件是要影響 Claude 下一步,還是只是旁路同步資料。

主流程事件

  • 可讓 Claude Code 暫停等待結果。
  • 適合做阻擋、要求確認、輸入改寫。
  • 例:工具使用前、權限請求、停止前檢查。

旁路事件

  • 適合記錄、通知、同步狀態。
  • 不應依賴它來阻擋高風險操作。
  • 例:通知事件、設定變更、觀測型紀錄。
工程含義

如果目標是防止錯誤發生,Hook 要放在行動前;如果目標是讓團隊知道發生了什麼,Hook 才放在行動後或旁路事件。把這兩種用途混在一起,會讓安全邊界看起來存在,實際上卻沒有攔截能力。

Blocking

要阻擋 Claude,不要只回傳一般失敗

文章指出一個實務陷阱:傳統 shell 腳本裡 exit 1 常代表失敗,但在 Hook 流程中,這不等於明確阻擋。真正需要的是系統錯誤訊號,或用結構化 JSON 回傳政策決策。後者通常更適合團隊規則,因為它能說清楚拒絕原因,也能引導模型改用安全替代方案。

System error適合環境壞掉、工具不存在、資源缺失等狀況。模型可能會嘗試理解錯誤或找替代路徑。
Policy decision適合團隊規則,例如禁止寫 production config。Claude 會把它理解成不可做的業務規則。
Ask human高風險但不一定禁止的操作,可以要求人類確認,而不是直接允許或拒絕。
Updated input部分情境可以改寫工具輸入,例如把危險命令改成 dry-run,或補上必要參數。
{
  "decision": "deny",
  "reason": "production config must be edited manually"
}
{
  "decision": "ask",
  "reason": "this command modifies deployment state"
}
Start here

最值得先做的 Hook:保護不可自動修改的檔案

如果只挑一個起點,文章建議從保護 production 環境檔開始。這不是最華麗的用法,但最能展現 Hooks 的價值:規則不是寫在文件裡等待模型記得,而是在每次 Write 或 Edit 前由腳本讀取 tool input,檢查目標路徑,符合保護規則就拒絕。

先列出不可碰的路徑例如 production env、正式憑證、部署設定、資料庫 migration 的危險區段。清單越具體,誤殺越少。
Hook 腳本只做小而明確的事讀 stdin、解析 JSON、比對路徑、回傳 allow 或 deny。不要把整個工作流程塞進第一個 Hook。
把測試與通知分開設計PostToolUse 適合提示或觸發測試;Stop 適合最後檢查;Notification 適合同步外部訊息。每種事件只負責它擅長的事。
把 Hook 當 production code 測錯誤的 exit code、無限觸發的 Stop Hook、或過度廣泛的 matcher,都可能讓日常工作中斷。

5 個帶走重點