@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.
- package/package.json +1 -1
- package/skills/vibe-figma/SKILL.md +25 -66
- package/skills/vibe-figma-analyze/SKILL.md +91 -319
- package/skills/vibe-figma-codegen/SKILL.md +112 -782
- package/skills/vibe-figma-consolidate/SKILL.md +53 -90
- package/skills/vibe-figma-frame/SKILL.md +142 -181
- package/skills/vibe-figma-pipeline/SKILL.md +4 -45
- package/skills/vibe-figma-rules/SKILL.md +320 -159
- package/skills/vibe-figma-style/SKILL.md +107 -476
|
@@ -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
|
|
8
|
+
# Skill: vibe-figma-consolidate — Step D: 공통화 + 최종 검증
|
|
9
9
|
|
|
10
|
-
>
|
|
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
|
-
| 색상 (
|
|
29
|
-
|
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
/
|
|
132
|
-
|
|
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
|
-
|
|
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로 다운로드 →
|
|
15
|
-
> - 스타일: Write 도구로 SCSS/CSS 파일 생성
|
|
13
|
+
> **실행 지시: 분석만 하지 말 것.**
|
|
14
|
+
> - 이미지: WebFetch로 다운로드 → 파일 저장
|
|
15
|
+
> - 스타일: Write 도구로 SCSS/CSS 파일 생성
|
|
16
16
|
> - 코드: Edit 도구로 Step A 컴포넌트의 template/style 채움
|
|
17
|
-
> - 토큰: Edit 도구로 _tokens
|
|
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
|
-
##
|
|
25
|
+
## B-1. 디자인 URL 입력
|
|
27
26
|
|
|
28
27
|
AskUserQuestion (options 사용 금지, 자유 텍스트만):
|
|
29
28
|
|
|
30
29
|
```
|
|
31
30
|
첫 번째 호출:
|
|
32
|
-
question: "
|
|
33
|
-
→
|
|
34
|
-
→ URL 저장 → Phase 2~5 실행
|
|
31
|
+
question: "디자인 Figma URL을 입력해주세요."
|
|
32
|
+
→ 응답 대기 → URL 저장 → B-2~B-5 실행
|
|
35
33
|
|
|
36
34
|
검증 완료 후:
|
|
37
|
-
question: "
|
|
38
|
-
→
|
|
39
|
-
→
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
210
|
-
- SCSS: figma-fluid($min, $max) 함수 사용
|
|
211
|
-
- CSS: clamp(min, preferred, max)
|
|
191
|
+
## B-5. 검증 루프
|
|
212
192
|
|
|
213
|
-
|
|
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
|
-
|
|
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
|
-
|
|
197
|
+
```
|
|
198
|
+
for each section in mappings:
|
|
223
199
|
|
|
224
|
-
|
|
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
|
-
|
|
207
|
+
### Step B 추가 검증 항목
|
|
228
208
|
|
|
229
209
|
```
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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` —
|
|
260
|
-
- `vibe-figma-style` — 토큰/스타일
|
|
261
|
-
- `vibe-figma-codegen` — 마크업/코드 생성
|
|
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:
|
|
3
|
+
description: "[Merged] → vibe-figma-consolidate D-4 참조"
|
|
4
4
|
triggers: []
|
|
5
5
|
tier: standard
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
#
|
|
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를 참조하세요.
|