@su-record/vibe 2.8.17 → 2.8.18

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.
@@ -1,17 +1,13 @@
1
1
  ---
2
2
  name: vibe-figma-consolidate
3
- description: Step D — 모바일/PC 스타일 공통화, 컴포넌트 통합, 최종 검증
3
+ description: Step D — 모바일/PC 스타일 공통화, 컴포넌트 통합, 최종 검증, 후처리 파이프라인
4
4
  triggers: []
5
5
  tier: standard
6
6
  ---
7
7
 
8
- # Skill: vibe-figma-consolidate — Step C: 최종 공통화 리팩토링
8
+ # Skill: vibe-figma-consolidate — Step D: 공통화 + 최종 검증
9
9
 
10
- > **⛔ 실행 지시: Edit 도구로 기존 파일을 실제 수정한다.**
11
- > - 토큰 통합: Edit으로 _tokens.scss 수정
12
- > - 중복 제거: Edit으로 중복 스타일/코드 통합
13
- > - variant 통합: Edit으로 유사 컴포넌트 합침
14
- > 분석만 보여주고 끝내면 안 됨.
10
+ > **실행 지시: Edit 도구로 기존 파일을 실제 수정한다.**
15
11
 
16
12
  ## D-1. 스타일 공통화
17
13
 
@@ -21,101 +17,37 @@ tier: standard
21
17
  3. 컴포넌트 내 중복 로직 제거
22
18
  ```
23
19
 
24
- ### 공통화 우선순위
25
-
26
20
  | 유형 | 처리 방법 |
27
21
  |------|----------|
28
- | 색상 (모바일/PC 동일) | 공통 CSS custom property 추출 |
29
- | 타이포그래피 (동일 scale) | 공통 토큰 유지 |
30
- | 간격 (다름) | clamp() fluid 토큰으로 변환 |
22
+ | 색상 (동일) | 공통 CSS custom property |
23
+ | 타이포 (동일 scale) | 공통 토큰 유지 |
24
+ | 간격 (다름) | clamp() fluid 토큰 (계산: vibe-figma-rules R-3) |
31
25
  | 레이아웃 방향 (다름) | @media 분기 유지 |
32
- | 컴포넌트 구조 (동일) | 하나의 컴포넌트로 통합 |
26
+ | 컴포넌트 구조 (동일) | 하나로 통합 |
33
27
 
34
28
  ## D-2. 컴포넌트 통합
35
29
 
36
- ```
37
- 1. 유사 컴포넌트 (80% rule) → variant prop으로 통합
38
- 2. 중복 sub-component → 공유 컴포넌트로 추출
39
- 3. Fragment/template 활용하여 불필요한 래퍼 제거
40
- ```
41
-
42
- ### 80% Rule 적용 기준
30
+ 80% Rule 및 variant 통합 기준은 **vibe-figma-rules R-5** 참조.
43
31
 
44
32
  ```
45
- 유사도 판단 기준:
46
- - 레이아웃 구조 동일
47
- - 색상/크기/텍스트만 다름
48
- → 하나의 컴포넌트 + props로 변형
49
-
50
- - 구조 자체가 다름 (요소 추가/제거, 레이아웃 방향 변경)
51
- → 별도 컴포넌트 유지
33
+ 1. 유사 컴포넌트 (80%+) → variant prop 통합
34
+ 2. 중복 sub-component 공유 컴포넌트 추출
35
+ 3. 불필요한 래퍼 → Fragment/template 제거
52
36
  ```
53
37
 
54
- | Stack | 변형 방법 |
55
- |-------|----------|
56
- | React | `variant` prop + 조건부 className / style |
57
- | Vue | `variant` prop + `<slot>` for 커스텀 영역 |
58
- | Svelte | `variant` prop + `<slot>` |
59
- | React Native | `variant` prop + StyleSheet 조건 선택 |
60
-
61
- ### 통합 예시 (React)
62
-
63
- ```tsx
64
- // 통합 전: 별도 컴포넌트 (구조 동일, 색상만 다름)
65
- <DefaultCard />
66
- <HighlightCard />
67
- <CompactCard />
68
-
69
- // 통합 후: 단일 컴포넌트 + variant
70
- interface CardProps {
71
- variant: 'default' | 'highlight' | 'compact';
72
- title: string;
73
- children: React.ReactNode;
74
- }
75
-
76
- export function Card({ variant, title, children }: CardProps): JSX.Element {
77
- return (
78
- <article className={styles[variant]}>
79
- <h3 className={styles.title}>{title}</h3>
80
- {children}
81
- </article>
82
- );
83
- }
84
- ```
38
+ ## D-3. 최종 검증
85
39
 
86
- ### 불필요한 래퍼 제거
40
+ 검증 공통 프로세스는 **vibe-figma-rules R-6** 참조.
87
41
 
88
- ```tsx
89
- // WRONG: 스타일 없는 불필요한 div 래핑
90
- <div>
91
- <ComponentA />
92
- <ComponentB />
93
- </div>
42
+ ### Step D 추가 검증
94
43
 
