在使用像 Claude Code 这样的 AI 编程助手时,我们常会遇到一个问题:它能写出漂亮的初始代码,但却可能“忘记”一些关键的后续步骤,比如代码格式化、运行测试、甚至是遵循特定的安全协议。结果就是,我们不得不一遍又一遍地提醒,这无疑降低了开发效率。
Claude Code Hooks 正是为解决这个痛点而生的。它允许你在 AI 编码会话的特定节点自动执行 shell 命令,将那些重复的提醒和操作统统自动化。
在本文中,我将手把手教你如何设置 Hooks,涵盖代码格式化、测试执行、智能通知,以及文件保护等多种场景。最终,我们将共同构建一套自动化系统,让开发标准得以持续遵守,而无需人工干预。
如果你对驱动 Claude Code 的大型语言模型感兴趣,可以参考这篇关于 Claude Sonnet 4.5 的文章。
什么是 Claude Code Hooks?
简单来说,Claude Code Hooks 就是一些 shell 命令,它们会在你的 AI 编码会话中特定事件发生时自动运行。你可以把它们想象成一套“自动触发器”,能在 Claude 完成文件写入、执行某个命令,或者向你发送通知等精确时刻,来执行你预设好的自定义脚本。
这个系统的工作原理是这样的:它会持续监控 Claude Code 的各项操作,并将其与你在配置文件中定义的规则进行匹配。一旦匹配成功,你指定的命令就会执行,并且能获取到当前事件的完整上下文信息。这赋予了你对 Claude 行为的精细控制力,让那些原本需要手动重复的任务变得自动化起来。
这里有个最基础的 Hook 示例,它能在 Claude 每次写入 Python 文件后自动运行代码格式化工具:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "python -m black ."
}
]
}
]
}
}
这个 Hook 配置有三个核心组成部分:
- 事件 (Event):
PostToolUse(表示在 Claude 完成一项操作之后触发)。 - 匹配器 (Matcher):
Write(只在写入文件时触发)。 - 命令 (Command):
python -m black .(在当前目录格式化所有 Python 文件)。
当 Hook 被触发时,它会接收到关于 Claude 刚刚执行了什么操作的详细 JSON 数据。有了这些上下文信息,我们就能构建出更复杂的自动化,例如根据具体的文件修改来智能响应。
如果你的自动化需求超出了编码工作流范畴,Claude Cowork 也提供了类似的 AI 辅助自动化,用于处理文件和文档任务。
接下来,我们就将深入探讨如何从零开始创建 Hook,并将其注册到 Claude Code 中,让你的工作流变得更丝滑。
先决条件
在深入了解 Claude Code Hooks 之前,你需要确保一些基础环境已经搭建好:
- Claude Code 已安装并运行:你应该已经熟悉 Claude Code 的基本用法来完成日常编码任务。
- 熟悉命令行操作:Hooks 本质上是运行 shell 命令,所以你需要了解如何在你的操作系统中编写基础的终端命令。
- 文本编辑器:我们需要编辑 JSON 配置文件来设置 Hooks。
- 项目目录:准备一个代码项目,你可以在其中安全地测试 Hooks,而不会影响到重要的工作。
你不需要成为 shell 脚本专家,但了解如何运行像 ls、cd 等命令以及进行基本的文件操作,将有助于你理解后续的示例。如果你是 Bash 脚本或终端的新手,我个人强烈建议先去学习一下 Introduction to Shell 课程。
上手 Claude Code Hooks
现在你已经明白了 Hooks 是什么,接下来就让我们来设置你的第一个自动化。这个过程包括选择合适的事件,配置一个简单的规则,然后用一个基础命令来测试它。
理解 Hook 事件
Claude Code 提供了十种不同的事件,就像是为你预设了十个精确的“观察点”,让你可以在 AI 工作流的每个关键节点介入并运行自定义命令:
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 在会话关闭时触发,允许进行清理或会话结束报告。
以下表格总结了这些事件的触发时机和主要用例:
| 事件名称 | 触发时机 | 主要用例 |
|---|---|---|
PreToolUse |
在 Claude 执行动作之前(例如,写入文件、运行命令)。 | 校验动作或阻止危险操作。 |
PostToolUse |
在 Claude 完成动作之后。 | 清理任务、格式化代码或运行测试。 |
UserPromptSubmit |
在你提交提示词时,处理开始之前。 | 为对话添加上下文或校验提示词要求。 |
Notification |
在 Claude 发送警报时(例如,请求输入或权限)。 | 处理系统警报和用户关注请求。 |
PermissionRequest |
当显示权限对话框时。 | 代表用户自动批准或拒绝请求。 |
Stop |
在 Claude 完成其整体响应时。 | 对主响应进行最终检查或生成报告。 |
SubagentStop |
在工具派生的辅助代理(“子代理”)完成工作时。 | 专门针对子代理活动的最终检查。 |
PreCompact |
在对话历史缩短之前。 | 管理对话清理和上下文保存。 |
SessionStart |
在新会话开始时。 | 初始化和设置默认值。 |
SessionEnd |
在会话关闭时。 | 最终清理或会话结束报告。 |
理解匹配器
匹配器是 Hook 的“准星”,它决定了哪些 Claude Code 操作会触发你的 Hook。从技术上讲,它们被解释为正则表达式字符串,这意味着你可以使用精确匹配,也可以使用更灵活的模式。
最常见的匹配器是像 Write(在 Claude 写入文件时触发)或 Edit(在编辑内容时触发)这样的简单模式,以及像 Edit|Write 这样组合多种动作的模式。
你也可以使用前缀模式,例如 Notebook.* 来匹配所有以“Notebook”开头的工具。如果你希望 Hook 在每次操作时都触发,可以使用通用正则表达式 .*,或者干脆使用空字符串(""),甚至留空 matcher 字段。
由于匹配器是区分大小写的,并且只作用于操作名称,因此最好让它们尽可能具体。当你需要更精细的控制(例如,只限制 Hook 作用于某些文件类型)时,你可以读取 Claude 传递给 Hook 的 JSON 数据,然后在脚本中应用你自己的正则表达式或条件判断。我个人觉得,如果对正则表达式不太熟,可以先从简单的精确匹配开始,等到要处理更复杂的逻辑时,再把这些逻辑放到 Hook 脚本里面去处理。
创建你的第一个 Hook in Claude Code
Claude Code 提供了两种设置 Hook 的方式:通过交互式的 /hooks 命令,或者直接编辑配置文件。让我们从交互式方法开始,它对新手来说更友好。
使用 /hooks 命令:
- 打开 Claude Code 并在聊天界面中输入
/hooks。 - 选择你的触发事件(本例中选择
PostToolUse)。 - 从菜单中选择 “Add new hook”(添加新 Hook)。
- 设置你的匹配器模式(输入
Write以针对文件写入操作)。 - 输入你的命令:
- Mac:
say "Task complete" - Windows:
powershell -c [console]::beep() - Linux:
spd-say "Task complete"
- Mac:
- 保存配置,并按三次
Esc键返回 Claude Code 主界面。
/hooks 命令会自动更新你的设置文件并重新加載配置。你也可以随时使用 /hooks 命令来查看现有的 Hook 或进行修改。
如果你更喜欢直接编辑配置文件,Hook 配置通常保存在全局设置文件 ~/.claude/settings.json 中,或者你的项目目录下的 .claude/settings.json 中。对于我们上面的例子,它看起来会是这样:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "say 'Task complete'"
}
]
}
]
}
}
手动编辑文件后,记得重启 Claude Code,或者使用 /hooks 命令来重新加载配置。现在,每当 Claude 写入一个文件时,你就会听到一个音频通知。
测试你的 Hook
在继续之前,请务必验证你的 Hook 是否真的工作:
- 让 Claude 写入任意一个 Python 文件(例如:“创建一个打印 hello world 的 hello.py 文件”)。
- 当 Claude 完成写入操作时,你应该会听到音频通知。
- 如果你什么也没听到,按下
Ctrl-O查看 Claude Code 的转录(transcript),看看是否有任何错误消息。 - 常见问题包括 Hook 命令未找到、文件权限不正确或配置文件中的语法错误。
搞定这个基本测试能为你日后构建更复杂的 Hook 节省大量的调试时间。如果你刚刚手动编辑了设置文件,或者修改了匹配器或事件,亦或安装了新的工具希望在 Hook 命令中使用,重新打开 /hooks 或重启 Claude 会很有帮助,以确保配置被正确加载。
这种“事件 - 匹配器 - 命令”的基本模式构成了所有 Hook 自动化的基础。你可以在此基础上进行扩展,例如在同一个事件触发时运行多个命令。举个例子,你可能希望在 Claude 写入文件时既播放声音,又创建一个备份。你还可以为同一个事件中的不同工具创建独立的匹配器,这样文件写入和代码编辑就能触发不同的操作。所有匹配相同工具模式的 Hook 都会并行运行。如果你为同一个事件配置了多个匹配器,每个 Hook 都会在其匹配器被触发时运行。
使用 Hook 输入
当 Claude Code 触发一个 Hook 时,它会通过标准输入 (stdin) 发送关于刚刚发生了什么的信息。stdin 是一个数据流,在你的命令运行时直接流入。这些数据使得 Hook 不再只是在任意时间运行的普通脚本,而是变得异常强大。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:告诉你哪个事件触发了这个 Hook。
有了这些上下文,你的 Hook 脚本就不再是盲目执行的工具,而是能做出“智能”判断的助手:你可以跟踪是哪个对话触发了操作,如果需要可以访问完整的聊天历史,或者在正确的目录中运行命令。
基于事件的输入差异
PreToolUse 和 PostToolUse 这样的工具事件会包含关于该操作的额外详细信息,这正是 Hook 在自动化方面真正发挥作用的地方。在 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 标志,指示操作是否正确完成。
这些详细信息意味着你的 Hook 可以根据实际发生的情况做出不同的响应。你可以只格式化 Python 文件,只备份重要的目录,或者只在特定文件类型被修改时发送通知。
像 UserPromptSubmit 这样的事件则相对简单,因为它们不涉及工具操作:
{
"session_id": "abc123",
"hook_event_name": "UserPromptSubmit",
"prompt": "Write a function to calculate factorial"
}
请注意,UserPromptSubmit Hook 的配置中不使用匹配器。它们会在所有提示词上触发,而不是工具操作。这使得它们非常适合用于记录对话、自动添加项目上下文,或者在 Claude 处理提示词之前对其进行验证。
实战:读取 Hook 输入
让我们创建一个 Hook 来记录每一个用户提示词。这解决了在长时间编码会话中,你可能忘记向 Claude 提问了什么的问题。谁会希望在几天后才发现自己忘了当时问了什么问题呢?
首先,Hook 的配置如下:
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "python3 ~/.claude/log_prompts.py"
}
]
}
]
}
}
接下来,创建 Python 脚本并将其保存到 ~/.claude/log_prompts.py,内容如下:
#!/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 发生了什么,以及是否应该继续正常操作。这种控制机制将 Hook 从简单的日志工具转变为强大的工作流自动化,能够指导 Claude 的行为。这主要通过三个通道实现:标准输出 (stdout)、标准错误 (stderr) 和退出码 (exit codes)。
输出通道与退出码
标准输出 (stdout) 用于正常的输出。例如,如果你打印一些东西,它就会发送到 stdout。对于大多数 Hook 来说,这些内容会显示在 Claude Code 的转录(当你按下 Ctrl-O 时)中,让你能够记录自动化操作,而不会干扰主对话。
标准错误 (stderr) 用于错误消息。你可以使用以下方式向 stderr 写入内容:
- Python:
print("message", file=sys.stderr) - 命令行:
echo "message" >&2
关键区别在于,stderr 可以直接发送给 Claude 进行自动处理,让它能够响应你的 Hook 检测到的问题。
退出码 (Exit codes) 则告诉 Claude Code 接下来该做什么:
- 退出码 0:表示成功(
stdout内容会显示给用户)。 - 退出码 2:表示阻塞性错误(
stderr内容会发送给 Claude)。 - 退出码 3:表示延迟执行(表示命令执行没有错误,但其效果会推迟到满足额外条件时才生效)。
- 其他代码:表示非阻塞性错误(
stderr内容会显示给用户,但操作会继续)。
这个系统让你能够精细控制 Claude 何时应该停止、继续,或者接收你的自动化发现的反馈。让我们来看看两个最重要的退出码的例子。
退出码 0:正常操作
大多数 Hook 都使用退出码 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,让它能够自动响应。这正是 Hook 成为安全机制而不仅仅是自动化的关键所在。这是一个阻止危险文件操作的 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 了解你的安全策略。
构建一个智能通知 Hook for Claude Code
让我们来构建一个改进版的通知 Hook,它将输入处理与智能输出处理相结合。这个 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 提供恰到好处的反馈。你不会再收到所有临时文件的烦人通知,只会听到那些对项目真正重要的更改。
请注意,本例使用了 say 命令,它在 macOS 上可用。在 Linux 上,你可能需要使用 notify-send,而在 Windows 上,则可能需要一个 PowerShell 命令来实现类似的通知。
Claude Code Hooks 的高级模式
除了基本的通知和日志记录,Hooks 还可以解决团队日常面临的实际开发工作流问题。以下是一些你可以为自己项目调整的思路。
一个很棒的提示是,你其实不必手动构建这些 Hook。你只需将下面提供的一些提示思路,连同 Hooks 参考文档一起提供给 Claude Code,它就能帮你生成相应的代码和 JSON 配置。
以下每种模式都可以根据你的特定工具和工作流进行定制。从那些能解决你日常最大痛点的问题开始,然后随着你对 Hook 开发的熟悉,在逐步扩大你的自动化范围。
用于安全与合规的高级 Hook
API 密钥扫描器
- 问题:意外将敏感信息提交到版本控制。
- 触发器:在写入任何文件之前。
- 解决方案:使用正则表达式模式扫描文件内容,查找 API 密钥、令牌和密码。
“创建一个 Python 脚本,读取 Hook 的输入 JSON,提取文件内容,并使用正则表达式模式检测常见的敏感信息格式,例如 api_key=、token: 或 password=。对于任何可疑匹配,请进行本地验证,绝不将原始敏感信息发送到外部。仅将掩码后的摘要(例如,保留 4 个前缀/后缀字符)或哈希值发送到 Anthropic API,以分析可疑字符串,确定它们是真正的敏感信息还是变量名。如果检测到敏感信息,以退出码 2 退出,并向 Claude 提供关于检测到的敏感信息和更安全的替代方案的反馈。”
许可证头强制器
- 问题:开源项目在新文件中遗漏了必需的许可证头。
- 触发器:在写入源代码文件之前。
- 解决方案:验证新的
.py、.js、.java文件是否包含正确的许可证文本。
“解析 Hook 输入以获取文件内容,并使用字符串匹配检查前 10 行是否包含许可证文本。为了进行更复杂的验证,将文件头发送到 Claude 的 API,以验证它是否包含正确的版权声明和许可证信息。如果缺少文件头,则以退出码 2 阻止文件创建,并向 Claude 提供要添加的正确许可证模板。”
生产文件守卫
- 问题:意外修改关键系统配置文件。
- 触发器:在编辑敏感目录中的文件之前。
- 解决方案:阻止对
/etc/、nginx.conf、database.yml和其他关键配置的更改。
“从 Hook 输入 JSON 中提取文件路径,并检查它是否与 /etc/、production.yml 或其他关键文件名的模式匹配。使用 Claude 的 API 分析文件路径,确定它是否是可能影响生产系统的配置文件。如果检测到危险路径,则以退出码 2 退出,并提供关于在安全开发实践方面的具体指导。”
图像优化器
- 问题:大型图像文件拖慢应用程序和代码仓库。
- 触发器:在添加新的图像文件之后。
- 解决方案:在保持视觉质量的同时压缩 PNG/JPEG 文件。
“解析 Hook 输入以获取文件路径,并使用扩展名匹配检查它是否是图像文件。运行像 imageoptim 这样的压缩工具,或者调用 TinyPNG API 来压缩图像,同时保持质量。将压缩结果记录到 stdout,这样你就可以在 Claude 的转录中看到文件大小的节省。”
用于版本控制自动化的高级 Hook
Git 分支验证器
- 问题:团队成员不小心将更改推送到受保护的分支。
- 触发器:在任何文件写入或编辑操作之前。
- 解决方案:检查当前 Git 分支,并阻止在
main/master/production分支上的操作。
“使用简单的 Bash 命令 git branch --show-current 获取当前分支名称,并将其与受保护分支列表进行比较。如果位于受保护分支上,则以退出码 2 退出,并向 Claude 发送错误消息,解释分支保护策略。对于复杂的分支命名规则,请使用 Claude 的 API 分析分支名称,并确定它们是否匹配保护模式。”
智能自动提交
- 问题:忘记提交更改或编写糟糕的提交消息。
- 触发器:在任何文件修改之后。
- 解决方案:使用 AI 生成的描述性消息自动暂存和提交更改。
“从 Hook 输入中读取修改的文件路径,运行 git diff 获取更改,并将差异发送到 Claude 的 API,并附带一个请求简洁提交消息的提示。使用生成的提交消息与 git add 和 git commit 命令,自动提交更改。在 API 提示中包含文件名和更改类型,以确保提交消息遵循约定式提交标准。”
文档生成器
- 问题:API 文档与代码更改不同步。
- 触发器:在修改接口文件(控制器、模型、API)之后。
- 解决方案:自动运行 JSDoc、Sphinx 或 OpenAPI 等文档生成工具。
“检查修改的文件路径以确定它是否是 API 端点、模型或接口文件,使用模式匹配。将文件内容发送到 Claude 的 API,要求它提取 API 更改并生成文档更新。运行适当的文档生成工具(jsdoc、sphinx-build 等),并自动提交更新后的文档。”
用于协作与工作流集成的高级 Hook
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 生成维护消息。使用 StatusPage.io 或 PagerDuty 等服务的 REST API 发布状态更新,并包含适当的事件类型和估计持续时间。”
团队状态通知器
- 问题:多个开发人员在不知情的情况下处理相同功能,导致冲突。
- 触发器:在启动新的 Claude Code 会话时。
- 解决方案:提醒团队频道你正在开始处理特定项目或组件。
“从 Hook 输入中读取项目目录,并使用 Claude 的 API 分析最近的文件或 git 历史记录,以了解正在进行的工作类型。向团队通信渠道发送格式化消息,包含你的姓名、项目名称和重点领域。包含估计的工作持续时间,并邀请团队成员在处理相关功能时进行协调。”
总结
Claude Code Hooks 将不可预测的 AI 编码助手,转变为在你需要时精确运行的自动化工作流。通过这篇教程,你已经学习了如何使用交互式 /hooks 命令和手动配置两种方式来设置 Hook,理解了驱动智能自动化的 JSON 输入数据,并通过退出码和结构化输出控制 Claude 的行为。
我们探讨的实际模式包括阻止危险操作的安全验证器,以及减少干扰的智能通知。这些例子展示了 Hook 如何解决实际的开发问题,同时赋予你对 AI 助手的完全控制。既然你已经掌握了这些基础知识,就可以开始构建符合你团队特定工作流需求的自动化了。
要深入了解如何使用 AI 工具,可以查看 DataCamp 的 Understanding Prompt Engineering 课程,它涵盖了与 Hook 开发直接相关的提示策略。要获得更广泛的 AI 编码技能,请尝试我们的 Intermediate ChatGPT 课程,培养让 AI 助手成为你开发工作流中更可靠伙伴的技能。
Claude Code Hooks 常见问题
什么是 Claude Code Hooks?
Claude Code Hooks 是自动触发器,它们会在你的 Claude Code 会话期间发生特定事件时执行 shell 命令。它们解决了 Claude 编写的代码很好,但却会“忘记”格式化、运行测试或检查安全性等重要步骤的问题。Hooks 不再需要你每次手动提醒 Claude,而是通过自动运行命令来处理这些提醒:例如,在 Claude 写入 Python 代码后格式化,在修改后运行测试,或阻止对敏感文件的危险更改。Hooks 会监控你的会话,检测匹配的事件,并执行你配置的命令,同时提供关于 Claude 刚刚做了什么的详细上下文。
我如何使用 Claude Code 中的 Hooks?
你可以通过两种方式设置 Hook。最简单的方法是使用 Claude Code 中的交互式 /hooks 命令,它会引导你选择一个事件(如 PostToolUse),一个匹配器模式(如 Write 用于文件写入),以及你的命令(如 python -m black .)。或者,你可以手动编辑你的配置文件 ~/.claude/settings.json(全局)或 .claude/settings.json(项目特定),以 JSON 格式定义 Hook。一旦配置完成,Hook 会自动加载并激活。你可以随时通过再次运行 /hooks 或重启 Claude Code 来查看、修改或重新加载你的 Hook。
PreToolUse 和 PostToolUse Hook 有什么区别?
PreToolUse Hook 在 Claude 执行操作(如写入或编辑文件)之前运行,使其成为验证和阻止危险操作的理想选择。你可以检查 Claude 即将做什么,并在需要时通过以退出码 2 退出。PostToolUse Hook 在 Claude 完成操作之后运行,使其成为代码格式化、运行测试或记录发生的事情等清理任务的完美选择。当你需要预防性控制时使用 PreToolUse,当你需要响应式自动化时使用 PostToolUse。
如何将 Claude 执行了什么的信息传递给我的 Hook 脚本?
Claude Code 通过标准输入 (stdin) 以 JSON 格式发送详细信息,其中包含文件路径、正在写入的内容、会话 ID 等上下文。你的 Hook 脚本使用 Python 中的 json.load(sys.stdin) 或其他语言中的类似方法读取此 JSON。此 JSON 有效负载允许你的 Hook 做出智能决策,例如,通过检查文件扩展名只格式化 Python 文件,或通过检查文件路径阻止对特定目录的修改。
退出码 2 有什么作用,我什么时候应该使用它?
退出码 2 告诉 Claude Code 应该阻止操作,并将你的错误消息(写入 stderr)直接发送给 Claude。然后 Claude 可以向你解释问题并建议替代方案。在安全检查(阻止危险文件修改)、合规性验证(缺少必需的头文件)或安全门(防止提交到受保护分支)等场景中使用退出码 2。对于不应阻止操作的信息性 Hook,请改用退出码 0 或其他代码。
关于
关注我获取更多资讯