《Claude Code 工程化实战》第 18 讲 Hooks 高级模式与工程实践

📌 本讲摘要

第 17 讲讲了 Hooks 的 4 类事件 + 安全三件套 + 质量三件套、本讲是 Hooks 系列的下篇、讲 4 个进阶主题:Stop Hook 门控(任务完成前的强制质量检查)/ SubAgent 事件验收(子代理完成后的报告自动汇总)/ frontmatter 精准配置(matcher / type / command 3 字段的最佳实践)/ 三维决策框架(性能 × 必要性 × 用户体验)。目的是让你"从会用 Hook 走向精通 Hook"------配置精准、响应快速、用户体验好。

本讲的三条主线:

第一、Stop Hook 门控 + SubAgent 事件验收------把质量检查和子代理完成验收自动化成机器强制的门、避免人为遗漏。

第二、frontmatter 精准配置------matcher 字段精确定位(避免 Edit 漏写 Write)/ command 字段最佳实践(绝对路径 + 错误信息清晰 + 退出码正确)。

第三、三维决策框架------性能(Hook 不能 > 1 秒)/ 必要性(是否真的需要拦截)/ 用户体验(不要频繁打断);3 维评分决定 Hook 该不该配。

学完本讲、你应该能把 6 个 Hook 串成完整防御链(PreToolUse 2 + PostToolUse 2 + Stop 2)、能用 Stop Hook 强制质量门、能用 SubAgentStop 自动汇总子代理报告、能用三维决策框架判断这个 Hook 该不该配。

📖 详细内容

Stop Hook 门控:任务完成前的强制质量检查

第 17 讲说 Stop Hook 可以强制 Claude 继续、本讲深入到完整的 Stop 门控------任务完成前、跑 4 步质量检查、任一不通过就强制继续、直到 4 步全过才允许停止。

4 步质量检查

步骤 1:未提交检查 (check-uncommitted.sh)------git status 看是否有未提交的改动。如果有、exit 2 强制 Claude 提醒"先 commit"。

步骤 2:测试通过检查 (check-tests.sh)------pytest tests/ -q 看是否全过。如果有失败、exit 2 强制 Claude 修复。

步骤 3:文档同步检查(check-docs-sync.sh)------对比 src/ 改动 vs docs/ 改动、如果 src 改了 docs 没改、exit 2 强制 Claude 同步文档。

步骤 4:审查 checklist 完整性(check-review-checklist.sh)------如果任务涉及代码改动、检查 review 报告是否包含 Security / Style / Test 3 段。缺一段、exit 2 强制 Claude 补全。

4 步门控形成质量门------任务未真正完成前、Stop 永远会被阻断、Claude 必须继续把 4 步都做对才能停下。

4 步的全或无语义

门控的设计原则:4 步必须全过、任一不过就 exit 2。这意味着:

• 步骤 1 失败 → 阻断、不进入步骤 2 / 3 / 4(避免连锁阻断)。

• 步骤 1 通过 + 步骤 2 失败 → 阻断、不进入步骤 3 / 4。

• 4 步全过 → 放行、允许 Stop。

这种短路求值避免了步骤 1 失败但步骤 2 3 4 还跑的浪费、Hook 性能也最优。

门控 vs 单检查

单检查(check-uncommitted.sh 单独配)的弱点:Claude 完成任务后只检查未提交、可能测试失败但没提醒。4 步门控(把 4 个检查串成一个 Stop Hook)的好处:任一不通过都被强制继续、质量门是复合的而不是单点的。

4 步门控的实现见后面"完整 Stop Hook 门控实现"代码块。

SubAgent 事件验收:子代理完成后的报告自动汇总

第 8 讲讲过子代理完成时、主对话需要汇总子代理输出。本讲用 SubAgentStop Hook 自动化这个过程------子代理完成后、Hook 读子代理输出、检查报告完整性、汇总到主对话的状态文件。

