Hook 机制实战:让 ClaudeCode 主动通知你

引言

你有没有遇到过这样的场景?

场景 1: 多终端协作

makefile 复制代码
[你开了 3 个终端,让 AI 并行处理任务]
终端1: 正在重构用户模块...
终端2: 正在添加测试...
终端3: 正在优化性能...

[20分钟后,你回来检查]
你: "等等,哪个任务完成了?我怎么知道?"
[需要逐个终端查看,效率低下]

场景 2: 需要人工确认的关键操作

vbnet 复制代码
你: "帮我部署到生产环境"

AI: [完成打包、测试]
AI: "所有检查通过,准备部署到生产环境"
AI: ⚠️  [等待用户确认] 请输入 'deploy' 继续,或 'abort' 取消

[此时你需要收到通知,而不是一直盯着屏幕]

场景 3: 代码质量保障

vbnet 复制代码
你: "实现用户登录功能"

AI: [生成代码...]
AI: "✅ 代码已生成"

[你忘记执行代码审查...]
[代码质量有问题,需要返工]

这些问题的根源在于:

  • 缺少通知机制: 任务完成后无法及时感知,需要人工盯着
  • 缺少自动化流程: 重复性工作需要手动执行,容易遗漏

答案是 : Hook 机制

Hook(钩子)是 Claude Code 提供的事件触发机制,允许你在特定事件发生时自动执行自定义脚本或 LLM 评估。Claude Code 支持 12 种 Hook 事件类型,常见的有:

  • Stop: Claude 完成响应时触发,可用于验证任务完成、自动继续多轮工作
  • Notification: 通知发送时触发,可用于桌面/Slack 通知
  • PreToolUse: 工具执行前触发,可用于权限控制、参数修改
  • PostToolUse: 工具成功执行后触发,可用于自动代码格式化、运行 lint
  • UserPromptSubmit: 用户提交提示词前触发,可用于验证/过滤输入

核心理念 : 让 AI 在关键时刻主动通知你,而不是被动等待

本文将深入探讨 Claude Code 的 Hook 机制,让你的 AI 辅助开发体验更加自动化和高效。

阅读本文后,你将学会:

  • 理解 Hook 的工作原理和配置方式
  • 掌握所有 12 种 Hook 事件类型
  • 配置任务完成自动通知和自动化工作流
  • 掌握 Hook 的最佳实践

一、Hook 机制基础

1.1 Hook 的工作原理

**Hook(钩子)**是 Claude Code 提供的事件触发机制,允许你在特定事件发生时自动执行自定义脚本或 LLM 评估。

核心概念:

复制代码
事件发生 → 触发 Hook → 执行脚本/LLM评估 → 返回结果 → 继续或中断

Hook 的生命周期:

markdown 复制代码
1. 注册 Hook
   ↓
2. 监听事件
   ↓
3. 事件触发
   ↓
4. 执行 Hook 脚本/LLM评估
   ↓
5. 获取返回值
   ↓
6. 根据返回值决定是否继续(可阻止的 Hook)

1.2 Hook 配置方式

Hook 可以通过两种方式配置:

方式 1: 通过 /hooks 命令配置(交互式)

在 Claude Code 交互式终端中输入:

bash 复制代码
> /hooks

这会打开 Hook 管理界面,你可以:

  • 查看已配置的 Hook
  • 添加新的 Hook 规则
  • 编辑或删除现有 Hook

方式 2: 通过 JSON 配置文件(推荐)

全局配置 (~/.claude/settings.json):

json 复制代码
{
  "hooks": {
    "Stop": [{
      "hooks": [{
        "type": "prompt",
        "prompt": "Check if all tasks complete. $ARGUMENTS"
      }]
    }],
    "Notification": [{
      "matcher": "permission_prompt",
      "hooks": [{
        "type": "command",
        "command": "notify-send 'Claude Code' 'Permission needed'"
      }]
    }],
    "PostToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{
        "type": "command",
        "command": "npx prettier --write",
        "async": true
      }]
    }]
  }
}

项目级配置 (.claude/settings.json.claude/settings.local.json):

json 复制代码
{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "hooks": [{
        "type": "command",
        "command": "./.claude/hooks/validate-bash.sh"
      }]
    }]
  }
}

配置优先级:

复制代码
项目配置 > 全局配置 > 默认策略

1.3 Hook 配置类型

Hook 支持三种配置类型:

类型 用途 示例
command 执行 shell 脚本 {"type": "command", "command": "./script.sh"}
prompt 快速 LLM 评估 {"type": "prompt", "prompt": "Check if done"}
agent 完整代理验证 {"type": "agent", "prompt": "Run tests"}

二、Hook 事件类型详解

