#!/bin/bash
# UserPromptSubmit hook: 检测 prompt 含 Figma URL, 按方向 classify → 注入对应 TVU 协议
#   - mockup-write (画/加 UX 交付/改 mockup/走查/设计稿 …) → 注入 Mockup Write Gate 协议
#   - Figma→code  (还原/实现/翻译/vue/html/react/code …)  → 注入 code-conventions 协议
# → 让 AI 不能 skip 起手协议; mockup-write 方向从 L1 自律升为 hook-injected (对齐 code 方向)
#
# 项目级 hook (in tvu-design-system/.claude/hooks/) — portable for cross-account /
# cross-device / cross-clone use. Run scripts/install-claude-config.sh to also
# install globally for cross-project (sibling consumer products) use.
#
# 真源 (触发判定/规则以被注入真源为准, hook 只粗分流, 不重造清单):
#   - mockup-write: tvu-design-system/AGENTS.md §Mockup Write Gate (触发判定 + 4 步前置)
#                 + docs/internal/{mockup-conventions,design-process}.md
#   - Figma→code : tvu-design-system/docs/internal/code-conventions.md R7-R10 + R12
#                 + tvu-design-system/docs/meta-rules.md 触发器 K, L
# 实证: 2026-05-13 retrospection (Config-T 反复绕弯) + 2026-06-15 错路由发现 (mockup-write 被注入 code 协议)

# === Detect TVU repo path (portable) ===
# Priority: env var > Claude Code env > script-location walkup
if [ -n "$TVU_DESIGN_SYSTEM_PATH" ]; then
  TVU_PATH="$TVU_DESIGN_SYSTEM_PATH"
elif [ -n "$CLAUDE_PROJECT_DIR" ] && [ -f "$CLAUDE_PROJECT_DIR/docs/internal/code-conventions.md" ]; then
  TVU_PATH="$CLAUDE_PROJECT_DIR"
else
  # Walk up from this script's location: .claude/hooks/X.sh → repo root
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
  if [ -n "$SCRIPT_DIR" ] && [ -f "$SCRIPT_DIR/../../docs/internal/code-conventions.md" ]; then
    TVU_PATH="$(cd "$SCRIPT_DIR/../.." && pwd)"
  else
    TVU_PATH=""
  fi
fi

# === Read user's prompt from stdin ===
prompt=$(cat)

