【Claude Code】带你了解 Hook 概念、生命周期及详细配置指南
Hooks
概念
学习概念最好的方法就是参考官方文档:code.claude.com/docs/en/hooks
以下内容全都基于官方文档解释总结
Hooks 是用户定义的 shell 命令、HTTP 端点或 LLM 提示,它们在 Claude Code 的生命周期中的特定点自动执行。用于参考查找事件模式、配置选项、JSON 输入/输出格式以及异步 hooks、HTTP hooks 和 MCP 工具 hooks 等高级功能。
生命周期(Lifecycle)
Hook 在 Claude Code 会话的特定时间点触发。当事件被触发且匹配器匹配时,Claude Code 会将关于该事件的 JSON 上下文传递给您的钩子处理器。
- 对于命令 Hook,输入会通过标准输入(stdin)到达
- 对于 HTTP Hook,输入会作为 POST 请求体到达
然后你的处理器可以检查输入、采取行动,并可选择返回一个决策。
事件分为三种节奏:每次会话一次( SessionStart , SessionEnd )、每次回合一次( UserPromptSubmit , Stop , StopFailure ),以及在每个工具调用中(在代理循环内)( PreToolUse , PostToolUse ),如图:

执行时间
下表总结了每个事件触发的时间。Hooks 事件部分记录了每个事件的完整输入模式和决策控制选项。
| Event | 触发时机 |
|---|---|
SessionStart |
当会话开始或恢复 |
UserPromptSubmit |
当你提交提示词,在 Claude 处理它之前 |
PreToolUse |
在工具调用执行之前。可能会阻止它 |
PermissionRequest |
当权限对话框出现时 |
PermissionDenied |
当自动模式分类器拒绝工具调用时,返回 {retry: true} 告诉模型它可以重试被拒绝的工具调用 |
PostToolUse |
工具调用成功后 |
PostToolUseFailure |
工具调用失败后 |
Notification |
当 Claude Code 发送通知时 |
SubagentStart |
当子代理被创建时 |
SubagentStop |
当子代理完成时 |
TaskCreated |
当任务通过 TaskCreate 创建时 |
TaskCompleted |
当任务被标记为完成时 |
Stop |
当 Claude 完成响应 |
StopFailure |
当本轮交互因API 错误而终止时触发,此时输出内容及退出码将被忽略 |
TeammateIdle |
当代理团队的队友即将进入空闲状态 |
InstructionsLoaded |
当 CLAUDE.md 或 .claude/rules/*.md 加载至上下文时触发;会话启动及会话中文件懒加载时均会触发 |
ConfigChange |
当会话期间配置文件发生变化时触发 |
CwdChanged |
工作目录发生变更时触发(例如 Claude 执行 cd 命令),可搭配 direnv 等工具实现响应式环境管理。 |
FileChanged |
当磁盘上的被监听文件发生变更时触发,匹配器字段用于指定需要监听的文件名称。 |
WorktreeCreate |
通过 --worktree 参数或 isolation: “worktree” 配置创建 Git 工作区时触发该行为会替换 Git 的默认逻辑 |
WorktreeRemove |
移除 Git 工作区时触发,触发时机为会话退出或子代理执行完毕后 |
PreCompact |
在上下文压缩之前触发 |
PostCompact |
上下文压缩完成后触发 |
Elicitation |
MCP 服务器在工具调用过程中请求用户输入时触发 |
ElicitationResult |
用户响应 MCP 信息征询后、响应结果回传至服务器前触发 |
SessionEnd |
会话结束时触发 |
如何解析
要了解这些部分如何协同工作,可以以 PreToolUse 钩子举例,它用于阻止破坏性 shell 命令。 matcher 会缩小到 Bash 工具调用,而 if 条件会进一步缩小到以 rm 开头的命令,因此 block-rm.sh 只会在两个过滤器都匹配时才会触发
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"if": "Bash(rm *)",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-rm.sh"
}
]
}
]
}
}
该脚本从标准输入读取 JSON 输入,提取命令,如果包含 rm -rf ,则返回 permissionDecision 的 “deny” :
#!/bin/bash
# .claude/hooks/block-rm.sh
COMMAND=$(jq -r '.tool_input.command')
if echo "$COMMAND" | grep -q 'rm -rf'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "Destructive command blocked by hook"
}
}'
else
exit 0 # allow the command
fi
现在假设 Claude Code 决定运行 Bash “rm -rf /tmp/build” 。以下是解析流程图

如何配置
Hooks 在 JSON 配置文件中定义。配置具有三个级别的嵌套:
-
选择要响应的 hook 事件,例如 PreToolUse 或 Stop
-
添加一个匹配器组来过滤何时触发,例如“仅适用于 Bash 工具”
-
定义一个或多个 hook 处理器来在匹配时运行
具体 hook 实现可参考官方文档:https://code.claude.com/docs/en/hooks-guide#reload-environment-w…
如果不知道如何手动配置,那就把网站丢给他让它给你配置就好了~!
画图不易,如果对你有帮助的可以点个小赞~
希望对你有所帮助,祝你身体健康!
更多推荐

所有评论(0)