Claude Code 支持 12 种 Hook 事件类型,以下是完整说明:

2.1 Hook 类型总览

事件名称 触发时机 可阻止 用途分类
SessionStart 会话开始/恢复 初始化/上下文注入
UserPromptSubmit 用户提交提示词前 验证/过滤
PreToolUse 工具执行前 权限控制/参数修改
PermissionRequest 权限对话显示时 自动化权限决策
PostToolUse 工具成功执行后 格式化/验证
PostToolUseFailure 工具执行失败后 错误处理/告警
Notification 通知发送时 桌面/Slack 通知
SubagentStart 子代理生成时 上下文注入
SubagentStop 子代理完成时 结果验证
Stop Claude 完成响应时 自动继续/验证完成
PreCompact 上下文压缩前 备份/清理
SessionEnd 会话结束时 清理/日志

2.2 详细说明

SessionStart

触发来源 : startup(新建) | resume(恢复) | clear(/clear后) | compact(压缩后)

用途: 加载开发上下文、设置环境变量、初始化工具链

配置示例:

json 复制代码
{
  "hooks": {
    "SessionStart": [{
      "matcher": "startup",
      "hooks": [{
        "type": "command",
        "command": "echo 'Session started'"
      }]
    }]
  }
}

UserPromptSubmit

用途: 验证提示词、阻止敏感请求、添加动态上下文

输出控制 : 退出码 2 或 "decision": "block" 可阻止提示

配置示例:

json 复制代码
{
  "hooks": {
    "UserPromptSubmit": [{
      "hooks": [{
        "type": "command",
        "command": "./.claude/hooks/validate-prompt.sh"
      }]
    }]
  }
}

PreToolUse

支持匹配 : Bash | Edit | Write | Read | Glob | Grep | mcp__*

决策类型 : allow | deny | ask

配置示例:

json 复制代码
{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "hooks": [{
        "type": "command",
        "command": "./.claude/hooks/validate-bash.sh"
      }]
    }]
  }
}

PermissionRequest

用途: 在 CI/CD 或无头模式下自动批准/拒绝权限请求

配置示例:

json 复制代码
{
  "hooks": {
    "PermissionRequest": [{
      "hooks": [{
        "type": "command",
        "command": "./.claude/hooks/auto-permission.sh"
      }]
    }]
  }
}

PostToolUse

用途: 自动代码格式化、运行 lint、日志记录

配置示例:

json 复制代码
{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{
        "type": "command",
        "command": "npx prettier --write",
        "async": true
      }]
    }]
  }
}

PostToolUseFailure

用途: 错误日志记录、发送告警、故障诊断

配置示例:

json 复制代码
{
  "hooks": {
    "PostToolUseFailure": [{
      "hooks": [{
        "type": "command",
        "command": "./.claude/hooks/log-error.sh"
      }]
    }]
  }
}

Notification

通知类型 : permission_prompt | idle_prompt | auth_success | elicitation_dialog

配置示例:

json 复制代码
{
  "hooks": {
    "Notification": [{
      "matcher": "permission_prompt",
      "hooks": [{
        "type": "command",
        "command": "notify-send 'Claude Code' 'Permission needed'"
      }]
    }]
  }
}

SubagentStart

匹配值 : Bash | Explore | Plan 或自定义代理名

用途: 为子代理注入安全策略和上下文

配置示例:

json 复制代码
{
  "hooks": {
    "SubagentStart": [{
      "matcher": "Bash",
      "hooks": [{
        "type": "command",
        "command": "./.claude/hooks/inject-context.sh"
      }]
    }]
  }
}

SubagentStop

用途: 验证子代理结果,决定是否继续/停止

配置示例:

json 复制代码
{
  "hooks": {
    "SubagentStop": [{
      "hooks": [{
        "type": "prompt",
        "prompt": "Verify subagent result: $ARGUMENTS"
      }]
    }]
  }
}

Stop

用途: 验证任务完成、自动继续多轮工作

配置示例:

json 复制代码
{
  "hooks": {
    "Stop": [{
      "hooks": [{
        "type": "prompt",
        "prompt": "Check if all tasks complete. $ARGUMENTS"
      }]
    }]
  }
}

PreCompact

触发器 : manual(/compact命令) | auto(自动压缩)

用途: 备份重要上下文、清理临时文件

配置示例:

json 复制代码
{
  "hooks": {
    "PreCompact": [{
      "hooks": [{
        "type": "command",
        "command": "./.claude/hooks/backup-context.sh"
      }]
    }]
  }
}

SessionEnd

结束原因 : clear | logout | prompt_input_exit | other

用途: 清理临时文件、保存会话统计

配置示例:

json 复制代码
{
  "hooks": {
    "SessionEnd": [{
      "hooks": [{
        "type": "command",
        "command": "./.claude/hooks/cleanup.sh"
      }]
    }]
  }
}

三、实战案例

3.1 案例 1: 任务完成自动通知

需求: 多终端协作时,任务完成自动发送系统通知

实现 : 使用 Stop Hook 触发通知

步骤 1: 创建通知脚本

bash 复制代码
# ~/.claude/hooks/notify-complete.sh
#!/bin/bash

# 根据操作系统选择通知方式
OS=$(uname -s)

case "$OS" in
    Darwin)  # macOS
        osascript -e 'display notification "任务完成" with title "Claude Code"'
        ;;
    Linux)
        notify-send "Claude Code" "✅ 任务完成"
        ;;
    *)
        echo "Unsupported OS: $OS"
        ;;
esac

exit 0

步骤 2: 赋予执行权限

bash 复制代码
chmod +x ~/.claude/hooks/notify-complete.sh

步骤 3: 配置 Hook

json 复制代码
{
  "hooks": {
    "Stop": [{
      "hooks": [{
        "type": "command",
        "command": "~/.claude/hooks/notify-complete.sh"
      }]
    }]
  }
}

3.2 案例 2: 权限请求自动通知

需求: 当需要权限确认时,自动发送通知提醒

实现 : 使用 Notification Hook

配置示例:

json 复制代码
{
  "hooks": {
    "Notification": [{
      "matcher": "permission_prompt",
      "hooks": [{
        "type": "command",
        "command": "notify-send -u critical 'Claude Code' '需要权限确认'"
      }]
    }]
  }
}

3.3 案例 3: 代码自动格式化

需求: 每次编辑或写入文件后,自动运行格式化工具

实现 : 使用 PostToolUse Hook

配置示例:

json 复制代码
{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{
        "type": "command",
        "command": "npx prettier --write $ARGUMENTS",
        "async": true
      }]
    }]
  }
}

注意 : 使用 "async": true 让格式化在后台执行,不阻塞主流程。

3.4 案例 4: 任务完成验证

需求: 任务完成后自动验证是否所有任务都已完成

实现 : 使用 Stop Hook + prompt 类型

配置示例:

json 复制代码
{
  "hooks": {
    "Stop": [{
      "hooks": [{
        "type": "prompt",
        "prompt": "检查以下任务是否全部完成:\n$ARGUMENTS\n如果还有未完成的任务,请继续执行。"
      }]
    }]
  }
}

四、最佳实践

4.1 Hook 配置最佳实践

✅ DO(推荐做法)

  1. 使用项目级配置 : 项目特定的 Hook 放在 .claude/settings.local.json,不提交到 Git
  2. 异步执行耗时操作 : 对于格式化、lint 等耗时操作,使用 "async": true
  3. 合理使用 matcher: 精确匹配工具类型,避免不必要的 Hook 触发
  4. 错误处理: Hook 脚本应包含错误处理,避免因 Hook 失败影响主流程
  5. 日志记录: 重要操作记录日志,便于调试和审计

❌ DON'T(避免的做法)

  1. Hook 执行时间过长: Hook 脚本应快速执行(建议 < 5 秒),耗时操作使用异步
  2. 阻塞关键流程 : 可阻止的 Hook(如 PreToolUse)应谨慎使用,避免误拦截
  3. 敏感信息泄露: Hook 脚本中不要硬编码敏感信息,使用环境变量
  4. 过度依赖 Hook: Hook 是辅助工具,不应替代正常的权限管理和代码审查流程

4.2 Hook 类型选择指南

场景 推荐 Hook 说明
任务完成通知 Stop Claude 完成响应时触发
权限请求通知 Notification 权限对话显示时触发
代码自动格式化 PostToolUse 工具成功执行后触发
危险命令拦截 PreToolUse 工具执行前拦截
输入验证 UserPromptSubmit 用户提交前验证
错误告警 PostToolUseFailure 工具失败时告警
会话初始化 SessionStart 会话开始时加载上下文

4.3 配置管理最佳实践

1. 配置文件版本管理

bash 复制代码
# 项目级配置提交到 Git
git add .claude/settings.json
git commit -m "feat: add Claude Code hooks config"

# 全局配置不提交(个人设置)
echo "~/.claude/settings.json" >> ~/.gitignore_global

2. Hook 脚本组织

python 复制代码
.claude/
├── settings.json              # 项目配置(提交到 Git)
├── settings.local.json        # 本地配置(不提交)
└── hooks/
    ├── notify-complete.sh     # 通知脚本
    ├── validate-bash.sh       # 验证脚本
    └── auto-format.sh         # 格式化脚本

3. 调试技巧

