@su-record/vibe 2.8.11 → 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 +183 -152
  2. package/package.json +1 -1
@@ -5,76 +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
15
  /vibe.figma --refine # 보완 모드 (기존 코드 + Figma 재비교 → 수정)
16
16
  ```
17
17
 
18
- 커맨드 실행 아래 순서로 사용자에게 질문:
18
+ ## Incremental Build Flow (핵심 플로우)
19
19
 
20
- ```
21
- 1. 📋 스토리보드 URL이 있나요? (선택)
22
- → 브레이크포인트, 인터랙션, 애니메이션 스펙 추출
23
- → 없으면 Enter (디폴트 브레이크포인트 사용)
20
+ 한번에 전체를 만들지 않고, **뷰포트별로 점진적으로 쌓아가는 방식**:
24
21
 
25
- 2. 🎨 디자인 URL을 입력해주세요. (필수, 복수 가능)
26
- 1개: 단일 디자인
27
- 2개 이상: 반응형 (프레임 width로 mobile/desktop 자동 감지)
28
- 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
+ → 🔄 최종 검증 루프 (양쪽 뷰포트 동시 검증)
29
43
  ```
30
44
 
31
- ### 입력 예시
45
+ ### 단계별 URL 입력 (AskUserQuestion — options 사용 금지, 자유 텍스트만)
32
46
 
33
47
  ```
34
- 📋 스토리보드 URL (선택, 없으면 Enter):
35
- > 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 저장 + 추출 + 스타일 반영 + 검증
36
59
 
