深度

Claude Code Hooks 完整参考:18 种 Hook 事件、配置 Schema、退出码与异步 Hook

Claude Code Hooks 完整技术参考:18 种 Hook 事件生命周期表(SessionStart/InstructionsLoaded/UserPromptSubmit/PreToolUse/PermissionRequest/PostToolUse/PostToolUseFailure/Notification/SubagentStart/SubagentStop/Stop/TeammateIdle/TaskCompleted/ConfigChange/WorktreeCreate/WorktreeRemove/PreCompact/SessionEnd)、配置结构(settings.json 完整 Schema)、四种 Hook 类型(command/http/prompt/agent)字段详解、Matcher 模式(工具/Bash 命令/MCP 服务器)、输入 stdin JSON 格式、退出码含义(0/2/非零)和每种事件退出码 2 效果、结构化 JSON 输出(permissionDecision/updatedInput/Stop decision/SessionStart env 注入)、异步 Hook(background: true 不阻塞/适用场景)、Prompt-based Hook、WorktreeCreate 自定义 worktree 和调试方法。

2026/3/96分钟 阅读ClaudeEagle

本文是 Claude Code Hooks 系统的完整技术参考。Hooks 是用户定义的 Shell 命令、HTTP 端点或 LLM Prompt,在 Claude Code 生命周期的特定节点自动执行。如需快速上手示例,请先阅读Hooks 实战指南

Hook 生命周期概览

