news 2026/4/23 1:46:18

Claude Code Hooks 实战:用钩子打造自动化工作流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Claude Code Hooks 实战:用钩子打造自动化工作流

Claude Code 的 Hooks 系统允许你在特定事件发生时自动执行脚本。比如在写入文件后自动格式化、在执行命令前做安全检查、在会话结束时发送通知。本文通过 7 个完整的实战案例,带你掌握 Hooks 的高级用法。

一、Hooks 基础概念

1.1 四种 Hook 类型

Hook 类型触发时机典型用途
PreToolUse工具调用之前安全检查、权限拦截
PostToolUse工具调用之后自动格式化、日志记录
Notification需要通知用户时发送消息到 Slack/钉钉
StopClaude Code 完成回复时自动测试、自动 lint

1.2 配置位置

Hooks 在.claude/settings.json中配置:

{ "hooks": { "PreToolUse": [...], "PostToolUse": [...], "Notification": [...], "Stop": [...] } }

1.3 Hook 配置结构

{ "matcher": "toolName 的匹配规则(正则或字符串)", "hooks": [ { "type": "command", "command": "要执行的 shell 命令" } ] }

Hook 脚本通过 stdin 接收 JSON 格式的事件数据,可以据此做出判断。

二、实战案例

案例 1:文件写入后自动格式化(PostToolUse)

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

{ "hooks": { "PostToolUse": [ { "matcher": "Write|Edit", "hooks": [ { "type": "command", "command": "filepath=$(echo $CLAUDE_TOOL_INPUT | jq -r '.file_path // .filePath // empty') && if [ -n \"$filepath\" ] && echo \"$filepath\" | grep -qE '\\.(ts|tsx|js|jsx|vue|css|json)$'; then npx prettier --write \"$filepath\" 2>/dev/null; fi" } ] } ] } }
这个 Hook 只对前端相关文件(.ts/.tsx/.js/.jsx/.vue/.css/.json)执行格式化,避免对其他文件产生副作用。

案例 2:危险命令拦截(PreToolUse)

阻止 Claude Code 执行危险的 shell 命令,如rm -rfDROP TABLE等。

{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "cmd=$(echo $CLAUDE_TOOL_INPUT | jq -r '.command') && if echo \"$cmd\" | grep -qiE 'rm\\s+-rf\\s+/|drop\\s+table|drop\\s+database|truncate\\s+table|:(){ :|:& };:'; then echo 'BLOCKED: 检测到危险命令,已拦截' >&2; exit 2; fi" } ] } ] } }

当 Hook 脚本以退出码 2 退出时,Claude Code 会阻止该工具调用。退出码含义:

退出码含义
0允许执行,不修改
1Hook 执行出错(不阻止工具调用)
2阻止工具调用

案例 3:敏感文件保护(PreToolUse)

阻止 Claude Code 读取或修改包含密钥的文件。

{ "hooks": { "PreToolUse": [ { "matcher": "Read|Write|Edit", "hooks": [ { "type": "command", "command": "filepath=$(echo $CLAUDE_TOOL_INPUT | jq -r '.file_path // .filePath // empty') && if echo \"$filepath\" | grep -qiE '\\.env$|\\.env\\.local$|credentials|secrets|private.key|id_rsa'; then echo 'BLOCKED: 该文件可能包含敏感信息' >&2; exit 2; fi" } ] } ] } }

案例 4:钉钉通知(Notification)

当 Claude Code 发出通知(如等待用户确认、任务完成)时,自动推送到钉钉群。

{ "hooks": { "Notification": [ { "matcher": "", "hooks": [ { "type": "command", "command": "msg=$(echo $CLAUDE_NOTIFICATION | jq -r '.message // \"Claude Code 通知\"') && curl -s -X POST 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN' -H 'Content-Type: application/json' -d \"{\\\"msgtype\\\": \\\"text\\\", \\\"text\\\": {\\\"content\\\": \\\"[Claude Code] $msg\\\"}}\"" } ] } ] } }

案例 5:Slack 通知(Notification)

{ "hooks": { "Notification": [ { "matcher": "", "hooks": [ { "type": "command", "command": "msg=$(echo $CLAUDE_NOTIFICATION | jq -r '.message // \"Claude Code notification\"') && curl -s -X POST 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL' -H 'Content-Type: application/json' -d \"{\\\"text\\\": \\\"$msg\\\"}\"" } ] } ] } }

案例 6:Stop 后自动运行测试(Stop)

每当 Claude Code 完成一轮回复,自动运行相关的单元测试。

{ "hooks": { "Stop": [ { "matcher": "", "hooks": [ { "type": "command", "command": "changed=$(git diff --name-only HEAD 2>/dev/null | grep -E '\\.(ts|js)$' | head -5) && if [ -n \"$changed\" ]; then for f in $changed; do testfile=$(echo $f | sed 's/\\.ts$/.spec.ts/' | sed 's/\\.js$/.spec.js/'); if [ -f \"$testfile\" ]; then npx jest \"$testfile\" --passWithNoTests 2>&1 | tail -5; fi; done; fi" } ] } ] } }
该 Hook 会检测 Git 变更中的 .ts/.js 文件,查找对应的 .spec.ts/.spec.js 测试文件并运行。只在有变更时触发,不会浪费时间。

案例 7:ESLint 自动修复(PostToolUse)

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

三、完整配置示例

将上述多个 Hook 组合成完整的.claude/settings.json

