@su-record/vibe 2.8.19 → 2.8.21

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "2.8.19",
3
+ "version": "2.8.21",
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",
@@ -1,105 +1,322 @@
1
1
  ---
2
2
  name: vibe-figma
3
- description: Step A — 스토리보드 추출 + 프로젝트 Base 구조 설계
3
+ description: Figma design to code — 스토리보드(기능) + 디자인(비주얼) 프로덕션 코드
4
4
  triggers: []
5
5
  tier: standard
6
6
  ---
7
7
 
8
- # Skill: vibe-figma — Step A: 스토리보드 + Base 구조
8
+ # vibe-figma — Figma Design to Code
9
9
 
10
- ## 스토리보드에서 추출하는 정보
10
+ ## 금지 사항
11
11
 
12
- | 항목 | 활용 |
13
- |------|------|
14
- | 브레이크포인트 / 해상도 가이드 | base 레이아웃 설계 |
15
- | 인터랙션 스펙 (호버, 클릭, 스크롤) | 이벤트 핸들러 + CSS states |
16
- | 애니메이션 스펙 (타이밍, 이징) | transition/animation |
17
- | 상태별 UI (로딩, 에러, 성공) | 조건부 렌더링 |
18
- | 반응형 동작 설명 | responsive 코드 |
19
- | 컬러/타이포 가이드 | 토큰 생성 |
12
+ ```
13
+ ❌ CSS로 이미지 재현 (삼각형/원/gradient로 나무/눈사람/배경 그리기)
14
+ 이미지 다운로드 없이 코드 생성 진행
15
+ 컴포넌트 파일 안에 <style> 블록 / 인라인 style=""
16
+ placeholder / template / 빈 src="" 남기기
17
+ CSS 값을 추정 (참조 코드에 정확한 값이 있음)
18
+ 브라우저 기본 스타일(검은색 16px)로 보이는 텍스트
19
+ ```
20
+
21
+ ## 전체 플로우
22
+
23
+ ```
24
+ /vibe.figma
25
+ → Phase 0: Setup (스택 감지, 디렉토리 생성)
26
+ → Phase 1: Storyboard (선택 — 레이아웃+컴포넌트 구성 + 기능 주석)
27
+ → Phase 2: Design (최소 뷰포트 퍼스트 → 브레이크포인트별 반복)
28
+ → Phase 3: Verification (Grep 체크 + 스크린샷 비교)
29
+ ```
30
+
31
+ ---
32
+
33
+ ## Phase 0: Setup
34
+
35
+ ```
36
+ 1. 프로젝트 스택 감지:
37
+ - package.json → react/vue/svelte
38
+ - next.config.* / nuxt.config.* → 프레임워크
39
+ - *.scss / sass in deps → SCSS
40
+ - tailwind.config.* → Tailwind
41
+
42
+ 2. 기존 스타일 디렉토리 감지:
43
+ - assets/scss/ or src/styles/ or styles/
44
+
45
+ 3. 피처명 결정:
46
+ - Figma 파일명에서 추출 → kebab-case
47
+ - 예: "PUBG 겨울 PC방 이벤트" → winter-pcbang
48
+
49
+ 4. 디렉토리 생성:
50
+ - components/{feature}/
51
+ - styles/{feature}/ (layout/, components/ 하위)
52
+ - public/images/{feature}/ (또는 static/images/{feature}/)
53
+ ```
54
+
55
+ ---
56
+
57
+ ## Phase 1: Storyboard
58
+
59
+ ```
60
+ AskUserQuestion: "스토리보드 Figma URL을 입력해주세요. (없으면 '없음')"
61
+
62
+ "없음" → Phase 2로 건너뜀 (디자인 URL만으로 진행)
63
+ ```
64
+
65
+ ### 1-1. 스토리보드 분석
66
+
67
+ ```
68
+ URL에서 fileKey, nodeId 추출
69
+ get_metadata(fileKey, nodeId) → 프레임 목록
70
+
71
+ 프레임 분류:
72
+ SPEC — 기능 정의서 → get_design_context로 텍스트 추출
73
+ CONFIG — 해상도/브레이크포인트 → 스케일 팩터 계산
74
+ SHARED — GNB/Footer/Popup → 공통 컴포넌트 파악
75
+ PAGE — 화면설계 → 섹션 목록 + 인터랙션 스펙
76
+ ```
77
+
78
+ ### 1-2. 레이아웃 + 컴포넌트 구성 (코드 생성)
79
+
80
+ ```
81
+ 스토리보드에서 파악한 섹션 구조로 실제 파일을 생성한다.
82
+
83
+ 1. 루트 페이지 파일 생성 (Write):
84
+ pages/{feature}.vue (또는 app/{feature}/page.tsx)
85
+ → 모든 섹션 컴포넌트 import + 순서대로 배치
86
+ → 팝업/모달 조건부 렌더링
87
+
88
+ 2. 섹션 컴포넌트 파일 생성 (Write):
89
+ components/{feature}/HeroSection.vue
90
+ components/{feature}/DailyCheckInSection.vue
91
+ components/{feature}/PlayTimeMissionSection.vue
92
+ ...PAGE 프레임 수만큼
93
+
94
+ 각 컴포넌트에 반드시 포함:
95
+
96
+ <template>:
97
+ - 섹션 제목 <h2> (스토리보드에서 추출한 실제 텍스트)
98
+ - 설명 텍스트 <p>
99
+ - 리스트 렌더링 (v-for + 목 데이터)
100
+ - 버튼/CTA (실제 라벨 + @click 핸들러)
101
+ - 조건부 렌더링 (상태에 따른 v-if)
102
+ → 빈 template 금지. 브라우저에서 텍스트가 보여야 함.
103
+
104
+ <script setup>:
105
+ - JSDoc 주석으로 기능 요구사항 작성:
106
+ /**
107
+ * 일일 출석 미션 섹션
108
+ *
109
+ * [기능 정의]
110
+ * - 매일 출석 시 스노우 토큰 즉시 지급
111
+ * - 누적 3/5/7일 달성 시 추가 보상
112
+ *
113
+ * [인터랙션]
114
+ * ① 출석하기 클릭 → API호출 → 토큰지급 표시
115
+ * ② 누적 보상 클릭 → 보상 수령
116
+ *
117
+ * [상태] default, checked, reward-claimed
118
+ */
119
+ - TypeScript 인터페이스
120
+ - 목 데이터 (빈 배열 금지, 3~7개 아이템)
121
+ - 이벤트 핸들러 stub (body는 // TODO:)
122
+
123
+ <style> 블록 없음 — 스타일은 Phase 2에서 외부 파일로.
124
+
125
+ 3. 공통 컴포넌트 (SHARED에서 파악):
126
+ → 프로젝트에 이미 있으면 import 재사용
127
+ → 없으면 새로 생성 (GNB, Footer, Popup)
128
+
129
+ 4. 스타일 디렉토리 구조 생성 (빈 파일):
130
+ styles/{feature}/index.scss
131
+ styles/{feature}/_tokens.scss
132
+ styles/{feature}/_mixins.scss
133
+ styles/{feature}/_base.scss
134
+ styles/{feature}/layout/
135
+ styles/{feature}/components/
136
+ ```
137
+
138
+ ### 1-3. 검증
139
+
140
+ ```
141
+ Phase 1 완료 조건:
142
+ □ 브라우저에서 열면 각 섹션의 텍스트/리스트/버튼이 보인다
143
+ □ 클릭하면 핸들러가 실행된다
144
+ □ 모든 컴포넌트에 [기능 정의] + [인터랙션] + [상태] JSDoc
145
+ □ 빈 배열 0개, 빈 template 0개, <style> 블록 0개
146
+ □ 빌드 성공
147
+
148
+ 빈 화면 = Phase 1 미완성. Phase 2로 넘어가지 않는다.
149
+ 스타일/이미지는 없어도 됨 — Phase 2에서 채움.
150
+ ```
151
+
152
+ ### 스케일 팩터
153
+
154
+ ```
155
+ 스토리보드 CONFIG 또는 기본값에서:
156
+ 모바일: scaleFactor = 480 / 720 = 0.667 (또는 targetMobile / designMobile)
157
+ PC: scaleFactor = 1920 / 2560 = 0.75 (또는 targetPc / designPc)
158
+
159
+ 적용 대상: font-size, padding, margin, gap, border-radius, width, height
160
+ 적용 안 함: color, opacity, font-weight, z-index, line-height(단위 없을 때)
161
+ ```
20
162
 
