本页面提供在 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
- Web 操作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 | 不适用,仅向用户显示 stderr |
UserPromptSubmit | 阻止提示处理,擦除提示,仅向用户显示 stderr |
Stop | 阻止停止,向 Claude 显示 stderr |
SubagentStop | 阻止停止,向 Claude 子代理显示 stderr |
PreCompact | 不适用,仅向用户显示 stderr |
SessionStart | 不适用,仅向用户显示 stderr |
SessionEnd | 不适用,仅向用户显示 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 执行详情: