Skip to content

第 8 章:Hooks(自动化钩子)

本章概览

在前面的章节中,我们学习了 MCP 如何连接外部工具、Plugin 如何扩展工作流。本章要介绍的 Hooks 则解决了另一个问题——让 Claude Code 在特定事件发生时自动执行操作,无需每次手动触发。

学习目标

  • 理解什么是 Hooks,它能做什么
  • 掌握 Hooks 的事件类型
  • 学会在 settings.json 中配置 Hooks
  • 了解实用的 Hooks 场景和示例
  • 理解 Hooks 和 MCP 的区别

8.1什么是 Hooks?

8.1.1一个类比

假设你有一位勤劳的助手(Claude Code),你可以给他设定一些"规矩":

  • 每次写完代码后,自动运行代码格式化工具 -> 这就是 Hook
  • 每次修改文件后,自动运行测试 -> 这也是 Hook
  • 任务完成后,自动发一条通知给你 -> 这还是 Hook

Hooks 就是一组自动触发的规则:当某个事件发生时,自动执行你预设的命令。

8.1.2正式定义

Hooks 是 Claude Code 提供的事件驱动自动化机制。你可以配置在特定事件(如工具调用前后、任务完成时)自动执行 shell 命令,从而实现自动化工作流。

Hooks 的核心价值

  • 减少重复操作 —— 不用每次都手动提醒 Claude "记得格式化代码"
  • 保证一致性 —— 每次操作后都自动检查,不会遗漏
  • 透明可控 —— 你完全掌控什么时候执行什么命令
  • 确定性执行 —— 不同于提示词的不确定性,Hooks 是代码级别的精确执行

8.1.3Hooks vs 在 CLAUDE.md 中写规则

你可能会问:"我在 CLAUDE.md 中写'每次修改代码后运行测试'不也行吗?"

对比项CLAUDE.md 规则Hooks
执行保证Claude 可能忘记遵守100% 确定执行
执行方式Claude 自己决定如何执行精确的 shell 命令
灵活性自然语言描述,灵活但模糊精确的代码定义
适用场景软性指导和偏好硬性自动化需求

简单来说:CLAUDE.md 是"建议",Hooks 是"规矩"。


8.2Hooks 事件类型

8.2.1支持的事件

Claude Code 支持以下几种 Hook 事件:

事件名称触发时机典型用途
PreToolUseClaude 调用工具之前拦截或验证工具调用
PostToolUseClaude 调用工具之后自动格式化、运行测试
NotificationClaude 发送通知时发送自定义通知
StopClaude 完成回复/任务结束时汇总、日志记录、通知
SubagentStop子代理(subagent)完成任务时管理子代理任务
UserPromptSubmit用户提交提示词时(发送前)验证或转换用户输入
SessionStart新的 Claude Code 会话启动时初始化环境、设置工作区
PreCompact上下文压缩(compact)之前在压缩前保存关键信息

8.2.2事件流程图

用户发送请求


Claude 分析请求,决定调用某个工具

     ├── 【PreToolUse Hook 触发】── 自动执行预设命令


Claude 执行工具操作(如编辑文件)

     ├── 【PostToolUse Hook 触发】── 自动执行预设命令


Claude 继续处理或完成任务

     ├── 【Stop Hook 触发】── 自动执行预设命令


完成

8.2.3PreToolUse 详解

PreToolUse 在工具执行之前触发,你可以用它来:

  • 验证操作 —— 检查即将执行的操作是否符合规范
  • 拦截危险操作 —— 阻止某些不安全的操作
  • 准备环境 —— 在操作前做一些准备工作

可以匹配的工具名称:

工具名称说明
Write写入文件
Edit编辑文件
Bash执行 shell 命令
WebFetch获取网页内容
Glob文件搜索
Grep内容搜索
Read读取文件

8.2.4PostToolUse 详解

PostToolUse 在工具执行之后触发,你可以用它来:

  • 代码格式化 —— 每次写入文件后自动格式化
  • 运行测试 —— 每次修改代码后自动运行测试
  • 代码检查 —— 每次编辑后自动运行 linter
  • 记录变更 —— 记录每次操作的日志

8.2.5Stop 详解

Stop 在 Claude 完成整个回复或一轮对话结束时触发:

  • 发送通知 —— 任务完成后通知你
  • 生成摘要 —— 自动生成本次操作的摘要
  • 清理环境 —— 清理临时文件

8.3 配置 Hooks

