@atezer/figma-mcp-bridge 1.7.23 → 1.7.25

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.
Files changed (119) hide show
  1. package/.claude-plugin/plugin.json +37 -0
  2. package/.cursor-plugin/plugin.json +21 -0
  3. package/CHANGELOG.md +30 -0
  4. package/README.md +4 -3
  5. package/agents/ds-auditor.md +29 -0
  6. package/agents/screen-builder.md +29 -0
  7. package/agents/token-syncer.md +26 -0
  8. package/assets/logo.png +0 -0
  9. package/commands/add-library.md +122 -0
  10. package/commands/ds-add.md +255 -0
  11. package/commands/ds-sync.md +314 -0
  12. package/commands/implement.md +43 -0
  13. package/commands/install-library.md +73 -0
  14. package/commands/setup.md +26 -0
  15. package/commands/test.md +39 -0
  16. package/commands/update.md +25 -0
  17. package/dist/core/config.d.ts +1 -5
  18. package/dist/core/config.d.ts.map +1 -1
  19. package/dist/core/config.js +11 -111
  20. package/dist/core/config.js.map +1 -1
  21. package/dist/core/plugin-bridge-server.d.ts.map +1 -1
  22. package/dist/core/plugin-bridge-server.js +1 -2
  23. package/dist/core/plugin-bridge-server.js.map +1 -1
  24. package/dist/core/response-guard.d.ts +1 -1
  25. package/dist/core/response-guard.js +1 -1
  26. package/dist/core/types/index.d.ts +2 -98
  27. package/dist/core/types/index.d.ts.map +1 -1
  28. package/dist/core/version.d.ts +1 -1
  29. package/dist/core/version.js +1 -1
  30. package/dist/local-plugin-only.d.ts.map +1 -1
  31. package/dist/local-plugin-only.js +14 -13
  32. package/dist/local-plugin-only.js.map +1 -1
  33. package/f-mcp-plugin/README.md +8 -15
  34. package/f-mcp-plugin/manifest.json +1 -3
  35. package/hooks/hooks.json +26 -0
  36. package/package.json +15 -31
  37. package/skills/BRAND_PROFILE_SCHEMA.md +113 -0
  38. package/skills/SKILL_INDEX.md +194 -0
  39. package/skills/TOOL_MAPPING.md +111 -0
  40. package/skills/ai-handoff-export/SKILL.md +254 -0
  41. package/skills/apply-figma-design-system/SKILL.md +104 -0
  42. package/skills/audit-figma-design-system/SKILL.md +278 -0
  43. package/skills/code-design-mapper/SKILL.md +370 -0
  44. package/skills/component-documentation/SKILL.md +190 -0
  45. package/skills/design-drift-detector/SKILL.md +407 -0
  46. package/skills/design-system-rules/SKILL.md +407 -0
  47. package/skills/design-token-pipeline/SKILL.md +619 -0
  48. package/skills/ds-impact-analysis/SKILL.md +266 -0
  49. package/skills/figjam-diagram-builder/SKILL.md +172 -0
  50. package/skills/figma-a11y-audit/SKILL.md +587 -0
  51. package/skills/figma-canvas-ops/SKILL.md +325 -0
  52. package/skills/figma-screen-analyzer/SKILL.md +235 -0
  53. package/skills/fix-figma-design-system-finding/SKILL.md +117 -0
  54. package/skills/fmcp-project-rules/SKILL.md +93 -0
  55. package/skills/generate-figma-library/SKILL.md +598 -0
  56. package/skills/generate-figma-screen/SKILL.md +689 -0
  57. package/skills/implement-design/SKILL.md +473 -0
  58. package/skills/ux-copy-guidance/SKILL.md +373 -0
  59. package/skills/visual-qa-compare/SKILL.md +166 -0
  60. package/dist/browser/base.d.ts +0 -50
  61. package/dist/browser/base.d.ts.map +0 -1
  62. package/dist/browser/base.js +0 -6
  63. package/dist/browser/base.js.map +0 -1
  64. package/dist/browser/local.d.ts +0 -81
  65. package/dist/browser/local.d.ts.map +0 -1
  66. package/dist/browser/local.js +0 -283
  67. package/dist/browser/local.js.map +0 -1
  68. package/dist/core/console-monitor.d.ts +0 -82
  69. package/dist/core/console-monitor.d.ts.map +0 -1
  70. package/dist/core/console-monitor.js +0 -428
  71. package/dist/core/console-monitor.js.map +0 -1
  72. package/dist/core/design-system-manifest.d.ts +0 -272
  73. package/dist/core/design-system-manifest.d.ts.map +0 -1
  74. package/dist/core/design-system-manifest.js +0 -261
  75. package/dist/core/design-system-manifest.js.map +0 -1
  76. package/dist/core/enrichment/enrichment-service.d.ts +0 -52
  77. package/dist/core/enrichment/enrichment-service.d.ts.map +0 -1
  78. package/dist/core/enrichment/enrichment-service.js +0 -272
  79. package/dist/core/enrichment/enrichment-service.js.map +0 -1
  80. package/dist/core/enrichment/index.d.ts +0 -8
  81. package/dist/core/enrichment/index.d.ts.map +0 -1
  82. package/dist/core/enrichment/index.js +0 -8
  83. package/dist/core/enrichment/index.js.map +0 -1
  84. package/dist/core/enrichment/relationship-mapper.d.ts +0 -106
  85. package/dist/core/enrichment/relationship-mapper.d.ts.map +0 -1
  86. package/dist/core/enrichment/relationship-mapper.js +0 -352
  87. package/dist/core/enrichment/relationship-mapper.js.map +0 -1
  88. package/dist/core/enrichment/style-resolver.d.ts +0 -80
  89. package/dist/core/enrichment/style-resolver.d.ts.map +0 -1
  90. package/dist/core/enrichment/style-resolver.js +0 -327
  91. package/dist/core/enrichment/style-resolver.js.map +0 -1
  92. package/dist/core/figma-api.d.ts +0 -137
  93. package/dist/core/figma-api.d.ts.map +0 -1
  94. package/dist/core/figma-api.js +0 -274
  95. package/dist/core/figma-api.js.map +0 -1
  96. package/dist/core/figma-desktop-connector.d.ts +0 -242
  97. package/dist/core/figma-desktop-connector.d.ts.map +0 -1
  98. package/dist/core/figma-desktop-connector.js +0 -1042
  99. package/dist/core/figma-desktop-connector.js.map +0 -1
  100. package/dist/core/figma-reconstruction-spec.d.ts +0 -162
  101. package/dist/core/figma-reconstruction-spec.d.ts.map +0 -1
  102. package/dist/core/figma-reconstruction-spec.js +0 -387
  103. package/dist/core/figma-reconstruction-spec.js.map +0 -1
  104. package/dist/core/figma-tools.d.ts +0 -21
  105. package/dist/core/figma-tools.d.ts.map +0 -1
  106. package/dist/core/figma-tools.js +0 -2920
  107. package/dist/core/figma-tools.js.map +0 -1
  108. package/dist/core/snippet-injector.d.ts +0 -24
  109. package/dist/core/snippet-injector.d.ts.map +0 -1
  110. package/dist/core/snippet-injector.js +0 -97
  111. package/dist/core/snippet-injector.js.map +0 -1
  112. package/dist/core/types/enriched.d.ts +0 -213
  113. package/dist/core/types/enriched.d.ts.map +0 -1
  114. package/dist/core/types/enriched.js +0 -6
  115. package/dist/core/types/enriched.js.map +0 -1
  116. package/dist/local.d.ts +0 -73
  117. package/dist/local.d.ts.map +0 -1
  118. package/dist/local.js +0 -2605
  119. package/dist/local.js.map +0 -1
