Hooks系统概述与核心概念

理解Claude Code钩子系统的基础架构

一、Hooks系统的设计目的

Hooks(钩子)系统是Claude Code提供的一种自动化扩展机制,其核心设计目的包括以下三个方面:

自动化事件响应:在实际开发工作流中,许多任务具有固定的模式——代码格式化、lint检查、测试运行、部署触发等。Hooks系统允许开发者将这些重复性任务自动化,在特定事件发生时自动执行对应的脚本,从而大幅减少手动操作,提升工作效率。

在特定时机执行自定义脚本:Hooks的核心能力在于"时机"——开发者可以精确控制脚本在事件发生之前(before)还是之后(after)执行。这种精细的时机控制使得Hooks能够胜任验证检查、数据处理、通知推送等多种场景,在不同阶段发挥不同作用。

扩展Claude Code的行为边界:虽然Claude Code本身提供了丰富的内置功能,但在实际使用中总会遇到个性化需求——特定的代码规范、团队特有的工作流程、与第三方系统的集成等。Hooks系统通过允许注入自定义逻辑,使得Claude Code的行为可以根据具体需求进行扩展和定制,而无需修改Claude Code自身的源代码。

核心思想:Hooks系统遵循"关注点分离"的设计哲学——Claude Code负责核心的AI对话与代码生成能力,而特定的自动化任务和集成工作交由Hooks处理。这种架构既保持了核心系统的简洁性,又提供了强大的扩展能力。

二、Hook的核心概念

要深入理解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可以适应几乎所有的自动化场景。

配置示例:一个典型的Hooks配置结构如下——事件类型(如 UserPromptSubmit / PreToolUse / PostToolUse)为顶层键,每个事件类型是包含 matcher + hooks 的数组。每个 hook 以命令对象的格式定义。
// .claude/settings.json 中的hooks配置示例(实际格式) { "hooks": { "UserPromptSubmit": [ { "matcher": "", "hooks": [ { "type": "command", "command": "echo '用户提交了提示词'" } ] } ], "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "echo '即将执行Bash命令...'" } ] } ], "PostToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "echo 'Bash命令执行完毕'" } ] } ] } }

三、PreToolUse与PostToolUse两种核心模式

Hook系统通过 PreToolUse(工具调用前)和 PostToolUse(工具调用后)两类事件实现执行前后的干预,此外还有 UserPromptSubmit 等事件类型。它们在执行时机、能力和用途上存在显著差异。

3.1 PreToolUse(工具调用前)

触发时机:在工具调用之前触发,为系统提供了"预先干预"的能力。通过 matcher 字段指定匹配的工具名称(如 Bash、Write、Read 等),当匹配的工具即将被调用时,对应的 hooks 会率先执行。

阻断能力:PreToolUse 拥有"阻断"能力——如果 hook 脚本以非零退出码(non-zero exit code)结束,系统会认为检查未通过,进而阻止工具调用的继续执行。这一特性使得 PreToolUse 非常适合用于验证、检查、审批等场景。例如,在运行危险的 Shell 命令之前进行检查,或者以 {"hookSpecificOutput": {"permissionDecision": "ask"}} 的方式要求用户确认。

典型应用:权限控制(阻止未授权的命令执行)、输入验证(检查提示词是否包含敏感信息)、环境准备(在执行之前自动拉取最新代码)、安全检查(扫描命令中是否包含危险操作)。

3.2 PostToolUse(工具调用后)

触发时机:在工具调用完成后触发,此时工具已经执行完毕,PostToolUse 在其基础上进行后续处理。

读取结果能力:PostToolUse 无法阻断事件(因为工具已执行),但它可以获取工具的执行结果和环境状态。通过分析输出、退出码等信息做出后续处理决策。

典型应用:日志记录(记录每个工具调用的耗时和结果)、通知推送(通过Webhook发送执行结果到团队聊天工具)、数据持久化(将关键操作结果保存到数据库)、后续处理(在文件读取后自动进行格式转换)。

3.3 UserPromptSubmit(用户提交提示词)

触发时机:在用户提交提示词时触发,适合做提示词的日志记录、预处理或统计分析。

典型应用:自动记录用户提示词到日志文件、分析使用频率、预处理提示内容。

3.4 事件类型对比

对比维度 PreToolUse(工具前) PostToolUse(工具后) UserPromptSubmit
触发时机 工具调用之前 工具调用之后 用户提交提示词时
阻断能力 可以(非零退出码/ask决策) 不可以 不可以
matcher 工具名称(如 Bash、Write) 工具名称 通常为空字符串
典型用途 验证、检查、审批、环境准备 记录、通知、清理、后续处理 提示词日志、使用统计
重要提示:在设计 Hooks 时,需要注意 PreToolUse 的阻断机制。如果 hook 非预期地返回非零退出码,会导致正常的工具调用被中断。建议在 PreToolUse 脚本中谨慎处理错误,只在真正需要阻断的情况下返回非零值,避免误阻断影响开发效率。