8.3.1 配置文件位置

Hooks 配置写在 settings.json 文件中,和 MCP 一样分为项目级和用户级:

级别文件路径适用范围
项目级.claude/settings.json仅当前项目
用户级~/.claude/settings.json所有项目

8.3.2 配置格式

基本的配置格式如下:

json
{
  "hooks": {
    "EventName": [
      {
        "matcher": "ToolName",
        "hooks": [
          {
            "type": "command",
            "command": "shell-command-to-execute"
          }
        ]
      }
    ]
  }
}

完整配置结构说明:

json
{
  "hooks": {
    "PreToolUse": [                   // 事件名称
      {
        "matcher": "Write",           // 匹配条件(可选):匹配特定工具
        "hooks": [                    // hooks 数组:要执行的操作列表
          {
            "type": "command",        // 类型:command 表示执行 shell 命令
            "command": "echo 'About to write a file'"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",      // 可以用 | 匹配多个工具
        "hooks": [
          {
            "type": "command",
            "command": "npm run format"
          }
        ]
      }
    ],
    "Stop": [
      {
        // 没有 matcher 表示匹配所有情况
        "hooks": [
          {
            "type": "command",
            "command": "echo 'Task completed!' >> ~/claude-log.txt"
          }
        ]
      }
    ]
  }
}

8.3.3 配置字段详解

配置采用三层嵌套结构:事件 -> 匹配器组 -> hooks 数组

匹配器组(matcher group)字段:

字段类型必填说明
matcherstring正则表达式,匹配工具名称。省略则匹配所有工具
hooksarray要执行的操作列表

hooks 数组中每个元素的字段:

字段类型必填说明
typestring操作类型,见下方支持的类型列表
commandstring是(当 type 为 command 时)要执行的 shell 命令

支持的 Hook 类型(type)

  • command —— 执行 shell 命令(最常用,本章示例均使用此类型)
  • prompt —— 向 Claude 发送一条提示词,让 Claude 处理并响应
  • agent —— 生成一个独立的子代理(subagent)来执行任务,不影响主对话
  • http —— 发送 HTTP POST 请求到指定 URL(适合与 Webhook 集成)

本教程的示例主要使用 command 类型。其他类型适用于更高级的自动化场景。

matcher 匹配规则

  • "matcher": "Write" —— 精确匹配 Write 工具
  • "matcher": "Write|Edit" —— 匹配 Write 或 Edit 工具
  • "matcher": ".*" —— 匹配所有工具(和省略 matcher 效果一样)
  • 省略 matcher 字段 —— 匹配所有情况

8.3.4 Hook 命令如何获取事件数据

Hook 命令执行时,Claude Code 会通过 stdin(标准输入) 传入一个 JSON 对象,包含当前事件的详细信息。你需要在命令中解析这个 JSON 来获取所需数据(推荐使用 jq 工具)。

stdin JSON 常见字段:

JSON 字段说明适用事件
.tool_name当前工具名称PreToolUse, PostToolUse
.tool_input工具的输入参数对象PreToolUse, PostToolUse
.tool_input.file_path操作的文件路径PreToolUse, PostToolUse(文件相关工具)
.tool_input.command执行的命令PreToolUse, PostToolUse(Bash 工具)
.tool_output工具的输出结果PostToolUse
.session_id当前会话 ID所有事件
.transcript_path对话记录文件路径Stop

可用的环境变量:

环境变量说明
CLAUDE_PROJECT_DIR当前项目的根目录路径
CLAUDE_CODE_ENTRYPOINTClaude Code 的启动方式(如 clivscode 等)

重要提示

早期文档中出现的 $CLAUDE_TOOL_NAME$CLAUDE_FILE_PATH$CLAUDE_EXIT_CODE 等环境变量并不存在。所有事件数据都通过 stdin JSON 传入,请使用 jq 解析。

解析 stdin JSON 的基本模式:

bash
# 单字段提取
FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path')

# 多字段提取(注意 stdin 只能读取一次,需先保存)
INPUT=$(cat /dev/stdin)
TOOL=$(echo $INPUT | jq -r '.tool_name')
FILE_PATH=$(echo $INPUT | jq -r '.tool_input.file_path')

使用示例:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"File modified: $(cat /dev/stdin | jq -r '.tool_input.file_path')\" >> ~/claude-changes.log"
          }
        ]
      }
    ]
  }
}

8.4 实用 Hooks 示例

8.4.1 示例 1:自动代码格式化

