教程

Claude Code Hooks 实战指南:自动格式化、桌面通知与文件保护

Claude Code Hooks 实战指南:5 大场景(桌面通知、自动格式化、文件保护、压缩后注入上下文、配置审计)的完整配置,Hook 输入/输出 JSON 格式,事件类型(PreToolUse/PostToolUse/Notification/PostCompact),以及提示型和 Agent 型 Hook。

2026/3/24分钟 阅读ClaudeEagle

Hooks 是 Claude Code 的自动化机制:在 Claude 生命周期的关键节点自动执行你的 Shell 命令。确保某些操作总是发生——而不是依赖 LLM 去记得执行。

Hooks vs Skills vs 子代理

方式适用场景
Hooks确定性规则,总是执行(格式化、保护文件)
Skills给 Claude 增加指令或可执行命令
子代理在隔离上下文中运行任务
提示型 Hooks需要 AI 判断的条件(分析变更质量)

快速创建第一个 Hook

在 Claude Code 中输入 /hooks,进入交互式菜单:

  1. 选择 Hook 事件类型
  2. 设置匹配条件(* 表示全部)
  3. 输入要执行的 Shell 命令
  4. 选择存储位置(用户设置或项目设置)

5 大实用场景

1. Claude 需要输入时发桌面通知

让 Claude 工作时你可以去做别的,完成后自动弹通知:

macOS:

json
{
  "hooks": {
    "Notification": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Claude 需要你的注意\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}

Linux:

json
{
  "hooks": {
    "Notification": [
      {
        "matcher": "*",
        "hooks": [
          { "type": "command", "command": "notify-send 'Claude Code' 'Claude 需要你的注意'" }
        ]
      }
    ]
  }
}

2. 编辑后自动格式化代码

每次 Claude 修改文件后自动运行格式化工具:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "cd $CLAUDE_PROJECT_DIR && npx prettier --write $CLAUDE_TOOL_RESULT_FILE_PATH 2>/dev/null || true"
          }
        ]
      }
    ]
  }
}

也可以按文件类型匹配:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "matchers": [
          { "tool_input.file_path": { "pattern": ".*\\.py$" } }
        ],
        "hooks": [
          { "type": "command", "command": "black $CLAUDE_TOOL_RESULT_FILE_PATH" }
        ]
      }
    ]
  }
}

3. 保护关键文件不被修改

阻止 Claude 修改 .env、密钥文件等:

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "matchers": [
          { "tool_input.file_path": { "pattern": ".*\.env.*|.*secret.*|.*credential.*" } }
        ],
        "hooks": [
          {
            "type": "command",
            "command": "echo '{\"decision\": \"block\", \"reason\": \"Protected file - cannot modify env/secret files\"}'"
          }
        ]
      }
    ]
  }
}

4. 压缩后重新注入上下文

/compact 后某些关键信息会丢失,用 Hook 自动补回:

json
{
  "hooks": {
    "PostCompact": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "echo '当前分支:'$(git branch --show-current)',项目:'$CLAUDE_PROJECT_DIR"
          }
        ]
      }
    ]
  }
}

5. 审计配置变更

记录所有配置文件修改到日志:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "matchers": [
          { "tool_input.file_path": { "pattern": ".*\.json$|.*\.yaml$|.*\.yml$" } }
        ],
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$(date): Modified $CLAUDE_TOOL_RESULT_FILE_PATH\" >> ~/.claude-audit.log"
          }
        ]
      }
    ]
  }
}

Hook 工作原理

输入

Hook 命令通过标准输入接收 JSON 数据:

json
{
  "tool_name": "Write",
  "tool_input": {
    "file_path": "/path/to/file.py",
    "content": "..."
  },
  "session_id": "xxx"
}

输出

Hook 通过标准输出返回结果(可选):

json
{ "decision": "approve" }         // 允许操作
{ "decision": "block", "reason": "Protected" }  // 阻止操作
{ "message": "注意:该文件已被修改" }  // 给 Claude 的消息

非零退出码通常表示警告但不阻止操作(取决于 Hook 类型)。

Hook 事件类型

事件触发时机
PreToolUse工具执行前
PostToolUse工具执行后
NotificationClaude 需要输入时
PostCompact上下文压缩后
SessionStart会话开始时

配置位置

范围文件位置
用户(所有项目)~/.claude/settings.json
项目(团队共享).claude/settings.json
本地项目(不提交).claude/settings.local.json

高级:提示型和 Agent 型 Hook