37
- 🎨 디자인 URL (필수, 복수 시 줄바꿈):
38
- > https://www.figma.com/design/ABC/Design?node-id=10-200
39
- > https://www.figma.com/design/ABC/Design?node-id=10-500
60
+ Step C: "🖥️ PC 디자인 Figma URL 입력해주세요. (없으면 '없음')"
61
+ ⏸️ 응답 대기
62
+ URL 또는 "없음" (없으면 single viewport mode)
63
+
64
+ 디자인 URL이 1개만이면: 단일 뷰포트 (Step B만 실행, Step C 스킵)
65
+ 디자인 URL이 2개이면: 반응형 (Step B + C + D)
40
66
  ```
41
67
 
42
- ### Generation Mode
68
+ ### Mode
43
69
 
44
70
  | Mode | 조건 | 동작 |
45
71
  |------|------|------|
46
72
  | **Project integration** | 기본값 | 기존 디자인 시스템/토큰 활용, 프로젝트 컨벤션 준수 |
47
73
  | **--new** | 플래그 지정 시 | 자체 완결 토큰 + 컴포넌트, 기존 디자인 시스템 무관 |
48
- | **--refine** | 플래그 지정 시 | 기존 생성 코드를 Figma 원본과 재비교하여 부족한 부분만 수정 |
49
- | **Responsive** | 디자인 URL 2개 이상 | 자동 감지, fluid clamp() + @media 생성 |
74
+ | **--refine** | 플래그 지정 시 | 기존 코드를 Figma 재비교 부족한 부분만 수정 |
50
75
 
51
76
  ### 스토리보드에서 추출하는 정보
52
77
 
53
- | 항목 | 활용 Phase |
54
- |------|-----------|
55
- | 브레이크포인트 / 해상도 가이드 | Phase 3 (breakpoints 오버라이드) |
56
- | 인터랙션 스펙 (호버, 클릭, 스크롤) | Phase 6 (이벤트 핸들러 + CSS states) |
57
- | 애니메이션 스펙 (타이밍, 이징) | Phase 6 (transition/animation) |
58
- | 상태별 UI (로딩, 에러, 성공, 빈 상태) | Phase 6 (조건부 렌더링) |
59
- | 반응형 동작 설명 | Phase 6-3 (responsive 코드) |
60
- | 컬러/타이포 가이드 | Phase 4 (토큰 생성) |
61
- | 컴포넌트 명세 | Phase 5 (마크업 구조) |
62
-
63
- ### File Reading Policy
64
-
65
- **스토리보드 있을 때:**
66
- 1. 스토리보드 `get_metadata` → 전체 프레임 목록 파악
67
- 2. 관련 섹션별 `get_design_context` → 스펙 정보 추출
68
- 3. 디자인 URL별 `get_design_context` + `get_screenshot` → 비주얼 + 코드
69
-
70
- **스토리보드 없을 때:**
71
- 1. 디자인 URL별 `get_design_context` + `get_screenshot` → 비주얼 + 코드
72
- 2. 디폴트 브레이크포인트 적용
73
-
74
- **항상:**
75
- - `.claude/vibe/config.json` → 프로젝트 스택
76
- - `.claude/vibe/design-context.json` → 브랜드, 토큰, 테마
77
- - 기존 코드 스캔 → 컴포넌트 패턴, 디자인 시스템
78
+ | 항목 | 활용 |
79
+ |------|------|
80
+ | 브레이크포인트 / 해상도 가이드 | base 레이아웃 설계 |
81
+ | 인터랙션 스펙 (호버, 클릭, 스크롤) | 이벤트 핸들러 + CSS states |
82
+ | 애니메이션 스펙 (타이밍, 이징) | transition/animation |
83
+ | 상태별 UI (로딩, 에러, 성공) | 조건부 렌더링 |
84
+ | 반응형 동작 설명 | responsive 코드 |
85
+ | 컬러/타이포 가이드 | 토큰 생성 |
78
86
 
79
87
  ## Context Reset
80
88
 
@@ -88,16 +96,17 @@ Figma 디자인 + 스토리보드 → 프로덕션 코드. 인터랙티브 방
88
96
 
89
97
  ## Model Routing
90
98
 
91
- | Phase | Claude | GPT (Codex) | 이유 |
92
- |-------|--------|-------------|------|
93
- | Phase 0 (추출) | **Haiku** | — | MCP 호출 + 데이터 수집 |
94
- | Phase 1-2 (분석) | **Sonnet** | — | 이미지 비교 + 구조 파악 |
95
- | Phase 3 (감지) | **Haiku** | | 파일 읽기 + 패턴 매칭 |
96
- | Phase 4-5 (토큰/마크업) | **Sonnet** | — | 토큰 매핑 + 시맨틱 판단 |
97
- | Phase 6 (코드 생성) | **Sonnet** | **gpt-5.3-codex-spark** (병렬) | 섹션별 컴포넌트 병렬 생성 |
98
- | Phase 7-8 (매핑/리포트) | **Sonnet** | — | 토큰 매핑 + 보고서 |
99
- | Phase 9 (검증 루프) | **Sonnet** | — | 이미지 비교 + diff 판단 + auto-fix |
100
- | 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** | 전체 코드 품질 검증 |
101
110
 
102
111
  ### GPT 모델 선택 기준
103
112
 
@@ -123,155 +132,177 @@ Post — 코드 리뷰:
123
132
  Codex 미설치 시 자동 스킵 — Claude만으로 순차 생성.
124
133
  ```
125
134
 
126
- ## Phase 0: URL 입력 + Figma Data Extraction
127
-
128
- ### 0-0. 사용자 입력 수집
135
+ ## Step A: 스토리보드 + Base 구조
129
136
 
130
- AskUserQuestion으로 하나씩 순서대로 **자유 텍스트 입력**을 받는다.
131
- **선택지(options)를 제공하지 않는다. 반드시 자유 입력(freeform text)만 받는다.**
132
- 각 질문 후 반드시 사용자 응답을 받은 다음에만 다음 Step으로 진행.
137
+ ### A-1. 스토리보드 URL 입력
133
138
 