每次 Claude 写入或编辑文件后,自动运行 Prettier 格式化:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); npx prettier --write \"$FILE_PATH\" 2>/dev/null || true"
          }
        ]
      }
    ]
  }
}

关于 2>/dev/null || true

  • 2>/dev/null —— 隐藏错误输出(比如格式化非代码文件时的报错)
  • || true —— 即使命令失败也不影响 Claude 继续工作

8.4.2 示例 2:自动运行 ESLint 检查

每次修改 JavaScript/TypeScript 文件后,自动运行 ESLint:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); if echo \"$FILE_PATH\" | grep -qE '\\.(js|ts|jsx|tsx)$'; then npx eslint \"$FILE_PATH\" --fix 2>/dev/null || true; fi"
          }
        ]
      }
    ]
  }
}

8.4.3 示例 3:自动运行测试

每次修改代码文件后,自动运行相关测试:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); if echo \"$FILE_PATH\" | grep -qE '\\.(js|ts|py)$'; then npm test 2>/dev/null || true; fi"
          }
        ]
      }
    ]
  }
}

注意

自动运行测试可能会显著拖慢 Claude 的响应速度。如果测试套件比较大,建议:

  • 只在特定文件变更时运行测试
  • 只运行相关的单元测试,而不是完整测试套件
  • 或者改用 Stop 事件,在一轮任务结束后统一运行测试

8.4.4 示例 4:任务完成通知

Claude 完成任务时发送桌面通知(macOS):

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

Windows 版本(使用 PowerShell):

json
{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "powershell -Command \"[System.Windows.MessageBox]::Show('Claude Code 任务已完成', 'Claude Code')\" 2>/dev/null || true"
          }
        ]
      }
    ]
  }
}

跨平台通知(使用 node-notifier):

json
{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "npx -y node-notifier-cli notify -t 'Claude Code' -m '任务已完成'"
          }
        ]
      }
    ]
  }
}

8.4.5 示例 5:变更日志记录

记录 Claude 所有的文件修改到日志文件:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); echo \"$(date '+%Y-%m-%d %H:%M:%S') - Modified: $FILE_PATH\" >> .claude/change-log.txt"
          }
        ]
      }
    ]
  }
}

日志文件 .claude/change-log.txt 的内容示例:

2024-01-15 14:32:15 - Modified: src/components/Login.tsx
2024-01-15 14:32:45 - Modified: src/styles/login.css
2024-01-15 14:33:10 - Modified: src/api/auth.ts
2024-01-15 14:35:00 - Modified: tests/login.test.ts

8.4.6 示例 6:Git 自动暂存

每次修改文件后,自动将文件添加到 Git 暂存区:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); git add \"$FILE_PATH\" 2>/dev/null || true"
          }
        ]
      }
    ]
  }
}

8.4.7 示例 7:PreToolUse 拦截示例

阻止 Claude 修改特定目录中的文件:

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); if echo \"$FILE_PATH\" | grep -q 'config/production'; then echo 'BLOCKED: Cannot modify production config files' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}

PreToolUse 的拦截机制

当 PreToolUse Hook 命令返回退出码 2 时,Claude Code 会阻止该工具的执行。退出码 0 表示放行,退出码 1 仅产生一条非阻塞的警告信息(工具仍会执行)。因此,要真正拦截操作请务必使用 exit 2


8.5 完整的项目配置示例

以下是一个前端项目的完整 Hooks 配置示例:

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); if echo \"$FILE_PATH\" | grep -q '.env'; then echo 'BLOCKED: Cannot modify .env files' >&2; exit 2; fi"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); if echo \"$FILE_PATH\" | grep -qE '\\.(js|ts|jsx|tsx|css|json|md)$'; then npx prettier --write \"$FILE_PATH\" 2>/dev/null || true; fi"
          },
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); if echo \"$FILE_PATH\" | grep -qE '\\.(js|ts|jsx|tsx)$'; then npx eslint \"$FILE_PATH\" --fix 2>/dev/null || true; fi"
          },
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); echo \"$(date '+%Y-%m-%d %H:%M:%S') - Modified: $FILE_PATH\" >> .claude/change-log.txt"
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "npx -y node-notifier-cli notify -t 'Claude Code' -m '任务已完成' 2>/dev/null || true"
          }
        ]
      }
    ]
  }
}

