用途:在编写 Claude Code Hook 时,帮助依据用途、受众和持久化需求选择正确的存放位置(插件 / 项目 / 全局)。不负责编写 Hook 本身(用 abstract:hook-authoring)或评估已有 Hook(用 abstract:hooks-eval)。
三种作用域:插件 Hook 位于插件内 hooks/hooks.json,面向插件用户,随插件启用生效;项目 Hook 位于 .claude/settings.json,面向团队成员,提交到仓库、按项目生效;全局 Hook 位于 ~/.claude/settings.json,仅自己使用,不提交,对所有会话生效。
决策框架:先问谁需要该 Hook——仅插件用户选插件,团队选项目,只有自己到处用选全局;再问是否需要版本控制——随插件分发选插件,仓库内共享选项目,保持私密选全局;最后看持久化要求——仅插件激活时选插件,仅此项目选项目,所有项目选全局。
自动加载注意:插件启用时 Claude Code 会自动加载 hooks/hooks.json,不要在 plugin.json 中再加 "hooks": "./hooks/hooks.json",否则会重复加载报错;plugin.json 的 hooks 字段仅用于标准 hooks/hooks.json 之外的额外 Hook 文件。
配置要点:使用字符串匹配器(如 "Read"、"Bash"),不要用对象匹配器;插件 Hook 使用 ${CLAUDE_PLUGIN_ROOT} 引用插件内路径。加载优先级由高到低:企业策略、命令行参数、本地项目设置、共享项目设置、用户设置;不同作用域的多个 Hook 可响应同一事件,匹配时并行执行。
适用场景:插件 Hook 用于校验、自动补全、插件相关日志;项目 Hook 用于保护敏感路径、强制测试/检查、代码规范;全局 Hook 用于个人审计日志、通用危险命令检测、通知集成。
限制与安全:项目 Hook 对团队可见并应经 PR 审阅;全局 Hook 会以你的凭据在所有项目执行,可能意外影响其他项目,加入前需充分测试。Claude Code 2.1.2+ 的 SessionStart Hook 可通过 stdin 获得 session_id、source、agent_type 等字段,用于按代理注入上下文。其他细节暂未提供。