跳至主要内容

Claude Code Hooks:工作流自动化实用指南

了解基于 hook 的自动化如何工作,并开始使用 Claude Code hooks 来自动化测试、格式化和通知等编码任务。
· 15分钟 阅读

使用 AI 探索

在使用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 进行配置

  • 使用 PreToolUse hooks 在危险操作发生前进行阻断(退出码 2 = 阻断)

  • 使用 PostToolUse hooks 在 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 在会话关闭时触发,用于清理或最终报告。

事件名称

触发时机

主要用例

PreToolUse

在 Claude 执行操作之前(如写文件、运行命令)。

校验操作或阻断危险行为。

PostToolUse

在 Claude 完成操作之后。

清理任务、代码格式化或运行测试。

UserPromptSubmit

当您提交提示,处理开始之前。

为对话添加上下文或校验提示要求。

Notification

当 Claude 发送提醒(如请求输入或权限)。

处理系统提醒和用户关注请求。

PermissionRequest

显示权限对话框时。

代表用户自动批准或拒绝请求。

Stop

当 Claude 完成整体响应。

对主响应进行最终检查或生成报告。

SubagentStop

当工具派生的助手("subagent")完成工作。

针对子代理活动的最终检查。

PreCompact

在对话历史被缩短之前。

管理对话清理与上下文保留。

SessionStart

在新会话开始时。

初始化并设置默认值。

SessionEnd

当会话关闭时。

最终清理或会话结束报告。

理解匹配器

匹配器是决定哪些 Claude Code 操作会触发 hook 的过滤条件。技术上,它们是作为正则表达式解析的字符串,因此您既可以精确匹配,也可以使用更灵活的模式。

最常用的是简单匹配器,如 Write(在 Claude 写入文件时触发)或 Edit(在编辑内容时触发),以及组合形式 Edit|Write 来覆盖多种操作。

您也可以使用前缀模式,如 Notebook.* 来匹配所有以“Notebook.”开头的工具。若希望 hook 在每个操作上都触发,可使用通配正则 .*、空字符串("")或将 matcher 留空。

由于匹配器区分大小写且仅作用于操作名称,最好尽量保持具体。当您需要更细粒度的控制(例如将 hook 限定在某些文件类型)时,可以读取 Claude 传入 hook 的 JSON 负载,并在其中应用自己的正则或条件。

在 Claude Code 中创建您的第一个 hook

Claude Code 提供两种设置 hooks 的方式:使用交互式 /hooks 命令,或直接编辑配置文件。我们先从更友好的交互式方式开始。

使用 /hooks 命令:

  1. 打开 Claude Code,并在聊天界面输入 /hooks

  2. 选择触发事件(本例选择 PostToolUse)

  3. 在菜单中选择“Add new hook”

  4. 设置匹配器模式(输入 Write 以针对写文件)

  5. 输入命令:

    • Mac:say "Task complete"

    • Windows:powershell -c [console]::beep()

    • Linux:spd-say "Task complete"

  6. 保存配置,并按下 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 的确生效:

  1. 让 Claude 写任意 Python 文件(例如:“创建一个 hello.py,打印 hello world”)

  2. 当 Claude 完成写入操作,您应能听到音频通知

  3. 如果没有声音,按 Ctrl-O 查看 Claude Code 的记录,以检查任何错误信息

  4. 常见问题包括找不到 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 参考。

主题