事件触发时机
SessionStart会话开始或恢复时
InstructionsLoadedCLAUDE.md 或 .claude/rules/*.md 加载到上下文时
UserPromptSubmit用户提交提示词后,Claude 处理前
PreToolUse工具调用执行前(可阻止)
PermissionRequest权限对话框出现时
PostToolUse工具调用成功后
PostToolUseFailure工具调用失败后
NotificationClaude Code 发送通知时
SubagentStartSubagent 启动时
SubagentStopSubagent 结束时
StopClaude 完成响应时
TeammateIdleAgent 团队成员即将进入空闲时
TaskCompleted任务被标记为完成时
ConfigChange会话中配置文件变更时
WorktreeCreateWorktree 创建时(替换默认 git 行为)
WorktreeRemoveWorktree 被删除时
PreCompact上下文压缩前
SessionEnd会话结束时

配置结构

json
// settings.json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": ".claude/hooks/check-cmd.sh"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write $CLAUDE_TOOL_INPUT_PATH",
            "background": true
          }
        ]
      }
    ]
  }
}

Hook 处理器字段

通用字段

字段说明
type"command""http""prompt""agent"
backgroundtrue = 异步运行,不等待结果(见下文)

Command Hook 字段

字段说明
command要执行的 Shell 命令字符串
timeout超时秒数(默认无限制)

HTTP Hook 字段

字段说明
url目标端点(必须是 allowedHttpHookUrls 中允许的 URL)
methodHTTP 方法(默认 POST
headers请求头对象
timeout超时秒数

Prompt 和 Agent Hook 字段

字段说明
prompt传给 LLM 的提示词(prompt 类型)
agentAgent 名称(agent 类型)
model使用的模型(默认 Haiku)

Matcher 模式

Matcher 控制哪些事件触发 Hook:

json
{ "matcher": "Edit|Write" }         // 匹配 Edit 或 Write 工具
{ "matcher": "Bash(git *)" }         // 匹配 git 开头的 Bash 命令
{ "matcher": "mcp__github" }         // 匹配 github MCP 服务器所有工具
{ "matcher": "mcp__github__create_issue" }  // 匹配特定 MCP 工具
{ "matcher": "" }                    // 匹配所有(等同 *)

Hook 输入/输出

输入(stdin / POST body)

Command Hook 通过 stdin 接收 JSON:

json
{
  "hook_event_name": "PreToolUse",
  "session_id": "abc123",
  "tool_name": "Bash",
  "tool_input": { "command": "npm test" }
}

退出码含义

退出码含义
0成功,继续执行
2阻止当前工具调用(仅 PreToolUse
其他非零显示错误但继续

每种事件的退出码 2 行为

事件退出码 2 效果
PreToolUse阻止工具调用
UserPromptSubmit阻止将提示词发给 Claude
Stop阻止 Claude 停止(让 Claude 继续运行)
TeammateIdle阻止成员进入空闲
TaskCompleted阻止任务标记为完成

JSON 输出(结构化决策)

Command Hook 的 stdout 如果是有效 JSON,Claude Code 解析为结构化输出:

json
// PreToolUse:拒绝工具调用
{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "deny",
    "permissionDecisionReason": "危险命令已被拦截"
  }
}

// PreToolUse:允许并修改输入
{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "allow",
    "updatedInput": { "command": "npm test 2>&1 | grep -E '(FAIL|ERROR)' | head -50" }
  }
}

// Stop:要求 Claude 继续
{
  "hookSpecificOutput": {
    "hookEventName": "Stop",
    "decision": "block",
    "reason": "请先运行测试套件再停止"
  }
}

SessionStart:持久化环境变量

SessionStart Hook 可以在 JSON 输出中设置环境变量,这些变量会被注入到该会话的所有后续工具调用中:

json
{
  "hookSpecificOutput": {
    "hookEventName": "SessionStart",
    "env": {
      "PROJECT_ENV": "production",
      "DATABASE_URL": "postgresql://..."
    }
  }
}

异步 Hook(background: true)

异步 Hook 不阻塞 Claude Code 执行流程:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/run-tests.sh",
            "background": true
          }
        ]
      }
    ]
  }
}

异步 Hook 行为

  • Hook 在后台启动,Claude Code 立即继续
  • 后台进程 stdout/stderr 不进入 Claude 上下文
  • 退出码被忽略(不能阻止工具调用)
  • 适合:运行测试、发送通知、记录日志

示例:文件变更后在后台运行测试:

bash
#!/bin/bash
# ~/.claude/hooks/run-tests.sh
FILE=$(cat /dev/stdin | jq -r '.tool_input.path // empty')
if [[ "$FILE" == *.ts ]] || [[ "$FILE" == *.js ]]; then
  cd "$(git rev-parse --show-toplevel)"
  npm test --silent > /tmp/test-results.log 2>&1 || true
  echo "Test run complete: $(tail -1 /tmp/test-results.log)" >> /tmp/hook-log.txt
fi

Prompt-based Hook

使用 LLM 评估条件,适合需要判断力而非规则的场景:

json
{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "prompt",
            "prompt": "Review the work done this session. If all tests pass and documentation is updated, allow stop. Otherwise block and explain what's missing.",
            "model": "haiku"
          }
        ]
      }
    ]
  }
}

Prompt Hook 响应 Schema:

json
{
  "decision": "allow",     // allow | block
  "reason": "可选原因"
}

WorktreeCreate Hook(自定义 Worktree 创建)

WorktreeCreate Hook 完全替换 Claude Code 的默认 git worktree 创建行为:

json
{
  "hooks": {
    "WorktreeCreate": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/create-worktree.sh"
          }
        ]
      }
    ]
  }
}

Hook 输出(指定 worktree 路径):

json
{
  "hookSpecificOutput": {
    "hookEventName": "WorktreeCreate",
    "worktreePath": "/path/to/custom/worktree"
  }
}

调试 Hook

bash
# 启用 Hook 调试日志
export CLAUDE_CODE_HOOK_DEBUG=1
claude

# 查看 Hook 输出
# 检查 /tmp/hook-debug.log(自己在脚本中写)

通过 /hooks 菜单查看已配置的 Hook;在设置中临时禁用 Hook 调试问题。


原文:Hooks reference - Claude Code Docs | 来源:Anthropic 官方文档

相关文章推荐

深度Claude Code Hooks 深度参考:事件类型、配置结构与高级用法Claude Code Hooks 完整参考文档:17 种生命周期事件详解、三层嵌套配置结构、Matcher 正则表达式模式、Shell/HTTP/Prompt 三类处理器、MCP 工具 Hook 匹配、异步 Hook 配置,以及阻止危险命令的完整实战示例。2026/2/28深度OpenClaw Hooks 自动化进阶:消息前后的智能拦截、转换与触发机制OpenClaw Hooks(钩子)自动化系统进阶教程:Hooks 的触发时机(before-send/after-receive/on-tool-call)、用 Hooks 拦截消息并修改内容(自动翻译/过滤/格式化)、基于条件的 Hook 触发(渠道过滤/关键词匹配)、Hook 中调用外部 API(Notion 记录/Bark 通知/监控告警)、exec 工具二次确认 Hook,以及 Hooks 与 SOUL.md 和 Standing Orders 的优先级关系详解。2026/3/26深度Claude Code 权限系统深度解析:规则语法、5 种权限模式与 Hooks 扩展Claude Code 权限系统完整解析:三层工具类型(只读/Bash/文件修改)审批规则、/permissions 管理界面(Allow/Ask/Deny 规则 deny→ask→allow 优先顺序)、5 种权限模式(default/acceptEdits/plan/dontAsk/bypassPermissions 及禁用方式)、权限规则语法(Tool/Tool(specifier)/通配符/空格边界规则/Shell 操作符感知)、四种路径前缀格式(//绝对路径/~/home/项目根/相对)、MCP 工具和 Agent 权限规则、WebFetch 网络控制局限性(无法阻止 Bash curl)及三种可靠 URL 过滤方案、PreToolUse Hooks 扩展权限、工作目录扩展(--add-dir/additionalDirectories),以及权限与沙箱互补关系和两个配置示例。2026/3/9深度Claude Code 最佳实践 2026:资深用户总结的 20 个效率提升技巧Claude Code 资深用户总结的 20 个实用最佳实践:上下文管理技巧(精准投喂 vs 全量读取)、CLAUDE.md 高价值写法、自定义命令的场景化设计、权限配置的最小化原则、子代理并行的触发时机、会话压缩与续接的使用策略、与 Git 工作流的结合方式、代码审查的标准提示词、让 Claude 解释而不只是修改代码的技巧、以及避免 Claude「过度自信」的提示词防护模式。2026/3/21深度Claude Code 重构策略完全指南:大型项目安全重构的 AI 辅助方法论Claude Code 辅助代码重构的完整方法论:重构前的安全网搭建(特征测试/快照测试)、渐进式重构策略(不要一次大改)、让 Claude 识别并命名坏味道(Long Method/God Class/Shotgun Surgery)、提取函数/类/模块的标准流程、依赖注入重构(方便测试)、数据库层重构(Repository 模式迁移)、重构进度追踪与 CLAUDE.md 配置,以及大型单体应用向微服务迁移的 AI 辅助路径。2026/3/21深度Claude Code 上下文窗口管理完全指南:100 万 Token 的高效利用策略Claude Code 超长上下文(100万 Token)完整使用指南:上下文窗口的构成(系统提示/工具定义/对话历史/当前请求)、会话压缩(Compaction)的触发机制与配置、--continue 跨会话续接上下文、如何避免上下文溢出、超大代码库的分批处理技巧、Prompt Caching 配合长上下文降低成本,以及 Token 计数工具的使用方法。2026/3/18