所属专题簇:控制、扩展与灰度治理
Claude Code 的 hooks 只是插件回调,还是 agent 运行过程中的正式切入点?
Claude Code 的 hooks 不是边缘扩展,而是可以在 prompt、command、HTTP、session 与 skill 运行过程中插入规则、检查和副作用的正式 runtime 扩展面。
这一章解释 src/utils/hooks/ 如何把 session hooks、prompt hooks、HTTP hooks、skill hooks 和 frontmatter hooks 接到 agent 工作流中。
- hooks 能改的不是样式,而是运行过程本身。
- session hooks 是临时、会话级、内存中的,不必落到持久配置。
- hooks 让 Claude Code 具备了“在 agent loop 周边挂规则和自动化”的能力。
当一个 agent 系统越来越复杂时,不可能把所有策略都硬编码进主循环。Claude Code 需要一种方式,让:
- skills 能携带行为增强
- 某些请求能先经过检查
- prompt / HTTP / command 生命周期能被拦截
- 会话级临时规则能快速挂上又撤掉
hooks 就是在做这件事。
- hooks 主目录:src/utils/hooks/
- session hooks:src/utils/hooks/sessionHooks.ts
- hook 类型:src/types/hooks.ts
- skills 章节中的 hooks 提及:src/skills/
flowchart TD
A["prompt / command / tool / HTTP event"] --> B["hook matcher"]
B --> C["session hook"]
B --> D["skill/frontmatter hook"]
B --> E["HTTP hook"]
C --> F["allow / block / enrich"]
D --> F
E --> F
F --> G["继续 query loop 或中断"]
src/utils/hooks/sessionHooks.ts 的注释和类型可以直接确认:
- session hooks 是 temporary
- in-memory only
- session 结束即清空
同一文件还定义了 FunctionHook,说明 hook 既可以是命令式配置,也可以是直接嵌入回调函数的运行时对象。
sessionHooks.ts 中关于 Map 的长注释很关键。它明确提到:
- parallel schema-mode agents
- 高频 addFunctionHook
- 避免 O(N²) 复制和 store listener 风暴
这说明 hooks 不只是“加一点扩展性”,而是已经被当作高并发 agent workflow 的基础设施来设计。
当前文档已经提到 skills frontmatter 可携带 hooks。这一层的意义是:
- skill 不只是 prompt 片段
- plugin 不只是命令集合
- 它们还可以把运行时规则挂进主循环
所以 Claude Code 的扩展体系,实际上比“命令扩展”更深一层。
- hooks 让 Claude Code 可以在不改主循环的前提下调整行为。
- 它们体现出一种“agent runtime 可插拔治理”的设计思路。
- 这也解释了为什么技能、插件、session 状态和权限会越来越像统一平台,而不是一堆散模块。
- hooks 是 Claude Code 的正式 runtime 扩展点。
- session hooks 说明 Claude Code 允许会话内临时挂规则。
- 研究 Claude Code 的“行为为什么变了”,不能只看 prompt,也要看 hooks。