95
- // CORRECT: Fragment
96
- <>
97
- <ComponentA />
98
- <ComponentB />
99
- </>
100
44
  ```
101
-
102
- ## D-3. 최종 검증 루프
103
-
104
- ```
105
- 🔄 양쪽 뷰포트 동시 검증:
45
+ 양쪽 뷰포트 동시 검증:
106
46
  - 모바일 Figma vs 코드 (mobile viewport)
107
47
  - PC Figma vs 코드 (desktop viewport)
108
48
  - 양쪽 모두 P1=0, Match Score 95%+
109
49
  - 이미지 에셋 전부 정상 표시
110
- ```
111
-
112
- ### 검증 완료 조건
113
-
114
- ```
115
- ✅ Match Score 95% 이상 (모바일 + 데스크탑 각각)
116
- ✅ P1 불일치 0건
117
- ✅ 모든 이미지 에셋 표시 확인
118
- ✅ 공통 토큰으로 중복 제거 완료
50
+ - 공통 토큰으로 중복 제거 완료
119
51
  ```
120
52
 
121
53
  ### Model Routing (Step D)
@@ -123,15 +55,46 @@ export function Card({ variant, title, children }: CardProps): JSX.Element {
123
55
  | 작업 | 모델 |
124
56
  |------|------|
125
57
  | 공통화 리팩토링 + 최종 검증 | **Sonnet** |
126
- | Post — 코드 리뷰 | **gpt-5.3-codex** |
58
+ | Post — 코드 리뷰 | **gpt-5.3-codex** (Codex 미설치 시 스킵) |
127
59
 
128
- ### Post 코드 리뷰 (Codex 설치 시)
60
+ ## D-4. Design Quality Pipeline (후처리)
129
61
 
62
+ Step D 완료 후 사용자에게 다음 단계를 제시.
63
+
64
+ ### Pre-requisite check
65
+
66
+ `.claude/vibe/design-context.json`이 없으면:
130
67
  ```
131
- /codex:review (gpt-5.3-codex)
132
- 생성된 코드의 design fidelity + 코드 품질 크로스 검증
68
+ 디자인 컨텍스트가 없습니다. /design-teach 를 먼저 실행하면
69
+ 브랜드, 접근성, 타겟 디바이스에 맞춘 정확한 코드를 생성할 수 있습니다.
70
+ ```
71
+
72
+ ### Quick (기본 추천)
133
73
 
134
- Codex 미설치 시 자동 스킵.
135
74
  ```