bash 复制代码
# 测试 Hook 脚本独立运行
~/.claude/hooks/notify-complete.sh

# 查看 Hook 执行日志
tail -f ~/.claude/logs/hook-execution.log

# 使用 shellcheck 检查脚本语法
shellcheck ~/.claude/hooks/*.sh

4.4 性能优化

1. 异步执行

json 复制代码
{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{
        "type": "command",
        "command": "./format.sh",
        "async": true
      }]
    }]
  }
}

2. 精确匹配

json 复制代码
{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",  // 只匹配 Bash,不匹配其他工具
      "hooks": [...]
    }]
  }
}

3. 快速退出

bash 复制代码
#!/bin/bash
# Hook 脚本开头快速检查,不满足条件立即退出
if [ "$1" != "important-task" ]; then
    exit 0
fi
# 继续执行...

五、常见问题与调试

5.1 Hook 未触发

排查步骤:

bash 复制代码
# 1. 检查配置文件格式
jq . ~/.claude/settings.json

# 2. 检查 Hook 脚本权限
ls -l ~/.claude/hooks/*.sh
chmod +x ~/.claude/hooks/*.sh

# 3. 测试脚本独立运行
~/.claude/hooks/notify-complete.sh

# 4. 查看 Hook 执行日志
tail -f ~/.claude/logs/hook-execution.log

5.2 Hook 执行失败

调试技巧:

bash 复制代码
# 1. 添加调试输出
set -x
# 脚本内容...
set +x

# 2. 重定向错误到日志
./hook.sh 2>> ~/.claude/logs/hook-errors.log

# 3. 使用 shellcheck 检查语法
shellcheck ~/.claude/hooks/*.sh

5.3 性能问题

优化方法:

bash 复制代码
# 1. 异步执行耗时操作
command &  # 后台执行

# 2. 添加超时限制
timeout 5s ./slow-script.sh

# 3. 快速退出非关键场景
if [ "$condition" != "important" ]; then
    exit 0
fi

六、总结

6.1 核心要点回顾

通过本文,我们深入探讨了 Claude Code 的 Hook 机制:

Hook 机制

  • 原理: 事件驱动,在特定时机自动执行脚本或 LLM 评估
  • 类型: 12 种 Hook 事件类型,覆盖完整的开发生命周期
  • 配置 : 通过 /hooks 命令或 JSON 配置文件
  • 应用: 智能通知、自动化 QA、安全拦截、工作流自动化

6.2 快速配置指南

第 1 步: 创建 Hook 脚本

bash 复制代码
mkdir -p ~/.claude/hooks

cat > ~/.claude/hooks/notify-complete.sh << 'EOF'
#!/bin/bash
notify-send "Claude Code" "✅ 任务完成"
exit 0
EOF

chmod +x ~/.claude/hooks/notify-complete.sh

第 2 步: 配置 Hook

json 复制代码
{
  "hooks": {
    "Stop": [{
      "hooks": [{
        "type": "command",
        "command": "~/.claude/hooks/notify-complete.sh"
      }]
    }]
  }
}

第 3 步: 验证配置

bash 复制代码
# 启动 Claude Code
claude

# 执行一个任务,完成后应该收到通知
> 帮我创建一个 hello.txt 文件

参考资料


💡 思考题: 你的开发流程中,有哪些操作可以通过 Hook 自动化?如果让你设计一个 Hook,你会选择什么触发时机?

🔗 相关文章:


如果这篇文章对你有帮助,欢迎点赞、收藏、分享!有任何问题或建议,欢迎在评论区留言讨论。让我们一起学习,一起成长!

也欢迎访问我的个人主页发现更多宝藏资源

相关推荐
码路飞3 小时前
语音 AI Agent 延迟优化实战:我是怎么把响应时间从 2 秒干到 500ms 以内的
ai编程
jackyrongvip6 小时前
一个简单的羊毛claude-4.6最新版本的方法
ai·claude
海石6 小时前
去到比北方更北的地方—2025年终总结
前端·ai编程·年终总结
forgetAndforgive7 小时前
免费使用cc opus 4.6等顶级模型,注册送三天plus会员!白嫖活动又来了
chatgpt·ai编程
玄同7658 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
南宫乘风9 小时前
Claude Code 从 0 到 1 实战全攻略:掌握下一代编程 Agent 的核心能力
ai·claude·mcp
打破砂锅问到底00711 小时前
AI 驱动开发实战:10分钟从零构建「微信群相册」小程序
人工智能·微信·小程序·ai编程
林武11 小时前
remotion-best-practices
ai编程
敲键盘的生活13 小时前
MoneyPrinter重构之一:用nicegui调用大模型生成视频文案
python·重构·aigc·ai编程·ai写作