学习目标
一个项目级 PostToolUse Hook,以及编辑后能查到的检查结果。
适用场景
你希望编辑后自动检查空白错误,不再依赖 Claude 记住。本篇先用只读 git diff --check 演示接线,不运行格式化、不写生产数据;它只是辅助检查,不能替代提交前或 CI 验收。
准备条件
- 本地项目已使用 Claude Code 与 Git。
- 现有 .claude/settings.json 需要合并保留原配置,不覆盖其他设置。
操作步骤
先单独验证检查命令
在项目根目录执行 git diff --check,了解正常和空白错误时的输出。没有更改时无输出不代表 Hook 已经触发;接线验证必须观察一次真实编辑。本例命令不修改文件,检查范围是工作区未暂存差异。
独立运行只读检查git diff --check配置项目级编辑后事件
把下面 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" } ] } ] } }用一次小编辑验证事件与结果
通过 /hooks 查看配置;按当前版本要求载入,再让 Claude 用 Edit/Write 在可丢弃的已跟踪测试文件里制造行末空白。未跟踪文件不在 git diff --check 范围内。确认 Hook 返回具体空白错误,再修正空白重试。成功时可能无输出,不能凭安静就推断已触发;保留当前客户端可查看的执行记录与失败对照。测试后撤回夹具改动。
明确它没有覆盖什么
Edit|Write 不覆盖所有改文件方式,例如 Bash 重定向。PostToolUse 的 exit 2 可以把 stderr 错误交给 Claude,但动作已经完成,不能撤销编辑,也不是发布门禁。需要更广覆盖或阻止动作时,按官方对应事件设计,仍保留独立提交前与 CI 检查。
常见误区
- Hook 没报错就宣布所有改动通过测试。
- 它只检查当前配置覆盖的事件和命令;仍需运行受影响的业务验收。
- 安装别人给的 Hook 时不读命令。
- Hook 会执行本地命令;先审查范围与副作用,再在隔离项目验证。
验收清单
- 原有项目设置被保留。
- 检查能单独运行且工作目录正确。
- 实际 Edit/Write 后有可观察执行证据。
- Bash、已暂存差异与业务测试等未覆盖项已说明。
资料与版本
本文为原创整理,示例需按项目调整;工具界面与功能以当前版本为准。