#!/bin/bash
# PostToolUse hook: 在每次 Figma 写操作 (use_figma 跑了 create/set/resize/remove… 的 JS)
# 之后, 注入 §M-LIFECYCLE 第②时点提醒 —— 报 done 前必须跑写后 conformance 机检。
#
# 为什么需要它 (2026-06-18):
#   §M-LIFECYCLE 把"操作后机检"定为硬兜底, 但 hook 注入的只是协议, AI 仍可能
#   "写完直接说 done 没跑 audit" (declared≠consumed, 本项目最高频 silent 失败)。
#   本 hook 把"忘了跑写后机检"从「AI 要记得」变成「harness 每次写后都提醒」。
#   局限 (诚实): hook 不能替跑 audit (要 token + nodeId), 也不能保证 --node 范围对;
#   Figma 写无机器拦截 (AGENTS 硬规则 #1) 的固有边界, 消不掉 —— 见 §M-LIFECYCLE Enforcement 现实。
#
# 真源: tvu-design-system/docs/internal/mockup-conventions.md §M-LIFECYCLE
# 注册: .claude/settings.json hooks.PostToolUse, matcher = use_figma 工具

input=$(cat)

# 只在含写信号时提醒 (纯读 use_figma —— getRange/probe/findAll 返回 —— 不打扰)
code=$(printf '%s' "$input" | python3 -c "
import json, sys
try:
    d = json.load(sys.stdin)
    ti = d.get('tool_input', {}) or {}
    # use_figma 的 JS 在 code; 兼容其它字段名
    print(ti.get('code') or ti.get('script') or '')
except Exception:
    print('')
" 2>/dev/null)

# 无 code (读类调用 / 解析失败) → 静默放行
[ -z "$code" ] && exit 0

# 写信号: 节点创建 / 改属性 / 改文本 / 几何 / 删除 / 绑定 / 层级
if ! printf '%s' "$code" | grep -qE "create(Instance|Frame|Text|Component|Rectangle|Ellipse|Vector)|appendChild|insertChild|\.characters[[:space:]]*=|setRange(FontName|FontSize|Fills|LineHeight|Hyperlink)|\.resize|resizeWithoutConstraints|\.fills[[:space:]]*=|\.strokes[[:space:]]*=|setBoundVariable|setSharedPluginData|\.remove\(\)|cloneNode|\.x[[:space:]]*=|\.y[[:space:]]*=|layoutMode|itemSpacing|\.name[[:space:]]*="; then
  exit 0
fi

# 试着从 code 里抽 node-id (形如 123:456) 给 --node 当提示 (去重, 取前几个)
hint_nodes=$(printf '%s' "$code" | grep -oE "[0-9]+:[0-9]+" | sort -u | head -6 | tr '\n' ' ')
[ -n "$hint_nodes" ] && node_hint="\n检测到触碰节点 (供 --node 参考, 自行确认是否齐全): $hint_nodes" || node_hint=""

remind="⛔ §M-LIFECYCLE 第②时点 (写操作后, 报 done 前必跑, 禁 silent pass):\n1. pnpm audit:mockup-conformance --file <key> --node <本批次触碰的所有节点, 不止新建> —— 含 integrity(I1-4) / colors / typography-icon / library-origin / binding-fidelity / overlap(block 叠加) / bilingual-spacing(M23.14) 共 8 维\n2. 连线另跑 use_figma checkConnectorOrthogonality (M23.6; REST 不可机检 centerline)\n3. 任一违例当场修, 再继续。--node 必须覆盖全部触碰节点 (2026-06-17 漏检根因: 只 audit 新建物)。${node_hint}"

# additionalContext 注入给模型; systemMessage 给用户可见
python3 -c "
import json, sys
msg = sys.argv[1]
print(json.dumps({
  'hookSpecificOutput': {'hookEventName': 'PostToolUse', 'additionalContext': msg},
  'systemMessage': 'Figma 写操作后提醒: 跑 audit:mockup-conformance --node 覆盖触碰节点 (§M-LIFECYCLE 第②时点)'
}, ensure_ascii=False))
" "$remind"
exit 0
