Claude Code Hooks 類型與使用指南

本文總結(jié) Claude Code / 本倉庫恢復(fù)版 claude-code 中 hooks 的類型、觸發(fā)時機(jī)、典型使用場景、配置方式與注意事項。
Hooks 是 Claude Code 在會話、工具調(diào)用、權(quán)限、壓縮、子代理、任務(wù)等生命周期節(jié)點(diǎn)執(zhí)行的自定義動作。它們適合做自動校驗、權(quán)限治理、日志審計、上下文注入、格式化、通知和資源清理。
0. 整體流程圖
整體流轉(zhuǎn)可以理解為:會話啟動后觸發(fā) SessionStart;用戶提交 prompt 后、Claude 處理前觸發(fā) UserPromptSubmit;Claude 推理中如果要調(diào)用工具,先在權(quán)限彈窗前觸發(fā) PermissionRequest,再在工具真正執(zhí)行前觸發(fā) PreToolUse;工具成功后觸發(fā) PostToolUse,失敗后觸發(fā) PostToolUseFailure,權(quán)限被拒絕后觸發(fā) PermissionDenied;子代理、上下文壓縮、通知和任務(wù)事件會在各自生命周期點(diǎn)觸發(fā);最后在回復(fù)結(jié)束前觸發(fā) Stop,會話退出時觸發(fā) SessionEnd。

