深度

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 Skills vs CLAUDE.md vs Plugins vs Sub-agents:何时用哪个的完整决策指南Claude Code 四种扩展机制的完整决策指南:四种机制本质对比表;CLAUDE.md 适合放/不适合放的内容清单(含内容精简测试);Skills 四种模式和完整决策树;Plugins 与 Skills 的选择对比表及 Token 开销警告;Sub-agents 三种触发方式和 context: fork 对比;四种组合使用模式;以及快速决策查询表(12 个场景)。2026/5/10深度2026 企业 AI Agent 现状报告:80% 已获可量化 ROI,编程是突破口Anthropic 联合 Material 公司调研 500+ 技术领导者的《2026 State of AI Agents Report》:57% 已部署多阶段工作流;86% 在生产代码部署 Agent;80% 报告可量化 ROI;编程时间节省覆盖规划/代码生成/文档/测试各 58-59%;真实案例(Doctolib 功能交付快 40%、eSentire 威胁分析从 5 小时到 7 分钟、L'Oréal 44000 月活数据直查);三大规模化挑战;以及企业 Claude Code 四阶段部署路径。2026/5/7深度Claude Code Auto Mode 技术深度解析:两层分类器架构如何防止 AI 越权行为Anthropic 工程博客深度解析 Auto Mode 背后的技术:用户审批了 93% 的权限请求却仍有疲劳感;内部事故日志(误删远程分支/上传 GitHub Token/生产数据库误迁移);两层防御(输入层提示注入探针+输出层对话记录分类器);三层许可决策;实测数据(0.4% 误报率,17% 漏报率,附原因分析);多 Agent 传递的安全处理;以及 Deny-and-Continue 机制。2026/5/3