21
163
  ---
22
164
 
23
- ## A-1. 스토리보드 URL 입력
165
+ ## Phase 2: Design (핵심)
166
+
167
+ Phase 1에서 컴포넌트가 이미 존재 (레이아웃 + 기능 주석 + 목 데이터).
168
+ Phase 2에서는 이 컴포넌트에 **디자인(이미지 + 스타일)**을 입힌다.
169
+
170
+ ```
171
+ 모바일 퍼스트 강제. CSS base = 최소 뷰포트, @media (min-width:)로 확장.
172
+
173
+ 1. AskUserQuestion: "베이스 디자인(모바일) Figma URL을 입력해주세요."
174
+ → base 스타일로 처리.
175
+
176
+ 2. 처리 완료 후:
177
+ AskUserQuestion: "다음 브레이크포인트 디자인 URL을 입력해주세요. (없으면 '없음')"
178
+ → URL 입력 → @media (min-width:) 레이어 추가
179
+ → 처리 완료 후 다시: "다음 브레이크포인트 디자인 URL을 입력해주세요. (없으면 '없음')"
180
+ → ...
181
+ → "없음" → Phase 3으로
182
+
183
+ 브레이크포인트는 프레임 width에서 자동 산출.
184
+ 예: 720px → 480px(스케일), 2560px → 1920px(스케일) → @media (min-width: 1024px)
185
+ ```
186
+
187
+ ### 2-1. 스타일 파일 내용 작성 (첫 섹션 전)
24
188
 