139
+ AskUserQuestion (options 사용 금지, 자유 텍스트만):
134
140
  ```
135
- Step 1: 스토리보드 URL (선택)
136
- AskUserQuestion 호출 (options 파라미터 사용 금지):
137
- question: "📋 스토리보드 Figma URL 입력해주세요. (없으면 '없음')"
138
- ⏸️ 사용자 응답 대기
139
- → figma.com URL 포함: storyboardUrl 저장
140
- → "없음" 또는 URL 미포함: storyboardUrl = null
141
-
142
- Step 2: 디자인 URL (필수)
143
- → AskUserQuestion 호출 (options 파라미터 사용 금지):
144
- question: "🎨 디자인 Figma URL을 입력해주세요."
145
- → ⏸️ 사용자 응답 대기
146
- → URL 저장: designUrls = [url]
147
-
148
- Step 3: 추가 디자인 URL (반응형)
149
- → AskUserQuestion 호출 (options 파라미터 사용 금지):
150
- question: "🎨 추가 디자인 URL이 있으면 입력해주세요. (없으면 '없음')"
151
- → ⏸️ 사용자 응답 대기
152
- → figma.com URL 포함: designUrls에 추가 → responsive mode
153
- → "없음" 또는 URL 미포함: single mode
154
-
155
- Step 4 (--new 미지정 시):
156
- 프로젝트에 기존 디자인 시스템이 있는지 자동 감지
157
- → 있으면: default mode (기존 토큰 활용)
158
- → 없으면: 자동으로 --new mode
159
-
160
- ⚠️ 절대 Step 1~3을 한 번에 호출하지 않는다.
161
- ⚠️ 절대 선택지(options/choices)를 제공하지 않는다. 순수 텍스트 입력만.
162
- Step 1 응답 → Step 2 호출 → Step 2 응답 → Step 3 호출 순서 엄수.
141
+ question: "📋 스토리보드 Figma URL 입력해주세요. (없으면 '없음')"
142
+ ⏸️ 응답 대기 (응답 받기 다음 진행 금지)
143
+ figma.com URL storyboardUrl 저장
144
+ "없음" storyboardUrl = null
163
145
  ```
164
146
 
165
- ### 0-1. 스토리보드 추출 (storyboardUrl이 있을 때)
166
-
167
- 스토리보드에서 **구현 스펙**을 먼저 추출. 이후 Phase에서 참조.
147
+ ### A-2. 스토리보드 추출 (storyboardUrl이 있을 때)
168
148
 
169
149
  ```
170
150
  URL에서 fileKey, nodeId 추출:
171
151
  https://www.figma.com/design/:fileKey/:fileName?node-id=:nodeId
172
152
  → nodeId: 하이픈을 콜론으로 ("1-109" → "1:109")
173
153
 
174
- 1. get_metadata(fileKey, nodeId) → 전체 프레임 목록 (섹션 파악)
154
+ 1. get_metadata(fileKey, nodeId) → 전체 프레임 목록
175
155
  2. 관련 섹션별 get_design_context:
176
156
  - "해상도 대응" / "Media Query" → 브레이크포인트
177
157
  - "인터랙션" / "Interaction" → 호버/클릭/스크롤 스펙
178
158
  - "애니메이션" / "Animation" / "Motion" → 트랜지션 스펙
179
159
  - "상태" / "State" → 로딩/에러/성공 UI
180
160
  - "컬러" / "Color" / "타이포" / "Typography" → 디자인 가이드
161
+ ```
181
162
 
