Courses
在使用Claude Code时,您会注意到一个常见问题:它能写出不错的代码,但会忘记格式化、运行测试或遵循安全规范等关键步骤。结果就是您要一遍又一遍地重复相同的提醒。Claude Code Hooks 允许您在工作流的特定节点自动运行 shell 命令,从而将这些提醒自动化。
在本教程中,我将介绍如何为代码格式化、测试执行、通知与文件保护设置 hooks。您将构建一套无需人工介入即可落实开发标准的自动化系统。
想进一步了解 Claude Code,请查看我们的Claude Code 最佳实践指南和Claude Skills教程。若您想学习如何配置项目级说明,请参阅我们的编写 CLAUDE.md指南。
要点速览
-
Claude Code Hooks 是在 Claude Code 生命周期的特定节点自动运行的 shell 命令(工具调用前/后、会话开始时、Claude 停止时)
-
在
.claude/settings.json(项目)或~/.claude/settings.json(全局)中通过包含事件、匹配器和命令的 JSON 进行配置 -
使用
PreToolUsehooks 在危险操作发生前进行阻断(退出码 2 = 阻断) -
使用
PostToolUsehooks 在 Claude 写代码后进行清理任务,如格式化、lint 或运行测试 -
Hooks 通过
stdin接收 JSON 上下文,并通过退出码、stdout与stderr传达结果
什么是 Claude Code Hooks?
Claude Code Hooks 会在 AI 编码会话中发生特定事件时自动运行 shell 命令。您可以把它们看作在精确时刻执行自定义脚本的自动触发器——例如在 Claude 写入文件前、运行命令后或向您发送通知时。
该系统通过监控 Claude Code 的操作并与您在配置文件中定义的规则进行匹配来工作。一旦匹配,您指定的命令会运行,并能访问刚刚发生事件的上下文信息。这让您可以控制 Claude 的行为,并将原本需要手动进行的重复性任务自动化。
下面是一个基础 hook:每当 Claude 写入 Python 文件时就运行代码格式化器:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "python -m black ."
}
]
}
]
}
}
这个 hook 由三部分组成:
-
事件:
PostToolUse(Claude 完成某个动作之后) -
匹配器:
Write(仅在写入文件时) -
命令:
python -m black .(格式化当前目录中的 Python 文件)
hook 会通过发送到脚本输入端的 JSON 数据接收 Claude 刚刚所做操作的详细信息,因此您可以构建更复杂的自动化来响应特定文件变更。
如果您想在 Claude Code 自动化上更进一步,我们的Claude Code Routines教程展示了如何在云端按计划周期性运行 hooks 和代理。
接下来我们从零开始创建 hooks,并在 Claude Code 中注册它们。
前提条件
开始之前,您需要准备以下内容:
-
已安装并运行 Claude Code:您应当能够熟练使用 Claude Code完成基础编码任务
-
熟悉命令行:hooks 运行的是 shell 命令,因此您需要了解如何为您的操作系统编写基本终端命令
-
可用文本编辑器:您将编辑 JSON 配置文件来设置 hooks
-
项目目录:一个可以安全测试 hooks 而不影响重要工作的编码项目
您不需要是 shell 脚本专家,但理解如何运行 ls、cd 以及基本文件操作将有助于您跟进示例。如果您是 bash 或终端新手,建议学习我们的Shell 入门课程。
开始使用 Claude Code Hooks
了解了 hooks 是什么之后,我们来设置您的第一个自动化。过程包括选择合适的事件、配置一条简单规则,并用基础命令进行测试。
理解 hook 事件
Claude Code 提供了 25+ 种 hook 事件。下表涵盖了您最常用的 10 个。完整列表见官方 hooks 参考。