25
- AskUserQuestion (options 사용 금지, 자유 텍스트만):
26
189
  ```
27
- question: "스토리보드 Figma URL을 입력해주세요. (없으면 '없음')"
28
- 응답 대기 (응답 받기 전 다음 진행 금지)
29
- → figma.com URL storyboardUrl 저장
30
- "없음" → storyboardUrl = null
190
+ Phase 1에서 파일로 만든 스타일 구조에 기본 내용 Write:
191
+ styles/{feature}/index.scss ← @use 진입점
192
+ styles/{feature}/_tokens.scss ← 파일 (섹션 처리하며 채움)
193
+ styles/{feature}/_mixins.scss ← breakpoint mixin
194
+ styles/{feature}/_base.scss ← reset, font-face
195
+ styles/{feature}/layout/ ← 디렉토리
196
+ styles/{feature}/components/ ← 디렉토리
31
197
  ```
32
198
 
33
- ## A-2. 스토리보드 추출 (storyboardUrl이 있을 때)
199
+ ### 2-2. 섹션별 루프
200
+
201
+ **각 섹션에 대해 순서대로, 한 섹션을 완전히 완료한 후 다음으로:**
202
+
203
+ #### a. get_design_context 호출
34
204
 
35
205
  ```
36
- URL에서 fileKey, nodeId 추출:
37
- https://www.figma.com/design/:fileKey/:fileName?node-id=:nodeId
38
- nodeId: 하이픈을 콜론으로 ("1-109" → "1:109")
206
+ get_design_context(fileKey, 섹션.nodeId)
207
+
208
+ 반환되는 것:
209
+ - const img변수명 = 'https://figma.com/api/mcp/asset/...' (이미지 에셋 URL들)
210
+ - React+Tailwind JSX 코드 (HTML 구조 + CSS 값)
211
+ - 스크린샷 (원본 디자인 이미지)
212
+ - data-name 속성 (레이어 이름: "BG", "Title", "Period" 등)
39
213
 
40
- 1. get_metadata(fileKey, nodeId) 전체 프레임 목록
41
- 2. 관련 섹션별 get_design_context 또는 get_screenshot:
42
- - "해상도 대응" / "Media Query" → 브레이크포인트 + 디자인 시안 사이즈
43
- - "인터랙션" / "Interaction" → 호버/클릭/스크롤 스펙
44
- - "애니메이션" / "Animation" / "Motion" → 트랜지션 스펙
45
- - "상태" / "State" → 로딩/에러/성공 UI
46
- - "컬러" / "Color" / "타이포" / "Typography" → 디자인 가이드
214
+ 참조 코드가 모든 작업의 기반.
47
215
  ```
