教程

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 完全指南:五大自动化场景、三类 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 自定义斜杠命令完全指南:用 /命令 封装常用工作流Claude Code 自定义斜杠命令(slash commands)完整教程:命令文件创建位置(.claude/commands/)、Markdown 格式规范、$ARGUMENTS 参数传递、项目级命令 vs 用户全局命令的区别、实用命令示例(/review、/test、/deploy-check、/refactor、/standup)、命令组合调用,以及如何在团队中共享和版本管理自定义命令。2026/3/18教程Claude Code Skills 自定义命令:打造你的团队专属 AI 工作流Claude Code Skills 自定义命令完整教程:Skills vs CLAUDE.md 使用场景对比、内置 Skills 速览(/batch/simplify/loop)、SKILL.md 文件格式与 Frontmatter 配置、四大实用 Skills 示例(代码审查/部署检查/功能开发/团队 OnBoarding)、传参方式、子代理执行与 Git 团队共享。2026/3/14教程Claude Code + GitHub Actions:自动化代码审查与 CI/CD 集成完全指南Claude Code GitHub Actions 完整配置指南:5 分钟快速安装(GitHub App + API Key Secret + Workflow 文件)、四大使用场景(按需 PR 审查/Issue 自动实现/快速修复/自动 Changelog)、每 PR 自动触发审查配置、高级参数(模型/轮数/工具限制/AWS Bedrock)与安全最佳实践。2026/3/13