#!/usr/bin/env bash
# UserPromptSubmit hook — deterministic skill routing.
#
# 스킬 자동 발동은 확률 게임이라(설명 매칭 실패가 잦다) 핵심 절차는 이 hook이
# 프롬프트 신호를 보고 결정적으로 로드 지시를 주입한다.
# stdout이 additionalContext가 된다. 무신호 → 빈 출력 + exit 0.

set -uo pipefail

input=$(cat 2>/dev/null || true)
prompt=$(printf '%s' "$input" | node "$(dirname "$0")/read-json-field.mjs" prompt 2>/dev/null || true)
[ -n "$prompt" ] || exit 0

out=""
add() { out="${out}${out:+ }$1"; }

# 1) 에러 신호 → fix-error (가장 먼저 — "화면이 안 떠"가 UI 신호로 오분류되지 않게)
ERR='에러|오류|안 ?(떠|돼|되|열려|나와|보여)|깨졌|깨져|하얗|white screen|crash|exception|failed|500|404 '
if printf '%s' "$prompt" | grep -qiE "$ERR"; then
  add "[route] 문제 해결 요청으로 보인다 — fix-error 스킬을 로드해 재현→원인→수정→재검 루프로 처리하라 (추측 수정 금지)."
fi

# 2) 신규 기능/화면 요청 → start-feature (코드보다 설계 합의 먼저)
FEAT='(화면|페이지|기능|폼|목록|대시보드)([^.!?]{0,10})(만들|추가|생기|넣|구현)|만들고 ?싶|새로 ?만들'
if [ -z "$out" ] && printf '%s' "$prompt" | grep -qE "$FEAT"; then
  add "[route] 새 기능/화면 요청으로 보인다 — 코드 전에 start-feature 스킬로 설계하고 쉬운 요약으로 합의부터. 앱이 아직 없으면(init-app 조건) init-app이 선행. UI를 짜게 되면 project-theme 토큰을 따르라."
fi

# 2.5) 되돌리기 요청 → checkpoint (확률 발동에 맡기지 않는다)
UNDO='되돌려|되돌리|원래대로|취소해 ?줘|아까(로| 상태)|이전 상태|어제 상태'
if [ -z "$out" ] && printf '%s' "$prompt" | grep -qE "$UNDO"; then
  add "[route] 되돌리기 요청으로 보인다 — checkpoint 스킬의 되돌리기 절차(현 상태 먼저 커밋 → revert, reset 금지)를 따르고, 결과를 show-screen으로 확인시켜라."
fi

# 2.6) 데이터가 남아야 하는 요청 → data-storage
STORE='저장(되게|돼야|되도록)|남게 해|남아(야|있게)|유지되게|새로고침해도|다시 (켜|열어)도'
if [ -z "$out" ] && printf '%s' "$prompt" | grep -qE "$STORE"; then
  add "[route] 데이터 저장 요청으로 보인다 — data-storage 스킬의 결정 트리(mock → localStorage → 외부 서비스)로 최소 단계를 고르고, 저장 코드는 entities/<domain>/api/에 격리하라 (목 데이터·스키마도 같이)."
fi

# 2.65) 실서버 연결 요청 → connect-api
CONNECT='실제 데이터|진짜 (데이터|서버)|API ?(를)? ?(붙|연결)|서버 (붙|연결)|백엔드 (붙|연결)|실서버'
if [ -z "$out" ] && printf '%s' "$prompt" | grep -qE "$CONNECT"; then
  add "[route] 실서버 연결 요청으로 보인다 — connect-api 스킬을 로드하라. 순서는 스펙 확보(없으면 여기서 멈춤) → pnpm codegen → 엔티티 팩토리만 교체(화면 코드는 안 바뀐다) → 주소·인증 배선. CORS·사내망·SSO로 막히면 mock으로 되돌리고 사용자에게 알린다."
fi

# 2.7) 정리/청소 요청 → housekeeping
TIDY='정리해 ?줘|청소해|리팩토링'
if [ -z "$out" ] && printf '%s' "$prompt" | grep -qE "$TIDY"; then
  add "[route] 정리 요청으로 보인다 — housekeeping 스킬(죽은 코드·경계·게이트 생존·레슨 승격 한 바퀴, 동작 변경 금지)을 따르라."
fi

# 3) UI 수정/스타일 작업 → project-theme + conventions
UI='컴포넌트|버튼|모달|카드|테이블|리스트|레이아웃|사이드바|탭|디자인|스타일|색|느낌|밝게|어둡게|둥글|폰트|\.tsx\b|src/(app|widgets|features)/'
if [ -z "$out" ] && printf '%s' "$prompt" | grep -qiE "$UI"; then
  add "[route] UI 작업으로 보인다 — ui-quality 스킬(register 판별 + anti-slop 하드밴), project-theme 스킬(theme 토큰만 사용, 전역 느낌 변경은 src/app/index.css 한 곳), frontend-conventions 색인의 07-component-design 장을 따르라."
fi

# 4) 배포/인터넷 공개 요청 → deploy 스킬 (완료 신호가 아니다 — 로컬 verify만 돌리고 "됐어요"라고 하면 거짓 성공)
DEPLOY='배포|인터넷에 올|온라인에 올|사이트로 만들|주소(로|를) 공유|링크(로|를) 공유|다른 사람이 보'
deploy_hit=""
if printf '%s' "$prompt" | grep -qE "$DEPLOY"; then
  deploy_hit=1
  add "[route] 인터넷 공개(배포) 요청이다 — deploy 스킬을 로드하라. 여기가 하드 관문이므로 세 가지를 **전부** 통과해야 배포한다: ①pnpm verify 전체 게이트 ②fe-reviewer 에이전트로 코드 심사 ③ui-critic 에이전트로 화면 심사. 게이트만 통과했다고 넘어가지 마라 — 저장소 실패 처리·숨은 쓰기·검증 없는 단언처럼 기계가 못 잡는 결함은 리뷰어만 잡는다(실사용 관찰: 9게이트 통과 코드에서 P1 3건). 심사에서 지적이 나오면 고치고 재심사한 뒤, 실데이터 공개 여부를 확인하고 Vercel로 배포해 URL을 전달한다."
fi

# 5) 완료 확인/보여주기 신호 → 핑퐁 사이클 화면 확인 (배포 요청이면 deploy가 우선)
DONE='다 ?됐|완료|끝났|이제 ?돼|공유해|보여줘|확인해 ?줘'
if [ -z "$deploy_hit" ] && printf '%s' "$prompt" | grep -qE "$DONE"; then
  add "[route] 핑퐁 사이클의 화면 확인 요청이다 — show-screen 절차(최소관문 pnpm preview → Playwright 로드 확인 → 열고 정지)로 빠르게 보여주고 멈춰라. 전체 verify·fe-reviewer·ui-critic은 여기서 돌리지 않는다(배포·푸시 하드 관문 몫). '됐어요'로 끝내지 말고 '고칠 데 있으면 말씀하세요'로 유저에게 넘겨라 (CLAUDE.md 만들기 루프)."
fi

[ -n "$out" ] && printf '%s\n' "$out (오탐이면 무시하고 진행.)"
exit 0
