Hooks 系统(Hooks System)

Verified 高级 Advanced 参考型 Reference ⚡ Claude Code 专属 ⚡ Claude Code Optimized
5 min read · 238 lines

Claude Code Hooks 完整指南:25+ 生命周期事件 × 4 种处理器类型 = 确定性自动化

Hooks 系统(Hooks System)

概述

Hooks 是用户定义的自动化动作,在 Claude Code 的特定生命周期节点自动执行。它们是确定性的(不是建议性的),一旦配置就会严格执行,不会被 Claude 跳过。

四种处理器类型

1. Command(Shell 命令)

运行本地 Shell 命令,通过 stdin 接收 JSON 输入:

{
  "hooks": {
    "PreToolUse": [{
      "type": "command",
      "command": "python3 ~/.claude/hooks/lint-check.py"
    }]
  }
}

2. HTTP(网络请求)

发送 POST 请求到 URL,支持环境变量插值:

{
  "hooks": {
    "Stop": [{
      "type": "http",
      "url": "https://hooks.example.com/notify",
      "headers": {
        "Authorization": "Bearer ${API_TOKEN}"
      }
    }]
  }
}

3. Prompt(LLM 评估)

使用 Claude 模型评估条件,返回 {ok, reason}

{
  "hooks": {
    "PreToolUse": [{
      "type": "prompt",
      "prompt": "这个 Bash 命令是否安全?不允许删除操作和 rm -rf。"
    }]
  }
}

4. Agent(子代理验证)

生成具有工具访问权限的子代理进行复杂验证:

{
  "hooks": {
    "PostToolUse": [{
      "type": "agent",
      "prompt": "验证刚刚编辑的文件是否通过类型检查和 lint。",
      "tools": ["Bash", "Read"]
    }]
  }
}

生命周期事件

会话级事件

事件 触发时机 典型用途
SessionStart 会话开始或恢复 初始化环境变量、记录日志
SessionEnd 会话终止 清理资源、发送统计
InstructionsLoaded 加载 CLAUDE.md 或规则文件 调试哪些指令被加载
ConfigChange 配置文件变更 热重载配置

工具级事件

事件 触发时机 典型用途
PreToolUse 工具调用执行前(可阻止) 安全验证、参数修改
PostToolUse 工具调用成功后 自动格式化、通知
PostToolUseFailure 工具调用失败后 错误记录、自动修复
PermissionRequest 权限对话框出现 自动授权/拒绝策略

子代理事件

事件 触发时机 典型用途
SubagentStart 子代理启动 记录子代理活动
SubagentStop 子代理完成 结果验证
TeammateIdle 团队成员即将空闲 分配新任务
TaskCompleted 任务标记完成 质量门禁

上下文事件

事件 触发时机 典型用途
PreCompact 上下文压缩前 保存关键信息
PostCompact 上下文压缩后 恢复关键信息
UserPromptSubmit 用户提交提示(处理前) 输入验证、预处理
Stop Claude 完成回复 桌面通知、自动保存
Notification 发送通知 自定义通知渠道

其他事件

事件 触发时机
WorktreeCreate / WorktreeRemove 工作树创建/删除
Elicitation / ElicitationResult MCP 服务器请求用户输入

退出码行为

退出码 效果
0 成功,stdout 解析为 JSON 输出
2 阻止动作(阻止工具调用、拒绝权限、阻止停止等)
其他 非阻止错误,stderr 在详细模式下显示

PreToolUse 的 JSON 输出

PreToolUse 是最强大的 Hook 事件,可以返回权限决策和修改参数:

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "allow",
    "permissionDecisionReason": "已通过安全检查",
    "updatedInput": { "command": "npm test -- --coverage" },
    "additionalContext": "已添加覆盖率标志"
  }
}

权限决策选项:

  • allow:允许执行(跳过用户确认)
  • deny:拒绝执行
  • ask:交给用户决定

Hook 配置位置

位置 作用范围
~/.claude/settings.json 所有项目
.claude/settings.json 单个项目(可共享)
.claude/settings.local.json 单个项目(本地)
托管策略设置 组织范围
插件 hooks/hooks.json 启用插件时
技能/代理的 frontmatter 组件激活时

环境变量

Hook 脚本可使用的环境变量:

变量 说明
$CLAUDE_PROJECT_DIR 项目根目录
${CLAUDE_PLUGIN_ROOT} 插件根目录
$CLAUDE_ENV_FILE 在 SessionStart 中写入 export VAR=val 以持久化环境变量

通用输入字段

每个 Hook 都会收到包含以下字段的 JSON:

{
  "session_id": "abc123",
  "transcript_path": "/path/to/transcript.jsonl",
  "cwd": "/当前/工作/目录",
  "permission_mode": "default",
  "hook_event_name": "EventName",
  "agent_id": "agent-xyz",
  "agent_type": "AgentName"
}

实用配方

自动格式化保存的文件

{
  "hooks": {
    "PostToolUse": [{
      "type": "command",
      "command": "jq -r '.tool_input.file_path // empty' | xargs -I {} prettier --write {}",
      "matcher": { "tool_name": "Edit|Write" }
    }]
  }
}

桌面通知(Claude 完成时)

{
  "hooks": {
    "Stop": [{
      "type": "command",
      "command": "osascript -e 'display notification \"Claude 已完成\" with title \"Claude Code\"'"
    }]
  }
}

阻止危险的 Shell 命令

{
  "hooks": {
    "PreToolUse": [{
      "type": "prompt",
      "prompt": "检查这个 Bash 命令是否包含危险操作(rm -rf、git push --force、DROP TABLE 等)。如果危险则拒绝。",
      "matcher": { "tool_name": "Bash" }
    }]
  }
}

MCP 工具命名模式

MCP 工具在 Hook 中的名称格式为 mcp__<服务器名>__<工具名>,例如 mcp__memory__create_entities

相关技能 Related Skills