跳到正文
教程31 篇

Claude Code第 4 / 4 篇

Claude Code:用 Hook 留下编辑检查记录

先接一个可观察、只读的检查,再理解事件匹配和执行边界。

进阶约 20 分钟练习资料核实

学习目标

一个项目级 PostToolUse Hook,以及编辑后能查到的检查结果。

适用场景

你希望编辑后自动检查空白错误,不再依赖 Claude 记住。本篇先用只读 git diff --check 演示接线,不运行格式化、不写生产数据;它只是辅助检查,不能替代提交前或 CI 验收。

准备条件

  • 本地项目已使用 Claude Code 与 Git。
  • 现有 .claude/settings.json 需要合并保留原配置,不覆盖其他设置。

操作步骤

  1. 先单独验证检查命令

    在项目根目录执行 git diff --check,了解正常和空白错误时的输出。没有更改时无输出不代表 Hook 已经触发;接线验证必须观察一次真实编辑。本例命令不修改文件,检查范围是工作区未暂存差异。

    独立运行只读检查
    git diff --check
  2. 配置项目级编辑后事件

    把下面 hooks 字段合并到项目 .claude/settings.json。它匹配 Edit 和 Write,把检查输出转到 stderr,便于空白错误导致 exit 2 时反馈给 Claude;成功 exit 0 通常不显示输出。先核对执行目录,避免检查错仓库。本例不修改文件,也不取代业务验收。

    合并到 .claude/settings.json 的片段
    {
      "hooks": {
        "PostToolUse": [
          {
            "matcher": "Edit|Write",
            "hooks": [
              {
                "type": "command",
                "command": "git diff --check >&2"
              }
            ]
          }
        ]
      }
    }
  3. 用一次小编辑验证事件与结果

    通过 /hooks 查看配置;按当前版本要求载入,再让 Claude 用 Edit/Write 在可丢弃的已跟踪测试文件里制造行末空白。未跟踪文件不在 git diff --check 范围内。确认 Hook 返回具体空白错误,再修正空白重试。成功时可能无输出,不能凭安静就推断已触发;保留当前客户端可查看的执行记录与失败对照。测试后撤回夹具改动。

  4. 明确它没有覆盖什么

    Edit|Write 不覆盖所有改文件方式,例如 Bash 重定向。PostToolUse 的 exit 2 可以把 stderr 错误交给 Claude,但动作已经完成,不能撤销编辑,也不是发布门禁。需要更广覆盖或阻止动作时,按官方对应事件设计,仍保留独立提交前与 CI 检查。

常见误区

Hook 没报错就宣布所有改动通过测试。
它只检查当前配置覆盖的事件和命令;仍需运行受影响的业务验收。
安装别人给的 Hook 时不读命令。
Hook 会执行本地命令;先审查范围与副作用,再在隔离项目验证。

验收清单

  • 原有项目设置被保留。
  • 检查能单独运行且工作目录正确。
  • 实际 Edit/Write 后有可观察执行证据。
  • Bash、已暂存差异与业务测试等未覆盖项已说明。

资料与版本

本文为原创整理,示例需按项目调整;工具界面与功能以当前版本为准。