182
- 결과 storyboardSpec 객체에 저장:
183
- {
184
- breakpoints: { ... }, // 브레이크포인트 오버라이드
185
- interactions: [ ... ], // 인터랙션 목록
186
- animations: [ ... ], // 애니메이션 스펙
187
- states: [ ... ], // UI 상태 목록
188
- colorGuide: { ... }, // 컬러 가이드
189
- typographyGuide: { ... } // 타이포 가이드
190
- }
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
+ - 토큰 파일 (스토리보드 기반 초기값)
191
174
  ```
192
175
 
193
- ### 0-2. 디자인 추출 (MCP)
176
+ ---
177
+
178
+ ## Step B: 모바일 디자인 반영
194
179
 
195
- 디자인 URL 대해 MCP로 추출:
180
+ ### B-1. 모바일 디자인 URL 입력
196
181
 
182
+ AskUserQuestion (options 사용 금지):
183
+ ```
184
+ question: "📱 모바일 디자인 Figma URL을 입력해주세요."
185
+ → ⏸️ 응답 대기
186
+ → URL 저장: mobileUrl
197
187
  ```
198
- URL에서 fileKey, nodeId 추출 (동일 방식)
199
188
 
200
- URL에 대해:
201
- 1. get_design_context(fileKey, nodeId) → 코드 + 스크린샷 + 메타데이터 + 에셋 URL
202
- 2. get_metadata(fileKey, nodeId) → 레이어 구조 (XML)
203
- 3. get_screenshot(fileKey, nodeId) → 프레임 이미지
189
+ ### B-2. 모바일 디자인 추출 (MCP)
204
190
 
205
- 디자인 URL이 2개 이상이면:
206
- 프레임 width로 viewport 자동 감지 (mobile/tablet/desktop)
207
- responsive mode 진입
191
+ ```
192
+ 1. get_design_context(fileKey, nodeId) 코드 + 스크린샷 + 에셋 URL
193
+ 스크린샷으로 전체 디자인 분석 (레이아웃, 타이포, 색상, 컴포넌트 구조)
208
194
  ```
209
195
 
210
- ### 0-3. Image Asset Download (BLOCKING — 코드 생성 전 반드시 완료)
196
+ ### B-3. 이미지 에셋 다운로드 (BLOCKING)
211
197
 
212
- > **⛔ 이 단계를 건너뛰면 안 됨.** 이미지 다운로드가 완료되지 않으면 Phase 6 코드 생성으로 진행하지 않는다.
198
+ > **⛔ 이미지 다운로드 완료 코드 생성 진행 금지.**
213
199
 
214
- `get_design_context` 응답에 포함된 이미지 에셋 URL은 **7일 후 만료**되는 임시 URL.
215
- **즉시 다운로드**하여 프로젝트에 저장해야 함.
200
+ ```
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
+ ```
209
+
210
+ ### B-4. 모바일 코드 생성
211
+
212
+ ```
213
+ 1. 모바일 기준으로 컴포넌트 코드 생성 (Phase 4~6 적용)
214
+ 2. 이미지 에셋은 매핑 테이블의 로컬 경로 사용
215
+ 3. 스토리보드 스펙 반영 (인터랙션, 애니메이션)
216
+ 4. 모바일 전용 스타일 작성 (desktop 미고려)
217
+ ```
218
+
219
+ ### B-5. 모바일 검증 루프
220
+
221
+ ```
222
+ 🔄 Phase 9 검증 루프 실행:
223
+ - Figma 모바일 스크린샷 vs 생성된 코드 비교
224
+ - P1=0 될 때까지 수정 반복
225
+ - 이미지 에셋 전부 표시되는지 확인
226
+ ```
227
+
228
+ ---
216
229
 
217
- **Step 1: 에셋 URL 수집**
230
+ ## Step C: PC 디자인 반영 (반응형)
218
231
 
219
- `get_design_context` 응답에서 모든 이미지 URL 추출:
232
+ ### C-1. PC 디자인 URL 입력
233
+
234
+ AskUserQuestion (options 사용 금지):
220
235
  ```
221
- 패턴: https://www.figma.com/api/mcp/asset/...
222
- 코드에 const xxxImage = 'https://...' 형태로 포함됨
236
+ question: "🖥️ PC 디자인 Figma URL을 입력해주세요. (없으면 '없음')"
237
+ ⏸️ 응답 대기
238
+ → URL → pcUrl 저장 (responsive mode)
239
+ → "없음" → single viewport mode (Step D로 직행)
223
240
  ```
224
241
 
225
- **Step 2: 다운로드 + 저장**
242
+ ### C-2. PC 디자인 추출 (MCP)
226
243
 
227
244
  ```
228
- URL에 대해:
229
- 1. WebFetch로 다운로드
230
- 2. 프로젝트 에셋 디렉토리에 저장:
231
- - Nuxt: static/images/{feature}/ 또는 public/images/{feature}/
232
- - Next.js: public/images/{feature}/
233
- - React: public/images/{feature}/
234
- 3. 파일명은 레이어 이름 기반 (kebab-case):
235
- - "Hero Background" → hero-background.webp
236
- - "Product Photo 1" → product-photo-1.webp
245
+ 1. get_design_context(fileKey, nodeId) → 코드 + 스크린샷 + 에셋 URL
246
+ 모바일 스크린샷과 side-by-side 비교 → viewport diff table 생성
237
247
  ```
238
248
 
239
- **Step 3: URL 로컬 경로 매핑 테이블 생성**
249
+ ### C-3. PC 이미지 에셋 다운로드 (BLOCKING)
240
250
 
241
251
  ```