75
+ /design-normalize → /design-audit
76
+ ```
77
+ - Normalize: 하드코딩 값 → MASTER.md 토큰으로 치환
78
+ - Audit: A11Y + 성능 + 반응형 + AI Slop 검출
79
+
80
+ ### Thorough (프로덕션 추천)
136
81
 
137
- Step D 완료 후 → vibe-figma-pipeline 실행.
82
+ ```
83
+ /design-normalize → /design-audit → /design-critique → /design-polish
84
+ ```
85
+ - + Critique: Nielsen 10 휴리스틱 + 페르소나 분석
86
+ - + Polish: 인터랙션 상태 보완 (hover/focus/loading/error)
87
+
88
+ ### 출력 포맷
89
+
90
+ ```markdown
91
+ ## Design Quality Pipeline
92
+
93
+ 생성된 파일: {file list}
94
+
95
+ 추천 다음 단계:
96
+ 1. /design-normalize — 토큰 정렬
97
+ 2. /design-audit — 기술 품질 검사
98
+ 3. /design-critique — UX 휴리스틱 리뷰
99
+ 4. /design-polish — 최종 인터랙션 보완
100
+ ```
@@ -10,12 +10,11 @@ triggers: []
10
10
  디자인 URL 하나를 받아서 **프레임별로 쪼개서 추출**하고, Step A에서 만든 컴포넌트에 스타일/이미지를 채움.
11
11
  어떤 뷰포트든 동일한 프로세스. 두 번째 호출 시 반응형 레이어만 추가.
12
12
 
13
- > **⛔ 실행 지시: 분석만 하지 말 것.**
14
- > - 이미지: WebFetch로 다운로드 → Write 도구로 파일 저장
15
- > - 스타일: Write 도구로 SCSS/CSS 파일 생성 (layout/ + components/)
13
+ > **실행 지시: 분석만 하지 말 것.**
14
+ > - 이미지: WebFetch로 다운로드 → 파일 저장
15
+ > - 스타일: Write 도구로 SCSS/CSS 파일 생성
16
16
  > - 코드: Edit 도구로 Step A 컴포넌트의 template/style 채움
17
- > - 토큰: Edit 도구로 _tokens.scss에 추출한 값 추가
18
- > 모든 Phase가 끝나면 디스크에 실제 파일이 변경되어 있어야 함.
17
+ > - 토큰: Edit 도구로 _tokens 파일에 추출한 값 추가
19
18
 
20
19
  ## 입력
21
20
 
@@ -23,44 +22,30 @@ triggers: []
23
22
  - Step A에서 생성된 컴포넌트 파일들
24
23
  - 호출 횟수 (첫 번째 = base, 두 번째 이후 = responsive 추가)
25
24
 
26
- ## Phase 1: 디자인 URL 입력
25
+ ## B-1. 디자인 URL 입력
27
26
 
28
27
  AskUserQuestion (options 사용 금지, 자유 텍스트만):
29
28
 
30
29
  ```
31
30
  첫 번째 호출:
32
- question: "🎨 디자인 Figma URL을 입력해주세요."
33
- ⏸️ 응답 대기 (응답 다음 진행 금지)
34
- → URL 저장 → Phase 2~5 실행
31
+ question: "디자인 Figma URL을 입력해주세요."
32
+ → 응답 대기 URL 저장 B-2~B-5 실행
35
33
 
36
34
  검증 완료 후:
37
- question: "🎨 추가 디자인 URL이 있나요? (없으면 '없음')"
38
- ⏸️ 응답 대기
39
- URL 입력 responsive 모드로 Phase 2~5 재실행
40
- → "없음" → Step C(공통화)로 진행
35
+ question: "추가 디자인 URL이 있나요? (없으면 '없음')"
36
+ URL 입력 → responsive 모드로 B-2~B-5 재실행
37
+ "없음"Step D(공통화)로 진행
41
38
 
42
39
  모바일/PC 순서를 강제하지 않음. 어떤 뷰포트든 먼저 입력 가능.
43
40
  첫 번째 URL = base 스타일, 추가 URL = 반응형 레이어 추가.
44
41
  ```
45
42
 
46
- ## Phase 2: 전체 → 섹션 프레임 매핑
43
+ ## B-2. 전체 → 섹션 프레임 매핑
47
44
 
48
45
  ```
49
46
  1. get_metadata(fileKey, nodeId) → 전체 페이지 하위 프레임 목록
50
47
 
51
48
  2. 프레임 이름으로 Step A 컴포넌트와 매핑:
52
- | 디자인 프레임 이름 | Step A 컴포넌트 |
53
- |------------------|----------------|
54
- | "키 비주얼" / "Hero" / "KV" | HeroSection.vue |
55
- | "출석" / "Check" / "Mission 01" | DailyCheckInSection.vue |
56
- | "플레이타임" / "Mission 02" | PlayTimeMissionSection.vue |
57
- | "교환" / "Exchange" / "Shop" | TokenExchangeSection.vue |
58
- | "응모" / "Raffle" / "Prize" | TokenRaffleSection.vue |
59
- | "유의사항" / "Caution" / "Notice" | CautionSection.vue |
60
- | "GNB" / "Header" / "Nav" | GnbHeader.vue |
61
- | "Footer" | EventFooter.vue |
62
-
63
- 매핑 방법:
64
49
  - 프레임 이름 키워드 매칭
