chore(hooks): OpenAPI 抓取 + Prompt 同步 提醒 hook (W1 / F2-1B)

历史教训 (F2-1A): OpenAPI 抓取脚本 2026-04-06 commit 779b2f6 被
Claude Opus 4.6 在批量清理 1155 个废弃文件时误归档到
_DEL/_DEL/scripts/ops/, 导致 docs/contracts/openapi/backend-api.json
28 天 stale (137 paths -> 实际 167 paths, 缺 30 端点)。
Neo 反馈: 建立机制不要让类似事件再发生。

F3-2C 配套需求: 建立 docs/ai/system-prompts/ 独立 MD 体系后,
维护流程依赖 3 步同步 (元信息日期 / 同步历史 / _INDEX.md 状态表),
容易遗漏造成漂移。

新增 2 个 PostToolUse hook (Edit|Write matcher, timeout 5s):
- post_edit_openapi_reminder.py: 改 apps/backend/app/routers/*.py
  提醒重抓 OpenAPI 具体命令
  (.venv/Scripts/python.exe scripts/ops/_export_openapi.py)
- post_edit_prompt_sync_reminder.py: 改 docs/ai/system-prompts/app*.md
  提醒 3 步同步 (元信息 / 同步历史 / _INDEX.md 状态表)

settings.json 注册 2 个 hook 条目 (PostToolUse 末尾追加)。

spec-close.md 步骤 5 文档同步表:
- OpenAPI 行升级为具体命令 (避免手工同步漂移描述)
- 新增 docs/ai/system-prompts/app*.md 同步行

验证: stdin 模拟测试 3 场景全部符合预期 (匹配 router 输出 OpenAPI 提醒;
匹配 system-prompts MD 输出 prompt 同步提醒; 不匹配静默)。

详见 docs/audit/changes/2026-05-05__wave1_f2_1b_defense_hooks.md
This commit is contained in:
Neo
2026-05-05 02:03:43 +08:00
parent b3ad4b8325
commit a99bbd9a74
5 changed files with 228 additions and 1 deletions

View File

@@ -0,0 +1,38 @@
#!/usr/bin/env python3
"""PostToolUse hook: 编辑 backend router 后提醒重抓 OpenAPI
历史教训(2026-04-06 commit 779b2f6):
脚本 scripts/ops/_export_openapi.py 被 Claude Opus 4.6 误归档到 _DEL/,
导致 28 天内 docs/contracts/openapi/backend-api.json 与代码漂移
(137 paths stale → 实际 167 paths,缺 30 个端点)。
Wave 1 F2-1A 恢复脚本 + F2-1B(本 hook)建立防御机制,
任何 router 改动后提醒重抓,确保 OpenAPI 静态导出不再 stale。
"""
import json
import re
import sys
try:
data = json.load(sys.stdin)
except Exception:
sys.exit(0)
fp = (data.get("tool_input") or {}).get("file_path", "")
if not fp:
sys.exit(0)
rel = re.sub(r"^.*?NeoZQYY[/\\]", "", fp.replace("\\", "/"))
if re.search(r"^apps/backend/app/routers/.*\.py$", rel):
print(json.dumps({
"hookSpecificOutput": {
"hookEventName": "PostToolUse",
"additionalContext": (
f"[openapi-sync] 已编辑后端 router: {rel}"
"如有新增/修改/删除端点,完成后须重抓 OpenAPI: "
"`.venv/Scripts/python.exe scripts/ops/_export_openapi.py` "
"(更新 docs/contracts/openapi/backend-api.json,避免静态导出 stale)"
)
}
}))

View File

@@ -0,0 +1,40 @@
#!/usr/bin/env python3
"""PostToolUse hook: 编辑 system prompt 独立 MD 后提醒同步状态表
背景(F3-2C / 2026-05-05):
百炼云端为 system prompt 权威源,docs/ai/system-prompts/ 各独立 MD 是本地 git 备份。
每次从云端同步后,需要更新:
- 当前 MD 的 §一 元信息表"最后同步"日期
- 当前 MD 的 §同步历史 追加一行
- _INDEX.md §四 同步状态表对应行
本 hook 在编辑 app*.md 后提醒上述同步动作。
"""
import json
import re
import sys
try:
data = json.load(sys.stdin)
except Exception:
sys.exit(0)
fp = (data.get("tool_input") or {}).get("file_path", "")
if not fp:
sys.exit(0)
rel = re.sub(r"^.*?NeoZQYY[/\\]", "", fp.replace("\\", "/"))
if re.search(r"^docs/ai/system-prompts/app\w+\.md$", rel):
print(json.dumps({
"hookSpecificOutput": {
"hookEventName": "PostToolUse",
"additionalContext": (
f"[prompt-sync] 已编辑 system prompt 独立 MD: {rel}"
"若改动了 §四 System Prompt 章节(从云端同步),请同步:"
"(1) §一 元信息表'最后同步'改为今日;"
"(2) §同步历史 追加一行;"
"(3) docs/ai/system-prompts/_INDEX.md §四 同步状态表对应行更新"
)
}
}))