这个配置做了什么:

  1. PreToolUse:阻止 Claude 修改 .env 文件(保护敏感配置)
  2. PostToolUse(第 1 个):修改文件后自动运行 Prettier 格式化
  3. PostToolUse(第 2 个):修改 JS/TS 文件后自动运行 ESLint 修复
  4. PostToolUse(第 3 个):记录所有文件变更到日志
  5. Stop:任务完成后发送桌面通知

8.6 Hooks 与 MCP 的区别

这是很多同学容易混淆的概念,我们来做一个清晰的对比:

8.6.1 概念对比

MCP(Model Context Protocol)
├── 作用:扩展 Claude 能"做什么"
├── 方向:Claude → 外部世界
├── 触发:Claude 主动调用
└── 例子:查询 GitHub、访问数据库

Hooks(自动化钩子)
├── 作用:定义 Claude "什么时候自动做"
├── 方向:事件 → 自动执行命令
├── 触发:事件自动触发
└── 例子:写完文件后自动格式化

8.6.2 详细对比表

对比维度MCPHooks
核心功能连接外部工具和数据事件驱动的自动化
触发方式Claude 主动调用事件自动触发
配置方式mcpServers 字段hooks 字段
运行环境MCP Server 进程Shell 命令
交互方向双向(请求和响应)单向(执行命令)
典型用途访问 GitHub、数据库、API格式化、测试、通知
是否需要安装需要安装 MCP Server只需要 shell 命令

8.6.3 如何选择

需要让 Claude 获取外部信息或操作外部系统?
  → 使用 MCP
  → 例:查询数据库、操作 GitHub

需要在某个操作后自动执行固定步骤?
  → 使用 Hooks
  → 例:保存文件后自动格式化

两者可以同时使用,互不冲突!

8.7 动手实践

8.7.1 练习 1:配置自动格式化 Hook

目标:让 Claude 每次修改文件后自动运行 Prettier。

第 1 步:确认项目中有 Prettier

bash
# 检查是否安装了 Prettier
npx prettier --version
# 如果没有安装,先安装
npm install --save-dev prettier

第 2 步:创建或编辑项目配置文件

bash
# 确保 .claude 目录存在
mkdir -p .claude

编辑 .claude/settings.json

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); npx prettier --write \"$FILE_PATH\" 2>/dev/null || true"
          }
        ]
      }
    ]
  }
}

第 3 步:测试

启动 Claude Code,让它创建一个格式不好的文件:

你:帮我创建一个 test.js 文件,内容是 const x=1;const y=2;console.log(x+y),
全部写在一行

Claude:我来创建这个文件。
[创建 test.js]

观察结果——文件应该被自动格式化为:

javascript
const x = 1;
const y = 2;
console.log(x + y);

8.7.2 练习 2:配置变更日志 Hook

目标:记录 Claude 的所有文件修改操作。

编辑 .claude/settings.json

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "INPUT=$(cat /dev/stdin); TOOL=$(echo $INPUT | jq -r '.tool_name'); FILE_PATH=$(echo $INPUT | jq -r '.tool_input.file_path'); echo \"$(date '+%Y-%m-%d %H:%M:%S') [$TOOL] $FILE_PATH\" >> .claude/change-log.txt"
          }
        ]
      }
    ]
  }
}

让 Claude 做一些文件修改操作,然后查看日志:

bash
cat .claude/change-log.txt
# 输出示例:
# 2024-01-15 14:32:15 [Write] src/index.js
# 2024-01-15 14:32:45 [Edit] src/styles.css
# 2024-01-15 14:33:10 [Write] README.md

8.7.3 练习 3:配置安全防护 Hook

目标:阻止 Claude 修改敏感配置文件。

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); if echo \"$FILE_PATH\" | grep -qE '(\\.env|\\.secret|credentials|password)'; then echo 'BLOCKED: 不允许修改敏感文件' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}

测试:

你:帮我在 .env 文件中添加一行 API_KEY=test123

Claude:抱歉,修改 .env 文件的操作被 Hook 拦截了。
根据项目安全配置,我无法修改敏感文件(如 .env、.secret 等)。
请手动修改这些文件。

8.8 Hooks 最佳实践

8.8.1 命令设计原则

1. 【快速执行】
   Hook 命令应该快速完成,避免耗时操作
   ✅ npx prettier --write file.js    (秒级完成)
   ❌ npm run build                    (可能需要几分钟)

2. 【容错处理】
   始终添加错误处理,避免 Hook 失败影响 Claude
   ✅ command ... 2>/dev/null || true
   ❌ command ...  (失败会导致问题)

