跳至内容

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

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

用 AI 探索

在 ChatGPT 中打开在 Claude 中打开在 Perplexity 中打开

在使用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 上下文,并通过退出码、stdoutstderr 传达结果

什么是 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 脚本专家,但理解如何运行 lscd 以及基本文件操作将有助于您跟进示例。如果您是 bash 或终端新手,建议学习我们的Shell 入门课程。

开始使用 Claude Code Hooks

了解了 hooks 是什么之后,我们来设置您的第一个自动化。过程包括选择合适的事件、配置一条简单规则,并用基础命令进行测试。

理解 hook 事件

Claude Code 提供了 25+ 种 hook 事件。下表涵盖了您最常用的 10 个。完整列表见官方 hooks 参考

PreToolUsePostToolUse 是最常见的事件。PreToolUse 在 Claude 执行写文件或运行命令等操作之前触发,非常适合做校验或阻断危险操作。PostToolUse 在 Claude 完成操作后触发,适用于格式化代码或运行测试等清理任务。

UserPromptSubmit 在您向 Claude 提交提示时(处理开始之前)触发。您可以借此为对话添加上下文,或校验提示是否满足某些要求。

Notification 在 Claude 向您发送提醒时运行,比如请求运行命令的权限或需要您的输入。PermissionRequest 在 Claude Code 显示权限对话框时触发,允许您代表用户自动同意或拒绝请求。

StopSubagentStop 在 Claude 结束响应时触发,适用于最终检查或生成报告。两者区别在于 Stop 在 Claude 整体响应结束时触发,而 SubagentStop 则在由工具派生的助手(“子代理”)完成工作时触发。

其余事件 PreCompactSessionStartSessionEnd 处理特定生命周期场景。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 才能做出智能决策:追踪是哪次对话触发了操作、在需要时访问完整聊天记录,或在正确目录中运行命令。

基于事件的输入差异

PreToolUsePostToolUse 这样的工具事件会包含关于动作的额外细节,这正是 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.confdatabase.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 addgit commit 命令自动提交更改。在 API 提示中包含文件名与变更类型,确保提交信息符合 conventional commit 标准。”

文档生成器

  • 问题:API 文档与代码变更不同步

  • 触发:在修改接口文件(controllers、models、APIs)之后

  • 方案:自动运行 JSDoc、Sphinx 或 OpenAPI 等文档工具

“通过模式匹配检查修改的文件路径,判断其是否为 API 端点、模型或接口文件。将文件内容发送给 Claude 的 API,请其提取 API 变更并生成文档更新。运行相应文档生成工具(jsdocsphinx-build 等),并自动提交更新后的文档。”

面向协作与工作流集成的高级 hooks

最后,hooks 还能帮助团队成员保持同步。

Slack 集成

  • 问题:团队对共享代码库的重要变更不够知情

  • 触发:在对重大操作发送通知时

  • 方案:将包含文件名与变更摘要的格式化消息发送到团队频道

“从 hook 输入中提取文件信息,并筛选源代码或配置等重要文件类型。使用 Claude 的 API 基于文件名与类型生成可读性强的变更摘要。通过 webhook URL 将格式化消息发送到 Slack,对于关键变更可@相关成员。”

Webhook 分发器

  • 问题:手动触发 CI/CD 流水线导致部署延迟

  • 触发:当发生特定事件(配置变更、部署文件修改)时

  • 方案:调用外部 API 以触发构建、部署或其他自动化流程

“将修改的文件路径与 Dockerfilepackage.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 参考

主题

在 DataCamp 学习 AI 辅助编码!

Courses

面向开发者的 AI 辅助编码

1小时30分钟
7.9K
用 AI 提升编码效率——引导你的编码助手高效编写、测试和记录代码。
查看详情Right Arrow
开始课程
查看更多Right Arrow