{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "cmd=$(echo $CLAUDE_TOOL_INPUT | jq -r '.command') && if echo \"$cmd\" | grep -qiE 'rm\\s+-rf\\s+/|drop\\s+table|drop\\s+database'; then echo 'BLOCKED' >&2; exit 2; fi" } ] }, { "matcher": "Read|Write|Edit", "hooks": [ { "type": "command", "command": "filepath=$(echo $CLAUDE_TOOL_INPUT | jq -r '.file_path // .filePath // empty') && if echo \"$filepath\" | grep -qiE '\\.env$|credentials|secrets'; then echo 'BLOCKED' >&2; exit 2; fi" } ] } ], "PostToolUse": [ { "matcher": "Write|Edit", "hooks": [ { "type": "command", "command": "filepath=$(echo $CLAUDE_TOOL_INPUT | jq -r '.file_path // .filePath // empty') && if [ -n \"$filepath\" ] && echo \"$filepath\" | grep -qE '\\.(ts|tsx|js|jsx|vue|css|json)$'; then npx prettier --write \"$filepath\" 2>/dev/null; fi" } ] } ], "Notification": [ { "matcher": "", "hooks": [ { "type": "command", "command": "msg=$(echo $CLAUDE_NOTIFICATION | jq -r '.message') && curl -s -X POST 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN' -H 'Content-Type: application/json' -d \"{\\\"msgtype\\\":\\\"text\\\",\\\"text\\\":{\\\"content\\\":\\\"[Claude Code] $msg\\\"}}\"" } ] } ], "Stop": [ { "matcher": "", "hooks": [ { "type": "command", "command": "changed=$(git diff --name-only HEAD 2>/dev/null | grep -E '\\.(ts|js)$' | head -5) && if [ -n \"$changed\" ]; then npx jest --passWithNoTests 2>&1 | tail -3; fi" } ] } ] } }

四、调试 Hooks

4.1 查看 Hook 输入数据

开发 Hook 时,可以先将输入数据写入日志文件:

{ "matcher": "Write", "hooks": [ { "type": "command", "command": "echo \"$(date): TOOL_INPUT=$CLAUDE_TOOL_INPUT\" >> /tmp/claude-hooks.log" } ] }

4.2 常见问题

  • Hook 不触发:检查 matcher 是否正确匹配工具名称(区分大小写)
  • 命令执行失败:确保命令中的路径是绝对路径或在 PATH 中
  • jq 未安装:Hook 脚本依赖jq解析 JSON,需要提前安装
  • 退出码误用:exit 2 会阻止工具调用,exit 1 只是报错但不阻止

五、最佳实践

  1. Hook 脚本要快:Hook 是同步执行的,耗时长的操作会阻塞 Claude Code
  2. 做好错误处理:Hook 失败不应该影响正常工作流,用|| true兜底
  3. 按需启用:不要配置过多 Hook,每个 Hook 都有执行开销
  4. 团队共享:将.claude/settings.json纳入版本控制,团队统一配置
  5. 渐进式添加:先从最有价值的 Hook(如自动格式化)开始,逐步扩展

总结

Hooks 是 Claude Code 自动化工作流的核心机制。通过合理配置 PreToolUse(安全守卫)、PostToolUse(自动格式化)、Notification(即时通知)和 Stop(自动测试)四类 Hook,你可以打造一个安全、高效、自动化的 AI 编程环境。

接口配置参考:https://9m8m.com/docs/

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 1:46:18

WebSocket 全面解析:让浏览器“实时说话”的黑科技(建议收藏)

智能体时代的代码范式转移与 C# 的战略转型 传统的 C# 开发模式,即所谓的“工程导向型”开发,要求开发者创建一个复杂的项目结构,包括项目文件(.csproj)、解决方案文件(.sln)、属性设置以及依赖…

作者头像 李华
网站建设 2026/4/23 1:38:58

RAG系统中LLM微调策略与实践指南

1. RAG系统中的LLM微调概述在构建检索增强生成(RAG)系统时,我们通常将注意力集中在检索组件上——如何优化向量数据库、改进索引策略、管理上下文长度等。但作为RAG系统的另一核心组件,生成模型(LLM)的适配…

作者头像 李华
网站建设 2026/4/23 1:29:48

Honey Select 2 进阶体验:从基础API到画质优化的必备插件指南

1. 基础框架搭建:插件系统的核心组件 当你第一次打开Honey Select 2的mod文件夹时,可能会被各种.dll文件和压缩包搞得晕头转向。别担心,我们先从最基础的框架开始搭建。就像盖房子需要打地基一样,这些核心组件是所有高级功能的前提…

作者头像 李华
网站建设 2026/4/23 1:28:36

别再乱加磁珠了!一个真实案例带你复盘开关电源自激振荡的排查与修复

磁珠引发的电源灾难:一次自激振荡故障的完整解剖实录 示波器屏幕上那条疯狂跳动的波形线,让整个实验室的空气瞬间凝固。电源工程师老张盯着CH3通道上高达200mV的峰峰值纹波,手指不自觉地敲打着工作台面。这个采用同步整流架构的12V转5V电源模…

作者头像 李华
网站建设 2026/4/23 1:26:49

《AI视觉检测:从入门到进阶》第一章(1)

前沿技术背景介绍:AI 智能体视觉检测系统(Transformer-based Vision Agent,缩写:TVA),是依托 Transformer 架构与“因式智能体”范式所构建的高精度智能体。它区别于传统机器视觉与早期 AI 视觉&#xff0c…

作者头像 李华