AI 编程工程化:Hook——AI 每次操作前后的自动检查站

上一篇我们讲了 Skill------给 AI 装上专业技能包

这篇讲 Hook,也是我觉得配置之后最有「踏实感」的一个东西。


说两件让我印象深刻的事

第一件。

AI 帮我改完一个模块,逻辑没问题,看起来挺好,我直接 commit 推上去了。

结果 CI 挂了。

原来几个文件改完没跑类型检查,导致 CI 的 build 出现几个 Error。每次手动补这一步,不是什么大事,但确实烦。

第二件更有意思。

有一次让 AI 整理项目里的临时文件。它跑了一段时间,然后告诉我:

「已清理无用文件,项目结构更整洁了。」

听起来挺好。但我根本不知道它删了什么,什么时候删的,也没任何提示让我确认。

后来查了 git 记录,那几个文件确实可以删,但当时真的出了一身冷汗。

两件事,一个根子:AI 干活,没有检查站。

改完代码没人盯着格式化。执行操作没人记录日志。你不知道它干了什么,也不知道该检查哪里。

配好 Hook,这两件事都不会再发生。


什么是 Hook

说白了,Hook 就是在 AI 调用工具前后,自动执行的一段 Shell 脚本

你告诉 Claude Code:每次它写文件之后,跑一下 ESLint。每次它执行 Bash 命令之前,先记一条日志。

配好后,再也不用手动盯着了。

把它理解成机场的安检通道更直观。

旅客要登机,得先过安检。安检不是为了刁难你,是为了保证每个人都按规矩来。AI 每次写代码、执行命令,也需要这个机制------操作之前检查一遍,操作之后验证一遍。

Hook 就是这个检查站。

这里有个很关键的区别------Hook 和 Rule 不一样。

Rule 是写在 CLAUDE.md 里的说明,AI 会尽量遵守,但本质上是「建议」。有时候会被忘掉。

Hook 是代码。你配了,它每次都执行。没有例外。


Hook 有哪几个时机

Claude Code 的 Hook 支持 4 种主要触发时机:

PreToolUse --- 工具调用之前

AI 准备动手,还没执行。

最适合做拦截。脚本返回退出码 2,Claude Code 取消这次操作,同时把脚本输出反馈给 AI,让它知道为什么被挡,重新调整方案。

PostToolUse --- 工具调用之后

AI 刚完成一次操作。

格式化、跑测试、触发构建------都放这里。用得最多的时机。

Notification --- Claude 等你的时候

Claude Code 需要你输入或确认时触发。

最常见用途:发一条桌面通知,不用一直盯着屏幕等。

Stop --- AI 停下来的时候

AI 完成整个任务、响应结束时触发。

适合跑完整测试、写汇总日志、发「干完了」的通知。


5 个实际场景

① 写完代码自动格式化

最高频的用法。

AI 改了文件,格式对不对?有没有 warning?不配 Hook 就得手动检查。配上 PostToolUse,AI 每次写文件之后自动跑一遍 ESLint 和 StyleLint。

你拿到的永远是干净的代码。不用叮嘱,不用手动触发。

② 保护不能动的文件

.env 文件、密钥文件、package-lock.json------这些东西 AI 不应该碰。但没人明说,它不知道。

PreToolUse Hook 拦截对这些文件的写操作,脚本返回退出码 2,操作直接取消,AI 收到提示。再也不用担心它手滑。

③ 记录所有 Bash 命令

AI 执行的每一条命令,你能追溯吗?

用 PreToolUse 勾住 Bash 工具,把命令和时间戳写到日志文件里。出了问题翻日志,AI 的每一步都清清楚楚。就是开头说的「悄悄删文件」那种情况,有了日志就不用出冷汗了。

④ 长任务完成后发通知

跑一个大型重构,可能要好几十分钟。你不可能一直盯着屏幕。

配 Notification Hook,Claude 等你确认的时候弹系统通知。或者配 Stop Hook,AI 干完了停下来的时候提醒你。

去倒杯水,回来看结果。

⑤ 自动跑测试

AI 改完代码,测试跑了没有?

PostToolUse 或者 Stop Hook 里触发 pnpm test,失败了 AI 直接看到输出,接着修。不用你每次手动说「跑一下测试」。


怎么配置

方式一:用 /hooks 菜单

最简单。在 Claude Code 里输 /hooks,打开交互式菜单。

选触发时机 → 设置 matcher → 填写命令 → 选保存位置。全程图形化,不用手写 JSON。刚上手的时候推荐这个方式。

