跳转到主要内容
每个钩子事件都会在 Agent 生命周期的特定阶段触发。使用 matcher 字段 (即一个与钩子事件 tool_name 匹配的正则表达式) 来筛选会触发你的钩子的工具调用。

PreToolUse

在工具执行触发。可用于阻止、修改工具调用,或为其添加上下文。 Stdin 数据: 示例 — 阻止危险命令:
示例——要求对 src/ 之外的写入操作进行确认: 使用一个脚本来检查工具输入并返回决策:
示例 — 在执行前重写命令: 钩子可以通过将 hookSpecificOutput.updatedInput 打印到 stdout,透明地重写工具输入 (请参阅输出格式) 。例如,一个将 shell 命令通过包装器转发的钩子脚本:
重写后的参数会在工具调用运行前合并进去——Agent 执行的是更新后的命令,而不是原始命令。

PostToolUse

在工具执行触发。可用于记录日志、验证,或触发后续操作。 Stdin 数据: 示例——记录所有 shell 命令:

PermissionRequest

当 Agent 需要进行权限判定时触发。可用它来实现自定义审批逻辑。 Stdin 数据: 示例 — 自动批准 git 命令:

UserPromptSubmit

当用户提交消息时触发。可用于添加上下文或触发工作流程。 Stdin 数据: 示例 — 在每个提示中注入上下文:
该命令会将 additionalContext 输出到 stdout 中的 hookSpecificOutput 对象内,并附带事件名称标签。该文本会被注入到 Agent 的上下文中:

Stop

当 Agent 决定停止 (结束当前回合) 时触发。可用它来添加后续指示,或防止过早停止。 Stdin 数据: 示例 — 提醒 Agent 执行测试:
注意会阻塞的 stop 钩子——如果条件始终无法满足,Agent 可能会陷入循环。

PostCompaction

在上下文压缩成功完成触发。可用于记录日志、触发后续操作,或重新注入在压缩过程中可能丢失的上下文。 Stdin 数据: 示例 — 记录压缩事件:

SessionStart

当新会话开始时触发。可用于初始化、日志记录或环境准备。 Stdin 数据: 示例 — 运行初始化脚本:
SessionStart 命令也可以通过在 hookSpecificOutput 对象中向 stdout 输出 additionalContext 来注入上下文:

SessionEnd

在会话结束时触发。可用于清理或记录最终日志。 Stdin 数据:

匹配多个事件

一个 hooks 文件可以为多个事件定义钩子:

使用 matcher

matcher 字段是一个正则表达式,用于匹配钩子事件的 tool_name。它适用于与工具相关的事件:PreToolUsePostToolUsePermissionRequest 对于非工具事件 (UserPromptSubmitStopPostCompactionSessionStartSessionEnd) ,不存在 tool_name;请使用 "" 或省略 matcher,以便钩子在该类型的每个事件上运行。
matcher 不是权限 glob。像 mcp__github__* 这样的模式可用于权限,但钩子的 matcher 使用的是正则表达式。在钩子 matcher 中,请使用 mcp__github__.*

你可以匹配的工具名称

钩子匹配器匹配的是钩子脚本通过 stdin 中的 tool_name 接收到的、同样对外可见的工具名称。具体有哪些可用工具名称,可能因 CLI 模式、模型以及启用的集成而有所不同。 最常见的公共核心工具名称包括:
  • read
  • edit
  • grep
  • glob
  • exec
MCP 服务器工具的名称格式为 mcp__<server>__<tool>。例如,github MCP 服务器中名为 create_issue 的工具会显示为 mcp__github__create_issue 对于其他工具,请匹配钩子 stdin 中显示的确切 tool_name。要确认当前会话中完整的可用工具集,请添加一个临时的 PostToolUse 钩子,将 matcher 设为 "",并记录 stdin payload。