在 Claude Code 中,Hook 是在每个生命周期事件时调用的 shell 脚本,Mod 则是一次性加载、保持状态、可在进程内处理事件并绘制 UI。作者把五个 Hook(阻止危险命令、记录文件改动、长回合通知、自动批准安全读取、上下文计数)全部迁移到 Mod,结果如下:
- 阻止危险命令:Hook 需要每次调用都启动子进程并依赖
jq,Mod 直接在进程内匹配正则,去掉了子进程、jq,并且可以后续扩展 UI。更短、更可升级。- 长回合通知:Hook 只能写日志,无法绘制 UI;Mod 可以在
turn.complete 事件中实时更新提示条,显示耗时和 token 变化。Hook 无法实现,Mod 轻松完成。- 自动批准安全读取:Hook 只在子进程中决定是否允许,Mod 直接返回批准,且 Mod 位于中间件链顶层,能覆盖 Hook 或权限规则。迁移后需重新审视安全链。
- **文件编辑日志 & 上下文计数**:Hook 纯粹观察,Mod 通过内存状态共享,减少 I/O。虽然改动不大,但状态共享带来更高效。
结论
- 对需要 UI 或状态共享的 Hook,优先迁移到 Mod。
- 纯观察或简单阻止/允许的 Hook,保持 Hook 也可;若迁移,需注意安全链顺序。
- 迁移后请编写测试验证链条行为,重新阅读权限文档。
