From 6d53d95fa6b884e5dadd53dd22d0ea39fb264c45 Mon Sep 17 00:00:00 2001 From: kyeongmin Date: Wed, 25 Mar 2026 11:52:33 +0900 Subject: [PATCH] =?UTF-8?q?=ED=8C=80=EC=9E=A5=202-Step=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20+=20=EC=8B=A4=EC=9E=A5=20detail=5Ftarget=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 팀장 (DA-13 → DA-13a + DA-13b): - Step A: 레이아웃 프리셋 선택 (규칙 기반, LLM 불필요) sidebar-right / two-column / hero-detail / single-column - Step B: 프리셋 안에서 블록 매핑 (Sonnet, 프리셋 CSS 포함) - 기존 DA-13b(편집자) → DA-13c로 변경 실장 (kei_client.py): - detail_target 기준 수정: 근거/사례/용어는 popup이 아님 - reference는 sidebar에, 근거는 본문에 - popup은 진짜 상세 데이터(비교표 등)만 - 1페이지로 담을 수 있으면 억지로 2페이지 안 함 pipeline.py: import re 추가 Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 74 ++++++++++++++++++++++++++++++++--------------- PLAN.md | 47 ++++++++++++++++++------------ PROGRESS.md | 15 +++++----- src/kei_client.py | 10 +++++-- 4 files changed, 95 insertions(+), 51 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 5ec4821..25cc581 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -16,10 +16,14 @@ ``` [1단계] Kei 실장 (Sonnet) — AI 사고 - 꼭지 추출 → 레이어 수준 → 강조 판단 → 배치 방향 + 꼭지 추출 → 정보 구조 파악 → 레이어/강조/배치/role 판단 ↓ -[2단계] 디자인 팀장 (Sonnet) — AI 사고 - 블록 매핑 + 공간 배분 + 글자 수 가이드 → 편집자에게 전달 +[2단계] 디자인 팀장 — 2-Step + Step A: 레이아웃 프리셋 선택 (규칙 기반, LLM 불필요) + - 실장의 role 분석을 보고 프리셋 자동 결정 + Step B: 프리셋 안에서 블록 매핑 + 글자 수 가이드 (Sonnet) + - 선택된 프리셋의 CSS가 프롬프트에 포함됨 + - flow → body/main, reference → sidebar ↓ [3단계] Kei 텍스트 편집자 (Sonnet) — AI 사고 글자 수 가이드 참고하되 내용 의미 우선. 도메인 용어 보존하며 편집 @@ -31,14 +35,34 @@ 전체 균형 재검토 → 공간 재배분 → 2차 조정 지시 ``` +### 레이아웃 프리셋 (2단계 Step A) + +실장의 role 분석을 보고 **규칙 기반**으로 프리셋을 자동 선택한다. LLM 호출 불필요. + +| 프리셋 | 조건 | CSS grid | +|--------|------|----------| +| `sidebar-right` | reference 꼭지가 1개 이상 있음 | `"title title" "body sidebar" "footer footer"` / 65fr 35fr | +| `two-column` | 모든 flow 꼭지가 대등한 비교 | `"title title" "left right" "footer footer"` / 1fr 1fr | +| `hero-detail` | 고강조 꼭지 1개 + 나머지 보조 | `"title title" "hero hero" "detail detail" "footer footer"` | +| `single-column` | 모든 꼭지가 flow, 순차적 | `"title" "body" "footer"` / 1fr | + +**선택 규칙:** +``` +reference 꼭지 있음 → sidebar-right +모든 flow가 대등 비교 → two-column +고강조 1개 + 나머지 보조 → hero-detail +나머지 → single-column +``` + ### 역할 분리 | 역할 | 담당 | 방식 | 하는 일 | 하지 않는 일 | |------|------|------|---------|------------| -| Kei 실장 | Sonnet | AI | 꼭지 추출, 레이어 판단, 강조 판단, 배치 방향, 이미지/표/상세 판단 | 디자인, 텍스트 편집 | -| 디자인 팀장 | Sonnet | AI | catalog에서 블록 선택, 공간 배분, 겹침 방지, 글자 수 가이드, 전체 재검토 | 텍스트 정리, 콘텐츠 의미 판단 | -| 텍스트 편집자 | Sonnet | AI | 도메인 용어 보존하며 편집, 출처 보존, 표 내용 편집 | 레이아웃 결정, 디자인 판단 | -| 디자인 실무자 | Sonnet + 코드 | AI + 코드 | 텍스트에 맞게 디자인 조정, HTML/CSS 조립, 이미지 크기 조정, 표 스케일링 | 콘텐츠 의미 판단 | +| Kei 실장 | Sonnet | AI | 꼭지 추출, 정보 구조 파악, 레이어/강조/배치/role 판단 | 디자인, 텍스트 편집 | +| 디자인 팀장 Step A | 코드 | 규칙 | 실장의 role에 따라 레이아웃 프리셋 자동 선택 | AI 판단 불필요 | +| 디자인 팀장 Step B | Sonnet | AI | 프리셋 안에서 블록 매핑, 글자 수 가이드, zone 배정 | 레이아웃 구조 결정 (이미 정해짐) | +| 텍스트 편집자 | Sonnet | AI | 도메인 용어 보존하며 편집, 출처 보존, 표 편집 | 레이아웃 결정 | +| 디자인 실무자 | Sonnet + 코드 | AI + 코드 | 텍스트에 맞게 디자인 조정, HTML/CSS 조립 | 콘텐츠 의미 판단 | --- @@ -75,33 +99,35 @@ 상세 콘텐츠 판단: - 너무 구체적/세부적인 내용은 "자세히보기" 대상 ↓ -[2단계] 디자인 팀장 — 레이아웃 설계 +[2단계] 디자인 팀장 — Step A + Step B - 블록 매핑: - - catalog 메뉴판에서 각 꼭지에 적합한 블록 선택 - - 꼭지의 성격을 보고 판단 (출처 있으면 example-card, 정의면 card-grid 등) + Step A: 레이아웃 프리셋 선택 (규칙 기반, LLM 불필요) + - 실장의 role 분석을 보고 자동 선택: + reference 있음 → sidebar-right + 대등 비교 → two-column + 고강조 1개 → hero-detail + 나머지 → single-column + - 선택된 프리셋의 CSS grid가 Step B 프롬프트에 포함됨 + + Step B: 프리셋 안에서 블록 매핑 (Sonnet) + - 선택된 프리셋의 zone(body/sidebar/footer)에 꼭지를 배정 + - flow 꼭지 → body/main zone + - reference 꼭지 → sidebar zone + - detail_target 꼭지 → popup 연결 + - catalog에서 각 꼭지에 적합한 블록 타입 선택 + - 각 블록의 대략적 글자 수 가이드 이미지 배치: - 원본 이미지 크기 확인 (Pillow Image.open().size) - 가로/세로 비율에 따라 영역 결정 - (가로형이면 전체 너비, 세로형이면 텍스트 옆) - - 텍스트 포함 도표는 너무 작게 하면 안 됨 - 이미지는 원본 그대로 사용, 크기만 조절 표 배치: - 행×열 규모 보고 공간 안에 들어가는지 판단 - - 안 들어가면 실장에게 요약 요청 또는 2페이지 분리 + - 안 들어가면 요약 요청 또는 popup - 자세히보기 설계: - - 상세 콘텐츠는
/ 영역으로 설계 - - 공간 배분: - - 전체 공간에서 영역별 비율 결정 - - 꼭지끼리 겹치지 않도록 grid-template 설계 - - 각 블록의 대략적 글자 수 가이드 - - 페이지 판단: - - 안 들어가면 2페이지로 분리 + 자세히보기: + - detail_target 꼭지는
/로 popup 연결 ↓ [3단계] Kei 텍스트 편집자 — 텍스트 정리 diff --git a/PLAN.md b/PLAN.md index 0988222..8d82047 100644 --- a/PLAN.md +++ b/PLAN.md @@ -93,21 +93,32 @@ - **의존성:** DA-2 - **완료 기준:** 꼭지 목록 + 레이어 + 강조 + 배치 + 이미지/표/상세 판단 JSON -### DA-13: 2단계 — 디자인 팀장 (레이아웃 설계) -- **파일:** src/design_director.py -- **내용:** 블록 매핑 + 공간 배분 + 글자 수 가이드 - - 블록 매핑: catalog 메뉴판에서 각 꼭지 성격에 맞는 블록 선택 - - 이미지 배치: Pillow로 원본 크기 확인 → 가로/세로에 따라 영역 결정 (크기만 조절, crop 안 함) - - 표 배치: 행×열 규모 보고 공간 판단 (안 되면 요약 요청 또는 페이지 분리) - - 자세히보기: 상세 콘텐츠는 `
` 영역으로 설계 - - 공간 배분: 영역별 비율, 겹침 방지 - - 글자 수 가이드: 각 블록 공간에 맞는 대략적 글자 수 (하드코딩 아닌 판단) - - 페이지 판단: 안 들어가면 2페이지 분리 -- **기술:** Anthropic API (Sonnet) + Pillow (이미지 크기) +### DA-13a: 2단계 Step A — 레이아웃 프리셋 선택 (규칙 기반) +- **파일:** src/design_director.py (`select_preset()` 함수) +- **내용:** 실장의 role 분석을 보고 레이아웃 프리셋을 자동 선택 + - reference 꼭지 있음 → `sidebar-right` (65:35) + - 모든 flow가 대등 비교 → `two-column` (50:50) + - 고강조 1개 + 나머지 보조 → `hero-detail` + - 나머지 → `single-column` +- **기술:** Python 규칙 코드 (LLM 불필요) - **의존성:** DA-12 -- **완료 기준:** 블록 배치 + 이미지/표 배치 + 글자 수 가이드 JSON +- **완료 기준:** 프리셋 이름 + CSS grid 반환 + +### DA-13b: 2단계 Step B — 프리셋 내 블록 매핑 (Sonnet) +- **파일:** src/design_director.py +- **내용:** 선택된 프리셋의 zone에 꼭지를 배정 + 블록 타입 선택 + 글자 수 가이드 + - 프롬프트에 선택된 프리셋의 CSS grid가 포함됨 + - flow 꼭지 → body/main zone + - reference 꼭지 → sidebar zone + - detail_target → popup 연결 + - catalog에서 블록 타입 선택 + - 이미지/표 배치 판단 +- **기술:** Anthropic API (Sonnet) + Pillow +- **의존성:** DA-13a +- **완료 기준:** zone별 블록 배정 + 글자 수 가이드 JSON + +### DA-13c: 3단계 — Kei 텍스트 편집자 (텍스트 정리) -### DA-13b: 3단계 — Kei 텍스트 편집자 (텍스트 정리) - **파일:** src/content_editor.py - **내용:** 팀장의 글자 수 가이드 참고하되 내용 의미 우선 - 전체 컨텍스트와 핵심 용어 유지 @@ -116,7 +127,7 @@ - 표 내용 편집 (핵심 행/열 선택, 요약) - 자세히보기 대상: 요약 버전 + 상세 버전 둘 다 작성 - **기술:** Anthropic API (Sonnet) -- **의존성:** DA-13 +- **의존성:** DA-13b - **완료 기준:** 슬롯별 텍스트 JSON. 핵심 용어 보존. 자세히보기 포함. ### DA-14: 4단계 — 디자인 실무자 (디자인 조정 + HTML 조립) + 5단계 재검토 @@ -126,7 +137,7 @@ + Jinja2 HTML 조립, 이미지 object-fit:contain, 표 container query, `
` 접기, 인쇄 펼침 JS - 5단계 (AI): 팀장이 전체 균형 재검토 → 채움 비율, 블록 균형, 이미지/표 크기 점검 → 2차 조정 - **기술:** Anthropic API Sonnet (디자인 조정 + 재검토) + Jinja2/CSS (조립) -- **의존성:** DA-11, DA-12, DA-13, DA-13b +- **의존성:** DA-11, DA-12, DA-13a, DA-13b, DA-13c - **완료 기준:** 텍스트 입력 → 균형 잡힌 슬라이드 HTML (이미지/표/자세히보기 포함, 재검토 완료) --- @@ -170,9 +181,9 @@ ## 의존 관계 ``` -DA-1 → DA-2 → DA-12(실장) → DA-13(팀장) → DA-13b(편집자) ─┐ - ├→ DA-14(조립+재검토) → DA-15 → DA-16 -DA-3 → DA-4~DA-10 → DA-11(렌더러) ─────────────────────────┘ +DA-1 → DA-2 → DA-12(실장) → DA-13a(프리셋) → DA-13b(블록배치) → DA-13c(편집자) ─┐ + ├→ DA-14(조립+재검토) → DA-15 → DA-16 +DA-3 → DA-4~DA-10 → DA-11(렌더러) ──────────────────────────────────────────────┘ ``` - Phase 1~2: AI 없이 진행 가능 diff --git a/PROGRESS.md b/PROGRESS.md index e4c90cd..72b3b00 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -4,11 +4,11 @@ | 상태 | 개수 | |------|------| -| done | 13 | +| done | 14 | | in-progress | 0 | -| todo | 3 | +| todo | 4 | | blocked | 0 | -| **전체** | **16** | +| **전체** | **18** | --- @@ -37,10 +37,11 @@ | 태스크 | 상태 | 담당 | 시작 | 완료 | 메모 | |--------|------|------|------|------|------| -| DA-12: 1단계 Kei 실장 (꼭지 추출+분석) | todo | - | - | - | 2~5개 꼭지 + 레이어 + 강조 + 이미지/표/상세 판단. 페이지 분리 | -| DA-13: 2단계 디자인 팀장 (레이아웃 설계) | todo | - | - | - | 블록 매핑 + 이미지/표 배치 + 공간 배분 + 글자 수 가이드 | -| DA-13b: 3단계 텍스트 편집자 (Kei 역할) | todo | - | - | - | 의미 우선 편집 + 표 편집 + 자세히보기(요약+상세) | -| DA-14: 4단계 실무자(AI+코드) + 5단계 재검토 | todo | - | - | - | 디자인 조정 + HTML 조립 + 팀장 균형 재검토 | +| DA-12: 1단계 Kei 실장 (꼭지+정보구조+role) | done | - | - | - | Kei API 연동. info_structure + role(flow/reference) | +| DA-13a: 2단계A 프리셋 선택 (규칙 기반) | todo | - | - | - | reference→sidebar-right, 비교→two-column 등 자동 | +| DA-13b: 2단계B 블록 매핑 (Sonnet) | todo | - | - | - | 프리셋 CSS 포함 프롬프트. zone별 블록 배정 | +| DA-13c: 3단계 텍스트 편집자 (Kei 역할) | todo | - | - | - | 의미 우선 편집 + 표 편집 + 자세히보기(요약+상세) | +| DA-14: 4단계 실무자 + 5단계 재검토 | todo | - | - | - | 디자인 조정 + HTML 조립 + 팀장 균형 재검토 | ## Phase 4: UI + 출력 diff --git a/src/kei_client.py b/src/kei_client.py index 29ca6bb..89c911f 100644 --- a/src/kei_client.py +++ b/src/kei_client.py @@ -31,9 +31,15 @@ KEI_PROMPT = ( "- 슬라이드에 맞게 정리하되, 원본이 말하려는 흐름은 유지\n" "- 각 꼭지의 레이어(도입/핵심/보조/결론), 강조 여부, 배치 방향을 판단해줘\n" "- 참조 정보는 role: 'reference'로, 본문 흐름은 role: 'flow'로 표시\n" - "- 본문 흐름을 끊는 상세 내용은 detail_target: true로 표시\n" + "- reference 꼭지는 페이지 안에 사이드바로 배치한다. popup으로 빼지 않는다.\n" + "- 본문 흐름을 뒷받침하는 근거/사례도 페이지 안에 배치한다. popup으로 빼지 않는다.\n" + "- detail_target: true는 정말로 별도로 봐야 하는 상세 데이터(비교표, 상세 스펙)에만 사용한다.\n" + "- 근거, 사례, 용어 정의는 detail_target이 아니다.\n" "- 이미지/표가 있으면 그것도 판단해줘\n" - "- 1페이지 적정 꼭지: 5개. 초과 시 2페이지 분리.\n\n" + "- 1페이지 적정 꼭지: 5개. 초과 시 2페이지 분리.\n" + "- 2페이지로 분리하는 기준: 꼭지 수가 아니라 콘텐츠 분량이 진짜 많을 때만.\n" + "- 꼭지가 5~6개라도 각 꼭지의 내용이 적으면 1페이지에 충분히 담을 수 있다.\n" + "- 억지로 2페이지로 나누지 마라. 1페이지로 담을 수 있으면 1페이지로.\n\n" "## 출력 형식 (JSON만)\n" "```json\n" '{"title": "제목", "total_pages": 1, '