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 配置文件中定义。配置具有三个级别的嵌套:

  1. 选择要响应的 hook 事件,例如 PreToolUse 或 Stop

  2. 添加一个匹配器组来过滤何时触发,例如“仅适用于 Bash 工具”

  3. 定义一个或多个 hook 处理器来在匹配时运行

具体 hook 实现可参考官方文档:https://code.claude.com/docs/en/hooks-guide#reload-environment-w…

如果不知道如何手动配置,那就把网站丢给他让它给你配置就好了~!

画图不易,如果对你有帮助的可以点个小赞~

希望对你有所帮助,祝你身体健康!

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