@@ -0,0 +1,619 @@
1
+ ---
2
+ name: design-token-pipeline
3
+ description: Figma variable'larını iOS (Swift Color/Font/Spacing), Android (colors.xml, dimens.xml, Compose Theme), ve Web (CSS, Tailwind, Sass, TS) formatlarında otomatik token dosyalarına dönüştürür. Ters yönde kod token dosyalarından Figma variable'ları da oluşturabilir. "export tokens", "token pipeline", "token'ları export et", "sync tokens", "generate token files", "token'ları Figma'ya yaz", "kod token'larını senkronla" ifadeleriyle tetiklenir. F-MCP Bridge plugin bağlantısı gerektirir. Bu özellik resmi Figma plugininde yoktur.
4
+ metadata:
5
+ mcp-server: user-figma-mcp-bridge
6
+ personas:
7
+ - uidev
8
+ - designops
9
+ ---
10
+
11
+ # Design Token Pipeline (Multi-Platform)
12
+
13
+ > **Design Token Kuralı:** Bu skill'deki kod örneklerinde geçen font adları, renk kodları, piksel boyutları yalnızca FORMAT gösterimidir. Çalışma anında tüm design token değerleri (font, renk, boyut, spacing, radius, gölge) kayıtlı kütüphaneden (`figma_get_variables`, `figma_get_styles`) veya kullanıcıdan okunmalıdır. Hardcoded token değeri kullanma. Detay: `project-context.md` → "Design Token Kuralı".
14
+
15
+ ## Overview
16
+
17
+ Bu skill, Figma'daki design token'ları (variable'lar ve style'lar) **iOS, Android ve Web** platformlarının kullandığı formatlarda kod dosyalarına dönüştürür. Resmi Figma plugininde bu özellik yoktur.
18
+
19
+ **Önemli:** MCP araçları (`figma_get_variables`, `figma_get_styles`, `figma_get_token_browser`) ham variable ve style verisi döner. Platform-spesifik dosya formatlarına dönüşüm (Swift, XML, CSS vb.) **AI agent tarafından** yapılır. Araçlar doğrudan Swift/XML/CSS export etmez.
20
+
21
+ **Desteklenen çıktı formatları:**
22
+
23
+ | Platform | Format | Dosya |
24
+ |----------|--------|-------|
25
+ | **iOS** | Swift Color extension | `Colors.swift` |
26
+ | **iOS** | Swift Font extension | `Typography.swift` |
27
+ | **iOS** | Swift Spacing constants | `Spacing.swift` |
28
+ | **iOS** | Asset Catalog color set | `*.colorset/Contents.json` |
29
+ | **Android** | XML resources | `colors.xml`, `dimens.xml`, `styles.xml` |
30
+ | **Android** | Compose Color object | `AppColors.kt` |
31
+ | **Android** | Compose Typography | `AppTypography.kt` |
32
+ | **Android** | Compose Spacing | `AppSpacing.kt` |
33
+ | **Web** | CSS Custom Properties | `tokens.css` |
34
+ | **Web** | Tailwind config | `tailwind.config.js` |
35
+ | **Web** | TypeScript constants | `tokens.ts` |
36
+ | **Web** | Sass variables | `_tokens.scss` |
37
+ | **JSON** | W3C Design Tokens | `tokens.json` |
38
+
39
+ **Ek özellikler:**
40
+ - Mode desteği (Light/Dark tema — variable'ların `valuesByMode` alanından)
41
+ - Alias zinciri çözümleme (variable referansları `type: "VARIABLE_ALIAS"` olarak gelir, AI takip eder)
42
+ - Incremental güncelleme (mevcut dosyalar okunup, sadece değişenler güncellenir)
43
+ - Kategori bazlı export
44
+ - Cross-platform token değeri tutarlılık doğrulaması
45
+
46
+ REST API veya Figma access token gerekmez.
47
+
48
+ ## Prerequisites
49
+
50
+ - F-MCP Bridge plugin bağlı olmalı
51
+ - Hedef platform(lar) ve styling yaklaşımları bilinmeli
52
+
53
+ ## F-MCP skill koordinasyonu
54
+
55
+ - **Önce:** Figma’da token’lar tutarlı bağlıysa export daha güvenilir — isteğe bağlı **audit-figma-design-system**.
56
+ - **Sonra:** **design-drift-detector** ve **implement-design** bu dosyaları referans alır; **design-system-rules** güncellenebilir.
57
+ - **Etki analizi:** Bir token değişikliğinin yarıçapını ölçmek istiyorsan → **ds-impact-analysis**
58
+ - **Performans:** Aynı oturumda token verisi zaten çekildiyse (`figma_get_variables` / `figma_get_styles`) yeniden full çağırma; **audit-figma-design-system** içindeki “Zincir performansı” bölümüne uy.
59
+
60
+ ## Required Workflow
61
+
62
+ ### Step 1: Plugin Bağlantısını Doğrula
63
+
64
+ ```
65
+ figma_get_status()
66
+ ```
67
+
68
+ ### Step 2: Token Envanterini Çek
69
+
70
+ Önce genel envanter için token browser:
71
+
72
+ ```
73
+ figma_get_token_browser(verbosity="full")
74
+ ```
75
+
76
+ Sonra detaylı variable verisi (`summary`: koleksiyon/sayı, `standard`: isim/tip, `full`: tüm değerler + mode'lar):
77
+
78
+ ```
79
+ figma_get_variables(verbosity="full")
80
+ ```
81
+
82
+ Bu çağrı döner: `variableCollections` (koleksiyon adları, mode'lar, mode ID'leri) ve `variables` (her variable'ın `name`, `resolvedType`, `valuesByMode`). Alias'lar `valuesByMode` içinde `{type: "VARIABLE_ALIAS", id: "..."}` olarak gelir — hedef variable'ı ID ile bul ve son değere ulaş.
83
+
84
+ **Code Syntax desteği:** Variable'larda `codeSyntax` alanı varsa (Web, Android, iOS), token export sırasında bu değerleri platform-spesifik isimlendirme için kullan. Figma'da Code Syntax ayarlanmışsa, token dönüşümünde Figma'daki isimleri referans al:
85
+ - **Web:** `codeSyntax.WEB` → CSS custom property adı (ör. `var(--btn-primary-bg)`)
86
+ - **Android:** `codeSyntax.ANDROID` → Resource adı (ör. `R.color.btn_primary_bg`)
87
+ - **iOS:** `codeSyntax.iOS` → Swift sabit adı (ör. `ButtonColor.primary.bg`)
88
+
89
+ Code Syntax bilgisini okumak için `figma_execute` kullan:
90
+ ```js
91
+ const v = await figma.variables.getVariableByIdAsync("<id>");
92
+ return { name: v.name, codeSyntax: v.codeSyntax };
93
+ ```
94
+
95
+ Stil verileri için:
96
+
97
+ ```
98
+ figma_get_styles(verbosity="full")
99
+ ```
100
+
101
+ Paint styles (renk), text styles (tipografi), effect styles (gölge vb.) döner.
102
+
103
+ ### Step 3: Hedef Platformları ve Formatları Belirle
104
+
105
+ Kullanıcıdan hangi platformlara export edileceğini öğren. Birden fazla seçilebilir.
106
+
107
+ ### Step 4: Platform-Spesifik Token Dosyaları Üret
108
+
109
+ ---
110
+
111
+ #### iOS — Swift Extensions
112
+
113
+ **Colors.swift:**
114
+
115
+ ```swift
116
+ import SwiftUI
117
+
118
+ // Auto-generated by F-MCP Design Token Pipeline
119
+ // Source: Figma — [File Name]
120
+ // Generated: 2026-03-12T10:30:00Z
121
+
122
+ extension Color {
123
+ enum DS {
124
+ // Primitives
125
+ static let blue50 = Color(hex: "#EFF6FF")
126
+ static let blue100 = Color(hex: "#DBEAFE")
127
+ static let blue500 = Color(hex: "#3B82F6")
128
+ static let blue900 = Color(hex: "#1E3A5A")
129
+
130
+ // Semantic
131
+ static let primary = blue500
132
+ static let background = Color(light: "#FFFFFF", dark: "#0A0A0A")
133
+ static let textPrimary = Color(light: "#1A1A1A", dark: "#FAFAFA")
134
+ }
135
+ }
136
+
137
+ extension Color {
138
+ init(hex: String) {
139
+ // hex → Color init implementation
140
+ }
141
+
142
+ init(light: String, dark: String) {
143
+ self.init(UIColor { traitCollection in
144
+ traitCollection.userInterfaceStyle == .dark
145
+ ? UIColor(hex: dark) : UIColor(hex: light)
146
+ })
147
+ }
148
+ }
149
+ ```
150
+
151
+ **Typography.swift:**
152
+
153
+ ```swift
154
+ import SwiftUI
155
+
156
+ extension Font {
157
+ enum DS {
158
+ static let headingLarge = Font.custom("Inter", size: 24).weight(.bold)
159
+ static let headingMedium = Font.custom("Inter", size: 20).weight(.semibold)
160
+ static let bodyLarge = Font.custom("Inter", size: 16).weight(.regular)
161
+ static let bodyMedium = Font.custom("Inter", size: 14).weight(.regular)
162
+ static let bodySmall = Font.custom("Inter", size: 12).weight(.regular)
163
+ static let labelMedium = Font.custom("Inter", size: 14).weight(.medium)
164
+ }
165
+ }
166
+ ```
167
+
168
+ **Spacing.swift:**
169
+
170
+ ```swift
171
+ import Foundation
172
+
173
+ enum Spacing {
174
+ static let xs: CGFloat = 4
175
+ static let sm: CGFloat = 8
176
+ static let md: CGFloat = 16
177
+ static let lg: CGFloat = 24
178
+ static let xl: CGFloat = 32
179
+ static let xxl: CGFloat = 48
180
+ }
181
+
182
+ enum CornerRadius {
183
+ static let sm: CGFloat = 4
184
+ static let md: CGFloat = 8
185
+ static let lg: CGFloat = 12
186
+ static let full: CGFloat = 9999
187
+ }
188
+ ```
189
+
190
+ **Dönüşüm kuralları (iOS):**
191
+ - Token adı → camelCase (ör. `color/primary/500` → `primary500`)
192
+ - COLOR → `Color(hex:)` veya Asset Catalog
193
+ - FLOAT → `CGFloat`
194
+ - Mode desteği → `UITraitCollection` veya Asset Catalog appearance
195
+ - Font → `Font.custom()` veya `Font.system()`
196
+
197
+ ---
198
+
199
+ #### Android — XML Resources
200
+
201
+ **res/values/colors.xml:**
202
+
203
+ ```xml
204
+ <?xml version="1.0" encoding="utf-8"?>
205
+ <!-- Auto-generated by F-MCP Design Token Pipeline -->
206
+ <resources>
207
+ <!-- Primitives -->
208
+ <color name="blue_50">#FFEFF6FF</color>
209
+ <color name="blue_100">#FFDBEAFE</color>
210
+ <color name="blue_500">#FF3B82F6</color>
211
+ <color name="blue_900">#FF1E3A5A</color>
212
+
213
+ <!-- Semantic -->
214
+ <color name="primary">@color/blue_500</color>
215
+ <color name="background">#FFFFFFFF</color>
216
+ <color name="text_primary">#FF1A1A1A</color>
217
+ </resources>
218
+ ```
219
+
220
+ **res/values-night/colors.xml:**
221
+
222
+ ```xml
223
+ <?xml version="1.0" encoding="utf-8"?>
224
+ <resources>
225
+ <color name="primary">@color/blue_400</color>
226
+ <color name="background">#FF0A0A0A</color>
227
+ <color name="text_primary">#FFFAFAFA</color>
228
+ </resources>
229
+ ```
230
+
231
+ **res/values/dimens.xml:**
232
+
233
+ ```xml
234
+ <?xml version="1.0" encoding="utf-8"?>
235
+ <resources>
236
+ <!-- Spacing -->
237
+ <dimen name="space_xs">4dp</dimen>
238
+ <dimen name="space_sm">8dp</dimen>
239
+ <dimen name="space_md">16dp</dimen>
240
+ <dimen name="space_lg">24dp</dimen>
241
+ <dimen name="space_xl">32dp</dimen>
242
+
243
+ <!-- Corner Radius -->
244
+ <dimen name="radius_sm">4dp</dimen>
245
+ <dimen name="radius_md">8dp</dimen>
246
+ <dimen name="radius_lg">12dp</dimen>
247
+
248
+ <!-- Typography -->
249
+ <dimen name="text_size_sm">12sp</dimen>
250
+ <dimen name="text_size_md">14sp</dimen>
251
+ <dimen name="text_size_lg">16sp</dimen>
252
+ </resources>
253
+ ```
254
+
255
+ #### Android — Compose Theme Objects
256
+
257
+ **AppColors.kt:**
258
+
259
+ ```kotlin
260
+ package com.app.ui.theme
261
+
262
+ import androidx.compose.ui.graphics.Color
263
+
264
+ // Auto-generated by F-MCP Design Token Pipeline
265
+
266
+ object AppColors {
267
+ // Primitives
268
+ val Blue50 = Color(0xFFEFF6FF)
269
+ val Blue100 = Color(0xFFDBEAFE)
270
+ val Blue500 = Color(0xFF3B82F6)
271
+ val Blue900 = Color(0xFF1E3A5A)
272
+
273
+ // Semantic — Light
274
+ val PrimaryLight = Blue500
275
+ val BackgroundLight = Color(0xFFFFFFFF)
276
+ val TextPrimaryLight = Color(0xFF1A1A1A)
277
+
278
+ // Semantic — Dark
279
+ val PrimaryDark = Color(0xFF60A5FA)
280
+ val BackgroundDark = Color(0xFF0A0A0A)
281
+ val TextPrimaryDark = Color(0xFFFAFAFA)
282
+ }
283
+ ```
284
+
285
+ **AppTypography.kt:**
286
+
287
+ ```kotlin
288
+ package com.app.ui.theme
289
+
290
+ import androidx.compose.ui.text.TextStyle
291
+ import androidx.compose.ui.text.font.FontWeight
292
+ import androidx.compose.ui.unit.sp
293
+
294
+ object AppTypography {
295
+ val HeadingLarge = TextStyle(fontSize = 24.sp, fontWeight = FontWeight.Bold)
296
+ val HeadingMedium = TextStyle(fontSize = 20.sp, fontWeight = FontWeight.SemiBold)
297
+ val BodyLarge = TextStyle(fontSize = 16.sp, fontWeight = FontWeight.Normal)
298
+ val BodyMedium = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.Normal)
299
+ val BodySmall = TextStyle(fontSize = 12.sp, fontWeight = FontWeight.Normal)
300
+ val LabelMedium = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.Medium)
301
+ }
302
+ ```
303
+
304
+ **AppSpacing.kt:**
305
+
306
+ ```kotlin
307
+ package com.app.ui.theme
308
+
309
+ import androidx.compose.ui.unit.dp
310
+
311
+ object AppSpacing {
312
+ val xs = 4.dp
313
+ val sm = 8.dp
314
+ val md = 16.dp
315
+ val lg = 24.dp
316
+ val xl = 32.dp
317
+ val xxl = 48.dp
318
+ }
319
+
320
+ object AppCornerRadius {
321
+ val sm = 4.dp
322
+ val md = 8.dp
323
+ val lg = 12.dp
324
+ }
325
+ ```
326
+
327
+ **Dönüşüm kuralları (Android):**
328
+ - Token adı → snake_case (XML), PascalCase (Compose)
329
+ - COLOR → `#AARRGGBB` (XML), `Color(0xFFRRGGBB)` (Compose)
330
+ - FLOAT → `dp` (spacing/radius), `sp` (typography)
331
+ - Mode → `values-night/` qualifier (XML), Light/Dark suffix (Compose)
332
+
333
+ ---
334
+
335
+ #### Web — CSS / Tailwind / Sass / TypeScript
336
+
337
+ Web formatları önceki versiyondaki gibi:
338
+
339
+ **CSS Custom Properties:**
340
+ ```css
341
+ :root {
342
+ --color-primary: #3b82f6;
343
+ --space-md: 16px;
344
+ --radius-md: 8px;
345
+ }
346
+
347
+ [data-theme="dark"] {
348
+ --color-primary: #60a5fa;
349
+ --color-background: #0a0a0a;
350
+ }
351
+ ```
352
+
353
+ **Tailwind Config:** Nested object formatında `theme.extend`
354
+
355
+ **TypeScript:** `as const` ile type-safe constant'lar
356
+
357
+ **Sass:** `$variable` formatında, `$map` destekli
358
+
359
+ ---
360
+
361
+ #### JSON — W3C Design Tokens (Platformlar-arası)
362
+
363
+ ```json
364
+ {
365
+ "$schema": "https://design-tokens.github.io/community-group/format/",
366
+ "color": {
367
+ "primary": {
368
+ "$type": "color",
369
+ "$value": "#3b82f6",
370
+ "$extensions": {
371
+ "mode": { "dark": "#60a5fa" },
372
+ "platforms": {
373
+ "ios": "Color.DS.primary",
374
+ "android": "@color/primary / AppColors.Primary",
375
+ "web": "var(--color-primary)"
376
+ }
377
+ }
378
+ }
379
+ }
380
+ }
381
+ ```
382
+
383
+ ### Step 5: Dosyaları Yaz
384
+
385
+ Her platform için oluşturulan dosyaları doğru konumlara yaz:
386
+
387
+ | Platform | Dosya | Konum |
388
+ |----------|-------|-------|
389
+ | iOS | Colors.swift | `[ios-root]/Sources/DesignSystem/` |
390
+ | iOS | Typography.swift | `[ios-root]/Sources/DesignSystem/` |
391
+ | iOS | Spacing.swift | `[ios-root]/Sources/DesignSystem/` |
392
+ | Android | colors.xml | `[android-root]/app/src/main/res/values/` |
393
+ | Android | colors.xml (night) | `[android-root]/app/src/main/res/values-night/` |
394
+ | Android | dimens.xml | `[android-root]/app/src/main/res/values/` |
395
+ | Android | AppColors.kt | `[android-root]/app/src/main/java/.../ui/theme/` |
396
+ | Android | AppTypography.kt | `[android-root]/app/src/main/java/.../ui/theme/` |
397
+ | Android | AppSpacing.kt | `[android-root]/app/src/main/java/.../ui/theme/` |
398
+ | Web | tokens.css | `[web-root]/src/styles/` |
399
+ | Web | tailwind.config.js | `[web-root]/` |
400
+ | JSON | tokens.json | proje kökü |
401
+
402
+ Dosya başına auto-generated uyarısı ekle.
403
+
404
+ ### Step 6: Cross-Platform Doğrulama
405
+
406
+ Token dosyaları oluşturulduktan sonra platformlar arası değer tutarlılığını kontrol et:
407
+
408
+ **Önemli:** `codeTokens` içindeki token isimleri Figma'daki variable isimleriyle **tam eşleşmeli**. Figma'da `color/primary` varsa `codeTokens`'ta da `color/primary` kullan. Bu araç yalnızca token değerlerini karşılaştırır, platform-spesifik naming convention'larını anlamaz.
409
+
410
+ ```
411
+ figma_check_design_parity(
412
+ codeTokens='{"color/primary": "#3b82f6", "spacing/md": "16", "radius/md": "8"}'
413
+ )
414
+ ```
415
+
416
+ Ek olarak kendi doğrulamamızı da yap (üretilen dosyalar arasında değerleri karşılaştırarak):
417
+
418
+ ```
419
+ Cross-Platform Token Tutarlılık Kontrolü:
420
+ ┌─────────────────┬───────────┬───────────┬───────────┐
421
+ │ Token │ iOS │ Android │ Web │
422
+ ├─────────────────┼───────────┼───────────┼───────────┤
423
+ │ primary │ #3B82F6 │ #3B82F6 │ #3b82f6 │ OK
424
+ │ spacing-md │ 16 pt │ 16 dp │ 16 px │ OK
425
+ │ radius-md │ 8 pt │ 8 dp │ 8 px │ OK
426
+ │ text-size-md │ 14 pt │ 14 sp │ 14 px │ OK
427
+ └─────────────────┴───────────┴───────────┴───────────┘
428
+ Sonuç: Tüm platformlarda token değerleri tutarlı ✓
429
+ ```
430
+
431
+ ## Incremental Güncelleme
432
+
433
+ "Token'ları güncelle" / "sync tokens" dendiğinde:
434
+
435
+ 1. Mevcut token dosyalarını oku (her platform için)
436
+ 2. `figma_get_variables(verbosity="full")` ile güncel Figma verileri çek
437
+ 3. Değişen token'ları tespit et
438
+ 4. Sadece değişen token'ları her platformda güncelle
439
+ 5. Auto-generated timestamp'i güncelle
440
+ 6. Cross-platform tutarlılık kontrolü çalıştır
441
+
442
+ ## Kategori Bazlı Export
443
+
444
+ - "Sadece renkleri export et" → COLOR variable'lar + paint style'lar
445
+ - "Spacing token'larını güncelle" → FLOAT variable'lar (space/spacing adlı)
446
+ - "Typography'yi export et" → text style'lar + font size/weight/line-height variable'lar
447
+
448
+ ## Examples
449
+
450
+ ### Örnek 1: 3 Platform Token Export
451
+
452
+ Kullanıcı: "Figma token'larını iOS, Android ve Web için export et"
453
+
454
+ **Akış:**
455
+
456
+ 1. Figma verilerini çek
457
+ 2. 3 platformun projelerini analiz et
458
+ 3. iOS: `Colors.swift`, `Typography.swift`, `Spacing.swift` üret
459
+ 4. Android: `colors.xml`, `dimens.xml`, `AppColors.kt`, `AppTypography.kt`, `AppSpacing.kt` üret
460
+ 5. Web: `tokens.css`, `tailwind.config.js` update
461
+ 6. JSON: `tokens.json` üret (referans)
462
+ 7. Cross-platform doğrulama çalıştır
463
+
464
+ ### Örnek 2: Sadece Android Token Güncelleme
465
+
466
+ Kullanıcı: "Android renk token'larını güncelle"
467
+
468
+ **Akış:**
469
+
470
+ 1. Figma'dan güncel COLOR variable'ları çek
471
+ 2. Mevcut `colors.xml` ve `AppColors.kt` dosyalarını oku
472
+ 3. Değişen renkleri tespit et
473
+ 4. Sadece değişen renkleri güncelle
474
+ 5. `values-night/colors.xml` da güncelle (dark mode varsa)
475
+
476
+ ## Common Issues and Solutions
477
+
478
+ ### Sorun: Birim farkları (pt vs dp vs px)
479
+
480
+ **Çözüm:** Figma'daki sayısal değer her platformda aynı kalır, sadece birim değişir: iOS = pt, Android = dp/sp, Web = px. 16 her yerde 16'dır.
481
+
482
+ ### Sorun: Android'de hem XML hem Compose token'ları gerekiyor
483
+
484
+ **Çözüm:** İkisini de üret. XML resources → legacy View system, Kotlin objects → Compose. Her iki set de aynı Figma değerlerinden türetilir.
485
+
486
+ ### Sorun: iOS Asset Catalog mu Swift extension mı?
487
+
488
+ **Çözüm:** Kullanıcıya sor. Asset Catalog Interface Builder'da görsel seçim sağlar; Swift extension programmatic erişim sağlar. İkisi birlikte de kullanılabilir.
489
+
490
+ ### Sorun: Figma'da mode 2'den fazla (ör. Light, Dark, HighContrast)
491
+
492
+ **Çözüm:** iOS: Asset Catalog'da "High Contrast" appearance ekle. Android: her mode için ayrı resource qualifier. Web: her mode için ayrı CSS class/data-attribute.
493
+
494
+ ---
495
+
496
+ ## Reverse Flow: Kod → Figma Variable
497
+
498
+ Mevcut akış yalnızca **Figma → Kod** yönünde çalışır. Bu bölüm ters yönü tanımlar: kod tabanındaki token tanımlarını Figma variable'larına yazmak.
499
+
500
+ ### Ne zaman kullanılır
501
+
502
+ - Kod tabanında token'lar tanımlı ama Figma'da henüz variable yok
503
+ - Kod tabanındaki token güncellemelerini Figma'ya yansıtmak
504
+ - JSON contract/W3C Design Token dosyasını Figma'ya aktarmak
505
+
506
+ ### Direction parametresi
507
+
508
+ - `--direction=figma-to-code` — Mevcut varsayılan akış (Figma → kod dosyaları)
509
+ - `--direction=code-to-figma` — Reverse flow (kod → Figma variable'ları)
510
+
511
+ ### Reverse Flow Adımları
512
+
513
+ #### R-Step 1: Kaynak token dosyasını oku
514
+
515
+ Desteklenen kaynak formatları:
516
+
517
+ | Format | Dosya | Ayrıştırma |
518
+ |---|---|---|
519
+ | CSS Custom Properties | `tokens.css` | `--token-name: value` ayrıştır |
520
+ | Tailwind config | `tailwind.config.js` | `theme.extend.*` objelerini çıkar |
521
+ | JSON (W3C Design Tokens) | `tokens.json` | `$value`, `$type` alanları |
522
+ | Swift Color extension | `Colors.swift` | Renk tanımlarını ayrıştır |
523
+ | Android colors.xml | `colors.xml` | `<color name="">` elementleri |
524
+ | Sass variables | `_tokens.scss` | `$token-name: value` ayrıştır |
525
+ | TypeScript constants | `tokens.ts` | `export const` objelerini çıkar |
526
+
527
+ #### R-Step 2: Token'ları kategorize et
528
+
529
+ Kaynak dosyadan çıkarılan her token'ı sınıfla:
530
+
531
+ - **COLOR** — hex, rgb, hsl değerleri
532
+ - **FLOAT** — spacing, radius, font-size (px/dp/pt → sayısal değer)
533
+ - **STRING** — font family, font weight isimleri
534
+
535
+ #### R-Step 3: Mevcut Figma variable'larla karşılaştır
536
+
537
+ ```
538
+ figma_get_variables(verbosity="full")
539
+ ```
540
+
541
+ - Aynı isimde variable varsa: değer farkı kontrol et → güncelle veya atla
542
+ - Yeni token varsa: oluşturulacaklar listesi
543
+ - Figma'da olup kodda olmayan: rapor et (silme önerisi)
544
+
545
+ #### R-Step 4: Collection ve variable oluştur/güncelle
546
+
547
+ Yeni collection gerekiyorsa:
548
+ ```
549
+ figma_create_variable_collection(name="Design Tokens", modes=["Light", "Dark"])
550
+ ```
551
+
552
+ Toplu oluşturma (tercih):
553
+ ```
554
+ figma_batch_create_variables(
555
+ collectionId="<id>",
556
+ variables=[
557
+ { name: "color/primary", type: "COLOR", values: { "Light": "#2563EB", "Dark": "#60A5FA" } },
558
+ { name: "spacing/md", type: "FLOAT", values: { "Light": 16 } },
559
+ ...
560
+ ]
561
+ )
562
+ ```
563
+
564
+ Güncelleme:
565
+ ```
566
+ figma_batch_update_variables(
567
+ updates=[
568
+ { variableId: "<id>", values: { "Light": "#3B82F6" } },
569
+ ...
570
+ ]
571
+ )
572
+ ```
573
+
574
+ #### R-Step 5: Scope ayarla
575
+
576
+ Her variable için uygun scope'u ayarla (figma_execute içinde):
577
+
578
+ ```js
579
+ const variable = await figma.variables.getVariableByIdAsync("<id>");
580
+ // Renk token'ları
581
+ if (variable.resolvedType === "COLOR") {
582
+ variable.scopes = variable.name.includes("text")
583
+ ? ["TEXT_FILL"]
584
+ : ["FRAME_FILL", "SHAPE_FILL"];
585
+ }
586
+ // Spacing token'ları
587
+ if (variable.resolvedType === "FLOAT" && variable.name.includes("spacing")) {
588
+ variable.scopes = ["GAP", "WIDTH_HEIGHT"];
589
+ }
590
+ return { id: variable.id, scopes: variable.scopes };
591
+ ```
592
+
593
+ #### R-Step 6: Doğrulama
594
+
595
+ Oluşturulan variable'ları kontrol et:
596
+
597
+ ```
598
+ figma_get_variables(verbosity="summary")
599
+ ```
600
+
601
+ Sayı ve isimlerin kaynak ile eşleştiğini doğrula.
602
+
603
+ ### Çıktı
604
+
605
+ - Oluşturulan variable sayısı ve listesi
606
+ - Güncellenen variable sayısı ve fark özeti
607
+ - Atlanılan (zaten güncel) token sayısı
608
+ - Figma'da olup kodda olmayan token raporu
609
+
610
+ ## Marka Profili Entegrasyonu
611
+
612
+ `.fmcp-brand-profile.json` varsa:
613
+ - `targetPlatforms` → Yalnızca belirtilen platformlar için token dosyaları üret (tümünü üretme)
614
+
615
+ ## Evolution Triggers
616
+
617
+ - Bridge'e yeni token araçları eklendiğinde (ör. toplu token import aracı) ilgili adımlar güncellenmeli
618
+ - W3C Design Tokens spec güncellendiğinde JSON formatı uyarlanmalı
619
+ - Yeni platform formatları (Flutter, .NET MAUI vb.) desteklendiğinde çıktı tablosu genişletilmeli