方式二:直接编辑配置文件

配置文件有三个位置:

文件路径 作用域
~/.claude/settings.json 全局,所有项目生效
.claude/settings.json 项目级,可提交 git,团队共享
.claude/settings.local.json 项目本地,gitignore,不共享

基本结构:

json 复制代码
{
  "hooks": {
    "触发时机": [
      {
        "matcher": "匹配哪些工具",
        "hooks": [
          {
            "type": "command",
            "command": "要执行的 Shell 命令"
          }
        ]
      }
    ]
  }
}

matcher 支持管道符组合:

arduino 复制代码
"Edit|Write"   ------ 文件编辑操作
"Bash"         ------ 执行命令
""             ------ 空字符串,匹配所有工具

三个直接可用的配置

写完文件自动 Prettier(官方示例)

先装 jqbrew install jq),用来解析 Hook 接收到的 JSON 输入:

json 复制代码
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
          }
        ]
      }
    ]
  }
}

保护 .env 等敏感文件

先建一个脚本 .claude/hooks/protect-files.sh

bash 复制代码
#!/bin/bash
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

PROTECTED=(".env" "package-lock.json" ".git/")
for pattern in "${PROTECTED[@]}"; do
  if [[ "$FILE_PATH" == *"$pattern"* ]]; then
    echo "已阻止:$FILE_PATH 是受保护文件" >&2
    exit 2
  fi
done

然后在配置里引用:

json 复制代码
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "bash .claude/hooks/protect-files.sh"
          }
        ]
      }
    ]
  }
}

任务需要确认时发 macOS 桌面通知

json 复制代码
{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Claude Code 需要你的确认\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}

注意事项

Hook 是同步的,别让它跑太慢。

AI 操作 → Hook 跑完 → AI 继续。Hook 卡了,整个流程就卡着。格式化、日志、通知这类轻操作没问题。真要跑完整测试套件,考虑放在 Stop 时机,或者后台异步(命令末尾加 &)。

PreToolUse 的拦截退出码是 2,不是其他非零值。

exit 2 才会让 Claude Code 取消操作并把原因反馈给 AI。其他非零值行为不一样,写拦截脚本的时候别搞混。

Hook 触发的操作不会再触发 Hook。

不用担心死循环:PostToolUse Hook 里写了文件,不会再触发一次 PostToolUse。官方处理好了。

个人配置和团队配置分开放。

桌面通知、个人日志,放 ~/.claude/settings.jsonsettings.local.json。格式化、保护文件这类团队都要用的,放 .claude/settings.json 并提交 git------大家拉项目就自动生效。

Hook 和 Rule 配合用,效果最好。

Rule 里定了「提交前必须通过 ESLint」,Hook 负责每次改完文件就自动执行这件事。规矩和执行,两手都要有。


去哪找参考配置

Hook 目前没有独立市场,但有几个好地方:

Claude Code 官方文档

code.claude.com/docs/en/hoo...

最全的来源。常用配置示例、字段说明、技术细节都在这里。建议精读一遍,半小时够了。

Claude 官方 Blog

claude.com/blog/how-to...

Anthropic 自己写的上手指南,从零开始配,步骤很清楚。

awesome-claude-code

github.com/hesreallyhi...

26,000+ Stars 的 Claude Code 资源合集,有专门的 Hook 配置分类。社区维护,质量有保证。


最后

Rule 让 AI 知道规矩。Command 封装你的操作流程。Skill 给 AI 装上专业能力。

Hook 做的是另一件事:让这些规矩在每次操作的时候真正被执行到。

AI 改完代码就格式化,碰敏感文件就拦截,任务完成就通知你------这些事不用叮嘱,配好就一直在。

人会忘,Hook 不会。


下一篇讲 Subagent:AI 学会拆任务之后,复杂项目可以怎么分工,效率能快多少。

欢迎感兴趣的朋友继续保持关注~

应部分读者呼声,作者组建了 AI 编程交流群,感兴趣的朋友请扫码加入,一起交流学习~

如果二维码过期,请添加作者微信并备注"AI编程交流群",作者会拉你进群。

相关推荐
Bs_MoneyMagnet9 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
AlienZHOU13 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
qq_25183645715 小时前
AI 疾病自查功能SpringbootAI项目实战 · 技术实现文档
java·ai·ai编程
狗头大军之江苏分军15 小时前
《潮水漫过十七岁》开学了
后端
苏三说技术16 小时前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong16 小时前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno70416 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
Captaincc16 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
aramae17 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
计算机魔术师18 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端