@su-record/vibe 2.8.38 → 2.8.39

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.38",
3
+ "version": "2.8.39",
4
4
  "description": "AI Coding Framework for Claude Code — 56 agents, 45 skills, multi-LLM orchestration",
5
5
  "type": "module",
6
6
  "main": "dist/cli/index.js",
@@ -202,86 +202,56 @@ URL에서 fileKey, nodeId 추출
202
202
  → 또는 depth 높여서 하위 분할 조회
203
203
  ```
204
204
 
205
- ### 1-2. 레이아웃 + 컴포넌트 구성 (코드 생성)
206
-
207
- ```
208
- 스토리보드에서 파악한 섹션 구조로 실제 파일을 생성한다.
209
-
210
- 1. 루트 페이지 파일 생성 (Write):
211
- pages/{feature}.vue (또는 app/{feature}/page.tsx)
212
- 모든 섹션 컴포넌트 import + 순서대로 배치
213
- → 팝업/모달 조건부 렌더링
214
-
215
- 2. 섹션 컴포넌트 파일 생성 (Write):
216
- components/{feature}/HeroSection.vue
217
- components/{feature}/DailyCheckInSection.vue
218
- components/{feature}/PlayTimeMissionSection.vue
219
- ...PAGE 프레임 수만큼
220
-
221
- 컴포넌트에 반드시 포함:
222
-
223
- <template>:
224
- - 섹션 제목 <h2> (스토리보드에서 추출한 실제 텍스트)
225
- - 설명 텍스트 <p>
226
- - 리스트 렌더링 (v-for + 데이터)
227
- - 버튼/CTA (실제 라벨 + @click 핸들러)
228
- - 조건부 렌더링 (상태에 따른 v-if)
229
- 빈 template 금지. 브라우저에서 텍스트가 보여야 함.
230
-
231
- <script setup>:
232
- - JSDoc 주석으로 기능 요구사항 작성:
233
- /**
234
- * 일일 출석 미션 섹션
235
- *
236
- * [기능 정의]
237
- * - 매일 출석 스노우 토큰 즉시 지급
238
- * - 누적 3/5/7일 달성 시 추가 보상
239
- *
240
- * [인터랙션]
241
- * 출석하기 클릭 API호출 토큰지급 표시
242
- * ② 누적 보상 클릭 → 보상 수령
243
- *
244
- * [상태] default, checked, reward-claimed
245
- */
246
- - TypeScript 인터페이스
247
- - 목 데이터 (빈 배열 금지, 3~7개 아이템)
248
- - 목 데이터의 image 필드: 실제 다운로드할 이미지 경로 사용 금지
249
- → Phase 1에서는 이미지 경로를 '' (빈 문자열) 또는 placeholder 텍스트로 설정
250
- → Phase 2에서 실제 이미지 다운로드 후 경로를 업데이트
251
- → ❌ '/images/{feature}/token-100.png' (존재하지 않는 파일 참조 금지)
252
- - 이벤트 핸들러 stub (body는 // TODO:)
253
-
254
- ❌ <client-only> 래핑 금지 — SSR hydration 실패 위험
255
- (<client-only>는 window/document 직접 접근하는 컴포넌트에만 사용)
256
- <style> 블록 없음 — 스타일은 Phase 3에서 외부 파일로.
257
-
258
- 3. 공통 컴포넌트 (SHARED에서 파악):
259
- → 프로젝트에 이미 있으면 import 재사용
260
- → 없으면 새로 생성 (GNB, Footer, Popup)
261
-
262
- 4. 스타일 디렉토리 구조 생성 (빈 파일):
263
- styles/{feature}/index.scss
264
- styles/{feature}/_tokens.scss
265
- styles/{feature}/_mixins.scss
266
- styles/{feature}/_base.scss
267
- styles/{feature}/layout/
268
- styles/{feature}/components/
205
+ ### 1-2. 기능 스펙 문서 작성 (파일 생성 없음)
206
+
207
+ ```
208
+ Phase 1에서 코드 파일을 생성하지 않는다.
209
+ → Phase 1 HTML 구조와 Phase 3 트리 매핑이 충돌하면 이중 작업
210
+ → Phase 3에서 tree.json 기반으로 코드를 생성
211
+
212
+ Phase 1의 출력물은 기능 스펙 문서 (텍스트):
213
+
214
+ 1. 섹션 목록:
215
+ | # | 섹션 이름 | Figma 프레임 name | 높이 | 설명 |
216
+ |---|----------|------------------|------|------|
217
+ | 1 | Hero | Hero | 1280px | 키비주얼 + 이벤트 정보 |
218
+ | 2 | DailyCheckIn | Daily | 3604px | 출석 미션 |
219
+ | 3 | PlayTime | Frame 633371 | 11363px | 플레이타임 미션 |
220
+
221
+ 2. 섹션의 기능 정의:
222
+ /**
223
+ * 일일 출석 미션 섹션
224
+ *
225
+ * [기능 정의]
226
+ * - 매일 출석 스노우 토큰 즉시 지급
227
+ * - 누적 3/5/7일 달성 추가 보상
228
+ *
229
+ * [인터랙션]
230
+ * ① 출석하기 클릭 → API호출 → 토큰지급 표시
231
+ * ② 누적 보상 클릭 → 보상 수령
232
+ *
233
+ * [상태] default, checked, reward-claimed
234
+ */
235
+
236
+ 3. 공통 컴포넌트 목록:
237
+ 프로젝트에 이미 있는 컴포넌트 (GNB, Footer 등)
238
+ 새로 만들 공통 컴포넌트
239
+
240
+ 4. TypeScript 인터페이스 초안:
241
+ interface RewardItem { id: string; name: string; tokenAmount: number; status: 'locked'|'available'|'claimed' }
269
242
  ```
270
243
 
271
244
  ### 1-3. 검증
272
245
 
273
246
  ```
274
247
  Phase 1 완료 조건:
275
- 브라우저에서 열면 섹션의 텍스트/리스트/버튼이 보인다
276
- 클릭하면 핸들러가 실행된다
277
- 모든 컴포넌트에 [기능 정의] + [인터랙션] + [상태] JSDoc
278
- 배열 0개, 빈 template 0개, <style> 블록 0개
279
- <client-only> 전체 래핑 0개
280
- □ 목 데이터의 image 필드에 존재하지 않는 파일 경로 0개
281
- 빌드 성공
282
-
283
- 빈 화면 = Phase 1 미완성. Phase 2로 넘어가지 않는다.
284
- 스타일/이미지는 없어도 됨 — Phase 3에서 채움.
248
+ 모든 섹션이 목록에 포함되어 있다
249
+ 섹션에 [기능 정의] + [인터랙션] + [상태] 가 정의되어 있다
250
+ TypeScript 인터페이스 초안이 작성되어 있다
251
+ 공통 컴포넌트가 식별되어 있다
252
+ 파일을 하나도 생성하지 않았다
253
+
254
+ Phase 3에서 이 스펙 + tree.json을 합쳐서 코드를 생성한다.
285
255
  ```
286
256
 
287
257
  ---
@@ -84,36 +84,80 @@ Bash:
84
84
 
85
85
  ---
86
86
 
87
- ## 2. 이미지 에셋
87
+ ## 2. 이미지 에셋 — 노드 렌더링 기반 (imageRef 개별 다운로드 금지)
88
88
 
89
- ### 2-1. Fill 이미지 다운로드
89
+ ```
90
+ ❌ imageRef 개별 다운로드 금지
91
+ → 텍스처 fill을 공유하는 경우 원본 텍스처(22.7MB)가 다운됨
92
+ → 노드 렌더링하면 해당 노드에 적용된 최종 결과물(364KB)이 나옴
90
93
 
94
+ ✅ 모든 이미지는 Figma screenshot API로 노드 렌더링
91
95
  ```
92
- 트리에서 imageRef 수집 → Figma API로 다운로드:
93
96
 
94
- Bash:
95
- node "[FIGMA_SCRIPT]" images {fileKey} {nodeId} --out=/tmp/{feature}/images/ --depth=10
97
+ ### 2-1. BG 프레임 렌더링 (섹션 배경)
98
+
99
+ ```
100
+ 각 섹션의 BG 프레임을 식별 → 합성된 배경 1장으로 렌더링:
101
+
102
+ BG 프레임 판별 기준:
103
+ - name에 "BG", "bg" 포함
104
+ - 또는 부모와 크기 동일(±10%) + 자식 이미지 3개 이상
105
+ - 또는 1depth 첫 번째 자식이면서 이미지 노드 다수 보유
96
106
 
97
- 반환: { total: N, images: { "imageRef": "/path/to/file.png", ... } }
107
+ 렌더링:
108
+ node "[FIGMA_SCRIPT]" screenshot {fileKey} {bg.nodeId} --out=/tmp/{feature}/bg/{section}-bg.png
98
109
 
99
- 검증: total = refs.size (누락 0), 0byte 파일 없음
110
+ BG 하위 20+ 레이어가 합성된 1장
111
+ → CSS background-image로 처리
112
+ → 개별 레이어(눈, 나무, 파티클 등) 다운로드하지 않음
100
113
  ```
101
114
 
102
- ### 2-2. 아이템/아이콘 노드 렌더링
115
+ ### 2-2. 콘텐츠 노드 렌더링
103
116
 
104
117
  ```
105
- fill 이미지가 없지만 시각적으로 의미 있는 노드를 PNG로 렌더링:
118
+ BG가 아닌 콘텐츠 이미지를 개별 노드 렌더링:
106
119
 
107
120
  대상 식별 (tree.json에서):
108
- - INSTANCE/COMPONENT 타입 크기 50~300px
109
- - name에 "item", "icon", "reward", "token", "coin", "badge" 포함
110
- - VECTOR/GROUP 크기 ≤ 64px (아이콘 후보)
121
+ - 타이틀/서브타이틀 이미지 (name에 "title", "sub title")
122
+ - 버튼 이미지 (name에 "btn", "button")
123
+ - 아이콘 (VECTOR/GROUP 크기 ≤ 64px)
124
+ - 아이템/보상 이미지 (name에 "item", "reward", "token", "coin")
125
+
126
+ 렌더링 (imageRef 다운로드 아님!):
127
+ node "[FIGMA_SCRIPT]" screenshot {fileKey} {node.nodeId} --out=/tmp/{feature}/content/{name}.png
128
+
129
+ → 텍스처 fill이 적용된 최종 결과물이 나옴
130
+ → 22.7MB 텍스처 대신 364KB 렌더링 이미지
131
+ ```
132
+
133
+ ### 2-3. 벡터 글자 그룹 렌더링
134
+
135
+ ```
136
+ 커스텀 폰트 텍스트가 글자별 벡터로 분리된 경우:
137
+
138
+ 판별:
139
+ - 부모 GROUP/FRAME 아래 VECTOR 타입 3개 이상
140
+ - 각 VECTOR 크기 < 60x60
141
+ - 같은 imageRef를 공유 (텍스처 fill)
111
142
 
112
143
  렌더링:
113
- node "[FIGMA_SCRIPT]" images {fileKey} {nodeId} --render --nodeIds={id1},{id2},... --out=/tmp/{feature}/images/
144
+ 부모 GROUP을 통째로 렌더링 (개별 글자 다운로드 금지)
145
+ node "[FIGMA_SCRIPT]" screenshot {fileKey} {group.nodeId} --out=/tmp/{feature}/content/{name}.png
114
146
 
115
- → 벡터/인스턴스 에셋도 PNG로 확보
116
- Phase 3에서 데이터의 image 경로에 연결 가능
147
+ 예시:
148
+ "MISSION 01" GROUP (174x42, 벡터 9개) 렌더링 1장 (58KB)
149
+ "일일/누적 출석" GROUP (327x51, 벡터 7개) → 렌더링 1장 (93KB)
150
+ ```
151
+
152
+ ### 2-4. imageRef 다운로드를 사용하는 유일한 경우
153
+
154
+ ```
155
+ 노드 렌더링이 불가능한 경우에만 imageRef 다운로드 폴백:
156
+ - Figma screenshot API 실패 (rate limit, 권한 등)
157
+ - 노드가 DOCUMENT 레벨이라 렌더링 불가
158
+
159
+ 이 경우에도 파일 크기 확인:
160
+ - 5MB 초과 → 텍스처 fill 가능성 높음 → 경고 로그
117
161
  ```
118
162
 
119
163
  ---
@@ -144,21 +188,29 @@ fill 이미지가 없지만 시각적으로 의미 있는 노드를 PNG로 렌
144
188
 
145
189
  /tmp/{feature}/
146
190
  ├── tree.json ← 코드 생성의 PRIMARY 소스
147
- ├── images/ 이미지 에셋 (fill + 노드 렌더링)
148
- │ ├── {imageRef}.png ← fill 이미지
149
- │ ├── {nodeId}.png ← 렌더링된 아이템/아이콘
191
+ ├── bg/ BG 프레임 렌더링 (섹션당 1장)
192
+ │ ├── hero-bg.png
193
+ │ ├── daily-bg.png
194
+ │ └── ...
195
+ ├── content/ ← 콘텐츠 노드 렌더링
196
+ │ ├── hero-title.png
197
+ │ ├── hero-subtitle.png
198
+ │ ├── mission-01.png ← 벡터 글자 그룹 렌더링
199
+ │ ├── btn-login.png
150
200
  │ └── ...
151
201
  ├── full-screenshot.png ← Phase 4 검증용
152
202
  └── sections/ ← Phase 4 섹션별 검증용
153
203
  ├── hero.png
154
204
  └── ...
155
205
 
156
- 이미지 목록:
157
- 파일명 | 크기 | 용도 (트리 기반 판별)
158
- {ref}.png | 720×1280 | 배경 (부모와 동일 크기 + z-index 낮음)
159
- {ref}.png | 620×174 | 콘텐츠 이미지 (독립적 크기)
160
- {ref}.png | 48×48 | 아이콘 (≤64px)
161
- {nodeId}.png | 200×200 | 렌더링된 아이템 (INSTANCE)
206
+ 이미지 분류 (실제 테스트 기준):
207
+ | 분류 | 처리 | 예시 |
208
+ |------|------|------|
209
+ | BG 프레임 (89개) | 프레임 렌더링 → bg/ | hero-bg.png (4.2MB) |
210
+ | 벡터 글자 (33개) | GROUP 렌더링 → content/ | mission-01.png (58KB) |
211
+ | 콘텐츠 (8개) | 노드 렌더링 → content/ | hero-title.png (364KB) |
212
+ | 장식 (29개) | BG 렌더링에 포함 | — |
213
+ → 전체 159개 → 실제 파일 약 18장
162
214
 
163
215
  색상 팔레트 (tree.json의 backgroundColor/color 고유값):
164
216
  #0a1628, #00264a, #ffffff, ...