[控场AI]
· 4 分钟阅读· 2,468 字

Claude Code Hooks实战:让代码自动格式化与拦截敏感操作

Claude Code Hooks实战:让代码自动格式化与拦截敏感操作

Claude Code Hooks 用事件+匹配器+脚本把口头约定变成强制规则。

本文基于 B 站「Claude Code 白板课」第 13 集,讲解 Claude Code 的 Hooks 机制。Hooks 由生命周期事件、匹配器和脚本三部分组成,把提示词的「请求」升级为到点必执行的「保证」,配置写在设置文件的 hooks 块中,用户级、项目级、本地级三层均适用且会合并触发。文章用三个实战场景演示:工具调用后事件自动格式化文件并将错误回传模型自修;工具调用前事件配合退出码 2 拦截敏感文件,且仅拦截单次;通知事件在等待确认时发桌面通知,实现挂机工作。此外还介绍了 loop 定时循环(最长七天、可自定义 loop.md 巡逻清单)与条件式「进清」任务的区别:循环按时间,目标按条件。最终给出「必须发生的做成钩子、需要判断的写成技能、要巡逻的交给循环」的分工骨架与今日行动建议。

Claude Code 的 Hooks 机制把「改完代码要格式化」这种口头约定,变成了到点必执行的强制规则。本文基于 B 站「Claude Code 白板课」第 13 集的分享,拆解 Hooks 的三段式结构,并用三个实战场景演示如何让 Claude Code 自己管自己。

Hooks 是什么:从「请求」到「保证」

提示词(Prompt)本质上是请求,不是承诺。你在手册里写一百遍「改完要格式化」,模型总有几次会忘。Hooks 解决的是这个问题:它把必须发生的事变成到点自动执行的脚本。

最爽的自动化不是 AI 帮你写代码,而是它自己管自己。钩子的结构只有三样:生命周期事件、匹配器、你的脚本。事件例如「工具调用前」「工具调用后」「会话开始」;匹配器负责筛出你关心的工具;脚本做什么完全由你定。

和提示词最大的区别在于:提示词是请求,钩子是保证,到点必执行。钩子能做的也不止跑脚本——发网络请求、调用模型判断都可以。

调用模型判断都行

生命周期事件是 Hooks 的触发锚点,指 Claude Code 在运行过程中会主动广播的一系列固定时机,例如会话开始、用户提交提示词、工具调用前、工具调用后、模型回复结束、会话结束等。每个事件都会携带一份结构化的 JSON 输入(包含会话 ID、工具名、工具参数等信息),脚本通过读取标准输入拿到这些数据。事件本身不关心你拿它做什么,只负责在正确的时间点把控制权交给脚本;脚本的退出码和输出则会被框架解释为“放行/拦截”或附加给模型的上下文。正因如此,同一套事件模型既能用来格式化代码,也能用来做门禁和通知。

配置方式:三层设置都适用

Hooks 配置写在设置文件的 hooks 块里。此前讲过的三层设置(用户级、项目级、本地级)都适用,多层钩子会合并、各自触发,互不覆盖。改完存盘,下一个动作就生效。

有个容易踩的坑:脚本记得加可执行权限,否则会静默失败,看起来什么都没发生,排查起来很费时间。

实战一:改完文件自动格式化

用「工具调用后」事件,匹配文件编辑类工具。脚本从输入里取出文件路径,交给格式化工具执行,结果回传给会话。

关键设计在于错误处理:如果格式化报错,错误信息也会回给模型,下一轮它自己会改。它写完就有人收拾,你不用盯。这是 Hooks 最有价值的地方——不是替代模型写代码,而是给模型的行为加上自动兜底。

实战二:敏感文件不许碰

第二个实战更硬:在「工具调用前」先跑检查脚本,命中环境变量文件、锁文件这些保护名单时,脚本退出码返回 2,这次操作直接拦下,理由还会回传给模型,它会换一条路走。规则从口头约定变成了门禁。

注意拦截的语义:是「这一次不许动」,不是永久拉黑。名单之外的正常编辑不受影响,不会误伤日常开发。

敏感文件不许碰

退出码 2 是 Hooks 中具有特殊语义的约定:脚本以 0 退出表示正常放行,以 2 退出表示“阻止本次操作”,此时标准错误输出会被作为拦截理由回传给模型,让它知道为什么被拒并尝试其他路径;其他非零退出码通常只被视为脚本自身出错,不一定拦截。因此拦截脚本必须显式以 2 退出,而不是随手 exit 1。这一约定把“脚本的判断结果”翻译成了“框架可执行的决策”,也是拦截类钩子能够成立的技术前提。

实战三:需要确认时发桌面通知

当 Claude Code 在等你确认或需要你输入时,会触发通知事件。配一条命令发桌面通知,你就不用一直盯着终端。通知还分类型,可以只在特定情况下配、各配各的。

这个能力把「挂机去干别的」变成现实:让它在后台干活,需要你的时候叫你。

挂机去干别的

钩子之外:会话类定时与循环

Hooks 之外还有会话类的定时循环,斜杠命令 loop 支持每五分钟一次检查部署,到点自己跑。不给间隔也行,它会自己挑节奏:有动静就停、看没动静就歇着,循环最长七天,会话关了即停。巡逻结果会在会话里汇报回来,历史一眼可见。

长期定时巡逻的内容可以自定义:在项目里放一份 loop.md,写你自己的清单,比如「分支红了就拉日志定位、推最小修复」;不写这个文件就用内置逻辑——继续没干完的活、照看合并请求、没事做做清理。

照看合并请求

再补一个「进清」命令:斜杠钩设一个完成条件,它一轮一轮接着干,直到条件满足或者你叫停。循环和条件式任务的区别可以概括为:循环按时间,目标按条件。配合验收思路,常任务挂机就更放心了。

loop.md 是放在项目根目录下的自定义巡逻清单文件,用来覆盖 loop 命令的默认行为。文件里用自然语言列出你希望循环期间反复检查和处理的事项,例如“分支变红就拉取日志定位并推送最小修复”“有未读的合并请求评论就逐条回复”。斜杠命令 loop 启动后会读取这份清单,按其中的条目规划每一轮动作;如果文件不存在,则退回内置逻辑(继续未完成任务、照看合并请求、做清理)。它相当于把“值班手册”交给 AI 执行,让长期挂机的巡逻内容可版本化、可团队共享。

一句话总结:规则写一百遍,不如拦一次

必须发生的做成钩子,需要判断的写成技能,要巡逻的交给循环。这三层分工是 Claude Code 自动化的骨架。

给一个今天就能做的行动建议:配一个最简单的钩子,改完文件自动跑 Lint 或格式化,然后让它连改两个文件,回来检查格式化是否真的执行了。配完这个,你就拥有了第一条强制规则。下一步再配拦截和通知。

Claude Code 已经会自己管自己了。下一集讲子代理与并行:主线留给判断,杂活外包出去。

#Claude Code Hooks#Claude Code 教程#AI编程#代码自动格式化#AI Agent 自动化#敏感文件拦截#Claude Code 配置
分享:

相关推荐