验收流程

  1. 子代理完成任务、准备停止。

  2. SubAgentStop 事件触发、Hook 脚本读子代理的输出(从 stdin 读 JSON、包含 subagent_output 字段)。

  3. Hook 检查报告完整性(比如代码审查 SubAgent 必须有 Security / Style / Test 3 段、缺一段 exit 2 强制继续)。

  4. Hook 把汇总报告写到 .claude/state/subagent-reports/-.md。

  5. Hook 通知主对话:"子代理 name 报告已汇总、路径: path"。

5 步形成子代理验收 + 自动汇总------避免子代理跑完报告没汇总、主对话不知道结果。

验收的 3 个检查项

检查项 1:报告完整性------子代理输出是否包含所有必要段(代码审查:Security / Style / Test;数据分析:数据源 / 处理逻辑 / 结论;部署:版本号 / 环境 / 健康状态)。

检查项 2:输出格式------是否按约定的 Markdown 结构(## 标题、表格、列表)。

检查项 3:状态文件------子代理是否写了状态文件到 .claude/state/.json(供主对话读取)。

3 个检查项任一不过、exit 2 强制子代理继续。

验收 vs 不验收

不配 SubAgentStop Hook 的弱点:子代理完成任务后、主对话只看到任务完成信号、不知道具体结果。需要用户主动 /ask 子代理汇报结果、或者主对话自己再读子代理输出------延迟高、容易遗漏。

配 SubAgentStop 的好处:子代理报告自动汇总到状态文件 + 通知主对话、主对话可以直接用结果。延迟从用户主动问降到自动汇总,0 用户操作。

frontmatter 精准配置:matcher / type / command 3 字段

第 17 讲配 Hook 时用了 frontmatter 的 matcher / type / command 3 个字段、本讲讲 3 字段的精准配置最佳实践。

字段 1:matcher 精确定位

matcher 字段决定哪个工具触发------Bash / Read / Edit / Write / Grep / Glob 等。常见写法:

"matcher": "Bash"------只对 Bash 工具触发(危险命令拦截)。

"matcher": "Edit|Write"------对 Edit 或 Write 触发(自动格式化)。

"matcher": "*"------对所有工具触发(Stop 门控)。

"matcher": "Edit"------只对 Edit 触发(漏写 Write 会导致 Write 不触发)。

易错点:写 Edit 漏写 Write,Write 不触发------Claude 用 Write 改文件时、自动格式化 / Lint 检查不会跑。修正:涉及修改文件的 Hook 统一写 "Edit|Write"

字段 2:type(目前仅 "command")

type 字段目前只支持 "command"、表示 Hook 是一个 shell 命令。未来可能支持 "prompt"(LLM 推理触发)、"http"(HTTP 回调)等。当前用 "command"。

字段 3:command 最佳实践

command 字段是 Hook 脚本的执行命令、3 个最佳实践:

实践 1:用绝对路径 ------"command": "bash /home/user/.claude/hooks/deny.sh" 而不是 "command": "bash .claude/hooks/deny.sh"。绝对路径避免 Claude 在不同目录运行时找不到脚本的问题。

实践 2:错误信息清晰------Hook 脚本 exit 2 时、stderr 必须输出清晰的拒绝原因(第 17 讲坑 2)。

实践 3:退出码正确------0 = 放行 / 通过、2 = 拒绝 / 强制继续。其他退出码(1 / 3 等)行为未定义、不要用。

3 字段的精准配置决定 Hook 是否按预期工作------matcher 写错 = 不触发、command 写错 = 拒绝 / 强制行为错乱。

三维决策框架:性能 × 必要性 × 用户体验

不是所有想法都要配 Hook。这个 Hook 该不该配有 3 维评估标准。

维度 1:性能(Hook 脚本耗时)

Hook 在 Claude 工具调用的关键路径上、每次都会跑。如果 Hook 太慢、Claude 整体响应速度被拖慢。判断标准:Hook 脚本 < 1 秒。超过 1 秒、优化或拆到 Stop 触发。

4 个性能问题:

  1. Hook 跑 ruff + pylint + mypy(总耗时 10 秒)→ 优化:只跑 ruff format(< 0.5 秒)。

  2. Hook 跑 pytest 完整套件(2 分钟)→ 优化:移到 Stop 触发、不阻塞工具调用。

  3. Hook 跑 curl 拉远程数据(网络延迟)→ 优化:缓存到本地、避免重复拉。

  4. Hook 跑 python -c 复杂逻辑(启动开销 0.5 秒 + 逻辑耗时)→ 优化:用 bash + grep 替代。

维度 2:必要性(是否真的需要拦截)

有些想法听起来好但实际没必要配 Hook。判断标准:Hook 拦截后、真的能避免实际发生过的真实问题吗?

4 个必要性问题:

  1. 拦截"误删 /tmp/test.txt"------真发生过多起吗?没有 → 不配。

  2. 拦截"chmod 777"------真发生过吗?发生过 → 配。

  3. 拦截提交含 TODO 的代码------值得拦截吗?看团队规范 → 视情况。

  4. 拦截在 main 分支直接 commit------团队用 PR 流程吗?用 → 不需要 Hook 拦截(main 分支保护由 GitHub 配);不用 → 配 Hook 提醒。

维度 3:用户体验(不要频繁打断)

Hook 频繁阻断会让用户觉得 Claude 怎么老是被打断。判断标准:这个 Hook 每天阻断 > 5 次吗?是、可能太严了或规则不精准。

4 个 UX 问题:

  1. Stop Hook 强制跑 pytest(每天阻断 10+ 次)→ 优化:只在涉及 test 改动时跑。

  2. PreToolUse 拦截所有 rm 命令(连 rm /tmp/test 都拦)→ 优化:只拦 rm -rf。

  3. PostToolUse 跑 ruff --fix(改文件 → 改回来循环)→ 优化:只跑 ruff format、不改语义。

  4. Stop Hook 阻断未提交(每次任务结束都阻断)→ 用户已经 commit 怎么办?优化:Hook 只在 git status --porcelain 有输出时阻断。

3 维评分:

• 性能:< 1 秒 = 通过、1-3 秒 = 警告、> 3 秒 = 失败。

• 必要性:真实问题发生过 = 通过、理论可能 = 警告、纯理论 = 失败。

• UX:< 5 次/天 = 通过、5-10 次/天 = 警告、> 10 次/天 = 失败。

3 维全通过 = 应该配;有 1 维警告 = 谨慎配;任 1 维失败 = 不配。

维度 评分标准 通过 警告 失败
性能 Hook 脚本耗时 < 1 秒 1-3 秒 > 3 秒
必要性 真实问题是否发生过 发生过多次 理论可能 纯理论
UX 每天阻断次数 < 5 次/天 5-10 次/天 > 10 次/天

多 Hook 编排:6 个 Hook 串成完整防御链

单个 Hook 是点、多个 Hook 串起来是链。本讲展示 6 个 Hook 串成的完整防御链------PreToolUse 2 个(拦截)+ PostToolUse 2 个(记录 / 改进)+ Stop 2 个(门控)。

完整配置见后面"6 个 Hook 完整防御链配置"代码块。

6 个 Hook 的出场顺序形成防御纵深:

  1. 工具执行前:PreToolUse deny-pipe-exec.sh 拦截 pipe 执行(curl | sh)。

  2. 工具执行前:PreToolUse deny-extra-dangerous.sh 拦截危险命令(rm -rf / chmod 777)。

  3. 工具执行后:PostToolUse auto-format.sh 自动格式化(.py 文件 ruff format)。

  4. 工具执行后:PostToolUse audit-log.sh 记录所有 Bash 命令(.claude/audit/.log)。

  5. 任务完成时:Stop check-uncommitted.sh 检查未提交。

  6. 任务完成时:Stop check-tests.sh 检查测试通过。

6 个 Hook 叠加形成防御链------任何一步有漏洞、其他步骤兜底。这是 defense in depth 在 Claude Code 中的工程实现。

Hooks 的工程最佳实践 5 条

5 条最佳实践是 Hook 工程的检查清单、任何 Hook 都应该按这 5 条评估。

最佳实践 1:Hook 脚本要轻(< 1 秒)

Hook 在关键路径上、每次都跑。轻量级:用 grep / awk / sed 比 python -c 快;缓存常用结果;长时间操作(完整测试套件)改用 Stop 触发。判断标准:Hook 脚本 > 1 秒 = 优化。

最佳实践 2:Hook 拒绝要说清原因

Hook exit 2 时、stderr 必须输出清晰的拒绝原因("❌ 拒绝:rm -rf 被禁止、原因:防止误删、改用 rm -i")。这样 Claude 收到后能告诉用户我被拒了、你可以用 rm -i、形成完整反馈链。判断标准:Hook 拒绝时 stderr 输出的信息、用户能直接看懂原因?能、正确。

最佳实践 3:Hook 规则要精准(不要误拦)

Hook 规则要精准------只拦真正危险的模式(rm -rf + 关键目录)、不拦普通 rm。规则写好后、在测试环境跑 10+ 测试用例(5 个应该被拦 + 5 个应该被放过的)、确保两个集合都正确。判断标准:Hook 误拦率 > 5%?调规则。

最佳实践 4:Hook 配置后要测试

配置 Hook 后立即在测试环境跑 5 个应该被拦的命令和 5 个应该被放过的命令、确认两个集合都正确。再用 Stop Hook 的未提交检查故意制造未提交改动、确认 Hook 能强制 Claude 继续。判断标准:Hook 配置后、跑过 >10 个测试用例吗?没有、补测。

最佳实践 5:Hook 进 git + 配 PR review

Hooks 是工程资产、不是个人草稿。所有 Hook 脚本和 .claude/settings.json 都进 git、变更走 PR review。这样团队用的 Hook 是一致的、可追溯的、可回滚的。判断标准:你的 .claude/hooks/ 目录是本地文件还是 git 跟踪?本地、赶紧入 git。

🛠️ 实战代码

📄 第 18 讲配套:完整 Stop Hook 门控实现(4 步质量检查 + 任一失败强制继续)

复制代码
#!/usr/bin/env bash
# .claude/hooks/stop-gate.sh
# 4 步质量门控:未提交 / 测试 / 文档 / 审查 checklist
# 任一不过 exit 2 强制 Claude 继续

set -e

FAIL=0

# === 步骤 1:未提交检查 ===
if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then
  if ! git diff --quiet HEAD 2>/dev/null || [ -n "$(git status --porcelain)" ]; then
    echo "⚠️ 步骤 1 失败:还有未提交的改动" >&2
    git status --short >&2
    FAIL=1
  fi
fi

# === 步骤 2:测试通过检查(只在涉及 test 改动时跑) ===
if git diff --name-only HEAD 2>/dev/null | grep -qE '^(src/|tests/)'; then
  if command -v pytest > /dev/null; then
    if ! pytest tests/ -q --tb=no > /dev/null 2>&1; then
      echo "⚠️ 步骤 2 失败:测试未通过" >&2
      FAIL=1
    fi
  fi
fi

# === 步骤 3:文档同步检查(src 改了 docs 没改) ===
if git diff --name-only HEAD 2>/dev/null | grep -qE '^src/'; then
  if ! git diff --name-only HEAD 2>/dev/null | grep -qE '^docs/'; then
    echo "⚠️ 步骤 3 失败:src 改了但 docs 没同步" >&2
    FAIL=1
  fi
fi

# === 步骤 4:审查 checklist 完整性(如果改了 src/) ===
if git diff --name-only HEAD 2>/dev/null | grep -qE '^src/'; then
  REVIEW_FILE=".claude/reports/review-latest.md"
  if [ ! -f "$REVIEW_FILE" ]; then
    echo "⚠️ 步骤 4 失败:没有审查报告(需要先跑 /review)" >&2
    FAIL=1
  elif ! grep -qE '^## (Security|Style|Test)' "$REVIEW_FILE"; then
    echo "⚠️ 步骤 4 失败:审查报告缺段(Security / Style / Test 必填)" >&2
    FAIL=1
  fi
fi

if [ "$FAIL" -eq 1 ]; then
  echo "" >&2
  echo "🚫 Stop 门控未通过,请修复后再次停止" >&2
  exit 2
fi

exit 0

📄 第 18 讲配套:SubAgentStop 验收 + 报告自动汇总实现(读子代理输出 / 写状态文件 / 通知主对话)

复制代码
#!/usr/bin/env bash
# .claude/hooks/subagent-accept.sh
# 子代理完成后的验收 + 报告自动汇总
set -e

INPUT=$(cat)
SUBAGENT_NAME=$(echo "$INPUT" | jq -r '.subagent_name // "unknown"')
SUBAGENT_OUTPUT=$(echo "$INPUT" | jq -r '.subagent_output // ""')
TIMESTAMP=$(date '+%Y-%m-%d_%H-%M-%S')

# === 验收 1:报告完整性(代码审查 SubAgent 必须有 3 段) ===
if [ "$SUBAGENT_NAME" = "code-reviewer" ]; then
  if ! echo "$SUBAGENT_OUTPUT" | grep -qE '^## Security'; then
    echo "⚠️ 验收 1 失败:code-reviewer 报告缺 ## Security 段" >&2
    exit 2
  fi
  if ! echo "$SUBAGENT_OUTPUT" | grep -qE '^## Style'; then
    echo "⚠️ 验收 1 失败:code-reviewer 报告缺 ## Style 段" >&2
    exit 2
  fi
  if ! echo "$SUBAGENT_OUTPUT" | grep -qE '^## Test'; then
    echo "⚠️ 验收 1 失败:code-reviewer 报告缺 ## Test 段" >&2
    exit 2
  fi
fi

# === 验收 2:状态文件(子代理必须写状态文件) ===
STATE_FILE=".claude/state/${SUBAGENT_NAME}.json"
if [ ! -f "$STATE_FILE" ]; then
  echo "⚠️ 验收 2 失败:${SUBAGENT_NAME} 没写状态文件 $STATE_FILE" >&2
  exit 2
fi

# === 验收 3:输出格式(必须有 ## 标题) ===
if ! echo "$SUBAGENT_OUTPUT" | grep -qE '^## '; then
  echo "⚠️ 验收 3 失败:子代理输出缺 ## 标题(Markdown 结构)" >&2
  exit 2
fi

# === 验收通过:汇总报告到主对话 ===
REPORT_DIR=".claude/state/subagent-reports"
mkdir -p "$REPORT_DIR"

REPORT_FILE="$REPORT_DIR/${SUBAGENT_NAME}-${TIMESTAMP}.md"
cat > "$REPORT_FILE" << EOF
# SubAgent Report: $SUBAGENT_NAME
# Timestamp: $TIMESTAMP
# State File: $STATE_FILE

$SUBAGENT_OUTPUT
EOF

# 通知主对话(写到 .claude/state/notifications.log)
echo "[$(date '+%Y-%m-%d %H:%M:%S')] SubAgent '$SUBAGENT_NAME' 完成,报告已汇总到 $REPORT_FILE" \
  >> .claude/state/notifications.log

exit 0

📄 第 18 讲配套:6 个 Hook 完整防御链配置(.claude/settings.json 完整版)

复制代码
// .claude/settings.json(完整 6 个 Hook 防御链)
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {"type": "command", "command": "bash /home/user/.claude/hooks/deny-pipe-exec.sh"},
          {"type": "command", "command": "bash /home/user/.claude/hooks/deny-extra-dangerous.sh"}
        ]
      },
      {
        "matcher": "Edit|Write",
        "hooks": [
          {"type": "command", "command": "bash /home/user/.claude/hooks/deny-edit-lockfile.sh"}
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {"type": "command", "command": "bash /home/user/.claude/hooks/auto-format.sh"},
          {"type": "command", "command": "bash /home/user/.claude/hooks/audit-log.sh"}
        ]
      }
    ],
    "Stop": [
      {
        "matcher": "*",
        "hooks": [
          {"type": "command", "command": "bash /home/user/.claude/hooks/stop-gate.sh"},
          {"type": "command", "command": "bash /home/user/.claude/hooks/check-tests.sh"}
        ]
      }
    ],
    "SubAgentStop": [
      {
        "matcher": "*",
        "hooks": [
          {"type": "command", "command": "bash /home/user/.claude/hooks/subagent-accept.sh"}
        ]
      }
    ]
  }
}

