@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.
- package/commands/vibe.figma.md +241 -151
- package/package.json +1 -1
package/commands/vibe.figma.md
CHANGED
|
@@ -5,74 +5,84 @@ argument-hint: ""
|
|
|
5
5
|
|
|
6
6
|
# /vibe.figma
|
|
7
7
|
|
|
8
|
-
Figma 디자인 + 스토리보드 → 프로덕션 코드.
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
34
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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
|
-
###
|
|
68
|
+
### Mode
|
|
42
69
|
|
|
43
70
|
| Mode | 조건 | 동작 |
|
|
44
71
|
|------|------|------|
|
|
45
72
|
| **Project integration** | 기본값 | 기존 디자인 시스템/토큰 활용, 프로젝트 컨벤션 준수 |
|
|
46
73
|
| **--new** | 플래그 지정 시 | 자체 완결 토큰 + 컴포넌트, 기존 디자인 시스템 무관 |
|
|
47
|
-
| **
|
|
74
|
+
| **--refine** | 플래그 지정 시 | 기존 코드를 Figma 재비교 → 부족한 부분만 수정 |
|
|
48
75
|
|
|
49
76
|
### 스토리보드에서 추출하는 정보
|
|
50
77
|
|
|
51
|
-
| 항목 | 활용
|
|
52
|
-
|
|
53
|
-
| 브레이크포인트 / 해상도 가이드 |
|
|
54
|
-
| 인터랙션 스펙 (호버, 클릭, 스크롤) |
|
|
55
|
-
| 애니메이션 스펙 (타이밍, 이징) |
|
|
56
|
-
| 상태별 UI (로딩, 에러,
|
|
57
|
-
| 반응형 동작 설명 |
|
|
58
|
-
| 컬러/타이포 가이드 |
|
|
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
|
-
|
|
|
90
|
-
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
95
|
-
|
|
|
96
|
-
|
|
|
97
|
-
|
|
|
98
|
-
|
|
|
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
|
-
##
|
|
135
|
+
## Step A: 스토리보드 + Base 구조
|
|
125
136
|
|
|
126
|
-
###
|
|
127
|
-
|
|
128
|
-
AskUserQuestion으로 하나씩 순서대로 **자유 텍스트 입력**을 받는다.
|
|
129
|
-
**선택지(options)를 제공하지 않는다. 반드시 자유 입력(freeform text)만 받는다.**
|
|
130
|
-
각 질문 후 반드시 사용자 응답을 받은 다음에만 다음 Step으로 진행.
|
|
137
|
+
### A-1. 스토리보드 URL 입력
|
|
131
138
|
|
|
139
|
+
AskUserQuestion (options 사용 금지, 자유 텍스트만):
|
|
132
140
|
```
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
###
|
|
196
|
+
### B-3. 이미지 에셋 다운로드 (BLOCKING)
|
|
192
197
|
|
|
193
|
-
|
|
198
|
+
> **⛔ 이미지 다운로드 완료 전 코드 생성 진행 금지.**
|
|
194
199
|
|
|
195
200
|
```
|
|
196
|
-
|
|
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
|
-
|
|
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
|
-
|
|
204
|
-
|
|
205
|
-
|
|
212
|
+
```
|
|
213
|
+
1. 모바일 기준으로 컴포넌트 코드 생성 (Phase 4~6 적용)
|
|
214
|
+
2. 이미지 에셋은 매핑 테이블의 로컬 경로 사용
|
|
215
|
+
3. 스토리보드 스펙 반영 (인터랙션, 애니메이션)
|
|
216
|
+
4. 모바일 전용 스타일 작성 (desktop 미고려)
|
|
206
217
|
```
|
|
207
218
|
|
|
208
|
-
###
|
|
219
|
+
### B-5. 모바일 검증 루프
|
|
209
220
|
|
|
210
|
-
|
|
221
|
+
```
|
|
222
|
+
🔄 Phase 9 검증 루프 실행:
|
|
223
|
+
- Figma 모바일 스크린샷 vs 생성된 코드 비교
|
|
224
|
+
- P1=0 될 때까지 수정 반복
|
|
225
|
+
- 이미지 에셋 전부 표시되는지 확인
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
211
229
|
|
|
212
|
-
|
|
213
|
-
**즉시 다운로드**하여 프로젝트에 저장해야 함.
|
|
230
|
+
## Step C: PC 디자인 반영 (반응형)
|
|
214
231
|
|
|
215
|
-
|
|
232
|
+
### C-1. PC 디자인 URL 입력
|
|
216
233
|
|
|
217
|
-
|
|
234
|
+
AskUserQuestion (options 사용 금지):
|
|
218
235
|
```
|
|
219
|
-
|
|
220
|
-
|
|
236
|
+
question: "🖥️ PC 디자인 Figma URL을 입력해주세요. (없으면 '없음')"
|
|
237
|
+
→ ⏸️ 응답 대기
|
|
238
|
+
→ URL → pcUrl 저장 (responsive mode)
|
|
239
|
+
→ "없음" → single viewport mode (Step D로 직행)
|
|
221
240
|
```
|
|
222
241
|
|
|
223
|
-
|
|
242
|
+
### C-2. PC 디자인 추출 (MCP)
|
|
224
243
|
|
|
225
244
|
```
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
|
|
249
|
+
### C-3. PC 이미지 에셋 다운로드 (BLOCKING)
|
|
238
250
|
|
|
239
251
|
```
|
|
240
|
-
|
|
252
|
+
모바일과 동일 프로세스.
|
|
253
|
+
PC 전용 이미지가 있으면 추가 다운로드.
|
|
254
|
+
동일 이미지는 스킵 (중복 방지).
|
|
255
|
+
```
|
|
241
256
|
|
|
242
|
-
|
|
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
|
-
|
|
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
|
-
|
|
269
|
+
### C-5. PC 검증 루프
|
|
251
270
|
|
|
252
271
|
```
|
|
253
|
-
|
|
254
|
-
-
|
|
255
|
-
-
|
|
272
|
+
🔄 Phase 9 검증 루프 실행:
|
|
273
|
+
- Figma PC 스크린샷 vs 생성된 코드 (PC viewport) 비교
|
|
274
|
+
- P1=0 될 때까지 수정 반복
|
|
275
|
+
- 모바일 검증도 재확인 (PC 수정으로 모바일이 깨지지 않았는지)
|
|
256
276
|
```
|
|
257
277
|
|
|
258
|
-
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Step D: 최종 공통화 리팩토링
|
|
259
281
|
|
|
260
|
-
|
|
282
|
+
### D-1. 스타일 공통화
|
|
261
283
|
|
|
262
284
|
```
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
-
|
|
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 |
|