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 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
- └── code-review.md
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,6 +1,6 @@
1
1
  {
2
2
  "name": "binary-agents",
3
- "version": "1.0.17",
3
+ "version": "1.0.18",
4
4
  "description": "Claude Code subagents and slash commands collection with sync CLI tool",
5
5
  "type": "module",
6
6
  "main": "src/sync.js",
@@ -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)