// 6 个 Hook 串成的防御链:
// PreToolUse  deny-pipe-exec        → 拦截 curl | sh
// PreToolUse  deny-extra-dangerous  → 拦截 rm -rf / chmod 777 / dd
// PreToolUse  deny-edit-lockfile    → 拦截改 lockfile
// PostToolUse auto-format           → 写完代码自动 ruff format
// PostToolUse audit-log             → 记录所有 Bash 命令
// Stop        stop-gate             → 4 步质量门控
// Stop        check-tests           → 测试通过检查
// SubAgentStop subagent-accept      → 子代理验收 + 报告汇总

📄 第 18 讲配套:三维决策框架的实操清单(性能 / 必要性 / 用户体验 3 维各 4 个问题)

复制代码
# Hook 三维决策框架实操清单

# === 维度 1:性能(Hook 脚本耗时) ===
□ 1. Hook 脚本 < 1 秒吗?(用 `time bash hook.sh` 测)
□ 2. Hook 是否跑网络请求?(curl / wget 会慢,加缓存)
□ 3. Hook 是否跑完整测试套件?(pytest 全套 1-2 分钟,改用 Stop 或 subset)
□ 4. Hook 是否用 python -c 复杂逻辑?(启动开销 0.5s+,改用 bash + grep)

# === 维度 2:必要性(是否真的需要拦截) ===
□ 1. 拦截的命令 / 操作真发生过多起吗?(没有 = 不配)
□ 2. 拦截后能避免"实际发生过的真实问题"吗?(发生过 = 配;纯理论 = 不配)
□ 3. 团队有更轻的方案替代吗?(比如 GitHub 分支保护比 Hook 拦截更合适)
□ 4. 拦截的频率和价值匹配吗?(高频高价值 = 配;低频低价值 = 不配)