3. 【条件过滤】
   只对相关文件执行操作
   ✅ 检查文件扩展名后再运行 linter
   ❌ 对所有文件都运行 linter

4. 【幂等性】
   命令执行多次应该得到相同结果
   ✅ prettier --write(多次格式化结果一样)
   ✅ git add file(多次添加没有副作用)

8.8.2 性能考虑

避免 Hook 成为性能瓶颈

  • 每次 Claude 调用工具都会触发 Hook,如果 Hook 太慢会严重影响体验
  • 建议 Hook 命令在 1-2 秒内完成
  • 避免在 PostToolUse 中运行完整的测试套件
  • 如果需要运行耗时操作,考虑放在 Stop 事件中(只执行一次)

8.8.3 调试 Hooks

如果 Hook 没有按预期工作:

bash
# 1. 检查配置文件格式是否正确
cat .claude/settings.json | python -m json.tool

# 2. 手动测试命令(模拟 stdin JSON)
echo '{"tool_name":"Write","tool_input":{"file_path":"test.js"}}' | bash -c 'FILE_PATH=$(cat /dev/stdin | jq -r ".tool_input.file_path"); npx prettier --write "$FILE_PATH"'

# 3. 检查命令是否存在
which prettier
which eslint

# 4. 查看 Claude Code 的日志输出
# 当 Hook 执行失败时,Claude Code 通常会在对话中显示错误信息

8.9 进阶:组合 Hooks 与 MCP

Hooks 和 MCP 可以配合使用,形成强大的自动化工作流:

8.9.1 场景示例

配置:
- MCP: GitHub Server(让 Claude 能操作 GitHub)
- Hook: Stop 事件发送 Slack 通知

工作流:
1. 你让 Claude 帮你创建一个 GitHub Issue
2. Claude 通过 MCP 调用 GitHub Server 创建 Issue
3. 任务完成后,Stop Hook 自动发送 Slack 通知
4. 你的团队在 Slack 中收到通知

8.9.2 完整的协作配置

json
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
      }
    }
  },
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "FILE_PATH=$(cat /dev/stdin | jq -r '.tool_input.file_path'); npx prettier --write \"$FILE_PATH\" 2>/dev/null || true"
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$(date): Claude Code 任务完成\" >> ~/.claude/activity.log"
          }
        ]
      }
    ]
  }
}

8.10 常见问题

8.10.1 Hook 命令失败会怎样?

  • PostToolUse / Stop / Notification:命令失败不会影响 Claude 继续工作,但你可能会看到错误输出
  • PreToolUse:命令返回退出码 2阻止工具执行,用于实现安全拦截;退出码 1 仅产生一条警告但不会阻止工具执行;退出码 0 表示正常放行

8.10.2 多个 Hook 的执行顺序

如果同一个事件配置了多个 Hook:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          { "type": "command", "command": "echo 'first'" },
          { "type": "command", "command": "echo 'second'" },
          { "type": "command", "command": "echo 'third'" }
        ]
      }
    ]
  }
}

它们会按照在数组中的顺序依次执行:first -> second -> third。

8.10.3 Hook 命令可以访问什么?

Hook 命令在你当前项目目录下执行,它可以:

  • 通过 stdin 读取事件的 JSON 数据(使用 jq 解析)
  • 访问 CLAUDE_PROJECT_DIRCLAUDE_CODE_ENTRYPOINT 环境变量
  • 访问项目中的所有文件
  • 使用系统中安装的任何命令行工具
  • 执行 npm/npx 命令

8.11 本章小结

在本章中,我们学习了:

  1. Hooks 的概念 —— 事件驱动的自动化机制
  2. 事件类型 —— PreToolUse、PostToolUse、Stop、Notification、UserPromptSubmit、SessionStart 等
  3. 配置方法 —— 在 settings.json 的 hooks 字段中配置
  4. 实用场景 —— 自动格式化、自动测试、通知、日志记录、安全拦截
  5. 与 MCP 的区别 —— MCP 扩展能力,Hooks 自动化流程
  6. 最佳实践 —— 快速执行、容错处理、条件过滤

下一步

在下一章中,我们将学习 权限与安全,深入了解如何控制 Claude Code 的权限级别,保护你的项目和数据安全。权限系统和 Hooks 的安全拦截功能是互补的——权限系统控制"Claude 能做什么",Hooks 拦截可以实现更细粒度的"哪些具体操作不允许"。