Hooks(钩子)系统是Claude Code提供的一种自动化扩展机制,其核心设计目的包括以下三个方面:
自动化事件响应:在实际开发工作流中,许多任务具有固定的模式——代码格式化、lint检查、测试运行、部署触发等。Hooks系统允许开发者将这些重复性任务自动化,在特定事件发生时自动执行对应的脚本,从而大幅减少手动操作,提升工作效率。
在特定时机执行自定义脚本:Hooks的核心能力在于"时机"——开发者可以精确控制脚本在事件发生之前(before)还是之后(after)执行。这种精细的时机控制使得Hooks能够胜任验证检查、数据处理、通知推送等多种场景,在不同阶段发挥不同作用。
扩展Claude Code的行为边界:虽然Claude Code本身提供了丰富的内置功能,但在实际使用中总会遇到个性化需求——特定的代码规范、团队特有的工作流程、与第三方系统的集成等。Hooks系统通过允许注入自定义逻辑,使得Claude Code的行为可以根据具体需求进行扩展和定制,而无需修改Claude Code自身的源代码。
核心思想:Hooks系统遵循"关注点分离"的设计哲学——Claude Code负责核心的AI对话与代码生成能力,而特定的自动化任务和集成工作交由Hooks处理。这种架构既保持了核心系统的简洁性,又提供了强大的扩展能力。
要深入理解Hooks系统,需要掌握以下四个核心概念:
1. Hook是事件触发的自动化脚本:Hook本质上是一段在特定事件发生时被自动执行的脚本。它不同于普通的Shell命令——不需要用户手动调用,而是由系统在事件触发时自动拉起。每个Hook可以执行任意Shell命令,包括但不限于执行本地程序、调用API、读写文件、发送通知等。
2. 配置在settings.json中:Hooks的定义和管理通过Claude Code的配置文件 settings.json 完成。这是一个JSON格式的配置文件,通常位于项目的 .claude/ 目录下(项目级别),也可以位于全局配置目录(用户级别)。Hooks配置作为 hooks 顶级字段存在,内部按事件类型组织子配置。
3. 基于事件类型的触发机制:根据执行时机,Hook事件类型分为 UserPromptSubmit(用户提交提示词时)、PreToolUse(工具调用前)、PostToolUse(工具调用后)等。每个事件类型为数组结构,通过 matcher 字段匹配特定工具名称(空字符串匹配所有),每个匹配项可包含多个 hooks,每个 hook 以 {"type": "command", "command": "..."} 格式定义。这一设计借鉴了Git Hooks、Web框架中间件等成熟系统的设计模式,提供了灵活的执行时机控制。
4. 可执行任意Shell命令或脚本:Hook的脚本体是标准的Shell命令,这意味着开发者可以使用任何在终端中可执行的程序——bash脚本、Python脚本、Node.js程序、编译型二进制文件等。这种灵活性确保了Hooks可以适应几乎所有的自动化场景。
Hook系统通过 PreToolUse(工具调用前)和 PostToolUse(工具调用后)两类事件实现执行前后的干预,此外还有 UserPromptSubmit 等事件类型。它们在执行时机、能力和用途上存在显著差异。
触发时机:在工具调用之前触发,为系统提供了"预先干预"的能力。通过 matcher 字段指定匹配的工具名称(如 Bash、Write、Read 等),当匹配的工具即将被调用时,对应的 hooks 会率先执行。
阻断能力:PreToolUse 拥有"阻断"能力——如果 hook 脚本以非零退出码(non-zero exit code)结束,系统会认为检查未通过,进而阻止工具调用的继续执行。这一特性使得 PreToolUse 非常适合用于验证、检查、审批等场景。例如,在运行危险的 Shell 命令之前进行检查,或者以 {"hookSpecificOutput": {"permissionDecision": "ask"}} 的方式要求用户确认。
典型应用:权限控制(阻止未授权的命令执行)、输入验证(检查提示词是否包含敏感信息)、环境准备(在执行之前自动拉取最新代码)、安全检查(扫描命令中是否包含危险操作)。
触发时机:在工具调用完成后触发,此时工具已经执行完毕,PostToolUse 在其基础上进行后续处理。
读取结果能力:PostToolUse 无法阻断事件(因为工具已执行),但它可以获取工具的执行结果和环境状态。通过分析输出、退出码等信息做出后续处理决策。
典型应用:日志记录(记录每个工具调用的耗时和结果)、通知推送(通过Webhook发送执行结果到团队聊天工具)、数据持久化(将关键操作结果保存到数据库)、后续处理(在文件读取后自动进行格式转换)。
触发时机:在用户提交提示词时触发,适合做提示词的日志记录、预处理或统计分析。
典型应用:自动记录用户提示词到日志文件、分析使用频率、预处理提示内容。
| 对比维度 | PreToolUse(工具前) | PostToolUse(工具后) | UserPromptSubmit |
|---|---|---|---|
| 触发时机 | 工具调用之前 | 工具调用之后 | 用户提交提示词时 |
| 阻断能力 | 可以(非零退出码/ask决策) | 不可以 | 不可以 |
| matcher | 工具名称(如 Bash、Write) | 工具名称 | 通常为空字符串 |
| 典型用途 | 验证、检查、审批、环境准备 | 记录、通知、清理、后续处理 | 提示词日志、使用统计 |
Hooks系统支持多种触发事件类型,每种事件使用数组结构,内部通过 matcher 字段匹配工具名称,通过 hooks 数组定义要执行的命令对象。
当用户在Claude Code界面中提交提示词(即发送消息)时触发。每个事件对象包含 matcher(通常为空字符串表示匹配所有)和 hooks 命令数组:
"UserPromptSubmit": [{"matcher": "", "hooks": [{"type": "command", "command": "..."}]}]当Claude Code调用内置工具时触发。通过 matcher 字段进行工具名称匹配:
matcher 字段指定完整的工具名称(如 Bash、Read、Write)进行精确匹配。空字符串 "" 匹配所有工具。随着Claude Code的发展,Hooks系统也在不断扩展其事件类型。除上述标准事件外,还支持:
为了全面理解Hooks在整个Claude Code生态系统中的定位,有必要将其与其他扩展机制进行对比。Claude Code提供了四种主要的扩展方式:Hooks、Skills、MCP和Plugins,它们各自扮演着不同的角色,相互补充,共同构成了完整的扩展体系。
| 维度 | Hooks(钩子) | Skills(技能) | MCP(模型上下文协议) | Plugins(插件) |
|---|---|---|---|---|
| 类型 | 事件驱动的自动化脚本层 | 提示词命令层 | 外部工具接入层 | 扩展功能层 |
| 触发方式 | 由系统事件自动触发 | 由用户输入关键字或命令触发 | 由AI模型按需调用 | 加载后常驻运行 |
| 主要用途 | 自动化工作流、验证、通知 | 封装常用任务为可复用命令 | 连接外部工具和数据源 | 深度扩展Claude Code功能 |
| 配置位置 | settings.json | CLAUDE.md 或 skill文件 | settings.json(mcpServers字段) | settings.json(plugins字段) |
| 开发难度 | 低(Shell脚本即可) | 低(自然语言描述) | 中(需实现MCP协议) | 高(需了解插件API) |
| 执行方式 | 自动执行 | 按需调用 | 按需调用 | 加载后常驻 |
| 典型场景 | 每次运行Bash前安全检查 | "/review" 一键审查代码 | 连接数据库、外部API | 自定义UI、消息拦截 |
Hooks + Skills:最常用的组合方式。Skill定义了一套复用的提示词模板(做什么),而Hook负责在Skill执行过程中自动化地完成准备工作(环境检查、依赖安装)和收尾工作(结果验证、通知推送)。例如,一个代码审查Skill可以和 PreToolUse Hook 配合,在操作前自动拉取最新代码。
Hooks + MCP:MCP提供了外部工具的接入能力,而Hook则可以在调用MCP工具前后进行额外的处理。例如,在调用数据库MCP工具之前,通过 PreToolUse Hook 进行权限验证;在调用之后,通过 PostToolUse Hook 记录查询日志。
Hooks + Plugins:Plugin可以注册自定义的Hook事件,扩展Hooks的触发源;反过来,Hook也可以用来监听Plugin的行为,实现插件行为的监控和管理。
选择Hooks:当需要自动化执行重复性任务、在工作流特定时机插入自定义逻辑、或对工具调用进行监控和管控时,优先考虑Hooks。它是最轻量、最容易上手的扩展方式。
选择Skills:当需要封装一个完整的、可复用的工作流程,且该流程需要用户主动触发时,使用Skills。Skills更适合需要AI参与理解和执行的复杂任务。
选择MCP:当需要接入外部系统(数据库、文件系统、云服务API等)时,MCP是最佳选择。它提供了一个标准化的协议来连接和交互外部工具。
选择Plugins:当需要深度定制Claude Code的行为(如修改UI、拦截消息、添加新的交互元素)时,考虑开发Plugin。Plugin的开发门槛最高,但也提供了最大的灵活性。
综合建议:在实际项目中,这四种扩展方式并非互斥的,而是互补的。一个完善的工作流往往需要组合使用多种扩展机制。最佳实践是:从最简单的Hooks开始,逐步引入Skills提高效率,通过MCP连接必要的外部工具,最后在需要深度定制时引入Plugins。这种渐进式的扩展策略可以有效降低学习成本,避免过度设计。
Hooks配置支持两种层级:
.claude/settings.json 中配置。这种方式便于团队共享,适合项目特定的自动化需求。两种层级的配置会合并生效,项目级别配置优先级高于用户级别。这意味着团队可以在项目级别设定强制规则(如安全审查),而个人可以在用户级别添加额外的辅助Hook。
Hooks在独立的Shell进程中执行,具有以下环境特性:
PATH、HOME 以及Claude Code注入的特定变量。echo 输出进行观察,最后才在生产环境中启用。对于复杂的Hook逻辑,建议将其封装为独立的脚本文件,而不是在配置中内联编写长命令。
总结:Hooks系统是Claude Code自动化能力的核心支柱。通过理解其设计目的、核心概念、两种触发类型和配置方式,开发者可以充分利用这一机制来构建高效、个性化的开发工作流。Hook与Skill、MCP、Plugin共同构成了Claude Code的完整扩展生态系统,四者各司其职、协同配合,为开发者提供了从简单到复杂的全方位扩展能力。掌握Hooks系统,是从Claude Code初级用户迈向高级用户的重要一步。