65
50
  - 매칭 안 되면 순서(위→아래)로 Step A 섹션과 1:1 대응
66
51
  - 그래도 안 되면 get_screenshot으로 비주얼 비교
@@ -70,125 +55,117 @@ AskUserQuestion (options 사용 금지, 자유 텍스트만):
70
55
  매핑 안 된 프레임이 있으면 사용자에게 확인
71
56
  ```
72
57
 
73
- ## Phase 3: 섹션별 개별 추출
58
+ ## B-3. 섹션별 개별 추출
74
59
 
75
60
  **각 매핑된 섹션에 대해 순서대로:**
76
61
 
62
+ ### 3-1. 스크린샷 시각 분석 (1순위)
63
+
64
+ ```
65
+ get_screenshot(fileKey, designFrame.nodeId)
66
+ → 원본 디자인 이미지 확보 — 이것이 코드 생성의 1차 소스
67
+
68
+ 스크린샷에서 읽는 항목 (vibe-figma-rules R-7 참조):
69
+ → 레이아웃 구조 (섹션 경계, flex/grid 방향, 요소 배치)
70
+ → 배경 (이미지/단색/그라데이션, 오버레이 유무)
71
+ → 색상 (배경, 텍스트, 버튼, 보더)
72
+ → 타이포 (크기 비율, 굵기, 줄간격) — 스케일 팩터 적용 (R-3)
73
+ → 간격 (패딩, gap, 마진) — 스케일 팩터 적용 (R-3)
74
+ → 이미지 분류 (Background/Content/Overlay, R-4 참조)
75
+ → z-index 관계 (겹침 구조, 투명도)
76
+ ```
77
+
78
+ ### 3-2. 참조 코드 + 에셋 추출 (2순위)
79
+
77
80
  ```