242
- 다운로드 완료 후, 매핑 테이블을 메모리에 보관:
252
+ 모바일과 동일 프로세스.
253
+ PC 전용 이미지가 있으면 추가 다운로드.
254
+ 동일 이미지는 스킵 (중복 방지).
255
+ ```
243
256
 
244
- | Figma 임시 URL | 로컬 경로 | 레이어 이름 |
245
- |---------------|----------|-----------|
246
- | https://figma.com/api/mcp/asset/abc... | /images/winter-pcbang/hero-bg.webp | Hero Background |
247
- | https://figma.com/api/mcp/asset/def... | /images/winter-pcbang/hero-title.webp | Hero Title |
257
+ ### C-4. PC 스타일 반영 + 반응형 리팩토링
248
258
 
249
- → 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. 기존 모바일 코드는 가능한 보존하고 반응형 레이어만 추가
250
267
  ```
251
268
 
252
- **Step 4: SVG 처리**
269
+ ### C-5. PC 검증 루프
253
270
 
254
271
  ```
255
- - 벡터 에셋 (아이콘, 로고) → SVG로 다운로드
256
- - 작은 아이콘 (< 1KB) 인라인 SVG 컴포넌트
257
- - SVG 파일로 저장
272
+ 🔄 Phase 9 검증 루프 실행:
273
+ - Figma PC 스크린샷 vs 생성된 코드 (PC viewport) 비교
274
+ - P1=0 때까지 수정 반복
275
+ - 모바일 검증도 재확인 (PC 수정으로 모바일이 깨지지 않았는지)
258
276
  ```
259
277
 
260
- ### 0-4. Extraction Gate (코드 생성 진행 조건)
278
+ ---
279
+
280
+ ## Step D: 최종 공통화 리팩토링
281
+
282
+ ### D-1. 스타일 공통화
261
283
 
262
- > **다음 조건을 모두 만족해야 Phase 1로 진행:**
284
+ ```
285
+ 1. 모바일/PC에서 동일한 값 → 공통 토큰으로 추출
286
+ 2. 중복 CSS/SCSS 규칙 통합
287
+ 3. 컴포넌트 내 중복 로직 제거
288
+ ```
289
+
290
+ ### D-2. 컴포넌트 통합
263
291
 
264
292
  ```
265
- 디자인 URL 최소 1개의 get_design_context 성공
266
- 디자인 스크린샷 최소 1개 획득
267
- 이미지 에셋 전부 다운로드 완료 (0개 남은 미다운로드)
268
- ✅ URL→로컬경로 매핑 테이블 생성 완료
269
- ✅ (responsive) 최소 2개 뷰포트의 스크린샷 획득
293
+ 1. 유사 컴포넌트 (80% rule) variant prop으로 통합
294
+ 2. 중복 sub-component 공유 컴포넌트로 추출
295
+ 3. Fragment/template 활용하여 불필요한 래퍼 제거
296
+ ```
297
+
298
+ ### D-3. 최종 검증 루프
270
299
 
271
- ❌ 하나라도 실패 시:
272
- 실패 항목 보고 + 재시도
273
- 이미지 다운로드 실패 시: 해당 URL 재시도 (최대 3회)
274
- 재시도 후에도 실패: 사용자에게 수동 다운로드 요청 후 계속
300
+ ```
301
+ 🔄 양쪽 뷰포트 동시 검증:
302
+ - 모바일 Figma vs 코드 (mobile viewport)
303
+ - PC Figma vs 코드 (desktop viewport)
304
+ - 양쪽 모두 P1=0, Match Score 95%+
305
+ - 이미지 에셋 전부 정상 표시
275
306
  ```
276
307
 
277
308
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "2.8.11",
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",