48
216
 
49
- ### 해상도 대응 프레임 추출
217
+ #### b. 이미지 전부 다운로드 (BLOCKING)
50
218
 
51
- 해상도 프레임에서 브레이크포인트 + 스케일 팩터 정보를 추출한다.
52
- 계산 공식과 기본값은 **vibe-figma-rules R-3** 참조.
219
+ ```
220
+ vibe-figma-extract 스킬 참조.
53
221
 
222
+ 참조 코드에서 모든 에셋 URL 추출 → 다운로드 → 검증.
223
+ 이미지가 모두 로컬에 있어야 c 단계로 진행.
224
+ 하나라도 실패하면 코드 생성하지 않음.
54
225
  ```
55
- 추출 결과를 storyboardSpec으로 저장:
56
226
 
57
- storyboardSpec = {
58
- breakpoints: { pcTarget, breakpoint, mobilePortrait, mobileMinimum, designPc, designMobile },
59
- scaleFactor: { pc, mobile },
60
- interactions: [ ... ],
61
- animations: [ ... ],
62
- states: { ... },
63
- colorGuide: { ... },
64
- typographyGuide: { ... }
65
- }
227
+ #### c. 참조 코드 → 외부 스타일 파일
228
+
66
229
  ```
230
+ vibe-figma-convert 스킬 참조.
67
231
 
68
- ## A-3. 프로젝트 스택 감지 + Base 구조 설계
232
+ 참조 코드의 Tailwind 클래스에서 CSS 추출:
233
+ text-[48px] → font-size: 36px (48 × 0.75)
234
+ text-[#1B3A1D] → color: #1B3A1D
235
+ bg-[#0A1628] → background-color: #0A1628
236
+ pt-[120px] → padding-top: 90px (120 × 0.75)
69
237
 
238
+ Write/Edit:
239
+ styles/{feature}/layout/_{section}.scss ← 배치/구조/배경이미지
240
+ styles/{feature}/components/_{section}.scss ← 텍스트/버튼/카드 스타일
241
+ styles/{feature}/_tokens.scss ← 새 토큰 추가
70
242
  ```
71
- 1. 프로젝트 스택 감지 (vibe-figma-rules R-2 참조)
72
- 2. 디자인 시스템 감지 (--new 미지정 시)
73
- 3. 브레이크포인트 로드 (vibe-figma-rules R-3 참조, 스토리보드 우선)
74
- 4. 피처명 결정 (Figma 파일명에서 추출)
75
- 5. → 파일 생성은 vibe-figma-analyze 스킬에서 실행 (이 스킬은 추출까지만)
243
+
244
+ #### d. Phase 1 컴포넌트 template 리팩토링
245
+
76
246
  ```
247
+ vibe-figma-convert 스킬 참조.
77
248
 
78
- ### 피처명 결정
249
+ Phase 1에서 만든 컴포넌트의 template을 참조 코드 기반으로 리팩토링.
250
+ script(JSDoc 주석, 인터페이스, 목 데이터, 핸들러)는 보존.
79
251
 
80
- Figma 파일명에서 피처명 자동 추출 → kebab-case 변환.
252
+ template 변경 사항:
253
+ - 참조 코드의 HTML 구조를 프로젝트 스택으로 변환
254
+ - 이미지 경로를 다운로드된 로컬 경로로 설정
255
+ - 배경 이미지 섹션은 Multi-Layer 구조 (.{section}Bg + .{section}Content)
256
+ - 클래스명을 외부 스타일 파일의 셀렉터와 매칭
257
+ - Phase 1의 기능 요소(v-for, @click, v-if)를 새 구조에 재배치
81
258
 
259
+ 컴포넌트에 <style> 블록 없음. 스타일은 전부 외부 파일.
82
260
  ```
