跳到主内容

hooks 和 skills 是什么?两种扩展的分界

2026-10-30 发布 来源:我告诉你AI导航 阅读

AI 工具的可扩展性到了 Claude Code 这里,最容易被混着谈的两个词就是 hooks 和 skills:都写在配置体系里,都能改变 agent 的行为,但机制完全不同——hooks 是你装在流程上的闸门,到点必然执行,不管...

AI 工具的可扩展性到了 Claude Code 这里,最容易被混着谈的两个词就是 hooks 和 skills:都写在配置体系里,都能改变 agent 的行为,但机制完全不同——hooks 是你装在流程上的闸门,到点必然执行,不管模型愿不愿意;skills 是你放在仓库里的本事包,模型判断用得上才加载。混用的结果要么是该强制的事靠不住(写进 skills 指望它每次都想起来),要么是把偶发的能力做成闸门(每次动作都被拖慢)。这篇按对比文的惯例,把两种扩展的机制、事件与加载方式讲清,最后给一条选择分界线;通用扩展协议的背景,见MCP 是什么一篇打底。

hooks:必然执行的自动化闸门

hooks 的定义可以浓缩成一句话:在 agent 工作流的特定时点,自动执行你预先声明的命令。机制上有几个关键词。其一,时点(事件):常见的事件包括 PreToolUse(工具调用之前)、PostToolUse(工具调用之后)、Stop(会话收束时)——比如在每次编辑文件之后跑一遍格式化,在每次执行命令之前做一次安全检查,都是把命令挂到对应事件上。其二,声明位置:hooks 在 settings.json 这类配置文件里声明,属于环境配置层,不进模型上下文、不靠模型记忆。其三,必然性:只要事件发生,命令就执行,与模型当轮的判断、心情、上下文长短统统无关——这正是它与「在 CLAUDE.md 里写一句请记得跑 lint」的本质区别,后者是建议层的事,见指令的层级一篇的分界。

exit code 2:闸门怎么拦住流程

hooks 不只是旁观者,还能拦流程,机制语言就是进程的退出码。以 PreToolUse 事件为例:你的检查命令挂在工具调用之前,如果命令以 exit code 2 退出,Claude Code 会把这视为一次拦截——对应的工具调用被阻断,反馈信息回给模型处理。这让 hooks 成为硬闸门的实现载体:测试不过就别想提交、危险路径就别想写入,规则的执行者是进程退出码,不是模型的自觉。两条边界要记:一是拦截命令要有明确的退出语义,检查通过退出码为零、不通过为二,别的退出码不会被当作拦截;二是闸门挂得越多,每次动作的延迟越高,常用事件挑两三个关键检查就够,全量塞入会拖慢每一步。权限层的 allow 规则管「能不能做」,hooks 管「做了之后过不过关」,两道闸各司其职,见权限模式与规则一篇。

退出码含义Claude Code 的反应
0检查通过对应工具调用照常进行
2检查不通过工具调用被阻断,反馈信息回给模型处理
其他没有拦截语义不会被当作拦截

skills:按需加载的本事包

skills 解决的是另一个问题:让 agent 掌握某类任务的专门做法,而不是每次都在对话里现场教。机制上,一个 skill 是一个文件夹,核心是 SKILL.md 这份说明文件——里面写清这个本事做什么、什么时候用、步骤怎么走,可以再带配套的脚本与参考文件。放置位置通常是项目的 .claude/skills/ 目录,随仓库走,团队共享。加载方式与 hooks 相反:模型平时只看到技能名与描述,判断当前任务用得上,才把 SKILL.md 的内容读进上下文——按需加载,不用不占地方。这个设计有个隐性好处:项目里堆二十个 skill,CLAUDE.md 也不会膨胀,日常会话的上下文保持干净;全部塞进 CLAUDE.md 的老做法,正是它要替代的反模式。配置文件的组织层级,通用讨论见配置分层一篇。

一条分界线:每次发生与有时要用

按对比文惯例给选择框架,一条分界线先立住:必须每次发生的,用 hooks;有时要用到的,用 skills。验证一下这条线的两边。每次提交前必须跑测试——是每次,hooks,挂到对应事件上,用退出码把关;生成周报时要用团队的数据口径——是有时,skills,写成本事包,需要时才加载。反过来也成立:把 lint 检查写成 skill,它就退化成「模型记得就跑、忘了就漏」的建议,强制力没了;把一份只有月末才用的对账流程做成 hook,其余二十九天每次工具调用都要白绕一圈,效率没了。两个追问帮判断:这件事漏一次有后果吗?有,hooks。这件事的状态(做没做、结果对不对)需要留在对话里让它接着推理吗?需要,skills 的产出会进上下文参与后续。

怎么配合:闸门加本事包的组合

成熟的使用形态是两者配合而不是二选一。一个典型组合:hooks 挂在编辑事件之后自动跑格式化与基础检查,守住下限;skills 装部署流程、性能分析这类阶段性本事,干活时按需调用。分界纪律两条:一是别在 skill 的说明里藏必须强制的检查项——它按需加载,漏加载就是漏执行,强制项一律上 hooks;二是别让 hooks 替模型做判断——闸门只该做机械校验(退出码、格式、路径),需要理解与取舍的事留给模型。想让团队的扩展资产盘点清楚,可以让 DeepSeek 把现有配置里的检查项与流程说明分成「每次发生」与「有时要用」两栏草表,再让腾讯元宝复核一遍有没有放错栏的条目,一轮就把混装的配置理顺。

扩展分界速查

  • hooks:挂事件必执行的闸门,PreToolUse/PostToolUse/Stop 是常用时点
  • exit code 2 是拦截的机制语言,阻断工具调用并把反馈回给模型
  • skills:SKILL.md 本事包,按需加载,不膨胀 CLAUDE.md
  • 分界线:必须每次发生用 hooks,有时要用用 skills
  • 强制项别藏进 skill,需要判断的事别做成 hook

扩展分界快问快答

  • hooks 配置写在项目里还是全局?两级都支持:团队统一的检查挂项目配置随仓库走,个人偏好挂全局配置;写法随版本演进,以官方文档为准。
  • skill 数量多了会不会拖慢会话?基本不会。平时只加载技能名与描述,命中才读全文;拖慢会话的是把所有说明塞进 CLAUDE.md,这正是 skill 设计要避免的。
  • hooks、skills、MCP 三者是什么关系?MCP 管接外部数据与服务的通道,hooks 管流程上的强制关卡,skills 管任务方法的沉淀;一个管通道、一个管闸门、一个管本事,互不替代。

反馈页面信息

请描述需要更正的地方,页面标题和网址会自动附上。

也可以发邮件至 [email protected]