四、Hook的触发事件类型

Hooks系统支持多种触发事件类型,每种事件使用数组结构,内部通过 matcher 字段匹配工具名称,通过 hooks 数组定义要执行的命令对象。

4.1 UserPromptSubmit(用户提交提示词)

当用户在Claude Code界面中提交提示词(即发送消息)时触发。每个事件对象包含 matcher(通常为空字符串表示匹配所有)和 hooks 命令数组:

4.2 PreToolUse / PostToolUse(工具调用前/后)

当Claude Code调用内置工具时触发。通过 matcher 字段进行工具名称匹配:

4.3 其他触发事件

随着Claude Code的发展,Hooks系统也在不断扩展其事件类型。除上述标准事件外,还支持:

文档原文:Hooks can be configured for the following events: user-prompt-submit (user prompt submission), tool (specific tool calls like Bash, Read, Write, etc.). Pattern matching is supported for tool names, allowing you to set up hooks that apply to multiple tools simultaneously.

五、Hooks与Skills/MCP/Plugins的关系

为了全面理解Hooks在整个Claude Code生态系统中的定位,有必要将其与其他扩展机制进行对比。Claude Code提供了四种主要的扩展方式:Hooks、Skills、MCP和Plugins,它们各自扮演着不同的角色,相互补充,共同构成了完整的扩展体系。

5.1 四者对比一览

维度 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、消息拦截

5.2 四种扩展机制的协同工作

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的行为,实现插件行为的监控和管理。

5.3 如何选择合适的扩展方式

选择Hooks:当需要自动化执行重复性任务、在工作流特定时机插入自定义逻辑、或对工具调用进行监控和管控时,优先考虑Hooks。它是最轻量、最容易上手的扩展方式。

选择Skills:当需要封装一个完整的、可复用的工作流程,且该流程需要用户主动触发时,使用Skills。Skills更适合需要AI参与理解和执行的复杂任务。

选择MCP:当需要接入外部系统(数据库、文件系统、云服务API等)时,MCP是最佳选择。它提供了一个标准化的协议来连接和交互外部工具。

选择Plugins:当需要深度定制Claude Code的行为(如修改UI、拦截消息、添加新的交互元素)时,考虑开发Plugin。Plugin的开发门槛最高,但也提供了最大的灵活性。

综合建议:在实际项目中,这四种扩展方式并非互斥的,而是互补的。一个完善的工作流往往需要组合使用多种扩展机制。最佳实践是:从最简单的Hooks开始,逐步引入Skills提高效率,通过MCP连接必要的外部工具,最后在需要深度定制时引入Plugins。这种渐进式的扩展策略可以有效降低学习成本,避免过度设计。

六、Hooks配置实战指南

6.1 配置文件的层级结构

Hooks配置支持两种层级:

两种层级的配置会合并生效,项目级别配置优先级高于用户级别。这意味着团队可以在项目级别设定强制规则(如安全审查),而个人可以在用户级别添加额外的辅助Hook。

6.2 配置完整示例

// 完整的项目级 settings.json 示例(实际格式) { "hooks": { "UserPromptSubmit": [ { "matcher": "", "hooks": [ { "type": "command", "command": "echo '[Hook] 用户提交了新的提示'" }, { "type": "command", "command": "echo '[日志] 记录到日志' >> /tmp/claude_log.txt" } ] } ], "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "echo '[安全检查] 即将执行命令' && bash -c 'echo $CLAUDE_TOOL_INPUT > /tmp/cmd_check.txt' && python3 /hooks/security_check.py" } ] }, { "matcher": "Write", "hooks": [ { "type": "command", "command": "echo '[写文件检查] 即将写入文件'" } ] } ], "PostToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "echo '[记录] Bash命令执行完毕,状态码: ' $?" } ] } ] } }

6.3 Hook执行环境说明

Hooks在独立的Shell进程中执行,具有以下环境特性:

调试技巧:在开发和测试Hooks时,建议先在终端中手动执行Hook脚本,确认其行为符合预期。然后在Hooks配置中加入 echo 输出进行观察,最后才在生产环境中启用。对于复杂的Hook逻辑,建议将其封装为独立的脚本文件,而不是在配置中内联编写长命令。

七、最佳实践与注意事项

7.1 Hook设计原则

7.2 安全注意事项

总结:Hooks系统是Claude Code自动化能力的核心支柱。通过理解其设计目的、核心概念、两种触发类型和配置方式,开发者可以充分利用这一机制来构建高效、个性化的开发工作流。Hook与Skill、MCP、Plugin共同构成了Claude Code的完整扩展生态系统,四者各司其职、协同配合,为开发者提供了从简单到复杂的全方位扩展能力。掌握Hooks系统,是从Claude Code初级用户迈向高级用户的重要一步。