#!/bin/bash
# .claude/hooks/stop-check-sync.sh
# arcrun Stop hook
#
# 職責：session 結束前檢查 code 變動是否有對應的 SDD / tasks.md 更新
# 退出 code：不 block，只警告

set -o pipefail

# 檢查 docs/3-specs 下本次 session 是否有變動
SPECS_DIFF=$(git -C "$(pwd)" status --porcelain -- 'docs/3-specs/' 2>/dev/null | head -20)
CODE_DIFF=$(git -C "$(pwd)" status --porcelain -- '*.go' '*.ts' '*.tsx' '*.py' 'cypher-executor/' 'registry/' 'cli/' 2>/dev/null | head -20)

if [[ -n "$CODE_DIFF" && -z "$SPECS_DIFF" ]]; then
  cat >&2 <<EOF

⚠️  Stop hook 警告（by arcrun hook）

偵測到本 session 有程式碼變動，但 docs/3-specs/ 下的 SDD 文件沒有任何變動。

未 commit 的程式碼變動：
$(echo "$CODE_DIFF" | head -10)

請在結束前確認：
  1. 對應的 tasks.md 是否已更新 [x]？
  2. 是否有架構變動需要更新 design.md？
  3. 是否有 SDD 範圍外的 change 未標記？

SDD 協議要求：code 和 SDD 必須同步更新。
參考：.claude/rules/00-sdd-protocol.md

EOF
fi

# ── console-ui：對外網址上是不是還跑著舊世代？（2026-08-08）────────────────
#
# 病（leo：「已經發生過一次這個錯誤，把舊版界面上到 prod，你要確定不可再犯」）：
#   前端改完、commit 了、甚至 wiki 都寫了，但**沒有人把它推上去**——
#   而線上不會報錯，只是繼續展示半個月前的介面。08-08 實測：三個對外網址的
#   apiBase/profile 全綠，跑的卻是 07-22 那一代。**組態對 ≠ 世代對。**
#
# 為什麼掛在 Stop：這裡正是 CC 要說「做完了」的那一刻。
#   不連網（每回合都跑），只比對「手上這一代」與「最後一次**通過線上實測**的部署紀錄」
#   （.deploy-state.json 只在 deploy.mjs 驗過線上後才寫，不是跑過指令就寫）。
#   要問線上真實現況：cd console-ui && npm run verify（那支才連網）。
if [ -d console-ui/scripts ] && command -v node >/dev/null 2>&1; then
  LAG="$(cd console-ui && node scripts/verify-live.mjs --offline-lag 2>/dev/null)"
  if [ -n "$LAG" ]; then
    cat >&2 <<EOF

🕰️  console-ui：手上這一代**還沒送出去過**
$(echo "$LAG" | sed 's/^/    · /')

    對外網址不會因此報錯——它只會繼續展示舊介面，而所有只驗組態的檢查都會說它是綠的。
    要看線上現在真的在跑哪一代：  cd console-ui && npm run verify
    要送出去（含推完自動回頭驗線上）：cd console-ui && npm run deploy:personal

EOF
  fi
fi

# 若有暫存的 tasks.md 變動，提醒 commit
TASKS_DIFF=$(git -C "$(pwd)" status --porcelain -- 'docs/3-specs/**/tasks.md' 2>/dev/null | head -5)
if [[ -n "$TASKS_DIFF" ]]; then
  cat >&2 <<EOF

📝 提醒：tasks.md 有未 commit 的變動
$(echo "$TASKS_DIFF")
記得在結束前 commit。

EOF
fi

exit 0
