第 25 章 · Hooks、Plugins 与生命周期
本章目标:区分“让模型记住一条规则”和“无论模型怎么想都必须执行一个检查”,并理解插件如何把能力分发。
1. Hook 是确定性插入点
Hook 在 SessionStart、UserPromptSubmit、PreToolUse、PostToolUse、PreCompact、Stop 等事件上运行程序。它不依赖模型主动想起,因此适合秘密扫描、命令校验、修改后 lint、结束前验证和审计上报。
例如系统 prompt 可以要求“不要提交 API key”,PreToolUse Hook 则可以在写文件前扫描内容并真正阻止。前者指导行为,后者机械执行。
2. Hook 输入与决定
Hook 通常从 stdin 接收结构化事件,输出 allow、ask、deny、附加上下文或状态消息。它需要超时和错误策略:安全 Hook 超时应默认拒绝,纯分析 Hook 失败可以降级。
多个 Hook 可能同时匹配。并发运行能降低延迟,但一个 Hook 不能假设自己先执行。冲突决定需要明确优先级,通常 deny 胜过 allow。
3. Hook 也需要信任
仓库里的 Hook 是可执行代码。克隆陌生项目后不能自动运行,应展示来源和哈希,让用户批准。Hook 更新后重新审查,企业管理 Hook 则由管理员策略签发。
不要让模型通过修改 Hook 文件后立即获得更高权限。配置目录和安全脚本应受到额外保护。
4. Plugin 是分发单元
一个 Plugin 可以打包 Skills、Hooks、MCP 配置、子 Agent、命令和资源。Skill 是作者编写工作流的格式,Plugin 是安装、版本和团队分发的容器。
插件清单需要名称、版本、入口和依赖。安装过程应显示将获得哪些工具、脚本和网络连接。升级要处理兼容性与回滚。
5. 机制选择
| 需求 | 首选 |
|---|---|
| 每次遵守仓库约定 | 指令文件 |
| 按需执行复杂流程 | Skill |
| 连接外部能力 | MCP |
| 工具前后强制检查 | Hook |
| 团队安装整套能力 | Plugin |
| 定时触发任务 | Automation |
| 隔离专业任务 | Subagent |
一个功能可以组合多个机制。发布插件可能包含发布 Skill、制品库 MCP 和 Stop Hook。
6. 本章实验
实验 07 会根据需求、作用域和副作用给各机制评分。它不是绝对答案,而是训练你先识别“这是知识、动作、强制规则、分发还是调度问题”。
不要用 Hook 写第二个 Agent
Hook 适合短小、确定、可预测的程序。如果它内部再次启动复杂自主循环,生命周期、权限和失败处理会变得难以理解。复杂判断交给 Agent,机械约束留给 Hook。