本頁面提供在 Claude Code 中實作 hooks 的參考文件。
~/.claude/settings.json
- 使用者設定.claude/settings.json
- 專案設定.claude/settings.local.json
- 本地專案設定(不提交)PreToolUse
和 PostToolUse
)
Write
僅匹配 Write 工具Edit|Write
或 Notebook.*
*
匹配所有工具。您也可以使用空字串(""
)或將 matcher
留空。type
:目前僅支援 "command"
command
:要執行的 bash 命令(可以使用 $CLAUDE_PROJECT_DIR
環境變數)timeout
:(可選)命令應該執行多長時間(以秒為單位),超過時間後取消該特定命令。UserPromptSubmit
、Notification
、Stop
和 SubagentStop
這樣不使用匹配器的事件,您可以省略匹配器欄位:
CLAUDE_PROJECT_DIR
(僅在 Claude Code 生成 hook 命令時可用)來引用儲存在專案中的腳本,確保無論 Claude 的當前目錄如何,它們都能正常工作:
Task
- 子代理任務(參見子代理文件)Bash
- Shell 命令Glob
- 檔案模式匹配Grep
- 內容搜尋Read
- 檔案讀取Edit
、MultiEdit
- 檔案編輯Write
- 檔案寫入WebFetch
、WebSearch
- 網路操作manual
- 從 /compact
呼叫auto
- 從自動壓縮呼叫(由於上下文視窗已滿)startup
- 從啟動呼叫resume
- 從 --resume
、--continue
或 /resume
呼叫clear
- 從 /clear
呼叫compact
- 從自動或手動壓縮呼叫。reason
欄位將是以下之一:
clear
- 使用 /clear 命令清除會話logout
- 使用者登出prompt_input_exit
- 使用者在提示輸入可見時退出other
- 其他退出原因tool_input
的確切架構取決於工具。
tool_input
和 tool_response
的確切架構取決於工具。
stop_hook_active
為 true。檢查此值或處理記錄以防止 Claude Code 無限期執行。
manual
,custom_instructions
來自使用者傳遞給 /compact
的內容。對於 auto
,custom_instructions
為空。
stdout
在記錄模式(CTRL-R)中向使用者顯示,除了 UserPromptSubmit
和 SessionStart
,其中 stdout 被添加到上下文中。stderr
被回饋給 Claude 自動處理。請參閱下面的每個 hook 事件行為。stderr
向使用者顯示,執行繼續。UserPromptSubmit
hook,其中 stdout 被注入為上下文。Hook 事件 | 行為 |
---|---|
PreToolUse | 阻止工具呼叫,向 Claude 顯示 stderr |
PostToolUse | 向 Claude 顯示 stderr(工具已執行) |
Notification | N/A,僅向使用者顯示 stderr |
UserPromptSubmit | 阻止提示處理,清除提示,僅向使用者顯示 stderr |
Stop | 阻止停止,向 Claude 顯示 stderr |
SubagentStop | 阻止停止,向 Claude 子代理顯示 stderr |
PreCompact | N/A,僅向使用者顯示 stderr |
SessionStart | N/A,僅向使用者顯示 stderr |
SessionEnd | N/A,僅向使用者顯示 stderr |
stdout
中返回結構化 JSON 以進行更複雜的控制:
continue
為 false,Claude 在 hooks 執行後停止處理。
PreToolUse
,這與 "permissionDecision": "deny"
不同,後者僅阻止特定的工具呼叫並向 Claude 提供自動回饋。PostToolUse
,這與 "decision": "block"
不同,後者向 Claude 提供自動回饋。UserPromptSubmit
,這防止提示被處理。Stop
和 SubagentStop
,這優先於任何 "decision": "block"
輸出。"continue" = false
優先於任何 "decision": "block"
輸出。stopReason
伴隨 continue
提供向使用者顯示的原因,不向 Claude 顯示。
PreToolUse
決策控制PreToolUse
hooks 可以控制工具呼叫是否進行。
"allow"
繞過許可系統。permissionDecisionReason
向使用者顯示但不向 Claude 顯示。"deny"
防止工具呼叫執行。permissionDecisionReason
向 Claude 顯示。"ask"
要求使用者在 UI 中確認工具呼叫。permissionDecisionReason
向使用者顯示但不向 Claude 顯示。decision
和 reason
欄位已棄用。請改用 hookSpecificOutput.permissionDecision
和 hookSpecificOutput.permissionDecisionReason
。已棄用的欄位 "approve"
和 "block"
分別對應到 "allow"
和 "deny"
。PostToolUse
決策控制PostToolUse
hooks 可以在工具執行後向 Claude 提供回饋。
"block"
自動用 reason
提示 Claude。undefined
什麼都不做。reason
被忽略。"hookSpecificOutput.additionalContext"
添加 Claude 要考慮的上下文。UserPromptSubmit
決策控制UserPromptSubmit
hooks 可以控制是否處理使用者提示。
"block"
防止提示被處理。提交的提示從上下文中清除。"reason"
向使用者顯示但不添加到上下文中。undefined
允許提示正常進行。"reason"
被忽略。"hookSpecificOutput.additionalContext"
如果未被阻止,將字串添加到上下文中。Stop
/SubagentStop
決策控制Stop
和 SubagentStop
hooks 可以控制 Claude 是否必須繼續。
"block"
防止 Claude 停止。您必須填充 reason
讓 Claude 知道如何進行。undefined
允許 Claude 停止。reason
被忽略。SessionStart
決策控制SessionStart
hooks 允許您在會話開始時載入上下文。
"hookSpecificOutput.additionalContext"
將字串添加到上下文中。additionalContext
值會被串聯。SessionEnd
決策控制SessionEnd
hooks 在會話結束時執行。它們無法阻止會話終止,但可以執行清理任務。
UserPromptSubmit
hooks,您可以使用任一方法注入上下文:UserPromptSubmit
的特殊情況)mcp__<server>__<tool>
,例如:
mcp__memory__create_entities
- Memory 伺服器的建立實體工具mcp__filesystem__read_file
- Filesystem 伺服器的讀取檔案工具mcp__github__search_repositories
- GitHub 伺服器的搜尋工具"$VAR"
而不是 $VAR
..
$CLAUDE_PROJECT_DIR
作為專案路徑).env
、.git/
、金鑰等。/hooks
選單中檢查變更才能應用CLAUDE_PROJECT_DIR
環境變數可用,包含專案根目錄的絕對路徑(Claude Code 啟動的位置)--debug
)/hooks
查看您的 hook 是否已註冊claude --debug
查看 hook 執行詳細資訊\"
claude --debug
查看詳細的 hook 執行claude --debug
查看 hook 執行詳細資訊: