@su-record/vibe 2.8.10 → 2.8.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/commands/vibe.figma.md +241 -151
  2. package/package.json +1 -1
@@ -5,74 +5,84 @@ argument-hint: ""
5
5
 
6
6
  # /vibe.figma
7
7
 
8
- Figma 디자인 + 스토리보드 → 프로덕션 코드. 인터랙티브 방식으로 URL을 입력받아 처리.
8
+ Figma 디자인 + 스토리보드 → 프로덕션 코드. **뷰포트별 점진적 빌드** 방식.
9
9
 
10
10
  ## Usage
11
11
 
12
12
  ```
13
- /vibe.figma # 인터랙티브 모드 (URL 입력 프롬프트)
13
+ /vibe.figma # 인터랙티브 모드 (단계별 URL 입력)
14
14
  /vibe.figma --new # 새 피처 모드 (기존 디자인 시스템 무시)
15
+ /vibe.figma --refine # 보완 모드 (기존 코드 + Figma 재비교 → 수정)
15
16
  ```
16
17
 
17
- 커맨드 실행 아래 순서로 사용자에게 질문:
18
+ ## Incremental Build Flow (핵심 플로우)
18
19
 
19
- ```
20
- 1. 📋 스토리보드 URL이 있나요? (선택)
21
- → 브레이크포인트, 인터랙션, 애니메이션 스펙 추출
22
- → 없으면 Enter (디폴트 브레이크포인트 사용)
20
+ 한번에 전체를 만들지 않고, **뷰포트별로 점진적으로 쌓아가는 방식**:
23
21
 
24
- 2. 🎨 디자인 URL을 입력해주세요. (필수, 복수 가능)
25
- 1개: 단일 디자인
26
- 2개 이상: 반응형 (프레임 width로 mobile/desktop 자동 감지)
27
- URL은 줄바꿈 또는 공백으로 구분
22
+ ```
23
+ Step A: 스토리보드 URL 입력
24
+ 브레이크포인트, 인터랙션, 스펙 추출
25
+ base 레이아웃 & 컴포넌트 구조 설계 + 파일 생성
26
+
27
+ Step B: 모바일 디자인 URL 입력
28
+ → 모바일 스타일 반영, 이미지 추출
29
+ → 컴포넌트 리팩토링 (모바일 기준)
30
+ → 🔄 검증 루프 (Figma vs 코드 비교, P1=0까지)
31
+
32
+ Step C: PC 디자인 URL 입력
33
+ → PC 스타일 반영 (반응형 clamp/breakpoint 추가)
34
+ → 이미지 추출 (PC용 에셋)
35
+ → 컴포넌트 리팩토링 (PC 대응)
36
+ → 🔄 검증 루프 (Figma vs 코드 비교, P1=0까지)
37
+
38
+ Step D: 최종 공통화 리팩토링
39
+ → 모바일/PC 스타일 공통 토큰 추출
40
+ → 중복 코드 통합
41
+ → 유사 컴포넌트 variant 통합 (80% rule)
42
+ → 🔄 최종 검증 루프 (양쪽 뷰포트 동시 검증)
28
43
  ```
29
44
 
30
- ### 입력 예시
45
+ ### 단계별 URL 입력 (AskUserQuestion — options 사용 금지, 자유 텍스트만)
31
46
 
32
47
  ```
33
- 📋 스토리보드 URL (선택, 없으면 Enter):
34
- > https://www.figma.com/design/ABC/Storyboard?node-id=1-109
48
+ Step에서 AskUserQuestion으로 하나씩 입력:
49
+ ⚠️ 절대 선택지(options)를 제공하지 않는다. 순수 텍스트 입력만.
50
+ ⚠️ 각 질문의 응답을 받은 후에만 다음으로 진행.
51
+
52
+ Step A: "📋 스토리보드 Figma URL을 입력해주세요. (없으면 '없음')"
53
+ → ⏸️ 응답 대기
54
+ → URL 또는 "없음"
55
+
56
+ Step B: "📱 모바일 디자인 Figma URL을 입력해주세요."
57
+ → ⏸️ 응답 대기
58
+ → URL 저장 + 추출 + 스타일 반영 + 검증
59
+
60
+ Step C: "🖥️ PC 디자인 Figma URL을 입력해주세요. (없으면 '없음')"
61
+ → ⏸️ 응답 대기
62
+ → URL 또는 "없음" (없으면 single viewport mode)
35
63
 
36
- 🎨 디자인 URL (필수, 복수 줄바꿈):
37
- > https://www.figma.com/design/ABC/Design?node-id=10-200
38
- > https://www.figma.com/design/ABC/Design?node-id=10-500
64
+ 디자인 URL 1개만이면: 단일 뷰포트 (Step B만 실행, Step C 스킵)
65
+ 디자인 URL이 2개이면: 반응형 (Step B + C + D)
39
66
  ```
40
67
 
41
- ### Generation Mode
68
+ ### Mode
42
69
 
43
70
  | Mode | 조건 | 동작 |
44
71
  |------|------|------|
45
72
  | **Project integration** | 기본값 | 기존 디자인 시스템/토큰 활용, 프로젝트 컨벤션 준수 |
46
73
  | **--new** | 플래그 지정 시 | 자체 완결 토큰 + 컴포넌트, 기존 디자인 시스템 무관 |
47
- | **Responsive** | 디자인 URL 2개 이상 | 자동 감지, fluid clamp() + @media 생성 |
74
+ | **--refine** | 플래그 지정 | 기존 코드를 Figma 재비교 부족한 부분만 수정 |
48
75
 
49
76
  ### 스토리보드에서 추출하는 정보
50
77
 
51
- | 항목 | 활용 Phase |
52
- |------|-----------|
53
- | 브레이크포인트 / 해상도 가이드 | Phase 3 (breakpoints 오버라이드) |
54
- | 인터랙션 스펙 (호버, 클릭, 스크롤) | Phase 6 (이벤트 핸들러 + CSS states) |
55
- | 애니메이션 스펙 (타이밍, 이징) | Phase 6 (transition/animation) |
56
- | 상태별 UI (로딩, 에러, 성공, 빈 상태) | Phase 6 (조건부 렌더링) |
57
- | 반응형 동작 설명 | Phase 6-3 (responsive 코드) |
58
- | 컬러/타이포 가이드 | Phase 4 (토큰 생성) |
59
- | 컴포넌트 명세 | Phase 5 (마크업 구조) |
60
-
61
- ### File Reading Policy
62
-
63
- **스토리보드 있을 때:**
64
- 1. 스토리보드 `get_metadata` → 전체 프레임 목록 파악
65
- 2. 관련 섹션별 `get_design_context` → 스펙 정보 추출
66
- 3. 디자인 URL별 `get_design_context` + `get_screenshot` → 비주얼 + 코드
67
-
68
- **스토리보드 없을 때:**
69
- 1. 디자인 URL별 `get_design_context` + `get_screenshot` → 비주얼 + 코드
70
- 2. 디폴트 브레이크포인트 적용
71
-
72
- **항상:**
73
- - `.claude/vibe/config.json` → 프로젝트 스택
74
- - `.claude/vibe/design-context.json` → 브랜드, 토큰, 테마
75
- - 기존 코드 스캔 → 컴포넌트 패턴, 디자인 시스템
78
+ | 항목 | 활용 |
79
+ |------|------|
80
+ | 브레이크포인트 / 해상도 가이드 | base 레이아웃 설계 |
81
+ | 인터랙션 스펙 (호버, 클릭, 스크롤) | 이벤트 핸들러 + CSS states |
82
+ | 애니메이션 스펙 (타이밍, 이징) | transition/animation |
83
+ | 상태별 UI (로딩, 에러, 성공) | 조건부 렌더링 |
84
+ | 반응형 동작 설명 | responsive 코드 |
85
+ | 컬러/타이포 가이드 | 토큰 생성 |
76
86
 
77
87
  ## Context Reset
78
88
 
@@ -86,16 +96,17 @@ Figma 디자인 + 스토리보드 → 프로덕션 코드. 인터랙티브 방
86
96
 
87
97
  ## Model Routing
88
98
 
89
- | Phase | Claude | GPT (Codex) | 이유 |
90
- |-------|--------|-------------|------|
91
- | Phase 0 (추출) | **Haiku** | — | MCP 호출 + 데이터 수집 |
92
- | Phase 1-2 (분석) | **Sonnet** | — | 이미지 비교 + 구조 파악 |
93
- | Phase 3 (감지) | **Haiku** | | 파일 읽기 + 패턴 매칭 |
94
- | Phase 4-5 (토큰/마크업) | **Sonnet** | — | 토큰 매핑 + 시맨틱 판단 |
95
- | Phase 6 (코드 생성) | **Sonnet** | **gpt-5.3-codex-spark** (병렬) | 섹션별 컴포넌트 병렬 생성 |
96
- | Phase 7-8 (매핑/리포트) | **Sonnet** | — | 토큰 매핑 + 보고서 |
97
- | Phase 9 (검증 루프) | **Sonnet** | — | 이미지 비교 + diff 판단 + auto-fix |
98
- | Post (코드 리뷰) | | **gpt-5.3-codex** | 생성 코드 품질 검증 |
99
+ | Step | Claude | GPT (Codex) | 이유 |
100
+ |------|--------|-------------|------|
101
+ | Step A (스토리보드 + 구조) | **Haiku → Sonnet** | — | MCP 추출 구조 설계 |
102
+ | Step B (모바일 추출) | **Haiku** | — | MCP + 이미지 다운로드 |
103
+ | Step B (모바일 코드 생성) | **Sonnet** | **gpt-5.3-codex-spark** (병렬) | 섹션별 컴포넌트 생성 |
104
+ | Step B (모바일 검증) | **Sonnet** | — | 이미지 비교 + auto-fix |
105
+ | Step C (PC 추출) | **Haiku** | | MCP + 이미지 다운로드 |
106
+ | Step C (PC 반응형 반영) | **Sonnet** | — | 기존 코드에 반응형 레이어 추가 |
107
+ | Step C (PC 검증) | **Sonnet** | — | 양쪽 뷰포트 비교 |
108
+ | Step D (공통화) | **Sonnet** | | 리팩토링 + 최종 검증 |
109
+ | Post (코드 리뷰) | — | **gpt-5.3-codex** | 전체 코드 품질 검증 |
99
110
 
100
111
  ### GPT 모델 선택 기준
101
112
 
@@ -121,155 +132,177 @@ Post — 코드 리뷰:
121
132
  Codex 미설치 시 자동 스킵 — Claude만으로 순차 생성.
122
133
  ```
123
134
 
124
- ## Phase 0: URL 입력 + Figma Data Extraction
135
+ ## Step A: 스토리보드 + Base 구조
125
136
 
126
- ### 0-0. 사용자 입력 수집
127
-
128
- AskUserQuestion으로 하나씩 순서대로 **자유 텍스트 입력**을 받는다.
129
- **선택지(options)를 제공하지 않는다. 반드시 자유 입력(freeform text)만 받는다.**
130
- 각 질문 후 반드시 사용자 응답을 받은 다음에만 다음 Step으로 진행.
137
+ ### A-1. 스토리보드 URL 입력
131
138
 
139
+ AskUserQuestion (options 사용 금지, 자유 텍스트만):
132
140
  ```
133
- Step 1: 스토리보드 URL (선택)
134
- AskUserQuestion 호출 (options 파라미터 사용 금지):
135
- question: "📋 스토리보드 Figma URL 입력해주세요. (없으면 '없음')"
136
- ⏸️ 사용자 응답 대기
137
- → figma.com URL 포함: storyboardUrl 저장
138
- → "없음" 또는 URL 미포함: storyboardUrl = null
139
-
140
- Step 2: 디자인 URL (필수)
141
- → AskUserQuestion 호출 (options 파라미터 사용 금지):
142
- question: "🎨 디자인 Figma URL을 입력해주세요."
143
- → ⏸️ 사용자 응답 대기
144
- → URL 저장: designUrls = [url]
145
-
146
- Step 3: 추가 디자인 URL (반응형)
147
- → AskUserQuestion 호출 (options 파라미터 사용 금지):
148
- question: "🎨 추가 디자인 URL이 있으면 입력해주세요. (없으면 '없음')"
149
- → ⏸️ 사용자 응답 대기
150
- → figma.com URL 포함: designUrls에 추가 → responsive mode
151
- → "없음" 또는 URL 미포함: single mode
152
-
153
- Step 4 (--new 미지정 시):
154
- 프로젝트에 기존 디자인 시스템이 있는지 자동 감지
155
- → 있으면: default mode (기존 토큰 활용)
156
- → 없으면: 자동으로 --new mode
157
-
158
- ⚠️ 절대 Step 1~3을 한 번에 호출하지 않는다.
159
- ⚠️ 절대 선택지(options/choices)를 제공하지 않는다. 순수 텍스트 입력만.
160
- Step 1 응답 → Step 2 호출 → Step 2 응답 → Step 3 호출 순서 엄수.
141
+ question: "📋 스토리보드 Figma URL 입력해주세요. (없으면 '없음')"
142
+ ⏸️ 응답 대기 (응답 받기 다음 진행 금지)
143
+ figma.com URL storyboardUrl 저장
144
+ "없음" storyboardUrl = null
161
145
  ```
162
146
 
163
- ### 0-1. 스토리보드 추출 (storyboardUrl이 있을 때)
164
-
165
- 스토리보드에서 **구현 스펙**을 먼저 추출. 이후 Phase에서 참조.
147
+ ### A-2. 스토리보드 추출 (storyboardUrl이 있을 때)
166
148
 
167
149
  ```
168
150
  URL에서 fileKey, nodeId 추출:
169
151
  https://www.figma.com/design/:fileKey/:fileName?node-id=:nodeId
170
152
  → nodeId: 하이픈을 콜론으로 ("1-109" → "1:109")
171
153
 
172
- 1. get_metadata(fileKey, nodeId) → 전체 프레임 목록 (섹션 파악)
154
+ 1. get_metadata(fileKey, nodeId) → 전체 프레임 목록
173
155
  2. 관련 섹션별 get_design_context:
174
156
  - "해상도 대응" / "Media Query" → 브레이크포인트
175
157
  - "인터랙션" / "Interaction" → 호버/클릭/스크롤 스펙
176
158
  - "애니메이션" / "Animation" / "Motion" → 트랜지션 스펙
177
159
  - "상태" / "State" → 로딩/에러/성공 UI
178
160
  - "컬러" / "Color" / "타이포" / "Typography" → 디자인 가이드
161
+ ```
162
+
163
+ ### A-3. 프로젝트 스택 감지 + Base 구조 설계
164
+
165
+ ```
166
+ 1. 프로젝트 스택 감지 (Phase 3 참조)
167
+ 2. 디자인 시스템 감지 (--new 미지정 시)
168
+ 3. 브레이크포인트 로드 (Phase 3-3 참조, 스토리보드 우선)
169
+ 4. 피처명 결정 (Figma 파일명에서 추출)
170
+ 5. 파일 구조 생성:
171
+ - 루트 페이지 파일 (빈 shell)
172
+ - 컴포넌트 디렉토리 (빈 폴더)
173
+ - 토큰 파일 (스토리보드 기반 초기값)
174
+ ```
175
+
176
+ ---
177
+
178
+ ## Step B: 모바일 디자인 반영
179
+
180
+ ### B-1. 모바일 디자인 URL 입력
181
+
182
+ AskUserQuestion (options 사용 금지):
183
+ ```
184
+ question: "📱 모바일 디자인 Figma URL을 입력해주세요."
185
+ → ⏸️ 응답 대기
186
+ → URL 저장: mobileUrl
187
+ ```
188
+
189
+ ### B-2. 모바일 디자인 추출 (MCP)
179
190
 
180
- 결과 → storyboardSpec 객체에 저장:
181
- {
182
- breakpoints: { ... }, // 브레이크포인트 오버라이드
183
- interactions: [ ... ], // 인터랙션 목록
184
- animations: [ ... ], // 애니메이션 스펙
185
- states: [ ... ], // UI 상태 목록
186
- colorGuide: { ... }, // 컬러 가이드
187
- typographyGuide: { ... } // 타이포 가이드
188
- }
191
+ ```
192
+ 1. get_design_context(fileKey, nodeId) → 코드 + 스크린샷 + 에셋 URL
193
+ 스크린샷으로 전체 디자인 분석 (레이아웃, 타이포, 색상, 컴포넌트 구조)
189
194
  ```
190
195
 
191
- ### 0-2. 디자인 추출 (MCP)
196
+ ### B-3. 이미지 에셋 다운로드 (BLOCKING)
192
197
 
193
- 디자인 URL에 대해 MCP로 추출:
198
+ > **⛔ 이미지 다운로드 완료 전 코드 생성 진행 금지.**
194
199
 
195
200
  ```
196
- URL에서 fileKey, nodeId 추출 (동일 방식)
201
+ 1. get_design_context 응답에서 모든 이미지 URL 추출
202
+ (패턴: https://www.figma.com/api/mcp/asset/...)
203
+ 2. WebFetch로 각 URL 다운로드
204
+ 3. 프로젝트 에셋 디렉토리에 저장 (Nuxt: static/images/{feature}/)
205
+ 4. 파일명: 레이어 이름 기반 kebab-case
206
+ 5. URL→로컬경로 매핑 테이블 생성
207
+ 6. SVG: 작은 아이콘 → 인라인, 큰 SVG → 파일
208
+ ```
197
209
 
198
- URL에 대해:
199
- 1. get_design_context(fileKey, nodeId) → 코드 + 스크린샷 + 메타데이터 + 에셋 URL
200
- 2. get_metadata(fileKey, nodeId) → 레이어 구조 (XML)
201
- 3. get_screenshot(fileKey, nodeId) → 프레임 이미지
210
+ ### B-4. 모바일 코드 생성
202
211
 
203
- 디자인 URL이 2개 이상이면:
204
- 프레임 width로 viewport 자동 감지 (mobile/tablet/desktop)
205
- responsive mode 진입
212
+ ```
213
+ 1. 모바일 기준으로 컴포넌트 코드 생성 (Phase 4~6 적용)
214
+ 2. 이미지 에셋은 매핑 테이블의 로컬 경로 사용
215
+ 3. 스토리보드 스펙 반영 (인터랙션, 애니메이션)
216
+ 4. 모바일 전용 스타일 작성 (desktop 미고려)
206
217
  ```
207
218
 
208
- ### 0-3. Image Asset Download (BLOCKING — 코드 생성 전 반드시 완료)
219
+ ### B-5. 모바일 검증 루프
209
220
 
210
- > **⛔ 이 단계를 건너뛰면 안 됨.** 이미지 다운로드가 완료되지 않으면 Phase 6 코드 생성으로 진행하지 않는다.
221
+ ```
222
+ 🔄 Phase 9 검증 루프 실행:
223
+ - Figma 모바일 스크린샷 vs 생성된 코드 비교
224
+ - P1=0 될 때까지 수정 반복
225
+ - 이미지 에셋 전부 표시되는지 확인
226
+ ```
227
+
228
+ ---
211
229
 
212
- `get_design_context` 응답에 포함된 이미지 에셋 URL은 **7일 후 만료**되는 임시 URL.
213
- **즉시 다운로드**하여 프로젝트에 저장해야 함.
230
+ ## Step C: PC 디자인 반영 (반응형)
214
231
 
215
- **Step 1: 에셋 URL 수집**
232
+ ### C-1. PC 디자인 URL 입력
216
233
 
217
- `get_design_context` 응답에서 모든 이미지 URL 추출:
234
+ AskUserQuestion (options 사용 금지):
218
235
  ```
219
- 패턴: https://www.figma.com/api/mcp/asset/...
220
- 코드에 const xxxImage = 'https://...' 형태로 포함됨
236
+ question: "🖥️ PC 디자인 Figma URL을 입력해주세요. (없으면 '없음')"
237
+ ⏸️ 응답 대기
238
+ → URL → pcUrl 저장 (responsive mode)
239
+ → "없음" → single viewport mode (Step D로 직행)
221
240
  ```
222
241
 
223
- **Step 2: 다운로드 + 저장**
242
+ ### C-2. PC 디자인 추출 (MCP)
224
243
 
225
244
  ```
226
- URL에 대해:
227
- 1. WebFetch로 다운로드
228
- 2. 프로젝트 에셋 디렉토리에 저장:
229
- - Nuxt: static/images/{feature}/ 또는 public/images/{feature}/
230
- - Next.js: public/images/{feature}/
231
- - React: public/images/{feature}/
232
- 3. 파일명은 레이어 이름 기반 (kebab-case):
233
- - "Hero Background" → hero-background.webp
234
- - "Product Photo 1" → product-photo-1.webp
245
+ 1. get_design_context(fileKey, nodeId) → 코드 + 스크린샷 + 에셋 URL
246
+ 모바일 스크린샷과 side-by-side 비교 → viewport diff table 생성
235
247
  ```
236
248
 
237
- **Step 3: URL 로컬 경로 매핑 테이블 생성**
249
+ ### C-3. PC 이미지 에셋 다운로드 (BLOCKING)
238
250
 
239
251
  ```
240
- 다운로드 완료 후, 매핑 테이블을 메모리에 보관:
252
+ 모바일과 동일 프로세스.
253
+ PC 전용 이미지가 있으면 추가 다운로드.
254
+ 동일 이미지는 스킵 (중복 방지).
255
+ ```
241
256
 
242
- | Figma 임시 URL | 로컬 경로 | 레이어 이름 |
243
- |---------------|----------|-----------|
244
- | https://figma.com/api/mcp/asset/abc... | /images/winter-pcbang/hero-bg.webp | Hero Background |
245
- | https://figma.com/api/mcp/asset/def... | /images/winter-pcbang/hero-title.webp | Hero Title |
257
+ ### C-4. PC 스타일 반영 + 반응형 리팩토링
246
258
 
247
- → Phase 6 코드 생성 시 이 매핑 테이블로 임시 URL을 로컬 경로로 교체
259
+ ```
260
+ 기존 모바일 코드에 PC 대응 추가:
261
+ 1. 공통 값 → clamp() fluid 토큰으로 변환
262
+ 2. 레이아웃 구조 변경 → @media (min-width: {breakpoint}px) 추가
263
+ 3. PC 전용 요소 → display toggle (.desktopOnly)
264
+ 4. 모바일 전용 요소 → display toggle (.mobileOnly)
265
+ 5. PC 전용 배경 이미지 → @media 분기
266
+ 6. 기존 모바일 코드는 가능한 보존하고 반응형 레이어만 추가
248
267
  ```
249
268
 
250
- **Step 4: SVG 처리**
269
+ ### C-5. PC 검증 루프
251
270
 
252
271
  ```
253
- - 벡터 에셋 (아이콘, 로고) → SVG로 다운로드
254
- - 작은 아이콘 (< 1KB) 인라인 SVG 컴포넌트
255
- - SVG 파일로 저장
272
+ 🔄 Phase 9 검증 루프 실행:
273
+ - Figma PC 스크린샷 vs 생성된 코드 (PC viewport) 비교
274
+ - P1=0 때까지 수정 반복
275
+ - 모바일 검증도 재확인 (PC 수정으로 모바일이 깨지지 않았는지)
256
276
  ```
257
277
 
258
- ### 0-4. Extraction Gate (코드 생성 진행 조건)
278
+ ---
279
+
280
+ ## Step D: 최종 공통화 리팩토링
259
281
 
260
- > **다음 조건을 모두 만족해야 Phase 1로 진행:**
282
+ ### D-1. 스타일 공통화
261
283
 
262
284
  ```
263
- 디자인 URL 최소 1개의 get_design_context 성공
264
- 디자인 스크린샷 최소 1개 획득
265
- 이미지 에셋 전부 다운로드 완료 (0개 남은 미다운로드)
266
- ✅ URL→로컬경로 매핑 테이블 생성 완료
267
- ✅ (responsive) 최소 2개 뷰포트의 스크린샷 획득
285
+ 1. 모바일/PC에서 동일한 공통 토큰으로 추출
286
+ 2. 중복 CSS/SCSS 규칙 통합
287
+ 3. 컴포넌트 중복 로직 제거
288
+ ```
289
+
290
+ ### D-2. 컴포넌트 통합
291
+
292
+ ```
293
+ 1. 유사 컴포넌트 (80% rule) → variant prop으로 통합
294
+ 2. 중복 sub-component → 공유 컴포넌트로 추출
295
+ 3. Fragment/template 활용하여 불필요한 래퍼 제거
296
+ ```
297
+
298
+ ### D-3. 최종 검증 루프
268
299
 
269
- ❌ 하나라도 실패 시:
270
- 실패 항목 보고 + 재시도
271
- 이미지 다운로드 실패 시: 해당 URL 재시도 (최대 3회)
272
- 재시도 후에도 실패: 사용자에게 수동 다운로드 요청 후 계속
300
+ ```
301
+ 🔄 양쪽 뷰포트 동시 검증:
302
+ - 모바일 Figma vs 코드 (mobile viewport)
303
+ - PC Figma vs 코드 (desktop viewport)
304
+ - 양쪽 모두 P1=0, Match Score 95%+
305
+ - 이미지 에셋 전부 정상 표시
273
306
  ```
274
307
 
275
308
  ---
@@ -1731,6 +1764,63 @@ P1 불일치가 있으면:
1731
1764
 
1732
1765
  ---
1733
1766
 
1767
+ ## Refine Mode (`--refine`)
1768
+
1769
+ 이전 `/vibe.figma` 실행으로 생성된 코드의 완성도가 부족할 때 사용.
1770
+ **새로 만들지 않고, 기존 코드를 Figma 원본과 재비교하여 수정만 한다.**
1771
+
1772
+ ### Refine 플로우
1773
+
1774
+ ```
1775
+ Step 1: URL 재입력
1776
+ → 이전과 동일한 방식으로 스토리보드/디자인 URL 입력
1777
+ → 또는 "이전과 동일" 입력 시 이전 URL 재사용
1778
+
1779
+ Step 2: 기존 코드 스캔
1780
+ → 프로젝트에서 이전에 생성된 파일 탐색 (pages/, components/ 내 피처 폴더)
1781
+ → 생성된 컴포넌트 목록 파악
1782
+
1783
+ Step 3: Figma 원본 재추출
1784
+ → get_design_context + get_screenshot으로 최신 디자인 데이터 획득
1785
+
1786
+ Step 4: Side-by-side 비교
1787
+ → Figma 스크린샷 vs 기존 코드의 렌더링 결과
1788
+ → Phase 9 검증 루프와 동일한 비교 항목:
1789
+ 레이아웃, 타이포, 색상, 이미지, 간격, 누락 요소
1790
+
1791
+ Step 5: Diff 기반 수정
1792
+ → 변경이 필요한 파일만 Edit
1793
+ → 새 파일 생성 최소화
1794
+ → 수정 사유를 주석으로 남기지 않음 (코드만 수정)
1795
+
1796
+ Step 6: 재검증
1797
+ → Phase 9 검증 루프 실행 (P1=0 될 때까지)
1798
+ ```
1799
+
1800
+ ### Refine에서 수정하는 항목
1801
+
1802
+ | 카테고리 | 수정 내용 |
1803
+ |----------|----------|
1804
+ | **누락 에셋** | 다운로드 안 된 이미지 재다운로드 + 경로 설정 |
1805
+ | **레이아웃 불일치** | flex/grid 방향, 정렬, 간격 보정 |
1806
+ | **타이포 불일치** | font-size, weight, line-height, letter-spacing 보정 |
1807
+ | **색상 불일치** | 배경, 텍스트, 보더 색상 보정 |
1808
+ | **누락 컴포넌트** | Figma에 있는데 코드에 없는 섹션 추가 |
1809
+ | **인터랙션 누락** | 호버/포커스/액티브 상태 추가 |
1810
+ | **반응형 누락** | 브레이크포인트 대응 미흡한 부분 보정 |
1811
+ | **이미지 경로** | 임시 URL → 로컬 경로 교체, 누락 이미지 다운로드 |
1812
+
1813
+ ### Refine에서 하지 않는 것
1814
+
1815
+ ```
1816
+ ❌ 파일 구조 변경 (이미 생성된 폴더/파일 구조 유지)
1817
+ ❌ 컴포넌트 분리/통합 (구조적 리팩토링은 수동으로)
1818
+ ❌ 토큰 파일 재생성 (기존 토큰에 누락분만 추가)
1819
+ ❌ 전체 재작성 (diff 기반 최소 수정만)
1820
+ ```
1821
+
1822
+ ---
1823
+
1734
1824
  ## Tool Usage Rules
1735
1825
 
1736
1826
  | Tool | When |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "description": "AI Coding Framework for Claude Code — 49 agents, 41+ tools, multi-LLM orchestration",
5
5
  "type": "module",
6
6
  "main": "dist/cli/index.js",