# === 维度 3:用户体验(不要频繁打断) ===
□ 1. 这个 Hook 每天阻断 > 5 次吗?(> 5 次调规则)
□ 2. 阻断时 stderr 输出的信息用户能看懂吗?(看不懂 = 补)
□ 3. Hook 是否会"误拦合法操作"?(> 5% 误拦 = 调规则)
□ 4. Hook 是否会"循环阻断"?(改文件 → 改回来 → 再改,改用 PostToolUse auto-format)

# === 评分规则 ===
# 性能:< 1 秒 = 通过,1-3 秒 = 警告,> 3 秒 = 失败
# 必要性:真实问题发生过 = 通过,理论可能 = 警告,纯理论 = 失败
# UX:< 5 次/天 = 通过,5-10 次/天 = 警告,> 10 次/天 = 失败

# === 决策结果 ===
# 3 维全通过 = 应该配
# 有 1 维警告 = 谨慎配,记录原因
# 任 1 维失败 = 不配

# === 示例 ===
# Hook: PreToolUse 拦 rm -rf
# 性能:grep 匹配 < 0.1 秒 = ✅ 通过
# 必要性:误删事件发生过 3 次 = ✅ 通过
# UX:每月阻断 1-2 次 = ✅ 通过
# 决策:应该配

# Hook: Stop 强制跑完整 pytest
# 性能:pytest 完整 1-2 分钟 = ❌ 失败
# 决策:不配(或改用 subset 测试)