需要 AI 判断时,可以用提示型 Hook:

json
{
  "type": "prompt",
  "prompt": "审查这次文件修改,如果有安全问题就阻止并说明原因"
}

或 Agent 型 Hook(启动一个子代理做复杂分析):

json
{
  "type": "agent",
  "agent": "security-reviewer"
}

常见问题

Hook 没有触发?

  • 检查事件类型是否正确
  • 确认 matcher 模式是否匹配
  • 运行 /hooks 查看已配置的 Hook 列表

Stop Hook 一直运行?

  • Stop hook 必须在有限时间内返回,否则 Claude Code 无法关闭
  • 设置命令超时:timeout 5 your-command

JSON 验证失败?

  • Hook 输出必须是合法 JSON(如果有输出的话)
  • echo 输出而不是 Shell 扩展字符串

原文:Automate workflows with hooks | 来源:Anthropic 官方文档

相关文章推荐

教程Claude Code Hooks 实战指南:5 大自动化场景、三种 Hook 类型与故障排查Claude Code Hooks 实战指南:/hooks 交互菜单四步创建桌面通知 Hook、5 大常用自动化场景(等待通知/编辑后 Prettier 格式化/退出码 2 阻止受保护文件/PostCompact 重注入上下文/ConfigChange 审计日志)、四种 Hook 类型(command/prompt-based/agent-based/HTTP Webhook)、输入/输出机制(stdin JSON/stdout 注入上下文/退出码 0 继续/2 阻止/非零警告)、结构化 JSON 输出、Matcher 过滤器语法(Edit|Write/Bash(git *)/*/空字符串)、四级存储位置,以及五大故障排查方法和调试技巧。2026/3/8教程Claude Code Hooks 完全实战指南:自动化你的编码工作流Claude Code Hooks 完整实战指南:6 种 Hook 事件类型(PreToolUse/PostToolUse/PreCompact/PermissionDenied/Stop/SubagentStop);8 个完整配置示例(文件修改后自动 lint+格式化/TypeScript 类型检查/git commit 前强制测试/危险命令阻断/Auto Mode 拒绝通知/MCP 工具调用/PreCompact 快照/条件 hooks);Hook 脚本环境变量说明;以及 5 个最佳实践(|| true 防误报/输出简洁/脚本快速/exit 1 明确阻断/逻辑放独立脚本)。2026/5/6教程Claude Code Hooks 深度实战:5 个真实案例教你用自动化消灭重复工作Claude Code Hooks 完整实战指南:配置文件结构(.claude/hooks/)、四种触发时机(post_write/pre_commit/session_start/session_end),以及 5 个完整案例:自动 Lint+格式化、修改后运行相关测试、TypeScript 类型检查、提交前安全扫描、Session 开始加载工作状态。含 on_error 策略选择。2026/4/22教程Claude Code Hooks 完全指南:五大自动化场景、三类 Hook 类型与 JSON 输入输出规范Claude Code Hooks 完整指南:30 秒创建第一个 Hook(/hooks 交互菜单)、五大常用场景(通知/自动格式化/保护文件/压缩后注入上下文/审计配置变更)、六个生命周期事件(PreToolUse/PostToolUse/Notification/PostCompact/SessionStart/Stop)、四类 Hook 类型(Command/Prompt/Agent/HTTP)、JSON 输入输出规范(decision/reason/output/updatedInput)、Matcher 过滤语法,以及五大故障排查方法。2026/3/6教程Claude Code Hooks 完全指南:自动化工作流的利器Claude Code Hooks 是在工具执行生命周期特定节点触发自定义脚本的机制。本文涵盖全部 17 种 Hook 事件,配置格式、实战案例(阻止危险命令、自动 lint、任务通知),以及异步 Hook 用法和最佳实践,助你构建强大的自动化工作流。2026/2/27教程Claude Code 自定义 Agents 完整指南:创建专用 AI 编程助手Claude Code 自定义 Agents 完整指南:Agent 定义文件格式(Frontmatter 字段:name/description/tools/permissionMode/model/effort/context);4 种调用方式(/agents 界面/--agent CLI/对话提及/Print 模式自动化);4 个实战 Agent 配置(安全审查员/数据库优化顾问/无障碍合规检查/TypeScript 类型安全/CI 失败分析师);skillOverrides 控制可见性;context: fork 独立上下文;以及在 GitHub Actions 里使用 Agent 的 CI 配置示例。2026/5/7