# === Detect Figma URL, then classify direction (mockup-write vs Figma→code) ===
if echo "$prompt" | grep -qE "figma\.com/(design|file)/"; then

  # Direction signals. mockup-write verbs复用 AGENTS §Mockup Write Gate 触发判定;
  # code-output 信号 = code-conventions R7 的"从 Figma 生成代码"意图。hook 只粗分流。
  mockup_write=0; code_out=0
  echo "$prompt" | grep -qiE "(画|加|改|调|更新|同步|推|设计|走查|角色测试|persona|journey|UX ?交付|交付说明|注释|效果图|设计稿)" && mockup_write=1
  echo "$prompt" | grep -qiE "(还原|实现|翻译|做成代码|组件代码|生成代码|\bcode\b|html|vue|react)" && code_out=1

  # --- mockup-write direction: 写动词 present 且无明确 code-output 信号 ---
  if [ "$mockup_write" = "1" ] && [ "$code_out" = "0" ]; then
    if [ -n "$TVU_PATH" ]; then
      AGENTSF="$TVU_PATH/AGENTS.md"
      MCONV="$TVU_PATH/docs/internal/mockup-conventions.md"
      DPROC="$TVU_PATH/docs/internal/design-process.md"
      CATALOG="$TVU_PATH/docs/internal/figma-component-catalog.md"
      MANIFEST="$TVU_PATH/docs/site-review-manifest.json"
    else
      AGENTSF="<TVU_REPO>/AGENTS.md"
      MCONV="<TVU_REPO>/docs/internal/mockup-conventions.md"
      DPROC="<TVU_REPO>/docs/internal/design-process.md"
      CATALOG="<TVU_REPO>/docs/internal/figma-component-catalog.md"
      MANIFEST="<TVU_REPO>/docs/site-review-manifest.json"
    fi
    cat <<JSON
{"systemMessage": "🚨 检测到 Figma URL + mockup-write 信号 (画/加 UX 交付/改 mockup/走查/设计稿 …) → TVU mockup-write 任务\n\n强制起手协议 (不可 skip; 触发判定与完整规则真源 = AGENTS §Mockup Write Gate, 以它为准):\n1. invoke tvu-design-mockup skill (Skill 工具) — 禁用通用 figma-use / figma-generate-design 替代 (会整段跳过 M23 等 mockup 硬规则)\n2. 完成 §Mockup Write Gate 4 步前置:\n   ① Read $MCONV (按 §AI 读取指引 scoped; 重点 M0 / M1 / M-COLOR / M-INTEGRITY / M23 / M32 / M35 / M43 / M46 / M47 + M49.1 token 绑定)\n   ② Read $DPROC (Pre-Phase 0 / No Open Questions / Stage 0.5 / Scope Handling / Delivery Cleanup Gate)\n   ③ Read $CATALOG 标题列表 (具体 entry 按需 grep)\n   ④ 从 $MANIFEST 拿 library fileKey (不靠扫产品文件 instance 反推库归属)\n3. 起手第一产出物: M48 Rule-Coverage Self-Check 清单 + M0 element→component mapping (catalog 查证, 非凭印象)\n4. ⛔ §M-LIFECYCLE 三时点闸 (任何 create/update/delete): 操作【前】probe 目标区防叠加(I6)·改既有先 live 重读做最小 delta(I5)·删前处理指向它的 connector; 操作【后】每批次跑 'pnpm audit:mockup-conformance --file <key> --node <触碰节点>' (含 overlap/bilingual-spacing/binding-fidelity) + use_figma connector 正交 probe, 违例当场修禁 silent pass; 【走查】三轴全跑·机械维度贴机检 pass/fail·--node 覆盖全 session 触碰节点\n\n严禁 (高频翻车): 自画库已有组件 (M32 Library-First) / M23 交付卡用 cream 浅底·单语·非 navy / 装饰元素浮 page 层 (M-INTEGRITY I4) / 改 text fontName 丢 textStyleId (M47) / 交付物残留 open questions (触发器 P)\n\n若实为 Figma→code 还原任务 (输出代码) → 起手按 $AGENTSF 与 code-conventions R7 重新 classify 方向。\n\n详细规则: https://github.com/NancyZeng0210/TVU-Design-System"}
JSON
    exit 0
  fi

  # --- Figma→code direction: 明确 code-output 信号 (bare/ambiguous URL 无信号则不注入) ---
  if [ "$code_out" = "1" ]; then

  # Build path references (with fallback placeholder if TVU repo not located)
  if [ -n "$TVU_PATH" ]; then
    CONV="$TVU_PATH/docs/internal/code-conventions.md"
    META="$TVU_PATH/docs/meta-rules.md"
    EXTRACT="$TVU_PATH/scripts/figma-extract-css.py"
    FETCH="$TVU_PATH/scripts/figma-asset-fetch.py"
    DIFF="$TVU_PATH/scripts/visual-diff.py"
  else
    CONV="<TVU_REPO>/docs/internal/code-conventions.md"
    META="<TVU_REPO>/docs/meta-rules.md"
    EXTRACT="<TVU_REPO>/scripts/figma-extract-css.py"
    FETCH="<TVU_REPO>/scripts/figma-asset-fetch.py"
    DIFF="<TVU_REPO>/scripts/visual-diff.py"
  fi

  # Output JSON systemMessage (bash heredoc with $ expansion for paths)
  cat <<JSON
{"systemMessage": "🚨 检测到 Figma URL + Code/还原 关键词 → TVU Figma-to-Code 任务\n\n强制起手协议 (不可 skip):\n1. invoke tvu-design-code skill (Skill 工具)\n2. Read $CONV (R7-R10 + R12 + 规则适用速查表)\n3. Read $META (触发器 K, L)\n4. **(新工具,必须先跑)** python3 $EXTRACT 取数据驱动 CSS baseline (禁止估算 layout values; 全部 from Figma metadata)\n\nR7 4 大场景 (起手 classify + 显式声明):\n- 场景 1: 非 TVU 视觉还原 (pre-design-system / 客户 Figma)\n- 场景 2: 已有产品增量\n- 场景 3: 全新产品 TVU 构建\n- 场景 4: TVU 规范校正\n声明格式: intent classified as 场景 X.Y (reason: ...)\n\n禁止行为 (高频翻车点):\n- 🔴 不准手画 SVG / 敲 Unicode 字符 (→ ← ✓ × ⋮ 等) 当图标 (R1/R13/M32 Library-First) → 画任何图标/指示符前先 spawn affordance-search agent 扫库 (Agent 工具, subagent_type=affordance-search); 库内确无 + 用户授权才自画并标 LIBRARY GAP\n- 不准 approximate 重画 vector (R8) → 用 $FETCH 取真 SVG\n- 不准从下游 React code 反推决策 (R10) → 先看 Figma node data-name (Logo/X = 单一 SVG 强 signal)\n- 不准自作主张 ambiguous case (Meta-L) → 必 ask + 列举疑问点\n- 不准 auto-commit 视觉文件 (Hook A) → 需 VISUAL_COMMIT_APPROVED=1 显式 override\n- 不准估算 layout values (padding/margin/font-size 等) → 必 run figma-extract-css.py 取精确数值\n- 不准把 Figma annotation (虚线框 / 浮于布局外 / _annotation/ 命名) 渲染为 UI → figma-extract-css.py 自动 filter, AI 必须 review annotation-filtered.md\n\n交付前自检 (R8 v2 L3): Chrome headless screenshot + $DIFF 客观 diff% vs Figma truth, threshold 内才交付. 不许凭主观判断 release.\n\n详细规则: https://github.com/NancyZeng0210/TVU-Design-System"}
JSON
  fi
fi
