---
title: "Hooks"
description: "Hooks 是 Claude Code 的扩展机制——在工具调用前后注入自定义逻辑。理解四种 Hook 能力、匹配机制和安全防护。"
keywords: ["Hooks", "生命周期钩子", "拦截器", "PreToolUse", "Hook 协议"]
---

## 核心问题

Claude Code 提供了强大的内置功能，但每个团队和工作流都不同。Hooks 让你可以在关键节点注入自定义逻辑——不需要修改 Claude Code 本身。

## Hook 事件

Hooks 覆盖 Agent 生命周期的所有关键节点：

| 阶段 | 典型事件 |
|------|---------|
| **会话** | 启动、结束、初始化 |
| **用户交互** | 提交消息、停止响应 |
| **工具执行** | 工具调用前、工具调用后（成功/失败） |
| **权限** | 权限请求、权限被拒 |
| **子 Agent** | 启动、停止 |
| **压缩** | 压缩前、压缩后 |
| **协作** | Teammate 空闲、任务创建/完成 |

## 四种 Hook 能力

Hook 不仅是"执行一个脚本"——它有四种不同的能力：

### 1. 拦截操作（PreToolUse）

在工具执行前拦截，可以阻止危险操作：

```json
{
  "hookSpecificOutput": {
    "permissionDecision": "deny",
    "permissionDecisionReason": "不允许在生产分支上强制推送"
  }
}
```

### 2. 修改行为

修改工具的输入或输出：

```json
{
  "hookSpecificOutput": {
    "updatedInput": { "command": "npm test -- --bail" }
  }
}
```

PostToolUse 的 `updatedMCPToolOutput` 可以替换 MCP 工具的返回值——用于过滤敏感数据。

### 3. 注入上下文

向 AI 的对话中注入额外信息：
- `additionalContext` — 注入为用户消息，AI 可以参考
- `systemMessage` — 显示为系统警告

### 4. 控制流程

阻止 Agent 继续执行：

```json
{
  "continue": false,
  "stopReason": "构建失败，停止执行"
}
```

**设计洞察**：四种能力从"被动观察"到"主动干预"递进。最简单的 Hook 只是记录日志，最强大的 Hook 可以阻止操作、修改输入、控制流程。

## 六种 Hook 类型

| 类型 | 执行方式 | 适用场景 |
|------|---------|---------|
| `command` | Shell 命令 | 通用脚本、CI 检查 |
| `prompt` | 注入到 AI 上下文 | 代码规范提醒 |
| `agent` | 启动子 Agent | 复杂分析任务 |
| `http` | HTTP 请求 | 远程服务、Webhook |
| `callback` | 内部 JS 函数 | 系统内置 Hook |
| `function` | 运行时函数 | Agent/Skill 内部使用 |

### 异步 Hook

Hook 进程的 stdout 第一行如果是 `{"async":true}`，系统将其转为后台任务。异步 Hook 完成后通过通知机制汇报结果。

**设计考量**：有些 Hook 需要长时间运行（如"等待 CI 结果"），不应该阻塞 Agent 的执行。异步 Hook 让这些操作在后台运行，完成后再通知 Agent。

## 匹配机制

### Matcher 模式

```
"Write"              → 精确匹配
"Write|Edit"         → 多值匹配
"^Bash(git.*)"       → 正则匹配
"*" 或 ""            → 通配所有
```

### if 条件

Hook 可以指定 `if` 条件，只在特定输入时触发：

```json
{
  "command": "check-branch.sh",
  "if": "Bash(git push*)"
}
```

条件使用与权限规则相同的语法——工具名 + 参数模式。Bash 工具还会进行 AST 级别的命令解析。

### 多来源合并

Hook 从多个来源汇聚：
- settings.json 中的配置（user/project/local）
- SDK 注册的回调
- Agent/Skill 的 frontmatter
- 运行时动态注册

同一命令可能在不同层级重复出现。系统按复合键去重，保留最后合并的层级。

## 安全防护

### 工作区信任

**所有 Hook 都要求工作区信任**。这是纵深防御——防止恶意仓库的 `.claude/settings.json` 在未信任的情况下执行任意命令。

**设计哲学**：Hook 有执行任意命令的能力，这个能力不应该被不可信的来源获取。项目级配置是团队共享的，任何人都可以修改——信任检查确保只有用户明确信任的项目才能运行 Hook。

### 超时控制

Hook 有默认 10 分钟的超时限制，可以通过配置调整。超时后 Hook 进程被终止，Agent 继续执行。

## Session Hook 的生命周期

Agent 和 Skill 可以注册 session Hook，绑定到特定的 session ID。Agent 结束时自动清理——Agent A 的 Hook 不会泄漏到 Agent B 的执行中。

**设计考量**：如果不自动清理，Agent A 的 PreToolUse Hook 可能意外拦截 Agent B 的工具调用，导致难以调试的问题。

## 接下来

- **Skills** — 理解基于 Hook 的技能系统
- **MCP 配置** — 理解外部工具的注册
- **权限模型** — 理解 PreToolUse Hook 与权限系统的协作