78
- for each (designFrame, component) in mappings:
79
-
80
- 1. get_design_context(fileKey, designFrame.nodeId)
81
- 해당 섹션 전용 **참조 코드** + 스크린샷 + 에셋 URL
82
-
83
- ⚠️ 참조 코드가 핵심:
84
- get_design_context는 React+Tailwind 기반 참조 코드를 반환함.
85
- 코드에 이미지 URL, 레이아웃 구조, 색상값, 폰트 정보가 모두 포함됨.
86
- 참조 코드를 **기반으로** 프로젝트 스택에 맞게 변환해야 함.
87
- → 참조 코드를 무시하고 스크린샷만 보고 자체 해석하면 안 됨.
88
- 참조 코드의 이미지 URL, 색상 hex, 폰트 크기를 그대로 가져온 후 스케일 적용.
89
-
90
- ⚠️ 스크린샷은 보조:
91
- 참조 코드와 스크린샷이 다르면 → 스크린샷(디자인 의도) 우선
92
- 참조 코드에 없는 시각적 요소가 스크린샷에 보이면 → 추가 구현
93
-
94
- 2. ⛔ 이미지 에셋 다운로드 (BLOCKING — 코드 반영 전 필수 완료):
95
-
96
- Step 2-a: get_design_context 응답에서 에셋 URL 추출
97
- 응답 코드에 아래 패턴이 포함됨:
98
- const heroImage = 'https://www.figma.com/api/mcp/asset/xxxx'
99
- const bgImage = 'https://www.figma.com/api/mcp/asset/yyyy'
100
- → 모든 https://www.figma.com/api/mcp/asset/ URL을 수집
101
-
102
- Step 2-b: 각 URL을 WebFetch로 다운로드 → Bash로 파일 저장
103
- 다운로드 명령 예시:
104
- Bash: curl -L "https://www.figma.com/api/mcp/asset/xxxx" -o static/images/{feature}/hero-bg.webp
105
- 또는 WebFetch 후 Write로 저장
106
- 파일명: 변수명/레이어명 기반 kebab-case (heroImage → hero-bg.webp)
107
-
108
- Step 2-c: URL→로컬경로 매핑 테이블 생성
109
- | 변수명 | Figma URL | 로컬 경로 |
110
- |--------|-----------|----------|
111
- | heroImage | https://figma.com/api/mcp/asset/xxxx | /images/{feature}/hero-bg.webp |
112
- | bgImage | https://figma.com/api/mcp/asset/yyyy | /images/{feature}/section-bg.webp |
113
-
114
- Step 2-d: 다운로드 검증
115
- → 파일이 실제로 존재하는지 Bash: ls -la static/images/{feature}/
116
- → 누락된 파일이 있으면 재다운로드
117
- → 0byte 파일 체크 (다운로드 실패)
118
-
119
- 3. 스크린샷 분석 + ⚠️ 스케일 팩터 적용:
120
- → 레이아웃 (flex/grid 방향, 정렬)
121
- → 색상 (배경, 텍스트, 보더) — 스케일 불필요
122
- → 타이포 (크기, 굵기, 줄간격) — ⚠️ 스케일 팩터 적용
123
- → 간격 (padding, gap, margin) — ⚠️ 스케일 팩터 적용
124
- → ⚠️ 배경 이미지 분류 (아래 참조)
125
-
126
- 스케일 팩터:
127
- 코드 값 = Figma 추출 값 × scaleFactor
128
- scaleFactor는 Step A의 storyboardSpec.scaleFactor에서 참조
129
- 디폴트: PC 0.75 (1920/2560), Mobile 0.667 (480/720)
130
-
131
- 4. ⛔ 배경 이미지 분류 + Multi-Layer 패턴 적용:
132
-
133
- 섹션에 배경 이미지가 있으면 반드시 Multi-Layer 구조로 작성:
134
-
135
- <template>:
136
- <section class="{section}Section">
137
- <div class="{section}Bg" /> ← 배경 이미지 (z-index: 0)
138
- <div class="{section}BgOverlay" /> ← 오버레이 (z-index: 1, 선택)
139
- <div class="{section}Content"> ← 콘텐츠 (z-index: 최상위)
140
- ...실제 UI...
141
- </div>
142
- </section>
143
-
144
- <style> (layout/{section}.scss):
145
- .{section}Section { position: relative; overflow: hidden; }
146
- .{section}Bg {
147
- position: absolute; inset: 0; z-index: 0;
148
- background-image: url('/images/{feature}/{image-name}.webp');
149
- background-size: cover;
150
- background-position: center;
151
- }
152
- .{section}BgOverlay {
153
- position: absolute; inset: 0; z-index: 1;
154
- background: linear-gradient(to bottom, rgba(0,0,0,0.3), rgba(0,0,0,0.7));
155
- }
156
- .{section}Content { position: relative; z-index: 2; }
157
-
158
- 배경이 없는 섹션은 Multi-Layer 불필요 — 일반 구조 사용.
159
-
160
- 5. component 파일에 반영 (Edit 도구):
161
-
162
- ⚠️ 변환 순서 (참조 코드 → 프로젝트 코드):
163
- a. get_design_context 참조 코드에서 추출:
164
- - HTML 구조 (div 계층, 이미지 배치, 텍스트 위치)
165
- - 이미지 URL (const xxxImage = '...')
166
- - 인라인 스타일/Tailwind 클래스 → 색상, 폰트, 간격 값
167
- - 배경 이미지 패턴 (background-image가 있으면 Multi-Layer 적용)
168
-
169
- b. 프로젝트 스택으로 변환:
170
- - React+Tailwind → Vue/Nuxt SFC + SCSS (또는 프로젝트 스택)
171
- - className → :class
172
- - style={{ }} → SCSS 변수/클래스
173
- - Tailwind 값 → SCSS 토큰 변수
174
-
175
- c. 스케일 팩터 적용:
176
- - 참조 코드의 px 값 × scaleFactor = 코드 값
177
- - 색상 hex는 그대로 (스케일 불필요)
178
-
179
- d. 이미지 경로 교체:
180
- - figma.com/api/mcp/asset/xxx → /images/{feature}/xxx.webp (매핑 테이블)
181
-
182
- e. Step A 코드와 병합:
183
- - Step A의 기능 주석/핸들러/인터페이스 보존
184
- - template의 placeholder → 참조 코드 기반 실제 마크업으로 교체
185
- - style 블록 → 참조 코드에서 추출한 스타일 작성
186
-
187
- ⛔ 참조 코드에 이미지가 있는데 생성 코드에 없으면 → 누락, 반드시 포함
188
- ⛔ Figma 임시 URL이 코드에 남으면 안 됨
81
+ get_design_context(fileKey, designFrame.nodeId)
82
+ → 참조 코드 + 에셋 URL
83
+
84
+ 참조 코드에서 가져오는 것:
85
+ ✅ 이미지 에셋 URL (https://figma.com/api/mcp/asset/...) — 핵심 가치
86
+ 정확한 hex 색상값 (스크린샷 추정보다 정확할 때)
87
+ 폰트 패밀리명, border-radius, shadow
88
+ ⚠️ 레이아웃/구조 스크린샷과 대조 채택
89
+ px 그대로 사용 금지 반드시 스케일 팩터 적용
90
+
91
+ ⚠️ 레이어가 "Frame 633372" 같은 비정형일 때:
92
+ 참조 코드가 부정확할 수 있음 → 스크린샷 분석 결과를 기준으로 코드 생성
189
93
  ```
190
94
 
191
- ## Phase 4: 뷰포트 모드에 따른 스타일 적용
95
+ ### 3-3. 이미지 에셋 다운로드 (BLOCKING 코드 반영 전 필수)
96
+
97
+ ```
98
+ Step a: 참조 코드에서 에셋 URL 추출
99
+ → 모든 https://www.figma.com/api/mcp/asset/ URL 수집
100
+
101
+ Step b: 각 URL을 다운로드 → 파일 저장
102
+ Bash: curl -L "{url}" -o static/images/{feature}/{name}.webp
103
+ 파일명: 변수명/레이어명 기반 kebab-case
104
+
105
+ Step c: URL→로컬경로 매핑 테이블 생성
106
+
107
+ Step d: 다운로드 검증
108
+ → 파일 존재 + 0byte 아닌지 확인
109
+ → 누락/실패 시 재다운로드
110
+ ```
111
+
112
+ ### 3-4. 이미지 코드 패턴 적용
113
+
114
+ 이미지 분류 결과에 따라 코드 생성:
115
+
116
+ **Background Image → Multi-Layer 패턴 (vibe-figma-rules R-4 참조)**
117
+
118
+ **Content Image:**
119
+ ```tsx
120
+ // React / Next.js — Image 컴포넌트 우선
121
+ <Image src="/images/{feature}/product.webp" alt="설명" width={600} height={400} />
122
+
123
+ // Vue / Nuxt — NuxtImg 우선
124
+ <NuxtImg src="/images/{feature}/product.webp" alt="설명" width="600" height="400" loading="lazy" />
125
+ ```
126
+
127
+ **반응형 Content Image:**
128
+ ```html
129
+ <picture>
130
+ <source media="(min-width: {breakpoint}px)" srcset="/images/{feature}/hero-pc.webp" />
131
+ <img src="/images/{feature}/hero-mobile.webp" alt="설명" loading="eager" />
132
+ </picture>
133
+ ```
134
+
135
+ **반응형 Background Image:**
136
+ ```css
137
+ .heroBg { background-image: url('/images/{feature}/hero-mobile.webp'); }
138
+ @media (min-width: {breakpoint}px) {
139
+ .heroBg { background-image: url('/images/{feature}/hero-pc.webp'); }
140
+ }
141
+ ```
142
+
143
+ ### 3-5. 컴포넌트 파일에 반영 (Edit 도구)
144
+
145
+ ```
146
+ 변환 순서 (스크린샷 분석 → 코드):
147
+
148
+ a. 스크린샷 분석 결과로 코드 작성:
149
+ - 레이아웃 구조 (스크린샷에서 읽은 flex/grid, 배치)
150
+ - 스타일 값 (스크린샷에서 읽은 색상, 간격, 폰트 × 스케일 팩터)
151
+ - 배경 이미지 Multi-Layer 구조 (스크린샷에서 판단한 z-index)
152
+
153
+ b. 참조 코드에서 보강:
154
+ - 에셋 URL → 다운로드된 로컬 경로로 교체
155
+ - 정확한 hex 색상값, border-radius, shadow (스크린샷 추정보다 정확할 때)
156
+
157
+ c. 프로젝트 스택으로 변환 (React→Vue 등)
158
+
159
+ d. Step A 코드와 병합:
160
+ - 기능 주석/핸들러/인터페이스 보존
161
+ - template의 placeholder → 실제 마크업으로 교체
162
+
163
+ 주의:
164
+ - 스크린샷에 보이는 이미지가 코드에 없으면 → 누락
165
+ - Figma 임시 URL이 코드에 남으면 안 됨
166
+ ```
167
+
168
+ ## B-4. 뷰포트 모드에 따른 스타일 적용
192
169
 
193
170
  ### 첫 번째 URL (base)
194
171
 
@@ -203,59 +180,43 @@ for each (designFrame, component) in mappings:
203
180
  ```
204
181
  기존 코드를 수정하지 않고 반응형 레이어만 추가:
205
182
 
206
- 1. 프레임 width 비교 → 어떤 뷰포트인지 자동 판별
207
- (base보다 크면 desktop 방향, 작으면 mobile 방향)
183
+ 1. 프레임 width 뷰포트 자동 판별
184
+ 2. 값이 다른 속성 → clamp() fluid 토큰 (계산: vibe-figma-rules R-3)
185
+ 3. 레이아웃 구조가 다른 부분 → @media (min-width: {breakpoint}px)
186
+ 4. 뷰포트별 배경 이미지 → @media 분기
187
+ 5. 추가 이미지 에셋 다운로드 (base와 동일하면 스킵)
188
+ 6. 기존 base 코드/주석/핸들러는 절대 삭제하지 않음
189
+ ```
208
190
 
209
- 2. 값이 다른 속성 → clamp() fluid 토큰으로 변환
210
- - SCSS: figma-fluid($min, $max) 함수 사용
211
- - CSS: clamp(min, preferred, max)
191
+ ## B-5. 검증 루프
212
192
 
213
- 3. 레이아웃 구조가 다른 부분 @media (min-width: {breakpoint}px)
214
- - flex-direction 변경
215
- - grid-template-columns 변경
216
- - display toggle (baseOnly/responsiveOnly)
193
+ 공통 프로세스: **vibe-figma-rules R-6** (6-1 ~ 6-7) 전체 적용.
217
194
 
218
- 4. 뷰포트별 배경 이미지 → @media 분기
219
- .heroBg { background-image: url(base.webp); }
220
- @media (min-width: {breakpoint}px) { .heroBg { background-image: url(alt.webp); } }
195
+ ### Step B 검증 흐름
221
196
 
222
- 5. 추가 이미지 에셋 다운로드 (base와 동일하면 스킵)
197
+ ```
198
+ for each section in mappings:
223
199
 
224
- 6. 기존 base 코드/주석/핸들러는 절대 삭제하지 않음
200
+ 1. 원본 확보: B-3.1에서 이미 get_screenshot한 섹션 이미지
201
+ 2. 생성 결과 확보: /vibe.utils --preview 또는 dev 서버 스크린샷 (R-6.2)
202
+ 3. 섹션별 비교: 레이아웃, 배경, 색상, 타이포, 간격, 이미지 (R-6.3~4)
203
+ 4. Diff Report 출력 (R-6.5)
204
+ 5. P1 → 해당 섹션 수정 → 재비교 (R-6.6)
225
205
  ```
226
206
 
227
- ## Phase 5: 검증 루프
207
+ ### Step B 추가 검증 항목
228
208
 
229
209
  ```
230
- 🔄 Figma 원본 스크린샷 vs 생성된 코드 비교:
231
-
232
- 1. get_screenshot으로 Figma 원본 획득 (이미 Phase 3에서 있음)
233
- 2. 생성된 코드의 렌더링 결과와 비교
234
- 3. 비교 항목:
235
- - 레이아웃 (배치, 정렬, 간격)
236
- - 타이포 (크기, 굵기, 색상)
237
- - 색상 (배경, 텍스트, 보더)
238
- - 이미지 (배경/에셋 표시 여부)
239
- - 누락 요소
240
-
241
- 4. Diff Report:
242
- | 섹션 | 항목 | Figma | 코드 | 심각도 |
243
- |------|------|-------|------|--------|
244
- | Hero | 배경 이미지 | 있음 | 누락 | P1 |
245
- | 출석 | font-size | 24px | 20px | P2 |
246
-
247
- 5. P1 불일치 → 수정 → 재비교 (횟수 제한 없음)
248
- 동일 항목 3회 연속 미해결 → 해당 항목만 사용자 확인 후 계속
249
-
250
- 6. 완료 조건:
251
- ✅ P1 = 0
252
- ✅ 모든 이미지 에셋 표시
253
- ✅ (두 번째 호출 시) 이전 뷰포트도 깨지지 않았는지 재확인
210
+ 1. 이미지 에셋: 전부 다운로드 + 로컬 파일 존재 + 0byte 아님
211
+ 2. Figma 임시 URL: Grep으로 figma.com/api/mcp/asset 잔존 0건 확인
212
+ 3. 배경 이미지: 스크린샷에 보이는 배경이 코드에도 있는지
213
+ 4. 오버레이: 배경 텍스트 가독성 확보 (스크린샷 대조)
214
+ 5. (responsive) 이전 뷰포트 섹션들 재비교 — 깨진 곳 없는지
254
215
  ```
255
216
 
256
217
  ## 참조 스킬
257
218
 
258
219
  코드 생성 시 다음 스킬의 규칙을 적용:
259
- - `vibe-figma-rules` — 분석/감지 (Phase 1-3)
260
- - `vibe-figma-style` — 토큰/스타일 (Phase 4, 클래스 네이밍, SCSS)
261
- - `vibe-figma-codegen` — 마크업/코드 생성 (Phase 5-6, 이미지 패턴, 반응형)
220
+ - `vibe-figma-rules` — 공통 규칙 (R-1~R-7)
221
+ - `vibe-figma-style` — 토큰/스타일 아키텍처
222
+ - `vibe-figma-codegen` — 마크업/코드 생성 규칙
@@ -1,52 +1,11 @@
1
1
  ---
2
2
  name: vibe-figma-pipeline
3
- description: Figma to Code 완료 후 Design Quality Pipeline 안내
3
+ description: "[Merged] vibe-figma-consolidate D-4 참조"
4
4
  triggers: []
5
5
  tier: standard
6
6
  ---
7
7
 
8
- # Skill: vibe-figma-pipeline — Design Quality Pipeline
8
+ # vibe-figma-pipeline
9
9
 
10
- 코드 생성 완료 후, 다음 파이프라인을 사용자에게 제시한다.
11
-
12
- ## Pre-requisite check
13
-
14
- If `.claude/vibe/design-context.json` does NOT exist:
15
- ```
16
- ⚠️ 디자인 컨텍스트가 없습니다. /design-teach 를 먼저 실행하면
17
- 브랜드, 접근성, 타겟 디바이스에 맞춘 더 정확한 코드를 생성할 수 있습니다.
18
- ```
19
-
20
- ## Quick (default recommendation)
21
-
22
- ```
23
- /design-normalize → /design-audit
24
- ```
25
-
26
- - Normalize: 하드코딩 값 → MASTER.md 토큰으로 치환
27
- - Audit: A11Y + 성능 + 반응형 + AI Slop 검출
28
-
29
- ## Thorough (recommended for production)
30
-
31
- ```
32
- /design-normalize → /design-audit → /design-critique → /design-polish
33
- ```
34
-
35
- - + Critique: Nielsen 10 휴리스틱 + 5 페르소나 분석
36
- - + Polish: 인터랙션 상태 보완 (hover/focus/loading/error)
37
-
38
- ## Output format
39
-
40
- ```
41
- ## 🎨 Design Quality Pipeline
42
-
43
- 생성된 파일: {file list}
44
-
45
- 추천 다음 단계:
46
- 1. /design-normalize — 토큰 정렬 (하드코딩 제거)
47
- 2. /design-audit — 기술 품질 검사
48
- 3. /design-critique — UX 휴리스틱 리뷰
49
- 4. /design-polish — 최종 인터랙션 보완
50
-
51
- 💡 /design-teach 가 아직 설정되지 않았다면 먼저 실행하세요.
52
- ```
10
+ 스킬은 **vibe-figma-consolidate** D-4 섹션으로 병합되었습니다.
11
+ Design Quality Pipeline 안내는 `vibe-figma-consolidate` Step D-4를 참조하세요.