# Hook: PreToolUse 拦所有 rm 命令
# 性能:grep 匹配 < 0.1 秒 = ✅ 通过
# 必要性:误删 /tmp/test 发生过 0 次 = ❌ 失败
# 决策:不配(或只拦 rm -rf)

⚠️ 常见坑

⚠️ Stop Hook 配太多(每步都强制 Claude 继续、反而拖慢任务完成)

"门控过多"的反作用:Stop Hook 配 5-6 个、每个都强制 Claude 继续、结果 Claude 任务完成后被反复阻断、体验很差。修正:Stop Hook 控制在 2-3 个(关键门控:未提交 + 测试通过 + 文档同步;非关键不配)。其他质量检查移到 PreToolUse / PostToolUse。判断标准:Stop Hook > 3 个 = 太多、精简。

⚠️ SubAgentStop 没配置(子代理跑完报告没汇总、主对话不知道结果)

"子代理静默完成"陷阱:用 SubAgent 跑代码审查(第 6 讲 code-reviewer)、完成后主对话只看到"子代理任务完成"信号、不知道审查结果是什么。需要用户主动 /ask 子代理"汇报结果"、或者主对话自己再读子代理输出------延迟高、容易遗漏。修正:配 SubAgentStop Hook(子代理-accept.sh)做"自动验收 + 报告汇总到 .claude/state/subagent-reports/"、主对话可以直接用。判断标准:你的 SubAgentStop Hook 配置了吗?没有、补配。