83
- 예: "Winter Sale Campaign" → winter-sale
84
- 예: "Dashboard Redesign v2" → dashboard-redesign
261
+
262
+ #### e. 섹션 검증
263
+
85
264
  ```
265
+ Grep으로 확인:
266
+ □ "figma.com/api" in 생성 파일 → 0건
267
+ □ "<style" in 컴포넌트 파일 → 0건
268
+ □ "placeholder" in 컴포넌트 파일 → 0건
269
+ □ 'src=""' in 컴포넌트 파일 → 0건
86
270
 
87
- ### 파일 구조 생성
271
+ Read로 확인:
272
+ □ 컴포넌트 template에 실제 HTML 태그 존재 (빈 template 아님)
273
+ □ 외부 스타일 파일에 font-size, color, background-image 존재
88
274
 
89
- 디렉토리는 **vibe-figma-rules R-2.2** 감지 결과에 따라 결정.
275
+ Glob로 확인:
276
+ □ 이미지 파일 존재 (public/images/{feature}/*.webp)
90
277
 
91
- **생성 예시 (Nuxt):**
278
+ 실패 → 해당 항목 수정 → 재검증
92
279
  ```
93
- pages/{feature-name}.vue ← 루트 페이지 (빈 shell)
94
- components/{feature-name}/ ← 컴포넌트 디렉토리 (빈 폴더)
95
- assets/scss/_{feature-name}-tokens.scss ← 스토리보드 기반 초기 토큰
280
+
281
+ ### 2-3. 번째 URL부터: 반응형 레이어 추가
282
+
96
283
  ```
284
+ 두 번째 이후 URL 처리 시, 이미 스타일이 존재하므로:
285
+ 기존 스타일은 유지하고 반응형만 추가.
97
286
 
98
- **생성 예시 (Next.js):**
287
+ 같은 → 유지
288
+ 다른 px 값 → clamp() 또는 @media 오버라이드
289
+ 다른 레이아웃 → @media (min-width: $breakpoint) 추가
290
+ 다른 배경 이미지 → @media 이미지 분기
291
+ 기존 코드/스타일 삭제 금지
99
292
  ```
100
- app/{feature-name}/page.tsx ← 루트 페이지 (빈 shell)
101
- components/{feature-name}/ ← 컴포넌트 디렉토리 (빈 폴더)
102
- styles/{feature-name}-tokens.css ← 스토리보드 기반 초기 토큰
293
+
294
+ ---
295
+
296
+ ## Phase 3: Verification
297
+
103
298
  ```
299
+ 자동 Grep 체크:
300
+ □ Grep: "figma.com/api" in 모든 생성 파일 → 0건
301
+ □ Grep: "<style" in components/{feature}/ → 0건
302
+ □ Grep: 'style="' in components/{feature}/ → 0건
303
+ □ Grep: "placeholder" in components/{feature}/ → 0건
304
+ □ Grep: 'src=""' in components/{feature}/ → 0건
305
+ □ Glob: images/{feature}/*.webp → 이미지 파일 존재
104
306
 
105
- Step A 완료 후 → Step B (vibe-figma-frame) 로 진행.
307
+ 시각 검증:
308
+ 각 섹션에 대해:
309
+ get_screenshot(섹션 nodeId) → 원본
310
+ /vibe.utils --preview 또는 dev 서버 → 생성 결과
311
+ → 비교, P1/P2 분류
312
+
313
+ P1 (필수 수정): 이미지 누락, 레이아웃 구조 다름, 텍스트 스타일 미적용
314
+ P2 (권장 수정): 미세 간격 차이, 미세 색상 차이
315
+
316
+ P1 → 수정 → 재검증 (P1=0 될 때까지, 제한 없음)
317
+
318
+ 완료 후:
319
+ Design Quality Pipeline 안내:
320
+ /design-normalize → /design-audit (quick)
321
+ + /design-critique → /design-polish (thorough)
322
+ ```
@@ -1,233 +1,10 @@
1
1
  ---