PreToolUse 和 PostToolUse 是最常见的事件。PreToolUse 在 Claude 执行写文件或运行命令等操作之前触发,非常适合做校验或阻断危险操作。PostToolUse 在 Claude 完成操作后触发,适用于格式化代码或运行测试等清理任务。
UserPromptSubmit 在您向 Claude 提交提示时(处理开始之前)触发。您可以借此为对话添加上下文,或校验提示是否满足某些要求。
Notification 在 Claude 向您发送提醒时运行,比如请求运行命令的权限或需要您的输入。PermissionRequest 在 Claude Code 显示权限对话框时触发,允许您代表用户自动同意或拒绝请求。
Stop 和 SubagentStop 在 Claude 结束响应时触发,适用于最终检查或生成报告。两者区别在于 Stop 在 Claude 整体响应结束时触发,而 SubagentStop 则在由工具派生的助手(“子代理”)完成工作时触发。
其余事件 PreCompact、SessionStart 与 SessionEnd 处理特定生命周期场景。PreCompact 在 Claude 缩短对话历史之前运行。‘SessionStart’ 在新会话开始时触发以设置默认值,SessionEnd 在会话关闭时触发,用于清理或最终报告。
|
事件名称 |
触发时机 |
主要用例 |
|
|
在 Claude 执行操作之前(如写文件、运行命令)。 |
校验操作或阻断危险行为。 |
|
|
在 Claude 完成操作之后。 |
清理任务、代码格式化或运行测试。 |
|
|
当您提交提示,处理开始之前。 |
为对话添加上下文或校验提示要求。 |
|
|
当 Claude 发送提醒(如请求输入或权限)。 |
处理系统提醒和用户关注请求。 |
|
|
显示权限对话框时。 |
代表用户自动批准或拒绝请求。 |
|
|
当 Claude 完成整体响应。 |
对主响应进行最终检查或生成报告。 |
|
|
当工具派生的助手("subagent")完成工作。 |
针对子代理活动的最终检查。 |
|
|
在对话历史被缩短之前。 |
管理对话清理与上下文保留。 |
|
|
在新会话开始时。 |
初始化并设置默认值。 |
|
|
当会话关闭时。 |
最终清理或会话结束报告。 |
理解匹配器
匹配器是决定哪些 Claude Code 操作会触发 hook 的过滤条件。技术上,它们是作为正则表达式解析的字符串,因此您既可以精确匹配,也可以使用更灵活的模式。
最常用的是简单匹配器,如 Write(在 Claude 写入文件时触发)或 Edit(在编辑内容时触发),以及组合形式 Edit|Write 来覆盖多种操作。
您也可以使用前缀模式,如 Notebook.* 来匹配所有以“Notebook.”开头的工具。若希望 hook 在每个操作上都触发,可使用通配正则 .*、空字符串("")或将 matcher 留空。
由于匹配器区分大小写且仅作用于操作名称,最好尽量保持具体。当您需要更细粒度的控制(例如将 hook 限定在某些文件类型)时,可以读取 Claude 传入 hook 的 JSON 负载,并在其中应用自己的正则或条件。
在 Claude Code 中创建您的第一个 hook
Claude Code 提供两种设置 hooks 的方式:使用交互式 /hooks 命令,或直接编辑配置文件。我们先从更友好的交互式方式开始。
使用 /hooks 命令:
-
打开 Claude Code,并在聊天界面输入 /hooks
-
选择触发事件(本例选择
PostToolUse) -
在菜单中选择“Add new hook”
-
设置匹配器模式(输入
Write以针对写文件) -
输入命令:
-
Mac:
say "Task complete" -
Windows:
powershell -c [console]::beep() -
Linux:
spd-say "Task complete" -
保存配置,并按下 Esc 三次返回 Claude Code
/hooks 命令会自动更新您的设置文件并重新加载配置。您也可以随时使用 /hooks 查看现有 hooks 或进行修改。
如果您更喜欢直接编辑配置文件,hooks 位于全局 ~/.claude/settings.json,项目目录内的 .claude/settings.json(提交到仓库以供团队共享),或个人使用且默认被 gitignore 的 .claude/settings.local.json。对上面的示例,配置如下:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "say 'Task complete'"
}
]
}
]
}
}
手动编辑文件后,重启 Claude Code,或使用 /hooks 命令重新加载配置。现在每当 Claude 写入文件,您都会听到音频通知。
测试您的 hook
继续前,请验证您的 hook 的确生效:
-
让 Claude 写任意 Python 文件(例如:“创建一个 hello.py,打印 hello world”)
-
当 Claude 完成写入操作,您应能听到音频通知
-
如果没有声音,按 Ctrl-O 查看 Claude Code 的记录,以检查任何错误信息
-
常见问题包括找不到 hook 命令、文件权限错误或配置文件中的语法错误
让这个基础测试运行成功,能在后续构建更复杂的 hooks 时为您省去调试时间。如果您刚刚手动编辑了设置文件、更改了匹配器或事件,或安装了要在 hook 命令中使用的新工具,重新打开 /hooks 或重启 Claude 以重新加载配置会有所帮助。
这个基础模式(事件、匹配器、命令)构成了所有 hook 自动化的基石。您可以在此基础上扩展,在同一事件触发时并行运行多个命令。例如,您可能希望在 Claude 写入文件时既播放声音又创建备份。
您也可以在同一事件下为不同工具创建单独的匹配器,从而让写文件与编辑代码触发不同操作。所有匹配同一工具模式的 hooks 会并行运行。如果为同一事件配置了多个匹配器,每个 hook 会在其匹配器被触发时运行。
处理 Hook 输入
当 Claude Code 触发 hook 时,会通过标准输入(stdin)发送刚刚发生事件的信息,这个数据流会直接传给您的命令。这些数据让 hooks 不只是“随机时间运行的脚本”,而是强大的自动化。
Claude Code 会将这些信息打包为 JSON,并传递给您配置的任何命令,无论是简单的终端命令还是自定义脚本。
hook 输入剖析
每个 hook 都会收到一个包含当前会话基本字段的 JSON 对象:
{
"session_id": "abc123",
"transcript_path": "/Users/you/.claude/projects/my-project/conversation.jsonl",
"cwd": "/Users/you/my-project",
"hook_event_name": "PostToolUse"
}
逐一说明如下:
-
session_id:标识当前对话 -
transcript_path:指向对话历史 -
cwd:显示工作目录 -
hook_event_name:告知触发的事件
有了这些上下文,您的 hooks 才能做出智能决策:追踪是哪次对话触发了操作、在需要时访问完整聊天记录,或在正确目录中运行命令。
基于事件的输入差异
像 PreToolUse 和 PostToolUse 这样的工具事件会包含关于动作的额外细节,这正是 hooks 在自动化中真正有用的地方。在 PreToolUse 中会包含 tool_input,而在 PostToolUse 中还会额外包含 tool_response:
{
"session_id": "abc123",
"hook_event_name": "PostToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "/path/to/file.py",
"content": "print('Hello world')"
},
"tool_response": {
"filePath": "/path/to/file.py",
"success": true
}
}
在 hook 输入中,file_path 显示将被写入或编辑的文件路径,content 包含工具即将写入的确切文本。执行后,工具的响应会回显最终的 filePath(注意驼峰命名)以确认实际修改的文件,并附带 success 标记表示操作是否成功。
这些详细信息意味着您的 hooks 可以根据实际发生的情况做出不同响应。比如只格式化 Python 文件、仅备份重要目录,或仅在特定文件类型被修改时发送通知。
像 UserPromptSubmit 这样的事件更简单,因为它们不涉及工具:
{
"session_id": "abc123",
"hook_event_name": "UserPromptSubmit",
"prompt": "Write a function to calculate factorial"
}
注意 UserPromptSubmit hooks 在配置中不使用匹配器。它们会在所有提示上触发,而非工具操作。这使其非常适合记录对话、自动添加项目上下文或在 Claude 处理之前校验提示。
实践中读取 hook 输入
我们来创建一个记录每个用户提示的 hook。它能解决在长时间编码会话中容易忘记自己给 Claude 下达了什么请求的问题。首先是 hook 配置:
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "python3 ~/.claude/log_prompts.py"
}
]
}
]
}
}
接着在 ~/.claude/log_prompts.py 创建如下 Python 脚本:
#!/usr/bin/env python3
import json
import sys
from datetime import datetime
# Read JSON data from stdin
input_data = json.load(sys.stdin)
# Extract information
session_id = input_data.get("session_id", "unknown")
prompt = input_data.get("prompt", "")
timestamp = datetime.now().isoformat()
# Log the prompt
log_entry = f"{timestamp} | Session: {session_id[:8]} | {prompt}\n"
with open("prompt_history.txt", "a") as f:
f.write(log_entry)
该脚本读取 Claude Code 发送的 JSON 数据,并结合会话上下文记录提示。这会创建一份可搜索的交互历史,数周后您需要回顾问题解决过程时就会非常有用。
处理 Hook 输出
hook 命令运行后,需要告诉 Claude Code 发生了什么以及是否应正常继续。正是这种控制机制让 hooks 不仅仅是日志工具,而是能引导 Claude 行为的强大工作流自动化。该机制通过三个通道实现:标准输出(stdout)、标准错误(stderr)和退出码。
输出通道与退出码
标准输出(stdout)用于正常输出。例如,打印的信息会进入 stdout。对于大多数 hooks,当您按 Ctrl-O 时,这些输出会显示在 Claude Code 的记录中,让您在不干扰主对话的情况下了解自动化执行了什么。
标准错误(stderr)用于错误信息。您可以通过以下方式写入 stderr:
-
Python:
print("message", file=sys.stderr)或 -
命令行:
echo "message" >&2
关键区别在于 stderr 可直接发送给 Claude 进行自动处理,使其能对 hooks 检测到的问题作出响应。
退出码用于告知 Claude Code 下一步该怎么做:
-
退出码 0:成功(向用户显示
stdout) -
退出码 2:阻断性错误(将
stderr发送给 Claude) -
其他码:非阻断错误(向用户显示
stderr,但继续执行)
该系统为您提供了细粒度控制:决定何时应让 Claude 停止、继续,或根据自动化发现获取反馈。我们来看看两个最重要退出码的示例。
退出码 0:正常运行
大多数 hooks 使用退出码 0 表示一切正常。下面是一个完整的 hook,用于记录文件操作并通知用户:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "python3 -c \"import datetime; open('activity.log','a').write('File written: ' + datetime.datetime.now().isoformat() + '\\n'); print('Logged file operation')\""
}
]
}
]
}
}
此 hook 运行两步:向文件写日志,然后在记录中打印消息。实现方式有很多,但这种方法跨平台,且避免依赖命令行细节。
由于未显式设置退出码,默认即为 0。打印的消息会出现在 Claude Code 的记录中,为您提供日志已生效的反馈。此模式非常适合构建审计轨迹或跟踪 Claude 随时间对项目所做的更改。
退出码 2:带反馈的阻断
退出码 2 会将您的错误消息直接发送给 Claude,使其能自动响应。这使 hooks 不只是自动化,更是安全防护机制。下面是一个阻断危险文件操作的 hook:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "python3 ~/.claude/security_check.py"
}
]
}
]
}
}
您需要在 ~/.claude/security_check.py 创建安全检查脚本:
#!/usr/bin/env python3
import json
import sys
# Read hook input
input_data = json.load(sys.stdin)
tool_input = input_data.get("tool_input", {})
file_path = tool_input.get("file_path", "")
# Check for dangerous patterns
dangerous_paths = ["/etc/", "/usr/", "production.conf"]
is_dangerous = any(pattern in file_path for pattern in dangerous_paths)
if is_dangerous:
# Block the operation and tell Claude why
print(f"Blocked modification of {file_path} - this appears to be a system or production file", file=sys.stderr)
sys.exit(2) # Sends stderr message to Claude
else:
# Allow the operation
print(f"Approved modification of {file_path}")
sys.exit(0) # Shows stdout in transcript
当此 hook 检测到危险路径时,会以退出码 2 退出。Claude Code 会将 stderr 消息发送给 Claude,后者会向您解释为何阻断该操作并给出替代方案。这样既能防止误改系统文件,又能让 Claude 了解您的安全策略。
为 Claude Code 构建智能通知 Hook
我们来构建一个改进的通知 hook,将输入处理与智能输出结合起来。这解决了最初那个在每次文件变更时都提醒、噪声过多的问题:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "python3 ~/.claude/smart_notify.py"
}
]
}
]
}
}
在 ~/.claude/smart_notify.py 创建通知脚本:
#!/usr/bin/env python3
import json
import sys
import os
import subprocess
# Read the hook input
input_data = json.load(sys.stdin)
tool_input = input_data.get("tool_input", {})
file_path = tool_input.get("file_path", "")
# Categorize file importance
important_extensions = [".py", ".js", ".ts", ".java", ".cpp"]
config_files = ["Dockerfile", "requirements.txt", "package.json"]
is_code = any(file_path.endswith(ext) for ext in important_extensions)
is_config = any(filename in file_path for filename in config_files)
if is_code:
# Important: notify and log
print(f"Code file modified: {os.path.basename(file_path)}")
subprocess.run(["say", "Code updated"], check=False) # Mac
sys.exit(0) # Show message in transcript
elif is_config:
# Very important: louder notification
print(f"Configuration file changed: {os.path.basename(file_path)}")
subprocess.run(["say", "Configuration updated - review changes"], check=False)
sys.exit(0)
else:
# Not important: silent success
sys.exit(0)
该 hook 会读取输入以了解被修改的文件,根据文件类型决定通知的重要程度,使用 stdout 将重要变更记录到日志,为不同文件类型触发不同音频提醒,并始终以 0 退出,因为这些是信息性而非阻断性操作。
输入分析与输出控制的结合,使 hook 能基于上下文智能地行动,同时为您与 Claude Code 提供恰当级别的反馈。您不会再被每个临时文件的通知打扰,只会听到真正关系到项目的重要变更。
请注意,该示例使用的是 macOS 上可用的 say 命令。在 Linux 上,您可以使用 notify-send;在 Windows 上,可以使用 PowerShell 命令实现类似通知。
Claude Code Hooks 常见坑
新手在使用 hooks 的第一周最容易踩的几个坑:
Shell 配置文件中的 echo 会破坏 hooks。hooks 在非交互式 shell 中运行,但会 source 您的 ~/.zshrc 或 ~/.bashrc。如果配置文件里有无条件的 echo,它们会把文本前置到 hook 的 stdout,导致 JSON 解析失败。请用交互式 shell 检查包裹:
if [[ $- == *i* ]]; then
echo "Welcome back"
fi
Stop hooks 可能陷入死循环。一个以退出码 2 退出的 Stop hook 会迫使 Claude 继续工作。如果您的脚本没有检查输入 JSON 中的 stop_hook_active 并在其为 true 时正常退出,您会一直循环直到超时。务必加入提前退出保护。
匹配器区分大小写。bash 不等于 Bash。请使用与 Claude Code 中显示完全一致的工具名称。
输出上限为 10,000 个字符。如果 hook 生成更多内容,在注入 Claude 上下文前会被截断。保持 stdout 简洁,仅输出模型所需的信息。
团队级与个人 hooks 容易混淆。位于 .claude/settings.json 的 hooks 会与团队共享(提交到仓库)。不想共享的个人 hooks 请使用 .claude/settings.local.json,它默认被 gitignore。
Hooks 与 Skills:何时用哪一个
Hooks 与 Claude Skills 的用途不同,配合使用效果最佳。Skill 是一份 markdown 文件,用来教会 Claude 如何做事(流程、规范、模板)。Hook 则是不受模型主观影响、以确定性方式强制执行规则的 shell 命令。
这一区别很重要:Skill 是建议,在压力下模型可能忽略;Hook 则每次都会触发。用 Skill 记录团队的迁移流程;用 PostToolUse hook 在 Claude 每次写入 .sql 文件时运行迁移 linter。Skill 让 Claude 更能干;Hook 让 Claude 更靠谱。
|
需求 |
使用 skill |
使用 hook |
|
Claude 在需要时加载的流程性知识 |
是 |
否 |
|
无法跳过的硬性约束 |
否 |
是 |
|
每次确定性运行 |
否 |
是 |
|
在模型异常时仍能生效 |
否 |
是 |
Claude Code Hooks 的高级范式
除了基础的通知与日志,hooks 还能解决团队日常面临的真实开发工作流问题。以下是一些您可在项目中借鉴的思路。
更棒的是,您其实不必手动构建这些 hooks。您只需把下面的提示思路连同文档中的Hooks 参考发给 Claude Code,它就会生成相应的代码与配置 JSON。
这些范式都可以根据您的工具与工作流进行定制。优先从能解决您日常最大痛点的开始,随着对 hook 开发的熟悉再逐步扩展自动化。
面向安全与合规的高级 hooks
Hooks 非常适合强制执行安全规则与合规标准。以下是四个用例。
API 密钥扫描器
-
问题:不小心将机密提交到版本控制
-
触发:在写入任何文件之前
-
方案:使用正则表达式扫描文件内容中的 API keys、tokens 与密码
“创建一个 Python 脚本,读取 hook 输入 JSON,提取文件内容,并使用正则模式检测常见的密钥格式,如 api_key=、token: 或 password=。对任何可疑匹配进行本地验证,切勿将原始密钥对外发送。
仅将打码片段(如保留前后各 4 个字符)或哈希发送至 Anthropic API,用于分析可疑字符串并判断它们是真实密钥还是变量名。如检测到密钥,以退出码 2 退出,并向 Claude 提供关于所发现密钥与更安全替代方案的反馈。”
许可证头校验器
-
问题:开源项目中新文件缺少必需的许可证头
-
触发:在写入源码文件之前
-
方案:校验新建的
.py、.js、.java文件是否包含正确的许可证文本
“解析 hook 输入获取文件内容,并检查前 10 行是否包含许可证文本(通过字符串匹配)。为更复杂的校验,将文件头发送给 Claude(通过 Anthropic API)以验证其包含正确的版权声明和许可证信息。若缺少头部,以退出码 2 阻止文件创建,并向 Claude 提供正确的许可证模板供添加。”
生产文件保护
-
问题:误修改关键系统配置文件
-
触发:在编辑敏感目录中的文件之前
-
方案:阻止对
/etc/、nginx.conf、database.yml等关键配置的修改
“从 hook 输入 JSON 中提取文件路径,并检查其是否匹配 /etc/、production.yml 或其他关键文件名等模式。使用 Claude 的 API 分析该文件路径,判断是否为可能影响生产系统的配置文件。如检测到危险路径,以退出码 2 退出,并提供更安全开发实践的具体建议。”
图片优化器
-
问题:大型图片文件拖慢应用与仓库
-
触发:添加新图片文件之后
-
方案:在保证视觉质量的前提下压缩 PNG/JPEG 文件
“解析 hook 输入以获取文件路径,并通过扩展名判断是否为图片文件。运行 imageoptim 等压缩工具,或调用 TinyPNG API,在保持质量的同时压缩图片。将压缩结果记录到 stdout,以便在 Claude 的记录中看到节省的体积。”
面向版本控制自动化的高级 hooks
在 Git 工作流与文档方面,hooks 也非常有用。我们来看一些点子。
Git 分支校验器
-
问题:团队成员不小心向受保护分支推送变更
-
触发:在任何文件写入或编辑操作之前
-
方案:检查当前 Git 分支,并在 main/master/production 上阻断操作
“使用简单的 bash 命令 git branch --show-current 获取当前分支名称,并与受保护分支列表比对。若位于受保护分支,以退出码 2 退出,并向 Claude 发送解释分支保护策略的错误信息。对于复杂的分支命名规则,可使用 Claude 的 API 分析分支名是否匹配保护模式。”
智能自动提交
-
问题:忘记提交更改或提交信息质量差
-
触发:在任何文件修改之后
-
方案:自动暂存并提交更改,并使用 AI 生成描述性提交信息
“从 hook 输入中读取修改的文件路径,运行 git diff 获取变更内容,并将 diff 发送给 Claude 的 API,请求生成简洁的提交信息。使用生成的信息配合 git add 与 git commit 命令自动提交更改。在 API 提示中包含文件名与变更类型,确保提交信息符合 conventional commit 标准。”
文档生成器
-
问题:API 文档与代码变更不同步
-
触发:在修改接口文件(controllers、models、APIs)之后
-
方案:自动运行 JSDoc、Sphinx 或 OpenAPI 等文档工具
“通过模式匹配检查修改的文件路径,判断其是否为 API 端点、模型或接口文件。将文件内容发送给 Claude 的 API,请其提取 API 变更并生成文档更新。运行相应文档生成工具(jsdoc、sphinx-build 等),并自动提交更新后的文档。”
面向协作与工作流集成的高级 hooks
最后,hooks 还能帮助团队成员保持同步。
Slack 集成
-
问题:团队对共享代码库的重要变更不够知情
-
触发:在对重大操作发送通知时
-
方案:将包含文件名与变更摘要的格式化消息发送到团队频道
“从 hook 输入中提取文件信息,并筛选源代码或配置等重要文件类型。使用 Claude 的 API 基于文件名与类型生成可读性强的变更摘要。通过 webhook URL 将格式化消息发送到 Slack,对于关键变更可@相关成员。”
Webhook 分发器
-
问题:手动触发 CI/CD 流水线导致部署延迟
-
触发:当发生特定事件(配置变更、部署文件修改)时
-
方案:调用外部 API 以触发构建、部署或其他自动化流程
“将修改的文件路径与 Dockerfile、package.json 或部署配置等模式进行匹配,判断是否应触发 CI/CD。使用 Python 的 requests 库调用带认证头与负载数据的 webhook URL。将文件路径与变更元数据包含在 webhook 负载中,以便外部系统做出智能的构建或部署决策。”
状态页更新器
-
问题:客户不了解维护或部署活动
-
触发:当部署或基础设施文件被修改时
-
方案:更新服务状态页以发布维护通知
“通过文件路径模式解析 hook 输入中的基础设施文件变更,如 Kubernetes 清单或 Terraform 配置。使用 Claude 的 API 基于检测到的基础设施变更类型生成维护消息。通过其 REST API 将状态更新发布到 StatusPage.io 或 PagerDuty,设置合适的事件类型与预估时长。”
团队状态通知器
-
问题:多个开发者在不知情的情况下同时处理同一功能导致冲突
-
触发:在开始新的 Claude Code 会话时
-
方案:向团队频道提醒您开始在某个项目或组件上工作
“读取 hook 输入中的项目目录,并使用 Claude 的 API 分析近期文件或 git 历史,了解正在进行的工作类型。向团队沟通渠道发送格式化消息,包含您的姓名、项目名称与关注领域。附上预计工作时长,并邀请在相关功能上协作的成员进行协调。”
结语
Claude Code Hooks 将不可控的 AI 编码助手转变为在恰当时机运行的自动化工作流。在本教程中,您学习了如何通过交互式 /hooks 命令与手动配置来设置 hooks,理解驱动智能自动化的 JSON 输入数据,并通过退出码与结构化输出来控制 Claude 的行为。
我们还介绍了实用范式,包括能阻断危险操作的安全校验与能减少噪声的智能通知。这些示例展示了 hooks 如何解决真实的开发问题,同时让您对 AI 助手保持完全掌控。掌握基础之后,您就能构建与团队特定工作流高度契合的自动化。
想进一步学习如何使用 AI 工具,请查看 DataCamp 的 Prompt Engineering 原理课程,其中涵盖与 hook 开发直接相关的提问策略。若想系统提升 AI 编码技能,试试我们的 ChatGPT 进阶课程,让 AI 助手成为您开发工作流中更可靠的伙伴。
Claude Code Hooks 常见问答
什么是 Claude Code Hooks?
Claude Code Hooks 是在 Claude Code 会话期间,当发生特定事件时执行 shell 命令的自动触发器。它们解决的问题是:Claude 会写出不错的代码,但会忘记格式化、运行测试或进行安全检查等重要步骤。与其每次手动提醒,不如让 hooks 自动运行命令完成这些步骤:例如在 Claude 写完 Python 代码后进行格式化、在修改后运行测试,或阻止对敏感文件的危险改动。Hooks 会监控您的会话、检测匹配事件,并在可获取详细上下文信息的情况下执行您配置的命令。
如何在 Claude Code 中使用 hooks?
您可以通过两种方式设置 hooks。最简单的方法是在 Claude Code 中使用交互式 /hooks 命令,它会引导您选择事件(如 PostToolUse)、匹配器模式(如针对写文件的 Write)以及命令(如 python -m black .)。或者,您也可以在 ~/.claude/settings.json(全局)或 .claude/settings.json(项目级)中手动编辑 JSON 定义 hooks。配置完成后,hooks 会自动加载并生效。您可随时通过再次运行 /hooks 或重启 Claude Code 来查看、修改或重新加载 hooks。
PreToolUse 与 PostToolUse hooks 有何区别?
PreToolUse hooks 在之前(如写入或编辑文件)触发,使其非常适合做校验与阻断危险操作。您可以检查 Claude 即将执行的动作,并通过以退出码 2 退出来在需要时阻止。PostToolUse hooks 在之后触发,使其非常适合做清理类任务,如代码格式化、运行测试或记录操作。需要预防性控制用 PreToolUse,需要事后自动化用 PostToolUse。
如何将 Claude 的操作信息传给我的 hook 脚本?
Claude Code 会通过标准输入(stdin)以 JSON 发送详细信息,其中包含文件路径、将写入的内容、会话 ID 等上下文。您的 hook 脚本可在 Python 中使用 json.load(sys.stdin) 或其他语言的类似方法读取。借助这份 JSON 负载,您的 hook 能做出智能决策,例如仅通过检查扩展名格式化 Python 文件,或通过检查文件路径来阻止特定目录的修改。
退出码 2 的作用是什么,何时应使用?
退出码 2 告诉 Claude Code 某个操作应被阻断,并会将您写入 stderr 的错误消息直接发送给 Claude。随后 Claude 会向您解释问题并提出替代方案。将退出码 2 用于安全检查(阻止危险文件修改)、合规校验(缺少必需头部)或安全门(阻止向受保护分支提交)。对于绝不应阻断的消息类 hooks,请使用退出码 0 或其他码。
Claude Code hooks 会导致无限循环吗?
会,若处理不当,Stop hooks 可能陷入无限循环。以退出码 2 退出的 Stop hook 会迫使 Claude 继续工作。如果您的脚本没有检查 hook 输入 JSON 中的 stop_hook_active,并在其为 true 时干净退出,Claude 就会再次响应、再次触发 Stop hook、再次被阻断,反复循环直到会话超时。务必在 Stop hook 脚本开头加入守卫,检查该字段并在已激活时立即返回退出码 0。
除 shell 命令外,Claude Code 还支持哪些 hook 类型?
Claude Code 支持五种 hook 类型:command(shell 命令,最常见)、http(向 URL 发送 POST 以做 webhook 集成)、mcp_tool(调用已连接 MCP 服务器上的工具)、prompt(向 Claude 模型发送单轮评估提示)以及 agent(启动可使用工具进行条件验证的子代理)。对于大多数场景,command hooks 就足够。详情参见官方 hooks 参考。