⚠️ frontmatter matcher 写错("Edit"漏写"Write",Write 不触发)

"matcher 漏写"陷阱:配置 PostToolUse auto-format 时、matcher 写 "Edit"(漏写 Write)、结果 Claude 用 Write 改文件时、自动格式化不触发。修正:涉及"修改文件"的 Hook 统一写 "Edit|Write"(用 | 分隔多个工具名)。判断标准:你的 matcher 字段覆盖了所有相关工具吗?grep "Edit|Write" 检查。

⚠️ Hook 配置后没监控(执行次数 / 拦截次数 / 性能没度量、无法迭代优化)

"配了不看"的优化盲区:Hook 配了之后、不知道"每天触发多少次 / 拦截多少次 / 每次耗时多少"、无法判断 Hook 是否真的有用 / 是否误拦太多 / 是否拖慢速度。修正:Hook 自带监控------audit-log 记录所有 Bash 命令、stop-gate 记录门控阻断次数、subagent-accept 记录子代理验收结果。每周看一次统计、调整规则。判断标准:你最近一次看 Hook 执行统计是什么时候?超过 1 个月 = 落后了、补监控。

💡 一句话备忘

Hooks 高级模式是"从会用走向精通"------Stop Hook 4 步门控强制质量、SubAgentStop 自动验收汇总、frontmatter 精准配置避免漏触发、三维决策框架判断"该配不该配";6 个 Hook 串成完整防御链、5 条最佳实践沉淀团队资产。


