@su-record/vibe 2.8.15 → 2.8.17
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
|
@@ -79,6 +79,10 @@ Error: 에러 페이지 구조
|
|
|
79
79
|
|
|
80
80
|
## Phase 4: PAGE 프레임 세밀 분석 (화면설계)
|
|
81
81
|
|
|
82
|
+
> **⛔ 모든 PAGE 프레임을 빠짐없이 분석한다. 일부만 처리하고 넘어가면 안 됨.**
|
|
83
|
+
> Phase 1에서 PAGE로 분류된 프레임 수 = Phase 5에서 생성하는 섹션 컴포넌트 수.
|
|
84
|
+
> 분석 완료 후 "PAGE 프레임 N개 중 N개 분석 완료" 카운트를 출력하여 누락 확인.
|
|
85
|
+
|
|
82
86
|
**각 PAGE 프레임**에 대해 get_screenshot + get_design_context:
|
|
83
87
|
|
|
84
88
|
```
|
|
@@ -254,12 +258,21 @@ function handleClaimReward(milestone: Milestone): void {
|
|
|
254
258
|
}
|
|
255
259
|
</script>
|
|
256
260
|
|
|
257
|
-
<style
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
261
|
+
<!-- ⛔ <style> 블록을 컴포넌트에 넣지 않는다 -->
|
|
262
|
+
<!-- 스타일은 외부 파일에서 관리: styles/{feature}/layout/, components/ -->
|
|
263
|
+
</script>
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### ⛔ 스타일 분리 규칙
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
Step A에서 컴포넌트 파일에 <style> 블록을 작성하지 않는다.
|
|
270
|
+
스타일은 Step B에서 외부 파일로 생성:
|
|
271
|
+
--new 모드: styles/{feature}/layout/_daily-checkin.scss
|
|
272
|
+
기본 모드: 기존 프로젝트 스타일 패턴을 따름
|
|
273
|
+
|
|
274
|
+
컴포넌트는 <template> + <script setup> 만 포함.
|
|
275
|
+
스타일 import는 루트 페이지 또는 nuxt.config에서 처리.
|
|
263
276
|
```
|
|
264
277
|
|
|
265
278
|
### 핵심 원칙: 스타일 없이 동작하는 코드
|
|
@@ -270,9 +283,21 @@ function handleClaimReward(milestone: Milestone): void {
|
|
|
270
283
|
✅ 상태 변경 (체크, 선택, 비활성화)이 반영됨
|
|
271
284
|
✅ 모달/팝업 open/close가 v-if/ref로 연결됨
|
|
272
285
|
✅ emit으로 부모-자식 이벤트가 실제 연결됨
|
|
273
|
-
✅ 리스트 렌더링 (v-for)이 더미 데이터로 동작
|
|
286
|
+
✅ 리스트 렌더링 (v-for)이 더미 데이터로 동작 — ⚠️ 빈 배열 금지, 반드시 목 데이터 채움
|
|
274
287
|
✅ 조건부 렌더링 (v-if)이 상태에 따라 전환됨
|
|
275
288
|
|
|
289
|
+
⚠️ 목 데이터 필수:
|
|
290
|
+
스토리보드 기능 정의서에서 아이템/보상/상품 정보를 추출하여 목 데이터로 사용.
|
|
291
|
+
빈 배열 = UI가 안 보임 = Step A 미완성.
|
|
292
|
+
예:
|
|
293
|
+
exchangeItems = [
|
|
294
|
+
{ id: 1, name: '스노우 토큰 100', cost: 100, image: '' },
|
|
295
|
+
{ id: 2, name: '스노우 토큰 500', cost: 500, image: '' },
|
|
296
|
+
]
|
|
297
|
+
raffleItems = [
|
|
298
|
+
{ id: 1, name: '1주차 경품', prize: 'PlayStation 5', entries: 0 },
|
|
299
|
+
]
|
|
300
|
+
|
|
276
301
|
→ 브라우저에서 열면 스타일은 없지만 클릭/인터랙션은 동작하는 상태
|
|
277
302
|
|
|
278
303
|
✅ 기능 정의서 내용 → 컴포넌트 JSDoc 주석
|
|
@@ -330,6 +355,92 @@ function handleConfirm(): void {
|
|
|
330
355
|
→ Step B/C에서 코드 생성 시 이 함수들의 body를 구현
|
|
331
356
|
```
|
|
332
357
|
|
|
358
|
+
## Phase 7: Step A 검증 루프
|
|
359
|
+
|
|
360
|
+
> **⛔ 아래 검증을 실제로 실행해야 함. 체크리스트를 머리속으로 확인하지 말고 도구로 확인.**
|
|
361
|
+
|
|
362
|
+
### 7-1. 파일 존재 확인 (Glob 도구)
|
|
363
|
+
|
|
364
|
+
```
|
|
365
|
+
Glob으로 생성된 파일 목록 확인:
|
|
366
|
+
Glob: pages/{feature}*.vue
|
|
367
|
+
Glob: components/{feature}/**/*.vue
|
|
368
|
+
Glob: styles/{feature}/**/*.scss
|
|
369
|
+
|
|
370
|
+
확인:
|
|
371
|
+
□ 루트 페이지 파일 존재
|
|
372
|
+
□ PAGE 프레임 수 = 컴포넌트 .vue 파일 수 (카운트 비교)
|
|
373
|
+
□ styles/{feature}/ 디렉토리 존재
|
|
374
|
+
□ 팝업 컴포넌트 존재 (스토리보드에 팝업이 있었으면)
|
|
375
|
+
|
|
376
|
+
누락 시 → Write로 생성
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### 7-2. 기능 주석 확인 (각 파일 Read 도구로 실제 열기)
|
|
380
|
+
|
|
381
|
+
```
|
|
382
|
+
⛔ 모든 섹션 컴포넌트 파일을 Read로 열어서 아래를 확인:
|
|
383
|
+
|
|
384
|
+
각 파일에서 체크:
|
|
385
|
+
□ JSDoc 주석 블록 존재 (/** ... */)
|
|
386
|
+
□ [기능 정의] 섹션 있음 — 스토리보드 기능 정의서에서 추출한 내용
|
|
387
|
+
□ [인터랙션] 섹션 있음 — ①②③ 번호 + 동작 설명
|
|
388
|
+
□ [상태] 섹션 있음 — 해당 섹션의 상태 목록
|
|
389
|
+
|
|
390
|
+
실제 확인 예시:
|
|
391
|
+
Read: components/{feature}/DailyCheckInSection.vue
|
|
392
|
+
→ /** 블록 검색
|
|
393
|
+
→ "[기능 정의]" 텍스트 존재 확인
|
|
394
|
+
→ "[인터랙션]" 텍스트 존재 확인
|
|
395
|
+
→ "handleCheckIn" 함수 존재 확인
|
|
396
|
+
|
|
397
|
+
하나라도 누락 → Edit으로 추가 → 다시 Read로 재확인
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### 7-3. 목 데이터 확인 (Grep 도구)
|
|
401
|
+
|
|
402
|
+
```
|
|
403
|
+
Grep으로 빈 배열 검색:
|
|
404
|
+
Grep: "ref<.*>\(\[\]\)" 또는 "ref\(\[\]\)" in components/{feature}/
|
|
405
|
+
|
|
406
|
+
빈 배열 발견 시:
|
|
407
|
+
→ 스토리보드 기능 정의서에서 해당 데이터 추출
|
|
408
|
+
→ Edit으로 목 데이터 채움
|
|
409
|
+
→ 다시 Grep으로 재확인
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### 7-4. 스타일 분리 확인 (Grep 도구)
|
|
413
|
+
|
|
414
|
+
```
|
|
415
|
+
컴포넌트에 <style> 블록이 없는지 확인:
|
|
416
|
+
Grep: "<style" in components/{feature}/**/*.vue
|
|
417
|
+
|
|
418
|
+
<style> 발견 시:
|
|
419
|
+
→ Edit으로 제거
|
|
420
|
+
→ 해당 스타일을 styles/{feature}/ 외부 파일로 이동
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### 7-5. 빌드 확인 (Bash 도구)
|
|
424
|
+
|
|
425
|
+
```
|
|
426
|
+
Bash: npm run build (또는 nuxt build, next build)
|
|
427
|
+
→ 에러 있으면 수정 → 재빌드
|
|
428
|
+
→ 성공해야 Step B 진행
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### 검증 완료 조건
|
|
432
|
+
|
|
433
|
+
```
|
|
434
|
+
✅ 파일 수 = PAGE 프레임 수
|
|
435
|
+
✅ 모든 컴포넌트에 [기능 정의] + [인터랙션] + [상태] 주석
|
|
436
|
+
✅ 빈 배열 0개
|
|
437
|
+
✅ 컴포넌트 내 <style> 블록 0개
|
|
438
|
+
✅ 빌드 성공
|
|
439
|
+
→ Step B 진행 가능
|
|
440
|
+
|
|
441
|
+
실패 항목 → 수정 → 재검증 (횟수 제한 없음)
|
|
442
|
+
```
|
|
443
|
+
|
|
333
444
|
## 출력 요약
|
|
334
445
|
|
|
335
446
|
```
|
|
@@ -337,6 +448,9 @@ function handleConfirm(): void {
|
|
|
337
448
|
✅ 각 섹션 컴포넌트 (구조 코드 + 기능 주석 + 이벤트 핸들러 + TypeScript 인터페이스)
|
|
338
449
|
✅ 공통 컴포넌트 (GNB, Footer, Popup — 기존 재사용 또는 신규)
|
|
339
450
|
✅ 인터랙션 매핑 테이블
|
|
340
|
-
✅
|
|
451
|
+
✅ 목 데이터 채워짐 (빈 배열 없음)
|
|
452
|
+
✅ 빌드 성공
|
|
453
|
+
✅ 스타일은 빈 블록 → Step B에서 디자인 URL 받고 채움
|
|
341
454
|
✅ 이미지는 placeholder → Step B에서 다운로드 후 교체
|
|
455
|
+
→ Step B 진행 가능
|
|
342
456
|
```
|
|
@@ -78,32 +78,114 @@ AskUserQuestion (options 사용 금지, 자유 텍스트만):
|
|
|
78
78
|
for each (designFrame, component) in mappings:
|
|
79
79
|
|
|
80
80
|
1. get_design_context(fileKey, designFrame.nodeId)
|
|
81
|
-
→ 해당 섹션 전용
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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 파일 체크 (다운로드 실패)
|
|
87
118
|
|
|
88
119
|
3. 스크린샷 분석 + ⚠️ 스케일 팩터 적용:
|
|
89
120
|
→ 레이아웃 (flex/grid 방향, 정렬)
|
|
90
121
|
→ 색상 (배경, 텍스트, 보더) — 스케일 불필요
|
|
91
122
|
→ 타이포 (크기, 굵기, 줄간격) — ⚠️ 스케일 팩터 적용
|
|
92
123
|
→ 간격 (padding, gap, margin) — ⚠️ 스케일 팩터 적용
|
|
93
|
-
→ 배경 이미지
|
|
124
|
+
→ ⚠️ 배경 이미지 분류 (아래 참조)
|
|
94
125
|
|
|
95
|
-
|
|
126
|
+
스케일 팩터:
|
|
96
127
|
코드 값 = Figma 추출 값 × scaleFactor
|
|
97
|
-
예: Figma font-size 48px × 0.75 (PC) = 36px
|
|
98
|
-
예: Figma padding 60px × 0.667 (Mobile) = 40px
|
|
99
128
|
scaleFactor는 Step A의 storyboardSpec.scaleFactor에서 참조
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
4.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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이 코드에 남으면 안 됨
|
|
107
189
|
```
|
|
108
190
|
|
|
109
191
|
## Phase 4: 뷰포트 모드에 따른 스타일 적용
|