# InsuRo AI 콘텐츠 생성 V2 — Max200 CLI + 스킬 연동 + 큐 시스템

## 작업 레벨: Lv.3

## 프로젝트 시스템 3문서
- DevSystem: `/home/jay/workspace/memory/plans/anu-guide-system/plan.md`

## 프로젝트
- InsuRo: `/home/jay/projects/InsuRo`
- 서버: `/home/jay/projects/InsuRo/server` (FastAPI, port 8001)

## 배경
- AI 콘텐츠 생성이 Edge Function + 외부 API 키 의존 → 현재 완전 불능
- 제이회장님 지시: Max200 플랜 내에서 `claude` CLI subprocess로 처리 (추가 API 비용 없음)
- 브레인스토밍 완료: 대안 C(프리셋 + 커스텀 하이브리드) + 플랜별 차등 + 큐 시스템

## ★ 핵심 설계 (브레인스토밍 확정)

### 1. AI 엔진: claude CLI subprocess
```python
import subprocess
result = subprocess.run(
    ["claude", "-p", full_prompt, "--model", "sonnet", "--output-format", "text"],
    capture_output=True, text=True, timeout=120
)
content = result.stdout
```
- Max200 플랜 내 처리, ANTHROPIC_API_KEY 불필요
- 모델: 무료/베이직=haiku, 프로/맥스/히든=sonnet

### 2. 큐 시스템 (동시 요청 제어)
```python
import asyncio
from collections import deque

class GenerationQueue:
    MAX_CONCURRENT = 10
    
    def __init__(self):
        self.semaphore = asyncio.Semaphore(MAX_CONCURRENT)
        self.waiting_count = 0
        self.active_count = 0
    
    async def submit(self, job):
        self.waiting_count += 1
        async with self.semaphore:
            self.waiting_count -= 1
            self.active_count += 1
            try:
                return await job()
            finally:
                self.active_count -= 1
```
- 동시 처리 최대 10건
- 초과 시 대기열에 추가, "대기 N명" 표시
- GET /api/insuro/generate-queue-status → { active: N, waiting: M }

### 3. 프리셋 + 커스텀 하이브리드 (고급 옵션 내)

**프리셋 4종:**
- 📝 기본 작성 (무료~) — 빠른 초안
- 🔍 검색 상위노출 (프로~) — SEO + GEO 적용
- 🔥 바이럴 특화 (맥스~) — 바이럴 훅 + 카피라이팅
- 👔 전문 컨설팅 (맥스~) — 전문 블로그 + 금소법 강화

**개별 스킬 6종 (커스텀 펼치기):**
- 📝 기본 작성 — 무료~ (항상 ON)
- 🔍 네이버 SEO — 프로~
- 🌐 GEO 최적화 — 프로~
- 🔥 바이럴 훅 — 맥스~
- ✍️ 전문 블로그 — 맥스~
- 📊 전환율 카피 — 맥스~

**잠긴 스킬:** 🔒 표시 + "XX 플랜부터 사용 가능" + 업그레이드 유도

### 4. 스킬 프롬프트 모듈
서버에 `server/skill_prompts/` 디렉토리 생성, 스킬별 프롬프트 파일:
```
server/skill_prompts/
├── base.txt          # 기본 작성 프롬프트
├── naver_seo.txt     # 네이버 SEO 최적화 지시문
├── geo.txt           # GEO (AI 검색 최적화) 지시문
├── viral_hook.txt    # 바이럴 훅 5감정 공식
├── pro_blog.txt      # 전문 블로그 3-Layer Hybrid
└── cro_copy.txt      # 전환율 카피라이팅
```
각 파일에서 핵심 지시문을 추출하여 시스템 프롬프트에 조립.
참고 스킬: `~/.claude/skills/` 하위의 blog-writer, naver-seo, geo-optimizer, thread-hook-formula, copywriting-prompt, blog-dominance

### 5. 프롬프트 조립 흐름
```python
def build_prompt(topic, channel, settings, skills, extra_prompt):
    parts = []
    
    # 1. 채널별 기본 프롬프트
    parts.append(load_channel_prompt(channel))
    
    # 2. 고급 옵션 반영
    if settings.get("insuranceCategory"):
        parts.append(f"보험 카테고리: {settings['insuranceCategory']}")
    if settings.get("contentTone"):
        parts.append(f"콘텐츠 톤: {settings['contentTone']}")
    # ... 타겟 연령, 성별, 지역, CPA 링크 등
    
    # 3. 선택된 스킬 프롬프트 추가
    for skill in skills:
        parts.append(load_skill_prompt(skill))
    
    # 4. 금소법 규정
    if settings.get("complianceFilter") != "off":
        parts.append(load_compliance_prompt())
    
    # 5. 사용자 추가 프롬프트
    if extra_prompt:
        parts.append(f"추가 지시: {extra_prompt}")
    
    # 6. 주제
    parts.append(f"\n주제: {topic}")
    
    return "\n\n".join(parts)
```

### 6. 대기 UX (프론트엔드)
1. "콘텐츠 생성하기" 클릭
2. POST /api/insuro/generate-content → job_id 반환
3. 프론트에서 polling: GET /api/insuro/generate-status/{job_id}
   - `queued`: "대기 중 (N번째)" 
   - `processing`: 단계 표시 "스킬 적용 중..." → "본문 작성 중..." → "검수 중..."
   - `completed`: 결과 표시
   - `failed`: 에러 + 재시도 버튼
4. 페이지 벗어나도 백그라운드 처리, 콘텐츠 관리에서 확인 가능
5. 완료 시 토스트 알림

### 7. 플랜별 스킬 매핑 (프론트)
```typescript
// src/config/planSkillMap.ts
export const PLAN_SKILL_MAP: Record<string, string[]> = {
  Free: ["base"],
  Basic: ["base"],
  Pro: ["base", "naver_seo", "geo"],
  Max: ["base", "naver_seo", "geo", "viral_hook", "pro_blog", "cro_copy"],
  Hidden: ["base", "naver_seo", "geo", "viral_hook", "pro_blog", "cro_copy"],
};

export const SKILL_PRESETS: Record<string, { name: string; skills: string[]; minPlan: string }> = {
  basic: { name: "📝 기본 작성", skills: ["base"], minPlan: "Free" },
  seo: { name: "🔍 검색 상위노출", skills: ["base", "naver_seo", "geo"], minPlan: "Pro" },
  viral: { name: "🔥 바이럴 특화", skills: ["base", "viral_hook", "cro_copy"], minPlan: "Max" },
  consulting: { name: "👔 전문 컨설팅", skills: ["base", "pro_blog"], minPlan: "Max" },
};
```

### 8. 기존 task-2220 코드와의 관계
task-2220에서 서버에 `/api/insuro/generate-content` 엔드포인트가 이미 추가됨 (anthropic SDK 기반). 이 코드를 **claude CLI subprocess + 큐 시스템으로 교체**한다. 프론트의 API 호출 URL은 동일하게 유지.

## affected_files
- `server/main.py` (수정 — generate-content 엔드포인트를 CLI + 큐로 교체)
- `server/skill_prompts/` (신규 — 스킬별 프롬프트 파일 6개)
- `server/generation_queue.py` (신규 — 큐 시스템)
- `src/pages/Generate.tsx` (수정 — 스킬 선택 UI + 프리셋 + 대기 UX)
- `src/config/planSkillMap.ts` (신규 — 플랜별 스킬 매핑)

## 검증 시나리오
1. "30대 직장인 암보험 비교" + 네이버 블로그 + 기본 작성 → 콘텐츠 생성 성공
2. 프로 플랜: "검색 상위노출" 프리셋 선택 → SEO+GEO 프롬프트 적용된 결과
3. 무료 플랜: "바이럴 특화" 프리셋 🔒 표시 → 클릭 시 업그레이드 안내
4. 큐 상태: /api/insuro/generate-queue-status → active/waiting 카운트
5. 백그라운드 처리: 페이지 벗어났다가 → 콘텐츠 관리에서 결과 확인
6. npm run build 성공
7. 서버 재시작 후 엔드포인트 정상 응답