← 回到 本讲网页顶部

相关推荐
西游音月6 小时前
Windows环境下的WSL+Claude Code安装配置
windows·大模型·ai编程·wsl·claude code
月走乂山2 天前
Anything Analyzer MCP 401 Unauthorized 故障排查
electron·故障排查·mcp·claude code·anything analyzer
码哥字节2 天前
为什么AI生成的单测,覆盖率看起来很高但上线还是出Bug?
测试覆盖率·claude code·ai单元测试
huy1n92 天前
Ubuntu 22.04部署Claude Code并接入DeepSeek-V4模型完整教程
linux·ubuntu·deepseek·claude code
仙逆GPT2 天前
Claude Code上下文满了怎么办?compact、clear和resume怎么用
大语言模型·ai编程·上下文·claude code·compact
Maynor9962 天前
AI Coding 零基础实战教程|第五部分:完整项目案例实操
java·前端·人工智能·claude code·ai coding
AITOP1002 天前
工信部发布Claude Code后门风险提示:首次对海外AI编程工具定调“危害严重“
claude code·ai编程工具·海外ai编程工具
Ai尚研修-贾莲3 天前
基于Claude Code与Codex双Agent协作的WebGIS全链路开发
codex·webgis·ai-agent·claude code·maplibre·openclaw·leaflet交互地图