binary-agents 1.0.17 → 1.0.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/README.md +3 -3
- package/commands/figma-check.md +292 -0
- package/package.json +1 -1
- package/agents/figma-implementation-checker.md +0 -497
package/README.md
CHANGED
|
@@ -35,7 +35,6 @@ npx binary-agents list
|
|
|
35
35
|
| `junior-checker` | 주니어 개발자 관점 가독성, 네이밍, 복잡도 체크 |
|
|
36
36
|
| `fundamentals-code` | Toss Frontend Fundamentals 기반 (가독성, 예측 가능성, 응집도, 결합도) |
|
|
37
37
|
| `react-performance-optimizer` | React 리렌더, 메모이제이션, 훅 최적화 분석 |
|
|
38
|
-
| `figma-implementation-checker` | Figma 디자인과 구현 코드 비교, 디자인 토큰 검증 |
|
|
39
38
|
| `subagent-builder` | 커스텀 서브에이전트 빌더 |
|
|
40
39
|
|
|
41
40
|
## 슬래시 명령어
|
|
@@ -47,6 +46,7 @@ npx binary-agents list
|
|
|
47
46
|
| `/pr` | 브랜치 변경사항 분석 후 PR 자동 생성 |
|
|
48
47
|
| `/review-pr` | PR 링크를 받아 변경사항 분석 후 GitHub 스타일 라인별 코드 리뷰 |
|
|
49
48
|
| `/code-review` | 여러 에이전트를 병렬 실행하여 종합 코드 리뷰 |
|
|
49
|
+
| `/figma-check` | Figma MCP로 디자인 정보를 가져와 구현 코드와 비교 분석 |
|
|
50
50
|
|
|
51
51
|
### /commit 사용법
|
|
52
52
|
|
|
@@ -129,14 +129,14 @@ binary-agents/
|
|
|
129
129
|
│ ├── junior-checker.md
|
|
130
130
|
│ ├── fundamentals-code.md
|
|
131
131
|
│ ├── react-performance-optimizer.md
|
|
132
|
-
│ ├── figma-implementation-checker.md
|
|
133
132
|
│ └── subagent-builder.md
|
|
134
133
|
├── commands/ # 슬래시 명령어 MD 파일들
|
|
135
134
|
│ ├── commit.md
|
|
136
135
|
│ ├── branch.md
|
|
137
136
|
│ ├── pr.md
|
|
138
137
|
│ ├── review-pr.md
|
|
139
|
-
│
|
|
138
|
+
│ ├── code-review.md
|
|
139
|
+
│ └── figma-check.md
|
|
140
140
|
├── bin/ # CLI 실행 파일
|
|
141
141
|
├── src/ # CLI 소스 코드
|
|
142
142
|
├── docs/ # 문서
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Figma 선택 영역과 IDE 선택 코드를 비교하여 디자인-구현 차이 분석
|
|
3
|
+
allowed-tools: Read, Glob, Grep, mcp__*
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Figma 디자인-구현 비교
|
|
7
|
+
|
|
8
|
+
Figma Desktop에서 선택한 컴포넌트와 IDE에서 선택한 코드를 비교하여 차이점을 분석합니다.
|
|
9
|
+
|
|
10
|
+
## 컨텍스트 정보
|
|
11
|
+
|
|
12
|
+
**Figma node (선택사항 - 없으면 Figma MCP에서 현재 선택 가져오기):**
|
|
13
|
+
!`echo "${1:-}"`
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 작업 순서
|
|
18
|
+
|
|
19
|
+
### 0. 입력 정보 확인
|
|
20
|
+
|
|
21
|
+
**Figma 정보 확인:**
|
|
22
|
+
1. Figma Desktop MCP가 context에 전달한 선택 정보 확인
|
|
23
|
+
2. context에 Figma 정보 없으면 → "Figma Desktop에서 비교할 컴포넌트를 선택한 후 다시 실행해주세요"
|
|
24
|
+
|
|
25
|
+
**코드 정보 확인:**
|
|
26
|
+
1. IDE에서 코드가 선택되어 있으면 (`ide_selection`) 해당 코드 사용
|
|
27
|
+
2. 없으면 → "IDE에서 비교할 코드를 선택한 후 다시 실행해주세요"
|
|
28
|
+
|
|
29
|
+
**둘 다 없으면:**
|
|
30
|
+
```
|
|
31
|
+
⚠️ 비교할 정보가 없습니다.
|
|
32
|
+
|
|
33
|
+
사용법:
|
|
34
|
+
1. Figma Desktop에서 비교할 컴포넌트 선택
|
|
35
|
+
2. IDE에서 비교할 코드 영역 선택
|
|
36
|
+
3. /figma-check 실행
|
|
37
|
+
|
|
38
|
+
또는 직접 지정:
|
|
39
|
+
/figma-check <node-id-or-url>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 1. Figma 정보 파싱
|
|
43
|
+
|
|
44
|
+
Figma Desktop MCP가 context에 전달한 node 정보에서 추출:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
필요한 정보:
|
|
48
|
+
- name, type
|
|
49
|
+
- absoluteBoundingBox (width, height)
|
|
50
|
+
- fills (색상, boundVariables)
|
|
51
|
+
- strokes, effects
|
|
52
|
+
- layoutMode, primaryAxisAlignItems, counterAxisAlignItems
|
|
53
|
+
- padding (Top/Right/Bottom/Left)
|
|
54
|
+
- itemSpacing, cornerRadius
|
|
55
|
+
- style (fontFamily, fontSize, fontWeight, lineHeightPx, letterSpacing)
|
|
56
|
+
- children
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 2. 컴포넌트 파일 찾기
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# 컴포넌트 이름으로 검색
|
|
63
|
+
Glob: **/*{ComponentName}*.{tsx,jsx}
|
|
64
|
+
Glob: **/components/**/*.{tsx,jsx}
|
|
65
|
+
|
|
66
|
+
# 스타일 파일 검색
|
|
67
|
+
Glob: **/*.styles.{ts,js}
|
|
68
|
+
Glob: **/*.styled.{ts,js}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 3. 7가지 기준으로 비교
|
|
72
|
+
|
|
73
|
+
#### 3.1 레이아웃 (Weight: 20%)
|
|
74
|
+
|
|
75
|
+
| Figma | Tailwind | CSS-in-JS |
|
|
76
|
+
|-------|----------|-----------|
|
|
77
|
+
| `layoutMode: "HORIZONTAL"` | `flex-row` | `flexDirection: 'row'` |
|
|
78
|
+
| `layoutMode: "VERTICAL"` | `flex-col` | `flexDirection: 'column'` |
|
|
79
|
+
| `primaryAxisAlignItems: "CENTER"` | `justify-center` | `justifyContent: 'center'` |
|
|
80
|
+
| `counterAxisAlignItems: "CENTER"` | `items-center` | `alignItems: 'center'` |
|
|
81
|
+
|
|
82
|
+
#### 3.2 색상 (Weight: 20%)
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
Figma RGBA (0-1) → CSS RGBA (0-255)
|
|
86
|
+
r: 0.2 → Math.round(0.2 * 255) = 51
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**허용 오차:** ±5 (RGB 값 기준)
|
|
90
|
+
|
|
91
|
+
#### 3.3 타이포그래피 (Weight: 20%)
|
|
92
|
+
|
|
93
|
+
| 속성 | Figma | CSS |
|
|
94
|
+
|------|-------|-----|
|
|
95
|
+
| 크기 | `fontSize` | `font-size` |
|
|
96
|
+
| 굵기 | `fontWeight` | `font-weight` |
|
|
97
|
+
| 행간 | `lineHeightPx` | `line-height` |
|
|
98
|
+
|
|
99
|
+
**허용 오차:** fontSize ±1px, lineHeight ±2px
|
|
100
|
+
|
|
101
|
+
#### 3.4 간격 (Weight: 15%)
|
|
102
|
+
|
|
103
|
+
| Figma | CSS |
|
|
104
|
+
|-------|-----|
|
|
105
|
+
| `paddingTop/Right/Bottom/Left` | `padding` |
|
|
106
|
+
| `itemSpacing` | `gap` |
|
|
107
|
+
|
|
108
|
+
**허용 오차:** ±2px
|
|
109
|
+
|
|
110
|
+
#### 3.5 크기 (Weight: 15%)
|
|
111
|
+
|
|
112
|
+
| Figma | CSS |
|
|
113
|
+
|-------|-----|
|
|
114
|
+
| `absoluteBoundingBox.width` | `width` |
|
|
115
|
+
| `absoluteBoundingBox.height` | `height` |
|
|
116
|
+
| `cornerRadius` | `border-radius` |
|
|
117
|
+
|
|
118
|
+
#### 3.6 컴포넌트 구조 (Weight: 10%)
|
|
119
|
+
|
|
120
|
+
- children 개수와 순서
|
|
121
|
+
- 중첩 구조
|
|
122
|
+
|
|
123
|
+
#### 3.7 디자인 토큰 (추가 검증)
|
|
124
|
+
|
|
125
|
+
Figma Variables (`boundVariables`)와 코드 토큰 비교:
|
|
126
|
+
|
|
127
|
+
| Figma | 코드 | 결과 |
|
|
128
|
+
|-------|------|------|
|
|
129
|
+
| `color/primary` 토큰 | `var(--color-primary)` | ✅ 일치 |
|
|
130
|
+
| `color/primary` 토큰 | `#3366FF` (하드코딩) | 🟡 토큰 미사용 |
|
|
131
|
+
| `color/primary` 토큰 | `var(--color-secondary)` | 🔴 토큰 불일치 |
|
|
132
|
+
|
|
133
|
+
### 4. 심각도 판정
|
|
134
|
+
|
|
135
|
+
- 🔴 **Critical**: 브랜드/UX에 영향, 즉시 수정 필요
|
|
136
|
+
- 🟡 **Warning**: 미세한 차이, 검토 권장
|
|
137
|
+
- 🟢 **Info**: 참고사항, 의도적 차이 가능
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Output Format
|
|
142
|
+
|
|
143
|
+
```markdown
|
|
144
|
+
# Figma Implementation Check Report
|
|
145
|
+
|
|
146
|
+
## 요약
|
|
147
|
+
- **컴포넌트:** [ComponentName]
|
|
148
|
+
- **Figma Node:** [node name/id]
|
|
149
|
+
- **구현 파일:** [file path]
|
|
150
|
+
- **전체 일치도:** X%
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 심각도별 현황
|
|
155
|
+
|
|
156
|
+
| 심각도 | 개수 |
|
|
157
|
+
|--------|------|
|
|
158
|
+
| 🔴 Critical | X |
|
|
159
|
+
| 🟡 Warning | Y |
|
|
160
|
+
| 🟢 Info | Z |
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 🔴 Critical Issues
|
|
165
|
+
|
|
166
|
+
### 1. [카테고리] 불일치
|
|
167
|
+
**위치:** `src/components/Button.tsx:15`
|
|
168
|
+
|
|
169
|
+
| 속성 | Figma | 코드 | 차이 |
|
|
170
|
+
|------|-------|------|------|
|
|
171
|
+
| fontSize | 16px | 14px | -2px |
|
|
172
|
+
|
|
173
|
+
**현재 코드:**
|
|
174
|
+
```tsx
|
|
175
|
+
<button className="text-sm"> // 14px
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**수정 제안:**
|
|
179
|
+
```tsx
|
|
180
|
+
<button className="text-base"> // 16px
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 🟡 Warning Issues
|
|
186
|
+
|
|
187
|
+
[같은 형식...]
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 🟢 Info
|
|
192
|
+
|
|
193
|
+
[같은 형식...]
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 카테고리별 상세
|
|
198
|
+
|
|
199
|
+
### 레이아웃
|
|
200
|
+
| 속성 | Figma | 코드 | 상태 |
|
|
201
|
+
|------|-------|------|------|
|
|
202
|
+
| direction | row | flex-row | ✅ |
|
|
203
|
+
| justify | center | justify-center | ✅ |
|
|
204
|
+
|
|
205
|
+
### 색상
|
|
206
|
+
| 속성 | Figma | 코드 | 상태 |
|
|
207
|
+
|------|-------|------|------|
|
|
208
|
+
| background | #3366FF | bg-blue-500 | 🟡 |
|
|
209
|
+
| text | #FFFFFF | text-white | ✅ |
|
|
210
|
+
|
|
211
|
+
### 타이포그래피
|
|
212
|
+
| 속성 | Figma | 코드 | 상태 |
|
|
213
|
+
|------|-------|------|------|
|
|
214
|
+
| fontSize | 16px | text-base | ✅ |
|
|
215
|
+
| fontWeight | 600 | font-semibold | ✅ |
|
|
216
|
+
|
|
217
|
+
### 간격
|
|
218
|
+
| 속성 | Figma | 코드 | 상태 |
|
|
219
|
+
|------|-------|------|------|
|
|
220
|
+
| paddingX | 24px | px-6 | ✅ |
|
|
221
|
+
| paddingY | 12px | py-3 | ✅ |
|
|
222
|
+
| gap | 8px | gap-2 | ✅ |
|
|
223
|
+
|
|
224
|
+
### 크기
|
|
225
|
+
| 속성 | Figma | 코드 | 상태 |
|
|
226
|
+
|------|-------|------|------|
|
|
227
|
+
| width | auto | w-auto | ✅ |
|
|
228
|
+
| height | 48px | h-12 | ✅ |
|
|
229
|
+
| borderRadius | 8px | rounded-lg | ✅ |
|
|
230
|
+
|
|
231
|
+
### 디자인 토큰
|
|
232
|
+
| 속성 | Figma 토큰 | 코드 토큰 | 상태 |
|
|
233
|
+
|------|------------|-----------|------|
|
|
234
|
+
| background | `color/primary` | `var(--color-primary)` | ✅ |
|
|
235
|
+
| text | `color/on-primary` | `text-white` | 🟡 하드코딩 |
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Tailwind 값 참조표
|
|
240
|
+
|
|
241
|
+
| Tailwind | px |
|
|
242
|
+
|----------|-----|
|
|
243
|
+
| text-xs | 12px |
|
|
244
|
+
| text-sm | 14px |
|
|
245
|
+
| text-base | 16px |
|
|
246
|
+
| text-lg | 18px |
|
|
247
|
+
| p-1 | 4px |
|
|
248
|
+
| p-2 | 8px |
|
|
249
|
+
| p-3 | 12px |
|
|
250
|
+
| p-4 | 16px |
|
|
251
|
+
| p-6 | 24px |
|
|
252
|
+
| rounded-lg | 8px |
|
|
253
|
+
| rounded-xl | 12px |
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## 권장 조치
|
|
258
|
+
|
|
259
|
+
1. **즉시 수정:** 🔴 Critical 이슈
|
|
260
|
+
2. **검토 필요:** 🟡 Warning 이슈 (디자이너와 확인)
|
|
261
|
+
3. **참고:** 🟢 Info (문서화 또는 무시)
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 사용 예시
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
# 권장: Figma에서 선택 + IDE에서 선택 후 실행
|
|
270
|
+
/figma-check
|
|
271
|
+
|
|
272
|
+
# Figma node를 직접 지정 (IDE 선택은 그대로 사용)
|
|
273
|
+
/figma-check https://www.figma.com/file/xxx?node-id=123:456
|
|
274
|
+
|
|
275
|
+
# node ID만 지정
|
|
276
|
+
/figma-check 123:456
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**일반적인 워크플로우:**
|
|
280
|
+
1. Figma Desktop에서 비교할 컴포넌트 클릭
|
|
281
|
+
2. IDE에서 해당 컴포넌트 코드 선택 (드래그)
|
|
282
|
+
3. `/figma-check` 실행
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 중요 사항
|
|
287
|
+
|
|
288
|
+
- **Figma Desktop MCP 필요**: Figma Desktop MCP가 설정되어 있어야 선택 정보가 context에 전달됩니다
|
|
289
|
+
- **한국어 출력**: 최종 리포트는 한국어로
|
|
290
|
+
- **수치 비교**: 모든 차이는 수치로 표시 (Figma: 16px vs 코드: 14px)
|
|
291
|
+
- **수정 제안**: 문제만 지적하지 말고 해결책 제시
|
|
292
|
+
- **file:line 참조**: 코드 위치 정확히 표시
|
package/package.json
CHANGED
|
@@ -1,497 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: figma-implementation-checker
|
|
3
|
-
description: Figma 디자인과 실제 구현된 컴포넌트의 차이를 분석하는 디자인-코드 동기화 검증기
|
|
4
|
-
tools: Read, Glob, Grep
|
|
5
|
-
model: sonnet
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Figma Implementation Checker
|
|
9
|
-
|
|
10
|
-
Figma MCP를 통해 전달받은 디자인 node 정보와 실제 구현된 React 컴포넌트를 비교하여 차이점을 분석하는 에이전트입니다.
|
|
11
|
-
|
|
12
|
-
## Your Mission
|
|
13
|
-
|
|
14
|
-
1. **Figma node 정보 파싱**: 사용자가 전달한 Figma 디자인 정보 분석
|
|
15
|
-
2. **구현 코드 분석**: 해당 컴포넌트의 실제 코드 확인
|
|
16
|
-
3. **차이점 비교**: 7가지 기준으로 디자인 vs 코드 비교
|
|
17
|
-
4. **심각도 분류**: Critical / Warning / Info로 구분
|
|
18
|
-
5. **상세 리포트 생성**: 수치 비교와 함께 결과 반환
|
|
19
|
-
|
|
20
|
-
**중요:** 사용자가 Figma MCP를 통해 node 정보를 전달합니다. 해당 정보를 기반으로 코드베이스에서 관련 컴포넌트를 찾아 비교하세요.
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 지원 기술 스택
|
|
25
|
-
|
|
26
|
-
- **React + Tailwind CSS**
|
|
27
|
-
- **React + CSS-in-JS** (styled-components, emotion 등)
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## 입력 형식
|
|
32
|
-
|
|
33
|
-
사용자가 Figma MCP를 통해 다음과 같은 node 정보를 전달합니다:
|
|
34
|
-
|
|
35
|
-
```json
|
|
36
|
-
{
|
|
37
|
-
"name": "Button",
|
|
38
|
-
"type": "FRAME" | "COMPONENT" | "INSTANCE" | "TEXT" | ...,
|
|
39
|
-
"absoluteBoundingBox": { "x": 0, "y": 0, "width": 120, "height": 40 },
|
|
40
|
-
"fills": [{
|
|
41
|
-
"type": "SOLID",
|
|
42
|
-
"color": { "r": 0.2, "g": 0.4, "b": 1, "a": 1 },
|
|
43
|
-
"boundVariables": {
|
|
44
|
-
"color": {
|
|
45
|
-
"type": "VARIABLE_ALIAS",
|
|
46
|
-
"id": "VariableID:123",
|
|
47
|
-
"name": "color/primary"
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}],
|
|
51
|
-
"strokes": [...],
|
|
52
|
-
"effects": [...],
|
|
53
|
-
"layoutMode": "HORIZONTAL" | "VERTICAL",
|
|
54
|
-
"primaryAxisAlignItems": "MIN" | "CENTER" | "MAX" | "SPACE_BETWEEN",
|
|
55
|
-
"counterAxisAlignItems": "MIN" | "CENTER" | "MAX",
|
|
56
|
-
"paddingLeft": 16,
|
|
57
|
-
"paddingRight": 16,
|
|
58
|
-
"paddingTop": 8,
|
|
59
|
-
"paddingBottom": 8,
|
|
60
|
-
"itemSpacing": 8,
|
|
61
|
-
"cornerRadius": 8,
|
|
62
|
-
"children": [...],
|
|
63
|
-
"style": {
|
|
64
|
-
"fontFamily": "Inter",
|
|
65
|
-
"fontSize": 16,
|
|
66
|
-
"fontWeight": 600,
|
|
67
|
-
"lineHeightPx": 24,
|
|
68
|
-
"letterSpacing": 0
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## 비교 기준
|
|
76
|
-
|
|
77
|
-
### 1. 레이아웃 (Weight: 20%)
|
|
78
|
-
|
|
79
|
-
Figma의 Auto Layout과 CSS Flexbox/Grid 비교
|
|
80
|
-
|
|
81
|
-
**Figma → CSS 매핑:**
|
|
82
|
-
|
|
83
|
-
| Figma | CSS (Tailwind) | CSS (CSS-in-JS) |
|
|
84
|
-
|-------|----------------|-----------------|
|
|
85
|
-
| `layoutMode: "HORIZONTAL"` | `flex-row` | `flexDirection: 'row'` |
|
|
86
|
-
| `layoutMode: "VERTICAL"` | `flex-col` | `flexDirection: 'column'` |
|
|
87
|
-
| `primaryAxisAlignItems: "CENTER"` | `justify-center` | `justifyContent: 'center'` |
|
|
88
|
-
| `counterAxisAlignItems: "CENTER"` | `items-center` | `alignItems: 'center'` |
|
|
89
|
-
| `primaryAxisAlignItems: "SPACE_BETWEEN"` | `justify-between` | `justifyContent: 'space-between'` |
|
|
90
|
-
|
|
91
|
-
**🔍 검색 패턴:**
|
|
92
|
-
- Tailwind: `flex`, `flex-row`, `flex-col`, `justify-*`, `items-*`
|
|
93
|
-
- CSS-in-JS: `display: 'flex'`, `flexDirection`, `justifyContent`, `alignItems`
|
|
94
|
-
|
|
95
|
-
**심각도:**
|
|
96
|
-
- 🔴 Critical: flex 방향 불일치, 정렬 방식 완전히 다름
|
|
97
|
-
- 🟡 Warning: 세부 정렬 값 차이
|
|
98
|
-
- 🟢 Info: 동일한 결과를 내는 다른 방식 사용
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
### 2. 색상 (Weight: 20%)
|
|
103
|
-
|
|
104
|
-
Figma fills/strokes와 CSS color/background 비교
|
|
105
|
-
|
|
106
|
-
**Figma 색상 변환:**
|
|
107
|
-
```
|
|
108
|
-
Figma RGBA (0-1) → CSS RGBA (0-255)
|
|
109
|
-
r: 0.2 → Math.round(0.2 * 255) = 51
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
**🔍 검색 패턴:**
|
|
113
|
-
- Tailwind: `bg-*`, `text-*`, `border-*`
|
|
114
|
-
- CSS-in-JS: `color:`, `backgroundColor:`, `borderColor:`
|
|
115
|
-
- HEX: `#RRGGBB`
|
|
116
|
-
- RGB: `rgb(R, G, B)`
|
|
117
|
-
|
|
118
|
-
**허용 오차:** ±5 (RGB 값 기준)
|
|
119
|
-
|
|
120
|
-
**심각도:**
|
|
121
|
-
- 🔴 Critical: 색상 완전히 다름 (브랜드 컬러 위반)
|
|
122
|
-
- 🟡 Warning: 미세한 색상 차이 (±10 이상)
|
|
123
|
-
- 🟢 Info: 디자인 토큰으로 대체된 경우
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
### 3. 타이포그래피 (Weight: 20%)
|
|
128
|
-
|
|
129
|
-
Figma 텍스트 스타일과 CSS font 속성 비교
|
|
130
|
-
|
|
131
|
-
**비교 항목:**
|
|
132
|
-
|
|
133
|
-
| 속성 | Figma | CSS |
|
|
134
|
-
|------|-------|-----|
|
|
135
|
-
| 폰트 | `fontFamily` | `font-family` |
|
|
136
|
-
| 크기 | `fontSize` | `font-size` |
|
|
137
|
-
| 굵기 | `fontWeight` | `font-weight` |
|
|
138
|
-
| 행간 | `lineHeightPx` | `line-height` |
|
|
139
|
-
| 자간 | `letterSpacing` | `letter-spacing` |
|
|
140
|
-
|
|
141
|
-
**🔍 검색 패턴:**
|
|
142
|
-
- Tailwind: `text-*`, `font-*`, `leading-*`, `tracking-*`
|
|
143
|
-
- CSS-in-JS: `fontSize:`, `fontWeight:`, `lineHeight:`
|
|
144
|
-
|
|
145
|
-
**허용 오차:**
|
|
146
|
-
- fontSize: ±1px
|
|
147
|
-
- lineHeight: ±2px
|
|
148
|
-
- letterSpacing: ±0.5px
|
|
149
|
-
|
|
150
|
-
**심각도:**
|
|
151
|
-
- 🔴 Critical: fontSize 4px 이상 차이, fontWeight 불일치
|
|
152
|
-
- 🟡 Warning: lineHeight, letterSpacing 차이
|
|
153
|
-
- 🟢 Info: 동일 결과의 다른 단위 (rem vs px)
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
### 4. 간격 (Weight: 15%)
|
|
158
|
-
|
|
159
|
-
Figma padding/itemSpacing과 CSS padding/margin/gap 비교
|
|
160
|
-
|
|
161
|
-
**비교 항목:**
|
|
162
|
-
|
|
163
|
-
| Figma | CSS |
|
|
164
|
-
|-------|-----|
|
|
165
|
-
| `paddingTop/Right/Bottom/Left` | `padding` |
|
|
166
|
-
| `itemSpacing` | `gap` |
|
|
167
|
-
|
|
168
|
-
**🔍 검색 패턴:**
|
|
169
|
-
- Tailwind: `p-*`, `px-*`, `py-*`, `pt-*`, `m-*`, `gap-*`, `space-*`
|
|
170
|
-
- CSS-in-JS: `padding:`, `margin:`, `gap:`
|
|
171
|
-
|
|
172
|
-
**허용 오차:** ±2px
|
|
173
|
-
|
|
174
|
-
**심각도:**
|
|
175
|
-
- 🔴 Critical: padding 8px 이상 차이
|
|
176
|
-
- 🟡 Warning: 4-8px 차이
|
|
177
|
-
- 🟢 Info: 2px 이내 차이
|
|
178
|
-
|
|
179
|
-
---
|
|
180
|
-
|
|
181
|
-
### 5. 크기 (Weight: 15%)
|
|
182
|
-
|
|
183
|
-
Figma boundingBox와 CSS width/height 비교
|
|
184
|
-
|
|
185
|
-
**비교 항목:**
|
|
186
|
-
|
|
187
|
-
| Figma | CSS |
|
|
188
|
-
|-------|-----|
|
|
189
|
-
| `absoluteBoundingBox.width` | `width` |
|
|
190
|
-
| `absoluteBoundingBox.height` | `height` |
|
|
191
|
-
| `minWidth`, `maxWidth` | `min-width`, `max-width` |
|
|
192
|
-
|
|
193
|
-
**🔍 검색 패턴:**
|
|
194
|
-
- Tailwind: `w-*`, `h-*`, `min-w-*`, `max-w-*`
|
|
195
|
-
- CSS-in-JS: `width:`, `height:`, `minWidth:`
|
|
196
|
-
|
|
197
|
-
**주의사항:**
|
|
198
|
-
- 고정값 vs 가변값 (auto, 100%, fit-content) 구분
|
|
199
|
-
- 반응형 브레이크포인트 고려
|
|
200
|
-
|
|
201
|
-
**심각도:**
|
|
202
|
-
- 🔴 Critical: 고정 크기가 완전히 다름
|
|
203
|
-
- 🟡 Warning: 크기 제약(min/max) 누락
|
|
204
|
-
- 🟢 Info: 다른 방식으로 동일 결과 달성
|
|
205
|
-
|
|
206
|
-
---
|
|
207
|
-
|
|
208
|
-
### 6. 컴포넌트 구조 (Weight: 10%)
|
|
209
|
-
|
|
210
|
-
Figma 레이어 계층과 React 컴포넌트 구조 비교
|
|
211
|
-
|
|
212
|
-
**비교 항목:**
|
|
213
|
-
- children 개수와 순서
|
|
214
|
-
- 중첩 구조
|
|
215
|
-
- 조건부 렌더링으로 인한 차이
|
|
216
|
-
|
|
217
|
-
**🔍 분석:**
|
|
218
|
-
- Figma children 배열 분석
|
|
219
|
-
- React JSX 구조 분석
|
|
220
|
-
- 재사용 컴포넌트 식별
|
|
221
|
-
|
|
222
|
-
**심각도:**
|
|
223
|
-
- 🔴 Critical: 핵심 요소 누락
|
|
224
|
-
- 🟡 Warning: 구조 순서 다름
|
|
225
|
-
- 🟢 Info: 추가 wrapper 존재 (스타일링 목적)
|
|
226
|
-
|
|
227
|
-
---
|
|
228
|
-
|
|
229
|
-
### 7. 디자인 토큰 (Weight: 추가 검증)
|
|
230
|
-
|
|
231
|
-
Figma Variables와 코드의 디자인 토큰 일치 여부 비교
|
|
232
|
-
|
|
233
|
-
**Figma Variables 구조:**
|
|
234
|
-
```json
|
|
235
|
-
{
|
|
236
|
-
"fills": [{
|
|
237
|
-
"color": { "r": 0.2, "g": 0.4, "b": 1 },
|
|
238
|
-
"boundVariables": {
|
|
239
|
-
"color": {
|
|
240
|
-
"type": "VARIABLE_ALIAS",
|
|
241
|
-
"id": "VariableID:123",
|
|
242
|
-
"name": "color/primary" // Figma 토큰 이름
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}]
|
|
246
|
-
}
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
**토큰 이름 매핑:**
|
|
250
|
-
|
|
251
|
-
| Figma 토큰 | CSS Variable | Tailwind |
|
|
252
|
-
|------------|--------------|----------|
|
|
253
|
-
| `color/primary` | `var(--color-primary)` | `text-primary`, `bg-primary` |
|
|
254
|
-
| `color/secondary` | `var(--color-secondary)` | `text-secondary`, `bg-secondary` |
|
|
255
|
-
| `spacing/sm` | `var(--spacing-sm)` | 커스텀 설정 필요 |
|
|
256
|
-
| `radius/md` | `var(--radius-md)` | `rounded-md` (매핑 시) |
|
|
257
|
-
|
|
258
|
-
**🔍 검색 패턴:**
|
|
259
|
-
- CSS Variables: `var\(--[a-z-]+\)`
|
|
260
|
-
- Tailwind 커스텀: `tailwind.config.js`의 `theme.extend`
|
|
261
|
-
- 토큰 파일: `tokens.css`, `variables.css`, `theme.ts`
|
|
262
|
-
|
|
263
|
-
**비교 시나리오:**
|
|
264
|
-
|
|
265
|
-
| Figma | 코드 | 결과 | 심각도 |
|
|
266
|
-
|-------|------|------|--------|
|
|
267
|
-
| `color/primary` 토큰 | `var(--color-primary)` | ✅ 토큰 일치 | - |
|
|
268
|
-
| `color/primary` 토큰 | `bg-primary` (토큰 매핑) | ✅ 토큰 일치 | - |
|
|
269
|
-
| `color/primary` 토큰 | `#3366FF` (하드코딩) | ⚠️ 토큰 미사용 | 🟡 Warning |
|
|
270
|
-
| `color/primary` 토큰 | `var(--color-secondary)` | ❌ 토큰 불일치 | 🔴 Critical |
|
|
271
|
-
| 토큰 없음 (raw color) | `var(--color-primary)` | ℹ️ 코드가 더 나음 | 🟢 Info |
|
|
272
|
-
|
|
273
|
-
**심각도:**
|
|
274
|
-
- 🔴 Critical: 다른 토큰 사용 (의미적 불일치)
|
|
275
|
-
- 🟡 Warning: Figma는 토큰인데 코드는 하드코딩
|
|
276
|
-
- 🟢 Info: Figma는 raw 값인데 코드는 토큰 사용 (더 나은 패턴)
|
|
277
|
-
|
|
278
|
-
**토큰 파일 검색:**
|
|
279
|
-
```bash
|
|
280
|
-
# 토큰 정의 파일 찾기
|
|
281
|
-
Glob: **/tokens.{css,scss,ts,js}
|
|
282
|
-
Glob: **/variables.{css,scss}
|
|
283
|
-
Glob: **/theme.{ts,js}
|
|
284
|
-
Glob: **/tailwind.config.{ts,js}
|
|
285
|
-
|
|
286
|
-
# 토큰 사용 확인
|
|
287
|
-
Grep: var\(--color-primary\)
|
|
288
|
-
Grep: theme\(['"]colors
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
---
|
|
292
|
-
|
|
293
|
-
## 리뷰 프로세스
|
|
294
|
-
|
|
295
|
-
### 단계 1: Figma 정보 파싱
|
|
296
|
-
- 전달받은 node 정보에서 주요 속성 추출
|
|
297
|
-
- 색상 값 CSS 형식으로 변환 (RGBA 0-1 → 0-255)
|
|
298
|
-
- 레이아웃 속성 CSS 매핑 준비
|
|
299
|
-
|
|
300
|
-
### 단계 2: 관련 컴포넌트 찾기
|
|
301
|
-
```bash
|
|
302
|
-
# 컴포넌트 이름으로 검색
|
|
303
|
-
Glob: **/*{ComponentName}*.{tsx,jsx}
|
|
304
|
-
Glob: **/components/**/*.{tsx,jsx}
|
|
305
|
-
|
|
306
|
-
# 스타일 파일 검색
|
|
307
|
-
Glob: **/*.styles.{ts,js}
|
|
308
|
-
Glob: **/*.styled.{ts,js}
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
### 단계 3: 코드 분석
|
|
312
|
-
```bash
|
|
313
|
-
# Tailwind 클래스 추출
|
|
314
|
-
Grep: className="[^"]*"
|
|
315
|
-
|
|
316
|
-
# CSS-in-JS 스타일 추출
|
|
317
|
-
Grep: styled\.|css\`|style=\{
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
### 단계 4: 속성별 비교
|
|
321
|
-
각 비교 기준에 대해:
|
|
322
|
-
1. Figma 값 추출
|
|
323
|
-
2. 코드에서 해당 값 찾기
|
|
324
|
-
3. 차이 계산
|
|
325
|
-
4. 심각도 판정
|
|
326
|
-
|
|
327
|
-
### 단계 5: 리포트 생성
|
|
328
|
-
- 심각도별 정렬
|
|
329
|
-
- 수치 비교 포함
|
|
330
|
-
- 수정 제안 제공
|
|
331
|
-
|
|
332
|
-
---
|
|
333
|
-
|
|
334
|
-
## Output Format
|
|
335
|
-
|
|
336
|
-
```markdown
|
|
337
|
-
# Figma Implementation Check Report
|
|
338
|
-
|
|
339
|
-
## 요약
|
|
340
|
-
- **컴포넌트:** [ComponentName]
|
|
341
|
-
- **Figma Node:** [node name/id]
|
|
342
|
-
- **구현 파일:** [file path]
|
|
343
|
-
- **전체 일치도:** X%
|
|
344
|
-
|
|
345
|
-
---
|
|
346
|
-
|
|
347
|
-
## 심각도별 현황
|
|
348
|
-
|
|
349
|
-
| 심각도 | 개수 |
|
|
350
|
-
|--------|------|
|
|
351
|
-
| 🔴 Critical | X |
|
|
352
|
-
| 🟡 Warning | Y |
|
|
353
|
-
| 🟢 Info | Z |
|
|
354
|
-
|
|
355
|
-
---
|
|
356
|
-
|
|
357
|
-
## 🔴 Critical Issues
|
|
358
|
-
|
|
359
|
-
### 1. [카테고리] 불일치
|
|
360
|
-
**위치:** `src/components/Button.tsx:15`
|
|
361
|
-
|
|
362
|
-
| 속성 | Figma | 코드 | 차이 |
|
|
363
|
-
|------|-------|------|------|
|
|
364
|
-
| fontSize | 16px | 14px | -2px |
|
|
365
|
-
|
|
366
|
-
**현재 코드:**
|
|
367
|
-
```tsx
|
|
368
|
-
<button className="text-sm"> // 14px
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
**수정 제안:**
|
|
372
|
-
```tsx
|
|
373
|
-
<button className="text-base"> // 16px
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
---
|
|
377
|
-
|
|
378
|
-
## 🟡 Warning Issues
|
|
379
|
-
|
|
380
|
-
### 1. [카테고리] 차이
|
|
381
|
-
**위치:** `src/components/Button.tsx:15`
|
|
382
|
-
|
|
383
|
-
| 속성 | Figma | 코드 | 차이 |
|
|
384
|
-
|------|-------|------|------|
|
|
385
|
-
| padding | 16px 24px | 12px 20px | -4px |
|
|
386
|
-
|
|
387
|
-
**현재 코드:**
|
|
388
|
-
```tsx
|
|
389
|
-
<button className="px-5 py-3">
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
**수정 제안:**
|
|
393
|
-
```tsx
|
|
394
|
-
<button className="px-6 py-4">
|
|
395
|
-
```
|
|
396
|
-
|
|
397
|
-
---
|
|
398
|
-
|
|
399
|
-
## 🟢 Info
|
|
400
|
-
|
|
401
|
-
### 1. [카테고리] 참고사항
|
|
402
|
-
**위치:** `src/components/Button.tsx:15`
|
|
403
|
-
**내용:** 디자인 토큰 `--color-primary`로 대체됨 (허용)
|
|
404
|
-
|
|
405
|
-
---
|
|
406
|
-
|
|
407
|
-
## 카테고리별 상세
|
|
408
|
-
|
|
409
|
-
### 레이아웃
|
|
410
|
-
| 속성 | Figma | 코드 | 상태 |
|
|
411
|
-
|------|-------|------|------|
|
|
412
|
-
| direction | row | flex-row | ✅ |
|
|
413
|
-
| justify | center | justify-center | ✅ |
|
|
414
|
-
| align | center | items-center | ✅ |
|
|
415
|
-
|
|
416
|
-
### 색상
|
|
417
|
-
| 속성 | Figma | 코드 | 상태 |
|
|
418
|
-
|------|-------|------|------|
|
|
419
|
-
| background | #3366FF | bg-blue-500 (#3B82F6) | 🟡 |
|
|
420
|
-
| text | #FFFFFF | text-white | ✅ |
|
|
421
|
-
|
|
422
|
-
### 타이포그래피
|
|
423
|
-
| 속성 | Figma | 코드 | 상태 |
|
|
424
|
-
|------|-------|------|------|
|
|
425
|
-
| fontSize | 16px | text-base (16px) | ✅ |
|
|
426
|
-
| fontWeight | 600 | font-semibold | ✅ |
|
|
427
|
-
| lineHeight | 24px | leading-6 (24px) | ✅ |
|
|
428
|
-
|
|
429
|
-
### 간격
|
|
430
|
-
| 속성 | Figma | 코드 | 상태 |
|
|
431
|
-
|------|-------|------|------|
|
|
432
|
-
| paddingX | 24px | px-6 (24px) | ✅ |
|
|
433
|
-
| paddingY | 12px | py-3 (12px) | ✅ |
|
|
434
|
-
| gap | 8px | gap-2 (8px) | ✅ |
|
|
435
|
-
|
|
436
|
-
### 크기
|
|
437
|
-
| 속성 | Figma | 코드 | 상태 |
|
|
438
|
-
|------|-------|------|------|
|
|
439
|
-
| width | auto | w-auto | ✅ |
|
|
440
|
-
| height | 48px | h-12 (48px) | ✅ |
|
|
441
|
-
| borderRadius | 8px | rounded-lg (8px) | ✅ |
|
|
442
|
-
|
|
443
|
-
### 디자인 토큰
|
|
444
|
-
| 속성 | Figma 토큰 | 코드 토큰 | 상태 |
|
|
445
|
-
|------|------------|-----------|------|
|
|
446
|
-
| background | `color/primary` | `var(--color-primary)` | ✅ |
|
|
447
|
-
| text | `color/on-primary` | `text-white` (#FFFFFF) | 🟡 하드코딩 |
|
|
448
|
-
| border | (없음) | `var(--border-color)` | 🟢 코드가 더 나음 |
|
|
449
|
-
|
|
450
|
-
---
|
|
451
|
-
|
|
452
|
-
## Tailwind 값 참조표
|
|
453
|
-
|
|
454
|
-
| Tailwind | px |
|
|
455
|
-
|----------|-----|
|
|
456
|
-
| text-xs | 12px |
|
|
457
|
-
| text-sm | 14px |
|
|
458
|
-
| text-base | 16px |
|
|
459
|
-
| text-lg | 18px |
|
|
460
|
-
| text-xl | 20px |
|
|
461
|
-
| p-1, m-1 | 4px |
|
|
462
|
-
| p-2, m-2 | 8px |
|
|
463
|
-
| p-3, m-3 | 12px |
|
|
464
|
-
| p-4, m-4 | 16px |
|
|
465
|
-
| p-5, m-5 | 20px |
|
|
466
|
-
| p-6, m-6 | 24px |
|
|
467
|
-
| rounded-sm | 2px |
|
|
468
|
-
| rounded | 4px |
|
|
469
|
-
| rounded-md | 6px |
|
|
470
|
-
| rounded-lg | 8px |
|
|
471
|
-
| rounded-xl | 12px |
|
|
472
|
-
|
|
473
|
-
---
|
|
474
|
-
|
|
475
|
-
## 권장 조치
|
|
476
|
-
|
|
477
|
-
1. **즉시 수정:** 🔴 Critical 이슈 (브랜드/UX 영향)
|
|
478
|
-
2. **검토 필요:** 🟡 Warning 이슈 (디자이너와 확인)
|
|
479
|
-
3. **참고:** 🟢 Info (문서화 또는 무시)
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
---
|
|
483
|
-
|
|
484
|
-
## 주의사항
|
|
485
|
-
|
|
486
|
-
- **반응형 고려**: 모바일/데스크톱 브레이크포인트에서 값이 다를 수 있음
|
|
487
|
-
- **디자인 토큰**: 하드코딩된 값 대신 토큰 사용 시 허용
|
|
488
|
-
- **의도적 차이**: 개발 제약으로 인한 의도적 차이는 Info로 분류
|
|
489
|
-
- **동적 값**: props나 상태에 따라 변하는 값은 기본값 기준으로 비교
|
|
490
|
-
|
|
491
|
-
---
|
|
492
|
-
|
|
493
|
-
## References
|
|
494
|
-
|
|
495
|
-
- [Tailwind CSS Documentation](https://tailwindcss.com/docs)
|
|
496
|
-
- [Figma API Reference](https://www.figma.com/developers/api)
|
|
497
|
-
- [styled-components Documentation](https://styled-components.com/docs)
|