2
2
  name: vibe-figma-analyze
3
- tier: standard
4
- description: "스토리보드 세밀 분석 → 실제 레이아웃 코드 + 기능 주석 + 컴포넌트 구조 생성. Step A에서 vibe-figma 이후 실행."
3
+ description: "[Merged] → vibe-figma (Phase 1: Storyboard) 참조"
5
4
  triggers: []
5
+ tier: standard
6
6
  ---
7
7
 
8
- # Storyboard Deep Analysis & Layout Generation
9
-
10
- 스토리보드 URL 하나로 **실제 동작하는 레이아웃 코드**를 생성.
11
- 빈 shell이 아니라, 스토리보드에서 파악 가능한 모든 정보를 코드에 반영.
12
-
13
- > **실행 지시: 이 스킬은 분석만 하는 게 아님. 반드시 Write 도구로 파일을 생성해야 함.**
14
- > A-1~A-4에서 분석 → A-5에서 **Write 도구로 실제 파일 생성** → A-6에서 인터랙션 테이블 출력.
15
-
16
- ## 입력
17
-
18
- - 스토리보드 URL의 get_metadata 결과 (전체 프레임 목록)
19
- - storyboardSpec (브레이크포인트 등, vibe-figma에서 추출)
20
-
21
- ## A-1. 프레임 전수 조사
22
-
23
- get_metadata에서 얻은 **모든 최상위 프레임**을 분류:
24
-
25
- ```
26
- SKIP — "개요", "Cover", "변경 이력" (문서 관리용)
27
- SPEC — "기능 정의", "정책" → 기능 스펙 텍스트 추출 대상
28
- CONFIG — "해상도", "Media Query", "브라우저" → 설정값 추출
29
- SHARED — "공통", "GNB", "Footer", "Popup", "Dialog" → 공통 컴포넌트
30
- FLOW — "Event Flow", "플로우" → 유저 플로우 파악
31
- ASSET — "OG", "배너", "어셋" → 스킵 (메타 이미지)
32
- PAGE — "메인", "화면설계" 하위 → 핵심 섹션 (코드 생성 대상)
33
-
34
- 서브 프레임 (3.x.1, 3.x.2 등):
35
- → 해당 PAGE 섹션의 상태 변형 / 인터랙션 결과 화면
36
- ```
37
-
38
- ## A-2. SPEC 프레임 세밀 분석
39
-
40
- **기능 정의서 프레임**에 대해 get_design_context 호출:
41
-
42
- ```
43
- 추출 대상:
44
- - Overview: 개요, 대상, 일정
45
- - Spec: 각 섹션별 기능 정의 (로직, 조건, 보상 구조)
46
- - 일정: 시작/종료 시간, 단계별 기간
47
-
48
- 추출한 텍스트를 섹션별로 분리:
49
- {
50
- "overview": "...",
51
- "sections": {
52
- "hero": "키 비주얼 영역, CTA 버튼...",
53
- "featureA": "섹션 A 기능 설명...",
54
- "featureB": "섹션 B 기능 설명..."
55
- }
56
- }
57
-
58
- → A-5에서 각 컴포넌트의 기능 주석이 됨
59
- ```
60
-
61
- ## A-3. SHARED 프레임 분석
62
-
63
- 공통 요소 프레임들의 get_screenshot으로 구조 파악:
64
-
65
- ```
66
- GNB: 네비게이션 구조, 메뉴 항목, 로그인 버튼
67
- Footer: 링크, 법적 고지
68
- Popup: 패턴 분류 (확인/취소, 상세 모달, 알림, 입력 폼)
69
-
70
- → 프로젝트에 이미 있는 컴포넌트 확인 (Glob으로 탐색)
71
- → 있으면 import 재사용, 없으면 새로 생성
72
- ```
73
-
74
- ## A-4. PAGE 프레임 세밀 분석
75
-
76
- > **모든 PAGE 프레임을 빠짐없이 분석한다. 일부만 처리하고 넘어가면 안 됨.**
77
- > A-1에서 PAGE로 분류된 프레임 수 = A-5에서 생성하는 섹션 컴포넌트 수.
78
-
79
- **각 PAGE 프레임**에 대해 get_screenshot + get_design_context:
80
-
81
- ```
82
- 각 프레임에서 추출:
83
-
84
- 1. 레이아웃 구조 (get_screenshot 비주얼 분석):
85
- - 섹션 경계 (배경 변화 지점)
86
- - 요소 배치 방향 (vertical stack / grid / positioned)
87
- - 이미지 배경 영역 vs 콘텐츠 영역
88
-
89
- 2. 인터랙션 스펙 (우측 주석):
90
- - 번호 태그 (①②③) → 인터랙션 ID
91
- - 동작 설명 → 이벤트 타입 + 결과
92
- - 조건 분기 (로그인 여부, 기간 내/외 등)
93
-
94
- 3. 상태 변형 (서브 프레임):
95
- - 기본 → 클릭 후 → 성공 → 에러 등
96
- - 팝업 트리거 조건
97
-
98
- 결과를 섹션별로 저장:
99
- sections[sectionName] = {
100
- layout: "vertical-stack, bg-image + overlay + content",
101
- children: ["Title", "Description", "Grid", "CTAButton"],
102
- interactions: [
103
- { id: "①", trigger: "클릭", action: "처리", result: "결과 표시" }
104
- ],
105
- states: ["default", "active", "completed"],
106
- popups: ["ConfirmDialog"]
107
- }
108
- ```
109
-
110
- ## A-5. 파일 생성 (Write 도구 사용 — 필수)
111
-
112
- > **Write 도구로 아래 파일들을 실제로 생성한다. 코드를 보여주기만 하면 안 됨.**
113
-
114
- 디렉토리는 **vibe-figma-rules R-2.2** 감지 결과에 따라 결정.
115
-
116
- ### 생성할 파일 목록
117
-
118
- ```
119
- 필수 생성 (Write 도구):
120
- 1. pages/{feature-name}.{vue|tsx} ← 루트 페이지
121
- 2. components/{feature-name}/각섹션.{vue|tsx} ← 섹션별 컴포넌트
122
- 3. components/{feature-name}/popups/각팝업 ← 팝업 컴포넌트
123
- 4. styles/{feature-name}/index.scss ← 스타일 진입점 (빈 import 목록)
124
- 5. styles/{feature-name}/_tokens.scss ← 빈 토큰 파일 (Step B에서 채움)
125
- ```
126
-
127
- ### 루트 페이지 구조
128
-
129
- ```
130
- - 모든 섹션 컴포넌트 import
131
- - 팝업 조건부 렌더링 (v-if/&&)
132
- - 개요 JSDoc 주석 (A-2에서 추출한 overview)
133
- ```
134
-
135
- ### 섹션 컴포넌트 필수 포함 사항
136
-
137
- ```
138
- 각 섹션 컴포넌트에 반드시 포함:
139
-
140
- 1. JSDoc 주석:
141
- - [기능 정의] — A-2에서 추출한 기능 설명
142
- - [인터랙션] — ①②③ 번호 + 동작 설명
143
- - [상태] — 해당 섹션의 상태 목록
144
-
145
- 2. TypeScript 인터페이스:
146
- - 섹션에서 사용하는 데이터 구조 정의
147
-
148
- 3. 이벤트 핸들러:
149
- - 인터랙션 스펙에 맞는 함수 (body는 // TODO:)
150
-
151
- 4. 목 데이터 (빈 배열 금지):
152
- - 기능 정의서에서 추출한 아이템/보상/상품 정보로 채움
153
- - 빈 배열 = UI가 안 보임 = Step A 미완성
154
- ```
155
-
156
- ### 스타일 분리 규칙
157
-
158
- ```
159
- 컴포넌트 파일에 <style> 블록을 작성하지 않는다.
160
- 스타일은 Step B에서 외부 파일로 생성.
161
- 컴포넌트는 template + script 만 포함.
162
- ```
163
-
164
- ### 핵심 원칙: 스타일 없이 동작하는 코드
165
-
166
- ```
167
- ✅ 클릭/탭/아코디언 등 인터랙션이 실제로 동작
168
- ✅ 모달/팝업 open/close가 연결됨
169
- ✅ 리스트 렌더링이 목 데이터로 동작
170
- ✅ 조건부 렌더링이 상태에 따라 전환
171
- ✅ emit으로 부모-자식 이벤트 연결
172
- → 브라우저에서 열면 스타일은 없지만 인터랙션은 동작하는 상태
173
-
174
- Step A에서는 이미지 자리에 빈 영역이 있을 수 있다.
175
- → Step B에서 반드시 실제 이미지로 교체해야 함.
176
- → Step B 완료 후 "placeholder", "Key Visual Image", 빈 dashed box가
177
- 코드에 남아있으면 = 미완성 (vibe-figma-frame HARD RULES 참조)
178
- ```
179
-
180
- ## A-6. 인터랙션 매핑 테이블
181
-
182
- 코드 생성 후, 전체 인터랙션을 테이블로 출력:
183
-
184
- ```markdown
185
- | 섹션 | ID | 트리거 | 동작 | 컴포넌트 | 함수 |
186
- |------|-----|--------|------|---------|------|
187
- | Hero | ① | 클릭 | 공유하기 팝업 | HeroSection | handleShare() |
188
- | 섹션A | ① | 클릭 | API 호출 | FeatureASection | handleAction() |
189
-
190
- → Step B/C에서 이 함수들의 body를 구현
191
- ```
192
-
193
- ## A-7. Step A 검증
194
-
195
- > **아래 검증을 도구로 실제 실행해야 함.**
196
-
197
- ### 검증 항목
198
-
199
- ```
200
- 1. 파일 존재 확인 (Glob 도구):
201
- □ 루트 페이지 파일 존재
202
- □ PAGE 프레임 수 = 컴포넌트 파일 수
203
- □ styles 디렉토리 존재
204
- □ 팝업 컴포넌트 존재 (스토리보드에 팝업이 있었으면)
205
- → 누락 시 Write로 생성
206
-
207
- 2. 기능 주석 확인 (Read 도구):
208
- □ 모든 컴포넌트에 [기능 정의] + [인터랙션] + [상태] JSDoc
209
- → 누락 시 Edit으로 추가
210
-
211
- 3. 목 데이터 확인 (Grep 도구):
212
- □ 빈 배열 (ref([]) 패턴) 검색 → 0건
213
- → 발견 시 목 데이터 채움
214
-
215
- 4. 스타일 분리 확인 (Grep 도구):
216
- □ 컴포넌트 내 <style> 블록 0건
217
- → 발견 시 제거
218
-
219
- 5. 빌드 확인 (Bash 도구):
220
- □ npm run build 성공
221
- → 에러 시 수정 후 재빌드
222
- ```
223
-
224
- ### 완료 조건
8
+ # vibe-figma-analyze
225
9
 
226
- ```
227
- ✅ 파일 수 = PAGE 프레임 수
228
- ✅ 모든 JSDoc 주석 완비
229
- ✅ 빈 배열 0개
230
- ✅ <style> 블록 0개
231
- ✅ 빌드 성공
232
- → Step B 진행 가능
233
- ```
10
+ 이 스킬은 **vibe-figma** (Phase 1: Storyboard)으로 병합되었습니다.