1. 配置位置
| 作用域 | 配置文件或來源 | 適用場景 | 是否建議提交到倉庫 |
|---|---|---|---|
| 用戶級 | ~/.claude/settings.json | 個人通用習(xí)慣,例如所有項目都禁止危險 Bash 命令 | 否 |
| 項目級 | .claude/settings.json | 團(tuán)隊共享規(guī)則,例如項目統(tǒng)一 formatter、lint、測試鉤子 | 是 |
| 項目本地級 | .claude/settings.local.json | 個人在當(dāng)前項目的本地配置,例如本機(jī)路徑、本地通知腳本 | 否 |
| 插件級 | ~/.claude/plugins/*/hooks/hooks.json | 由插件提供的通用 hook 能力 | 否 |
| 會話級 | 運(yùn)行時內(nèi)存注冊 | 臨時 hook,隨會話結(jié)束清除 | 否 |
基礎(chǔ)配置結(jié)構(gòu):
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash|Write|Edit",
"hooks": [
{
"type": "command",
"command": "python3 .claude/hooks/check.py",
"timeout": 30
}
]
}
]
}
}2. Hook 執(zhí)行類型
Hook 事件描述“什么時候觸發(fā)”,hook 執(zhí)行類型描述“觸發(fā)后用什么方式執(zhí)行”。
| 執(zhí)行類型 | 關(guān)鍵字段 | 什么時候使用 | 如何使用 | 注意事項 |
|---|---|---|---|---|
| command | command, shell, timeout, statusMessage, once, async, asyncRewake, if | 需要執(zhí)行本地腳本或 shell 命令時;最常用 | 寫一個腳本從 stdin 讀取 JSON,輸出文本或 JSON,再在 settings.json 配置 command | hook 可執(zhí)行任意命令,只運(yùn)行可信腳本;建議設(shè)置合理 timeout |
| prompt | prompt, model, timeout, statusMessage, once, if | 需要用模型判斷某個事件是否合規(guī),或生成簡短建議 | 配置 prompt,讓 Claude Code 把 hook 輸入交給模型分析 | 適合判斷和文本分析,不適合強(qiáng)制性安全邊界 |
| agent | prompt, model, timeout, statusMessage, once, if | 需要啟動代理做更完整的驗證或檢查 | 配置 agent prompt,要求代理審查輸入、輸出結(jié)論 | 成本和延遲更高;適合較重的檢查 |
| http | url, headers, allowedEnvVars, timeout, statusMessage, once, if | 需要把 hook 事件發(fā)送到外部服務(wù),例如審計、通知、策略引擎 | Claude Code 向 url POST hook 輸入 JSON,服務(wù)返回 JSON | HTTP hook 必須返回 JSON;不要把敏感信息發(fā)到不可信服務(wù) |
callback 和 function 類型屬于程序內(nèi)或會話內(nèi)注冊機(jī)制,不適合直接寫入持久化 settings.json。
3. Hook 事件類型總表
| Hook 類型 | 觸發(fā)時機(jī) | 什么時候使用 | 如何使用 | 常見 matcher |
|---|---|---|---|---|
| PreToolUse | Claude 準(zhǔn)備調(diào)用工具之前 | 阻止危險命令、限制文件寫入范圍、校驗工具輸入、改寫工具輸入 | 配置在 hooks.PreToolUse 下,按工具名匹配;腳本讀取 tool_name 和 tool_input,必要時返回 permissionDecision 或 updatedInput | 工具名,例如 Bash, Write, Edit, Read |
| PostToolUse | 工具調(diào)用成功之后 | 自動格式化、運(yùn)行 lint/test、記錄工具結(jié)果、補(bǔ)充上下文、處理 MCP 工具輸出 | 配置在 hooks.PostToolUse 下;腳本讀取 tool_response 并返回普通輸出或結(jié)構(gòu)化 JSON | 工具名 |
| PostToolUseFailure | 工具調(diào)用失敗之后 | 收集失敗診斷、記錄錯誤、提示修復(fù)建議 | 配置在 hooks.PostToolUseFailure 下;腳本讀取 error 字段 | 工具名 |
| PermissionRequest | Claude Code 需要權(quán)限決策時 | 自動批準(zhǔn)低風(fēng)險命令、拒絕高風(fēng)險命令、改寫工具輸入、接入組織策略 | 配置在 hooks.PermissionRequest 下,返回 hookSpecificOutput.decision.behavior 為 allow 或 deny,可附帶 updatedInput | 工具名 |
| PermissionDenied | 工具權(quán)限被拒絕后 | 記錄拒絕原因、通知用戶、決定是否引導(dǎo)換方案 | 配置在 hooks.PermissionDenied 下,讀取被拒絕的工具和原因 | 工具名 |
| Notification | Claude Code 發(fā)出通知時 | 轉(zhuǎn)發(fā)到桌面、Slack、企業(yè) IM、日志系統(tǒng) | 配置在 hooks.Notification 下;按通知類型匹配 | notification_type |
| UserPromptSubmit | 用戶提交 prompt 后、Claude 處理前 | 注入項目上下文、審計用戶輸入、阻止違規(guī)請求、補(bǔ)充團(tuán)隊規(guī)則 | 配置在 hooks.UserPromptSubmit 下;返回 additionalContext 可給模型增加上下文 | 通常不按工具匹配 |
| SessionStart | 會話開始、恢復(fù)、清空后重新進(jìn)入等場景 | 加載項目上下文、設(shè)置 watch paths、輸出初始化提示 | 配置在 hooks.SessionStart 下;可返回 additionalContext, initialUserMessage, watchPaths | source |
| SessionEnd | 會話結(jié)束、清空或退出時 | 清理資源、保存狀態(tài)、發(fā)送結(jié)束通知 | 配置在 hooks.SessionEnd 下;腳本應(yīng)很快完成 | reason |
| Stop | Claude 完成一次響應(yīng)、即將停止時 | 最終質(zhì)量檢查、檢查待辦未完成項、要求 Claude 繼續(xù)修復(fù) | 配置在 hooks.Stop 下;返回阻塞結(jié)果可促使繼續(xù)處理 | 通常無 matcher |
| StopFailure | Stop hook 或停止流程失敗時 | 記錄停止失敗、診斷異常 | 配置在 hooks.StopFailure 下,讀取錯誤信息 | error |
| SubagentStart | 子代理啟動時 | 給子代理注入上下文、記錄代理開始執(zhí)行 | 配置在 hooks.SubagentStart 下 | agent_type |
| SubagentStop | 子代理完成時 | 校驗代理輸出、收集報告、阻止不合格結(jié)果進(jìn)入主流程 | 配置在 hooks.SubagentStop 下 | agent_type |
| PreCompact | 上下文壓縮前 | 保存關(guān)鍵狀態(tài)、導(dǎo)出中間結(jié)論、阻止不合適的壓縮 | 配置在 hooks.PreCompact 下 | trigger |
| PostCompact | 上下文壓縮后 | 恢復(fù)關(guān)鍵上下文、重新注入摘要或提醒 | 配置在 hooks.PostCompact 下 | trigger |
| Setup | 初始化或 setup 流程觸發(fā)時 | 初始化環(huán)境、準(zhǔn)備上下文、執(zhí)行一次性設(shè)置 | 配置在 hooks.Setup 下 | trigger |
| TeammateIdle | 協(xié)作 agent 或 teammate 空閑時 | 自動分派任務(wù)、提醒、狀態(tài)檢查 | 配置在 hooks.TeammateIdle 下 | 通常無 matcher |
| TaskCreated | 任務(wù)創(chuàng)建時 | 記錄任務(wù)、同步到外部系統(tǒng)、通知協(xié)作方 | 配置在 hooks.TaskCreated 下 | 通常無 matcher |
| TaskCompleted | 任務(wù)完成時 | 結(jié)果校驗、歸檔、通知、觸發(fā)后續(xù)流程 | 配置在 hooks.TaskCompleted 下 | 通常無 matcher |
| Elicitation | MCP elicitation 請求發(fā)起時 | 自動接受、拒絕或取消 MCP 服務(wù)提出的問題 | 配置在 hooks.Elicitation 下 | mcp_server_name |
| ElicitationResult | MCP elicitation 返回結(jié)果時 | 校驗返回內(nèi)容、審計用戶/系統(tǒng)響應(yīng) | 配置在 hooks.ElicitationResult 下 | mcp_server_name |
| ConfigChange | 配置發(fā)生變化時 | 刷新緩存、記錄配置變更、重新加載策略 | 配置在 hooks.ConfigChange 下 | source |
| WorktreeCreate | 創(chuàng)建 worktree 時 | 接管或參與 worktree 創(chuàng)建,并在返回路徑前完成必要初始化 | 配置在 hooks.WorktreeCreate 下;必須通過 stdout 或 hookSpecificOutput.worktreePath 返回非空 worktree 路徑 | 通常無 matcher |
| WorktreeRemove | 刪除 worktree 時 | 清理資源、釋放鎖、刪除臨時文件 | 配置在 hooks.WorktreeRemove 下 | 通常無 matcher |
| InstructionsLoaded | 指令文件加載完成后 | 審計或追加說明上下文、提示沖突規(guī)則 | 配置在 hooks.InstructionsLoaded 下 | load_reason |
| CwdChanged | 當(dāng)前工作目錄變化時 | 更新路徑相關(guān)環(huán)境、刷新項目上下文 | 配置在 hooks.CwdChanged 下 | 通常無 matcher |
| FileChanged | 被監(jiān)聽的文件變化時 | 自動刷新上下文、重新加載配置或規(guī)則 | 先通過 SessionStart 返回 watchPaths,再配置 FileChanged 處理變更 | 文件 basename |
4. 常見目標(biāo)與推薦 hook
| 目標(biāo) | 推薦 hook | 推薦 matcher | 典型做法 |
|---|---|---|---|
| 阻止危險 Bash 命令 | PreToolUse | Bash | 讀取 tool_input.command,命中 rm -rf, git reset --hard, `curl |
| 限制只能改某些目錄 | PreToolUse | `Write | Edit |
| 編輯后自動格式化 | PostToolUse | `Write | Edit |
| 工具失敗后自動診斷 | PostToolUseFailure | `Bash | Read |
| 自動批準(zhǔn)低風(fēng)險只讀命令 | PermissionRequest | Bash | 對 git status, ls, pwd 等返回 hookSpecificOutput.decision.behavior: "allow" |
| 用戶輸入后補(bǔ)充上下文 | UserPromptSubmit | 無 | 返回 additionalContext,例如項目當(dāng)前規(guī)范或安全邊界 |
| 會話啟動時加載項目信息 | SessionStart | source | 返回項目說明、默認(rèn)任務(wù)提醒、需要監(jiān)聽的文件路徑 |
| 響應(yīng)結(jié)束前質(zhì)量門禁 | Stop | 無 | 檢查是否運(yùn)行測試、是否完成待辦;不滿足則阻塞并說明原因 |
| 子代理完成后校驗 | SubagentStop | agent_type | 檢查代理輸出是否包含必需字段或是否發(fā)現(xiàn)高危問題 |
| 上下文壓縮前保存狀態(tài) | PreCompact | trigger | 把關(guān)鍵任務(wù)狀態(tài)寫入文件或外部系統(tǒng) |
| 任務(wù)完成后通知 | TaskCompleted | 無 | 發(fā)桌面通知、Webhook 或企業(yè) IM 消息 |
| 接管 worktree 創(chuàng)建 | WorktreeCreate | 無 | 創(chuàng)建或初始化 worktree 后,返回最終 worktree 路徑 |
5. Hook 輸入?yún)f(xié)議
Claude Code 會把結(jié)構(gòu)化 JSON 寫入 hook 進(jìn)程的 stdin。
通用字段:
| 字段 | 類型 | 含義 |
|---|---|---|
| session_id | string | 當(dāng)前會話 ID |
| transcript_path | string | 當(dāng)前 transcript 文件路徑 |
| cwd | string | 當(dāng)前工作目錄 |
| permission_mode | string? | 當(dāng)前權(quán)限模式,可能不存在 |
| agent_id | string? | 子代理 ID,主線程通常不存在 |
| agent_type | string? | agent 類型,可能不存在 |
| hook_event_name | string | 當(dāng)前 hook 事件名 |
工具相關(guān) hook 額外字段:
| 字段 | 出現(xiàn)于 | 含義 |
|---|---|---|
| tool_name | PreToolUse, PostToolUse, PostToolUseFailure, PermissionRequest, PermissionDenied | 工具名 |
| tool_input | 工具相關(guān) hook | 工具輸入 |
| tool_response | PostToolUse | 工具成功輸出 |
| error | 失敗類事件 | 錯誤信息 |
示例腳本讀取輸入:
#!/usr/bin/env python3
import json
import sys
payload = json.load(sys.stdin)
print(json.dumps({"suppressOutput": True}))
6. Hook 輸出協(xié)議
command hook 的 stdout 如果去掉空白后以 { 開頭,會被當(dāng)成 JSON 解析;否則按普通文本處理。http hook 必須返回 JSON。
通用輸出字段:
| 字段 | 類型 | 作用 |
|---|---|---|
| continue | boolean | false 表示阻止 Claude 繼續(xù) |
| suppressOutput | boolean | 是否隱藏 hook stdout |
| stopReason | string | continue: false 時展示的停止原因 |
| decision | string | 常見值為 approve 或 block |
| reason | string | 決策原因 |
| systemMessage | string | 展示給用戶的系統(tǒng)消息或警告 |
| hookSpecificOutput | object | 針對具體 hook 的結(jié)構(gòu)化輸出 |
常用 hookSpecificOutput:
| Hook | 可用字段 | 用法 |
|---|---|---|
| PreToolUse | permissionDecision, permissionDecisionReason, updatedInput | 允許、拒絕或改寫即將執(zhí)行的工具輸入 |
| PermissionRequest | decision.behavior, decision.updatedInput, decision.message | 對權(quán)限請求返回允許或拒絕決策 |
| UserPromptSubmit | additionalContext | 給 Claude 追加上下文 |
| SessionStart | additionalContext, initialUserMessage, watchPaths | 初始化會話上下文和文件監(jiān)聽 |
| PostToolUse | updatedMCPToolOutput | 更新 MCP 工具輸出,僅對 MCP 工具有效 |
| WorktreeCreate | worktreePath | HTTP hook 返回創(chuàng)建好的 worktree 路徑;command hook 可直接輸出路徑 |
權(quán)限請求允許示例:
{
"hookSpecificOutput": {
"hookEventName": "PermissionRequest",
"decision": {
"behavior": "allow",
"updatedInput": {}
}
}
}權(quán)限請求拒絕示例:
{
"hookSpecificOutput": {
"hookEventName": "PermissionRequest",
"decision": {
"behavior": "deny",
"message": "該命令不允許自動執(zhí)行"
}
}
}阻止危險命令示例:
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "禁止執(zhí)行破壞性 rm 命令"
}
}注入上下文示例:
{
"hookSpecificOutput": {
"hookEventName": "UserPromptSubmit",
"additionalContext": "本項目要求修改代碼后運(yùn)行相關(guān)測試。"
}
}
會話啟動示例:
{
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"additionalContext": "已加載項目上下文。",
"initialUserMessage": "請先閱讀 README.md 和 AGENTS.md。",
"watchPaths": ["/absolute/path/to/AGENTS.md"]
}
}7. 退出碼語義
| 退出碼 | 行為 | 什么時候使用 |
|---|---|---|
| 0 | 成功 | hook 檢查通過,或只輸出信息 |
| 2 | 阻塞錯誤,Claude 會收到 hook feedback | 需要明確阻止當(dāng)前動作或要求 Claude 修正 |
| 其他非零值 | 非阻塞錯誤,通常展示給用戶但不一定阻止流程 | hook 自身失敗但不應(yīng)中斷主流程 |
也可以用 JSON 表達(dá)阻塞:
{
"decision": "block",
"reason": "該命令不允許執(zhí)行"
}8. Matcher 與條件
8.1 matcher
matcher 用來篩選 hook 是否執(zhí)行。
| 寫法 | 含義 | 示例 |
|---|---|---|
| 省略或 * | 匹配全部 | 所有工具調(diào)用后都運(yùn)行日志 hook |
| 精確工具名 | 只匹配單個工具 | Bash |
| 管道分隔 | 匹配多個工具 | `Write |
| 正則表達(dá)式 | 更靈活的匹配 | ^mcp__.* |
8.2 if 條件
if 是更細(xì)粒度的工具條件,適用于工具相關(guān)事件:
- PreToolUse
- PostToolUse
- PostToolUseFailure
- PermissionRequest
示例:
{
"type": "command",
"command": "python3 .claude/hooks/check-git.py",
"if": "Bash(git *)"
}9. 配置示例
9.1 禁止危險 Bash 命令
.claude/settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 .claude/hooks/block-dangerous-bash.py",
"timeout": 10
}
]
}
]
}
}.claude/hooks/block-dangerous-bash.py:
下面腳本只是最小演示,不能覆蓋所有 shell 繞過方式;生產(chǎn)環(huán)境更推薦 allowlist、命令解析器或組織級策略引擎。
#!/usr/bin/env python3
import json
import re
import sys
payload = json.load(sys.stdin)
command = payload.get("tool_input", {}).get("command", "")
blocked = [r"\brm\s+-rf\b", r"\bgit\s+reset\s+--hard\b", r"\bgit\s+push\s+--force\b"]
if any(re.search(pattern, command) for pattern in blocked):
print(json.dumps({
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "檢測到高風(fēng)險命令,請先獲得用戶明確確認(rèn)。"
}
}))
sys.exit(0)
print(json.dumps({"suppressOutput": True}))9.2 編輯后自動格式化
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "python3 .claude/hooks/format-changed-file.py",
"timeout": 60
}
]
}
]
}
}9.3 會話開始時注入項目上下文
settings.json 里只配置 hook 什么時候運(yùn)行、運(yùn)行什么命令;hookSpecificOutput 是該命令執(zhí)行后輸出到 stdout 的 JSON,不是直接嵌在 settings.json 里的字段。
.claude/settings.json:
{
"hooks": {
"SessionStart": [
{
"matcher": "startup|resume|clear|compact",
"hooks": [
{
"type": "command",
"command": "python3 .claude/hooks/session-context.py",
"timeout": 10
}
]
}
]
}
}matcher 匹配 source 字段,可用值如下:
| source | 含義 | 適用場景 |
|---|---|---|
| startup | 新會話啟動 | 加載項目上下文、初始化提示 |
| resume | 恢復(fù)舊會話 | 恢復(fù)會話狀態(tài)、提醒歷史上下文 |
| clear | 清空會話后重新開始 | 重新注入基礎(chǔ)規(guī)則 |
| compact | 壓縮上下文后繼續(xù) | 重新注入關(guān)鍵摘要或狀態(tài) |
SessionStart hook 收到的輸入 JSON 結(jié)構(gòu)大致如下:
{
"session_id": "session-id",
"transcript_path": "/absolute/path/to/transcript.jsonl",
"cwd": "/absolute/path/to/project",
"permission_mode": "default",
"hook_event_name": "SessionStart",
"source": "startup",
"agent_type": "default",
"model": "claude-sonnet-4-6"
}字段說明:
| 字段 | 類型 | 必填 | 說明 |
|---|---|---|---|
| session_id | string | 是 | 當(dāng)前會話 ID |
| transcript_path | string | 是 | 當(dāng)前 transcript 文件路徑 |
| cwd | string | 是 | 當(dāng)前工作目錄 |
| permission_mode | string | 否 | 當(dāng)前權(quán)限模式 |
| hook_event_name | "SessionStart" | 是 | 固定為 SessionStart |
| source | "startup" | "resume" | "clear" | "compact" | 是 | SessionStart 的觸發(fā)來源,也是 matcher 匹配字段 |
| agent_type | string | 否 | 當(dāng)前 agent 類型 |
| model | string | 否 | 當(dāng)前會話使用的模型 |
腳本 stdout 返回的完整 hookSpecificOutput JSON 結(jié)構(gòu):
{
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"additionalContext": "本倉庫是 Claude Code 恢復(fù)版源碼;修改前請優(yōu)先閱讀 README.md。",
"initialUserMessage": "請先閱讀 README.md 和 AGENTS.md,然后再開始任務(wù)。",
"watchPaths": [
"/absolute/path/to/project/README.md",
"/absolute/path/to/project/AGENTS.md"
]
}
}SessionStart.hookSpecificOutput 字段說明:
| 字段 | 類型 | 必填 | 作用 |
|---|---|---|---|
| hookEventName | "SessionStart" | 是 | 必須與當(dāng)前 hook 事件一致,否則會被視為錯誤輸出 |
| additionalContext | string | 否 | 注入給 Claude 的額外上下文,適合放項目規(guī)則、恢復(fù)提示、環(huán)境說明 |
| initialUserMessage | string | 否 | 作為會話開始時的初始用戶消息,適合自動觸發(fā)啟動任務(wù)或提醒 |
| watchPaths | string[] | 否 | 要監(jiān)聽的絕對路徑;文件變化后可觸發(fā) FileChanged hook |
最小腳本示例:
#!/usr/bin/env python3
import json
print(json.dumps({
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"additionalContext": "本項目要求修改代碼后運(yùn)行相關(guān)測試。"
}
}))9.4 用戶提交 prompt 后追加規(guī)則
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "python3 .claude/hooks/user-prompt-context.py",
"timeout": 5
}
]
}
]
}
}腳本輸出:
{
"hookSpecificOutput": {
"hookEventName": "UserPromptSubmit",
"additionalContext": "如果要修改代碼,請先檢查現(xiàn)有測試和相關(guān)實現(xiàn)。"
}
}10. 關(guān)鍵注意事項
| 注意事項 | 說明 | 建議 |
|---|---|---|
| Hooks 能執(zhí)行任意命令 | .claude/settings.json 中的 hook 是代碼執(zhí)行入口 | 只信任可信倉庫與可信配置;審查外部 PR 中的 hook 變更 |
| 交互模式可能需要 workspace trust | 未信任工作區(qū)時,交互模式下 hook 可能被跳過 | 對安全邊界不要只依賴 hook;結(jié)合權(quán)限模式和人工確認(rèn) |
| 同一事件的多個 hook 可能并行執(zhí)行 | 不應(yīng)依賴 hook 之間的執(zhí)行順序 | 需要順序時把邏輯放進(jìn)同一個腳本 |
| 默認(rèn)超時可能較長 | 工具 hook 默認(rèn)可能等待較久 | 為每個 hook 顯式設(shè)置 timeout |
| SessionEnd 要快速完成 | 結(jié)束 hook 默認(rèn)超時很短 | 只做輕量清理;重任務(wù)放到后臺或外部隊列 |
| stdout JSON 解析敏感 | stdout.trim() 以 { 開頭會按 JSON 解析 | 普通文本不要以 { 開頭;結(jié)構(gòu)化輸出確保合法 JSON |
| HTTP hook 必須返回 JSON | 空響應(yīng)會按 {} 處理,非 JSON 是錯誤 | 外部服務(wù)統(tǒng)一返回 JSON envelope |
| HTTP hook 不適合所有事件 | SessionStart / Setup 等場景不適合 HTTP hook | 初始化類邏輯優(yōu)先用 command |
| PreToolUse 可改寫輸入 | updatedInput 會影響即將執(zhí)行的工具 | 只做確定、安全、可審計的改寫 |
| PostToolUse 不應(yīng)假設(shè)能改所有輸出 | updatedMCPToolOutput 只對 MCP 工具有效 | 普通工具結(jié)果用日志或上下文提示處理 |
| async hook 后臺運(yùn)行 | 可減少等待,但結(jié)果不會同步阻塞當(dāng)前流程 | 只用于通知、審計、異步歸檔等非關(guān)鍵路徑 |
| asyncRewake 會喚醒模型 | 后臺 hook 退出碼為 2 時可注入阻塞反饋 | 謹(jǐn)慎使用,避免噪音或循環(huán)喚醒 |
| once 只運(yùn)行一次 | 執(zhí)行后 hook 會被移除 | 適合一次性初始化,不適合長期策略 |
| shell 可配置 | 支持 bash 和 powershell | 跨平臺項目要明確 shell 與路徑差異 |
11. 設(shè)計建議
| 設(shè)計原則 | 推薦做法 |
|---|---|
| 安全優(yōu)先 | 對破壞性操作使用 PreToolUse 或 PermissionRequest,但仍保留人工確認(rèn) |
| 快速失敗 | hook 內(nèi)部校驗失敗時輸出清晰原因,不要靜默失敗 |
| 最小權(quán)限 | hook 只讀取必要字段,只訪問必要文件或外部服務(wù) |
| 可觀察 | 關(guān)鍵 hook 記錄事件、決策和原因,便于排查 |
| 不依賴順序 | 多個獨(dú)立 hook 不共享隱式狀態(tài) |
| 保持輕量 | 同步 hook 只做快速檢查;耗時任務(wù)改為異步或外部隊列 |
| 配置分層 | 團(tuán)隊規(guī)則放項目級,個人偏好放用戶級或本地級 |
| 明確邊界 | 不把 hook 當(dāng)作唯一安全機(jī)制;配合權(quán)限模式、代碼審查和測試 |
12. 速查表
| 你想做什么 | 首選 hook | 執(zhí)行類型 | 返回什么 |
|---|---|---|---|
| 阻止命令執(zhí)行 | PreToolUse | command | permissionDecision: "deny" |
| 自動批準(zhǔn)權(quán)限 | PermissionRequest | command | hookSpecificOutput.decision.behavior: "allow" |
| 改寫工具輸入 | PreToolUse | command | updatedInput |
| 編輯后格式化 | PostToolUse | command | 普通輸出或 suppressOutput |
| 工具失敗后提示 | PostToolUseFailure | command / prompt | 文本建議或系統(tǒng)消息 |
| 增加用戶 prompt 上下文 | UserPromptSubmit | command | additionalContext |
| 會話開始加載上下文 | SessionStart | command | additionalContext, initialUserMessage, watchPaths |
| 響應(yīng)結(jié)束前檢查 | Stop | command / agent | decision: "block" 或退出碼 2 |
| 通知外部系統(tǒng) | Notification / TaskCompleted | http / command | {} 或通知結(jié)果 |
| 壓縮前保存狀態(tài) | PreCompact | command | 成功狀態(tài)或阻塞原因 |
| 創(chuàng)建 worktree | WorktreeCreate | command / http | stdout 路徑或 hookSpecificOutput.worktreePath |
到此這篇關(guān)于Claude Code Hooks 類型與使用指南的文章就介紹到這了,更多相關(guān)Claude Code Hooks 類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
Hooks 是用戶自定義的腳本/命令,在 Claude Code 的特定生命周期節(jié)點(diǎn)自動執(zhí)行,支持 4 種類型、4 個生命周期事件,下面小編就和大家詳細(xì)介紹一下Hook這四種類型的具體使用吧2026-06-04
Claude Code Hooks 選裝實戰(zhàn)指南
Claudede Hooks實戰(zhàn)指南,涵蓋三級攔截體系,兩腳本開箱即用,覆蓋致命、高風(fēng)險、警告三級操作,通過配置settings.json靈活定制攔截策略,支持PowerShell與原生Toast通知,適用于2026-06-03
Claude Code 每次調(diào)用工具、等待輸入、結(jié)束會話,都會觸發(fā)對應(yīng)的Hook生命周期事件,Hook 腳本除了做判斷和記錄,還可以把事件轉(zhuǎn)發(fā)到本地 socket,讓一個常駐進(jìn)程處理所有狀2026-06-02



