@atezer/figma-mcp-bridge 1.7.29 → 1.9.0

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 (57) hide show
  1. package/CHANGELOG.md +403 -0
  2. package/README.md +4 -3
  3. package/agents/_orchestrator-protocol.md +185 -0
  4. package/agents/ds-auditor.md +73 -22
  5. package/agents/screen-builder.md +60 -22
  6. package/agents/token-syncer.md +63 -19
  7. package/dist/core/code-warnings.d.ts +38 -0
  8. package/dist/core/code-warnings.d.ts.map +1 -0
  9. package/dist/core/code-warnings.js +191 -0
  10. package/dist/core/code-warnings.js.map +1 -0
  11. package/dist/core/device-presets.d.ts +49 -0
  12. package/dist/core/device-presets.d.ts.map +1 -0
  13. package/dist/core/device-presets.js +141 -0
  14. package/dist/core/device-presets.js.map +1 -0
  15. package/dist/core/instructions.d.ts +4 -2
  16. package/dist/core/instructions.d.ts.map +1 -1
  17. package/dist/core/instructions.js +239 -29
  18. package/dist/core/instructions.js.map +1 -1
  19. package/dist/core/plugin-bridge-connector.d.ts +32 -0
  20. package/dist/core/plugin-bridge-connector.d.ts.map +1 -1
  21. package/dist/core/plugin-bridge-connector.js +31 -2
  22. package/dist/core/plugin-bridge-connector.js.map +1 -1
  23. package/dist/core/plugin-bridge-server.d.ts +8 -0
  24. package/dist/core/plugin-bridge-server.d.ts.map +1 -1
  25. package/dist/core/plugin-bridge-server.js +27 -2
  26. package/dist/core/plugin-bridge-server.js.map +1 -1
  27. package/dist/core/response-guard.d.ts +23 -0
  28. package/dist/core/response-guard.d.ts.map +1 -1
  29. package/dist/core/response-guard.js +113 -0
  30. package/dist/core/response-guard.js.map +1 -1
  31. package/dist/core/version.d.ts +1 -1
  32. package/dist/core/version.d.ts.map +1 -1
  33. package/dist/core/version.js +1 -1
  34. package/dist/core/version.js.map +1 -1
  35. package/dist/local-plugin-only.d.ts.map +1 -1
  36. package/dist/local-plugin-only.js +504 -85
  37. package/dist/local-plugin-only.js.map +1 -1
  38. package/f-mcp-plugin/code.js +514 -29
  39. package/f-mcp-plugin/ui.html +62 -6
  40. package/package.json +1 -1
  41. package/skills/SKILL_INDEX.md +13 -1
  42. package/skills/apply-figma-design-system/SKILL.md +37 -0
  43. package/skills/audit-figma-design-system/SKILL.md +38 -0
  44. package/skills/code-design-mapper/SKILL.md +37 -0
  45. package/skills/design-token-pipeline/SKILL.md +44 -0
  46. package/skills/figma-canvas-ops/SKILL.md +200 -240
  47. package/skills/fmcp-ds-audit-orchestrator/SKILL.md +205 -0
  48. package/skills/fmcp-intent-router/SKILL.md +574 -0
  49. package/skills/fmcp-project-rules/SKILL.md +9 -5
  50. package/skills/fmcp-screen-orchestrator/SKILL.md +166 -0
  51. package/skills/fmcp-screen-recipes/SKILL.md +528 -0
  52. package/skills/fmcp-token-sync-orchestrator/SKILL.md +198 -0
  53. package/skills/generate-figma-library/SKILL.md +38 -0
  54. package/skills/generate-figma-screen/SKILL.md +382 -19
  55. package/skills/implement-design/SKILL.md +32 -0
  56. package/skills/inspiration-intake/SKILL.md +220 -0
  57. package/skills/visual-qa-compare/SKILL.md +33 -0
@@ -0,0 +1,574 @@
1
+ ---
2
+ name: fmcp-intent-router
3
+ description: F-MCP ile ilgili herhangi bir kullanıcı talebinin ilk giriş noktası. Kullanıcının niyetini analiz eder, hangi hedef SKILL'in çalıştırılacağına karar verir, o SKILL için gereken eksik input'ları tek turda toplar, özet+onay alır ve ondan sonra hedef SKILL'i çalıştırır. "figma", "ekran oluştur", "tasarım yap", "component üret", "DS denetle", "token sync", "kod üret", "design system" gibi her F-MCP-tetiklemesiyle aktive olur. Claude hiçbir figma_* yazma tool'u çalıştırmadan ÖNCE bu protokolü uygulamak zorundadır.
4
+ metadata:
5
+ mcp-server: user-figma-mcp-bridge
6
+ version: 1.8.1
7
+ priority: 100
8
+ phase: entry-gate
9
+ personas:
10
+ - designer
11
+ - uidev
12
+ - designops
13
+ ---
14
+
15
+ # F-MCP Intent Router — Universal Entry Gate
16
+
17
+ ## Neden Var?
18
+
19
+ F-MCP Bridge'in 20+ SKILL'i var. Her biri farklı bir iş yapar (ekran oluşturma, denetim, kütüphane inşası, vb.) ve her biri farklı input'lar ister. Claude kullanıcı "figma'da ekran yap" dediğinde:
20
+
21
+ 1. Hangi SKILL lazım? (`generate-figma-screen` mi `generate-figma-library` mi?)
22
+ 2. Hangi bilgiler eksik? (device? DS? benchmark? içerik bölümleri?)
23
+ 3. Kullanıcı ne onay verdi?
24
+
25
+ Bu SKILL bu üç soruyu **upstream** çözer. Claude intent'i netleştirmeden hiçbir `figma_execute`, `figma_create_frame`, `figma_clone_screen_to_device` çalıştırmaz. "Hızlı ve doğru" kuralı: yanlış varsayım yapmaktansa 1 soru sormak her zaman daha hızlıdır.
26
+
27
+ ## Protokol (9 Adım — v1.9.1+)
28
+
29
+ Kullanıcı F-MCP ile ilgili herhangi bir talep yaptığında Claude bu 9 adımı SIRAYLA uygular. Hiçbir adım atlanmaz.
30
+
31
+ ### 🚨 Adım 0 — DS GATE (v1.9.1+ MUTLAK İLK KAPI)
32
+
33
+ **Herhangi bir intent analysis veya figma_* tool çağrısından ÖNCE:**
34
+
35
+ 1. `.claude/design-systems/active-ds.md` dosyasını oku
36
+ 2. `Status:` alanını kontrol et:
37
+ - **`✅ Aktif`** → DS net, Adım 1'e (Intent Analysis) geç
38
+ - **`❌ Henüz seçilmedi`** VEYA dosya yok → **DUR**, hiçbir tool çağırma, kullanıcıya DS sorusu sor:
39
+ > "Aktif bir design system belirlenmemiş. Hangi DS ile ilerlemek istersiniz?
40
+ > (Mevcut seçenekler için library listesini vermenizi istiyorum, veya SUI gibi spesifik bir isim verin.)
41
+ > Bu sorunun cevabı gelmeden hiçbir keşif / tarama yapmayacağım."
42
+ 3. Kullanıcı cevabı gelince `active-ds.md`'yi güncelle (`Status: ✅ Aktif`, `Library Name: <isim>`), sonra Adım 1'e geç.
43
+
44
+ **Neden bu kadar katı:**
45
+ - DS belirsizken `figma_search_assets`, `figma_get_file_data`, `figma_get_library_variables` çağırmak = kullanıcının istemediği library'leri enumere etmek = **token israfı + UX bozulması**
46
+ - Test geçmişinde gözlenen hata: benchmark Figma dosyasının 24+ library component'i enumere edildi, sonra "hangi DS?" soruldu. **Bu sıra YASAK.**
47
+
48
+ **Bu adımda çağrılabilen tek Figma tool'u:**
49
+ - ✅ `figma_get_status()` — plugin bağlantı kontrolü, DS bağımsız
50
+ - **Başka HİÇBİR figma_* YASAK.** `figma_get_file_data`, `figma_search_assets`, `figma_search_components`, `figma_get_library_variables`, `figma_get_variables`, `figma_get_styles` — **hepsi YASAK** ta ki Adım 0 geçilene kadar.
51
+
52
+ ---
53
+
54
+ ### Adım 1 — Intent Analysis
55
+
56
+ Kullanıcı talebini oku. Anahtar kelimeleri tara:
57
+
58
+ | Kullanıcı ifadesi | Olası SKILL adayı |
59
+ |---|---|
60
+ | "ekran yap", "tasarım oluştur", "ui çiz", "UI'ı Figma'ya aktar", "landing page", "mobil ekran" | `generate-figma-screen` |
61
+ | "DS hizala", "SUI'ye uygula", "design system uygula", "token'lara bağla" | `apply-figma-design-system` |
62
+ | "denet", "audit", "DS sağlığı", "token bağlı mı", "ne kadar DS uyumlu" | `audit-figma-design-system` |
63
+ | "kütüphane yap", "component set üret", "DS kütüphane inşa" | `generate-figma-library` |
64
+ | "Figma'dan kod üret", "implement design", "SwiftUI/Compose/React kodu" | `implement-design` |
65
+ | "kod ↔ figma eşleştir", "Code Connect", "design mapping" | `code-design-mapper` |
66
+ | "görsel karşılaştır", "visual diff", "QA screenshot" | `visual-qa-compare` |
67
+ | "token sync", "design tokens export", "CSS/Swift/Kotlin token" | `design-token-pipeline` |
68
+ | "figjam diyagram", "flowchart", "mind map" | `figjam-diagram-builder` |
69
+ | "ekran özeti", "analiz et", "ne içeriyor" | `figma-screen-analyzer` |
70
+ | "accessibility", "a11y", "WCAG", "contrast check" | `figma-a11y-audit` |
71
+ | "drift", "kod/tasarım sapması", "out of sync" | `design-drift-detector` |
72
+ | "UX copy", "microcopy", "buton metni", "empty state" | `ux-copy-guidance` |
73
+ | "bu görselden ilham al", "şu resim gibi", "link'teki tasarımdan", "dribbble/behance", "benchmark'tan varyasyon" | `inspiration-intake` → `generate-figma-screen` |
74
+
75
+ **Not (v1.8.3+):** `inspiration-intake` bir **ön-işleme** skill'idir. Kullanıcı bir Figma benchmark linki, internet görsel linki veya sohbete yüklenmiş görsel ile gelirse önce bu skill çalıştırılır (structural_intent JSON üretir, DEĞER çıkarmaz), sonra çıktısı `generate-figma-screen`'in `reference_benchmark` parametresine beslenir. v1.8.2 build-from-scratch kuralı ile tam uyumludur — clone değil, inspiration.
76
+
77
+ Mode tespiti:
78
+ - Figma URL pattern (`figma.com/file/...?node-id=`) → `inspiration-intake` (source_type: figma_url)
79
+ - Dribbble/Behance/genel HTTP URL → `inspiration-intake` (source_type: image_url, WebFetch fallback'li)
80
+ - Kullanıcı mesajında görsel attachment → `inspiration-intake` (source_type: image_uploaded)
81
+
82
+ ### Adım 2 — State Files Check
83
+
84
+ Claude her seferinde üç state dosyasını okur:
85
+
86
+ ```
87
+ 1. .claude/design-systems/active-ds.md
88
+ → Aktif DS belirtilmiş mi? (örn "❖ SUI")
89
+
90
+ 2. .claude/design-systems/last-intent.md
91
+ → Son tamamlanan intent nedir? (device, ds, skill, inputs)
92
+
93
+ 3. .claude/design-systems/intent-history.md
94
+ → Son 5 intent nedir? (LRU)
95
+ ```
96
+
97
+ Bu dosyalar Claude'un "öncekiyle aynı mı?" sorusu sormasını sağlar.
98
+
99
+ ### Adım 3b — Approach Karar Mantığı (v1.8.2+)
100
+
101
+ Target skill `generate-figma-screen` ise, **yaklaşım ayrımı** yap.
102
+ Kullanıcının cümlesinde şu keyword'leri ara ve `approach` input'unu doldur:
103
+
104
+ | Keyword | Yaklaşım | Tool Önerisi |
105
+ |---|---|---|
106
+ | "alternatif", "varyasyon", "farklı", "yeni", "tasarla", "redesign", "iyileştir" | `build-from-scratch` ⭐ | `figma_execute` + Step 5, **`figma_clone_screen_to_device` KULLANMA** |
107
+ | "aynı ekranı X device'a migrate et", "boyut değiştir", "iPhone 13→17", "klonla" | `clone-to-device` | `figma_clone_screen_to_device` |
108
+ | "mevcut ekranı DS'ye hizala", "tokenize et", "tokens bind et" | `apply-ds-to-existing` | `apply-figma-design-system` SKILL |
109
+ | Hiçbiri net değil | **Kullanıcıya sor** | — |
110
+
111
+ **⭐ ÖNEMLİ:** Eğer kullanıcı "3 alternatif" veya "varyasyon" derse, `approach = build-from-scratch` **DEFAULT**'tur. `figma_clone_screen_to_device` tool'u **ASLA önerilmez**. Clone tool'u kopyalama yaparken benchmark'ın **mevcut yanlışlıklarını** (hardcoded rectangle, missing token binding, non-responsive layout) kopyalar. Bu kullanıcının istediği **gerçek varyasyon yaratmaz**.
112
+
113
+ Eğer `approach = build-from-scratch` ise, Claude'un akış haritası:
114
+ ```
115
+ figma_search_assets ile SUI bileşenlerini bul
116
+
117
+ figma_get_library_variables ile DS token key'lerini topla
118
+
119
+ figma_execute ile bölüm bölüm inşa et:
120
+ - figma.createFrame() + layoutMode + padding (variable binding)
121
+ - importComponentByKeyAsync + createInstance (DS instance'lar)
122
+ - setBoundVariableForPaint (fills token bind)
123
+ - setBoundVariable (padding/itemSpacing/cornerRadius token bind)
124
+ - importStyleByKeyAsync + setTextStyleIdAsync (text style bind)
125
+ - appendChild sonrası layoutSizingHorizontal/Vertical = FILL
126
+
127
+ figma_validate_screen ile skor kontrolü (≥80)
128
+ ```
129
+
130
+ **Özet + Onay ekranında göster:**
131
+ ```
132
+ 📋 Yaklaşım: build-from-scratch ⭐
133
+ Bu kullanıcının "alternatif tasarım" isteğine uygun doğru yol.
134
+ Clone tool kullanılmayacak. Her alternatif sıfırdan SUI bileşenleriyle inşa edilecek.
135
+ Benchmark (139:xxx) sadece ilham kaynağı — kopyalanmayacak.
136
+ ```
137
+
138
+ ### Adım 3 — Decide Target Skill
139
+
140
+ Adım 1'deki keyword eşleşmesi + Adım 2'deki state bilgisi → tek bir SKILL seç.
141
+
142
+ **Karar mantığı:**
143
+
144
+ ```
145
+ IF user request EXACTLY matches one keyword pattern
146
+ → Select that skill (single match, no question)
147
+
148
+ ELSE IF user request matches 2+ patterns (ambiguous)
149
+ → Ask user: "Şunlardan hangisini yapayım?"
150
+ → Use AskUserQuestion with matched skills as options
151
+
152
+ ELSE IF user request is generic ("figma'da bir şey yap")
153
+ → Ask user: "Tam olarak ne yapmak istiyorsun?"
154
+ → Offer top 5 common skills as options
155
+
156
+ ELSE (no match)
157
+ → Ask user to clarify intent in natural language
158
+ ```
159
+
160
+ ### Adım 4 — Read Target Skill Metadata
161
+
162
+ Seçilen SKILL'in frontmatter'ını oku. `required_inputs` bloğunu parse et:
163
+
164
+ ```yaml
165
+ required_inputs:
166
+ - name: device
167
+ type: enum
168
+ options: ["iPhone 17", "iPhone 16 Pro Max", ...]
169
+ question: "Hangi device boyutunda olsun?"
170
+ required: true
171
+ default_source: ".claude/design-systems/last-intent.md#device"
172
+ - name: design_system
173
+ type: from_state
174
+ source: ".claude/design-systems/active-ds.md#Library Name"
175
+ required: true
176
+ - name: reference_benchmark
177
+ type: node_id_or_none
178
+ question: "Referans benchmark node var mı?"
179
+ required: false
180
+ affects: ["screen_type", "sections"] # verilirse bunlar atlanır
181
+ - name: screen_type
182
+ type: enum
183
+ ...
184
+ skip_if: "reference_benchmark != none"
185
+ ```
186
+
187
+ **Input türleri:**
188
+ - `enum` — Kullanıcı seçenekten seçer
189
+ - `from_state` — State dosyasından oku, yoksa fallback_question sor
190
+ - `node_id_or_none` — Figma node ID veya "yok"
191
+ - `string` — Serbest metin
192
+ - `string_list` — Virgülle ayrılmış liste
193
+ - `boolean` — Yes/No
194
+
195
+ **Özellikler:**
196
+ - `required: true/false` — Zorunlu mu?
197
+ - `default_source` — State'ten default çekilir
198
+ - `default` — Sabit default değer
199
+ - `skip_if` — Koşullu atlamak (başka input'un değerine bağlı)
200
+ - `affects` — Bu input verilirse atlanacak diğer input'ları belirtir
201
+
202
+ ### Adım 5 — Gather Missing Inputs (Smart Skipping)
203
+
204
+ Claude her `required_inputs` girdisini şu mantıkla işler:
205
+
206
+ ```
207
+ FOR each input in required_inputs:
208
+ IF input has default_source AND state file value exists:
209
+ → USE state value, don't ask
210
+
211
+ IF input has default:
212
+ → USE default, don't ask
213
+
214
+ IF user request already mentions this input (parse from prompt):
215
+ → USE parsed value, don't ask
216
+
217
+ IF another input has affects: [this_input_name] AND that input was set:
218
+ → SKIP this input (will be derived from affecting input)
219
+
220
+ IF input has skip_if AND condition evaluates true:
221
+ → SKIP this input
222
+
223
+ ELSE:
224
+ → ADD to missing list
225
+ ```
226
+
227
+ Missing list'teki tüm soruları **TEK** `AskUserQuestion` çağrısında toplayıp sor. Max 4 soru/çağrı (AskUserQuestion limiti). 5+ soru gerekiyorsa 2 ayrı çağrı yap, ama ÖNCE kritik 4'ü sor, sonra kalanları.
228
+
229
+ **Örnek — generate-figma-screen:**
230
+
231
+ ```
232
+ Kullanıcı: "sui ile ekran yap"
233
+
234
+ State okuma:
235
+ - active-ds.md → "❖ SUI" ✓ (design_system sorulmaz)
236
+ - last-intent.md → yok
237
+
238
+ Missing inputs:
239
+ 1. device (zorunlu)
240
+ 2. reference_benchmark (opsiyonel ama soruyu sor)
241
+ 3. screen_type (zorunlu, reference'a bağlı)
242
+ 4. sections (zorunlu, reference'a bağlı)
243
+ 5. variants (opsiyonel, default "single")
244
+
245
+ AskUserQuestion (tek çağrı, 4 soru):
246
+ Q1: Hangi device? (iPhone 17 / 16 Pro Max / Android / iPad / Custom)
247
+ Q2: Referans benchmark var mı? (Evet node ID / Hayır template kullan)
248
+ Q3: Ekran tipi? (dashboard / list / detail / form / login)
249
+ Q4: Ana bölümler? (kısa liste yaz)
250
+ ```
251
+
252
+ ### Adım 6 — Summary + Explicit Confirmation Gate
253
+
254
+ Tüm input'lar toplandıktan sonra Claude **AYRI** bir `AskUserQuestion` çağrısıyla onay ister:
255
+
256
+ ```
257
+ "Anladım, şunu yapacağım:
258
+
259
+ 🎯 Skill: generate-figma-screen
260
+ 📱 Device: iPhone 17 (402×874)
261
+ 🎨 DS: ❖ SUI
262
+ 📋 Reference: 139:3407 (Vadesiz TL Hesabı)
263
+ 🧩 Yaklaşım: clone-to-device with SUI token binding
264
+ 📊 Çıktı: 1 ekran 'Vadesiz TL - iPhone 17'
265
+ ⏱️ Tahmini süre: 20 saniye
266
+
267
+ Onaylıyor musun?"
268
+
269
+ Seçenekler:
270
+ [✅ Evet, başla]
271
+ [✏️ Değiştir (hangi alan?)]
272
+ [❌ İptal]
273
+ ```
274
+
275
+ **Bu adım ATLANMAZ.** Fast path dahil HER durumda onay sorusu sorulur. İstisna: sadece "önceki ile aynı" cevabı gelen repeat path, tek adım onay.
276
+
277
+ ### Adım 7 — Execute Target Skill
278
+
279
+ Onay alındıktan sonra:
280
+
281
+ 1. Seçilen SKILL'in `SKILL.md` dosyasını yükle (Skill tool ile)
282
+ 2. Kullanıcıdan topladığın input'ları context'te tut
283
+ 3. SKILL'in kendi Step 1-N akışını çalıştır
284
+
285
+ **ÖNEMLİ:** Target SKILL zaten Step 0 (DS context check), Step 1-N (iş), Step N+1 (self-audit via `figma_validate_screen`) yapacak. Intent router'ın işi sadece input gathering ve onay — execution target SKILL'e bırakılır.
286
+
287
+ ### Adım 8 — Persist Intent
288
+
289
+ SKILL tamamlandıktan sonra (başarılı veya başarısız):
290
+
291
+ **1. `.claude/design-systems/last-intent.md` güncelle:**
292
+ ```markdown
293
+ # Last Intent
294
+ **Updated:** 2026-04-14 14:23
295
+
296
+ ## Selected Skill
297
+ generate-figma-screen
298
+
299
+ ## Inputs
300
+ - device: iPhone 17
301
+ - design_system: ❖ SUI
302
+ - reference_benchmark: 139:3407
303
+ - (other inputs)
304
+
305
+ ## Result
306
+ - output_node: 173:12130
307
+ - validation_score: 95/100
308
+ - duration: 18s
309
+ - status: ✅ Success
310
+
311
+ ## User Confirmation
312
+ ✅ Onaylandı 14:23
313
+ ```
314
+
315
+ **2. `.claude/design-systems/intent-history.md` başına yeni entry ekle** (LRU 5, eskisi silinir).
316
+
317
+ ## Fast Paths (Akıllı Kısayollar)
318
+
319
+ ### Fast Path 1 — Detaylı Talep
320
+
321
+ Kullanıcı talebi zaten tüm input'ları içeriyorsa (örn. "139:3407'yi iPhone 17'ye SUI ile klonla"), Adım 5 atlanır. Direkt Adım 6 (onay) → Adım 7 (execute).
322
+
323
+ **Örnek:**
324
+ ```
325
+ Kullanıcı: "139:3407'yi iPhone 17'ye SUI ile klonla"
326
+
327
+ Parse:
328
+ - skill: generate-figma-screen (klonla keyword)
329
+ - device: iPhone 17 (explicit)
330
+ - ds: SUI (explicit + active-ds.md confirm)
331
+ - reference: 139:3407 (explicit)
332
+ - variants: single (default)
333
+
334
+ → Direkt Adım 6: onay sor
335
+ → Kullanıcı "Evet" → Adım 7: execute
336
+ ```
337
+
338
+ ### Fast Path 2 — Repeat
339
+
340
+ Kullanıcı "bir tane daha yap" / "aynısını yap" derse, `last-intent.md`'yi oku ve tek bir soruyla onay al:
341
+
342
+ ```
343
+ "Öncekiyle aynı ayarlarla mı devam edeyim?
344
+
345
+ • Skill: generate-figma-screen
346
+ • Device: iPhone 17
347
+ • DS: ❖ SUI
348
+ • Yaklaşım: clone-to-device
349
+
350
+ [✅ Aynı]
351
+ [✏️ Değiştir]
352
+ [❌ İptal]"
353
+ ```
354
+
355
+ ### Fast Path 3 — Partial Reuse
356
+
357
+ Kullanıcı "aynı ama Android'de" derse, `last-intent.md`'nin çoğunu reuse et, sadece değişen alanları sor:
358
+
359
+ ```
360
+ State'ten reuse: ds, reference, type, sections, variants
361
+ Kullanıcıdan sor: device = Android (hangisi? - Compact/Medium)
362
+ ```
363
+
364
+ ## Ambiguity Handling
365
+
366
+ ### Durum 1 — Belirsiz talep
367
+
368
+ ```
369
+ Kullanıcı: "figma'da bir şey yap"
370
+
371
+ Router: Tek SKILL eşleşmedi.
372
+
373
+ AskUserQuestion:
374
+ "Ne yapmak istediğini netleştirebilir misin?
375
+ (a) Yeni ekran oluştur
376
+ (b) Mevcut ekranı DS'ye uydur (reconcile)
377
+ (c) Dosyayı denetle / rapor çıkar
378
+ (d) Figma → kod üret
379
+ (e) Başka — açıklayarak yaz"
380
+ ```
381
+
382
+ ### Durum 2 — Çoklu eşleşme
383
+
384
+ ```
385
+ Kullanıcı: "SUI ile bir şey yap"
386
+
387
+ Router: 4 SKILL match (create, apply, audit, library).
388
+
389
+ AskUserQuestion:
390
+ "SUI ile ne yapmak istiyorsun?
391
+ (a) Yeni ekran oluştur (generate-figma-screen)
392
+ (b) Mevcut ekrana SUI uygula (apply-figma-design-system)
393
+ (c) SUI uyumu denet (audit-figma-design-system)
394
+ (d) SUI library'ye component ekle (generate-figma-library)"
395
+ ```
396
+
397
+ ### Durum 3 — Yanlış SKILL seçme riski
398
+
399
+ Kullanıcı "token oluştur" derse:
400
+ - Yanlış: `generate-figma-screen` (token yok o)
401
+ - Doğru: `generate-figma-library` (DS kütüphane inşası, içinde token creation var)
402
+ - Alternatif: `design-token-pipeline` (external token sync)
403
+
404
+ Router **sorar:**
405
+ ```
406
+ "Token işi için:
407
+ (a) Figma'da yeni variable/token oluştur (library)
408
+ (b) Kod tarafındaki token'ları Figma'ya sync et (pipeline)
409
+ (c) Figma token'larını CSS/Swift/Kotlin'a export et (pipeline)"
410
+ ```
411
+
412
+ ## Tool Failure Recovery Protocol (v1.8.2+)
413
+
414
+ Tool çağrısı başarısız olursa (timeout, error, unexpected result),
415
+ şu protokolü izle. **ASLA körü körüne retry yapma** — çöp birikir.
416
+
417
+ ### Retry Kuralları
418
+
419
+ 1. **İlk hata (timeout/error):** 1 kez retry et, **farklı parametre** ile:
420
+ - `figma_clone_screen_to_device` timeout → küçük source node dene veya farklı targetDevice
421
+ - `figma_execute` timeout → kod parçalarına böl, timeout param artır (max 30000)
422
+ - `figma_validate_screen` timeout → minScore düşür veya daha küçük alt-node'a uygula
423
+ 2. **İkinci hata (aynı tool):** **DUR**. Kullanıcıya git, strateji iste.
424
+ 3. **ASLA** aynı tool + aynı param ile 3 kez çağırma.
425
+
426
+ ### Orphan Cleanup (ZORUNLU)
427
+
428
+ Clone/create tool'ları timeout aldıysa **dosyada yarım iş kalmış olabilir**.
429
+ Her başarısız write-tool denemesi sonrası Claude cleanup protokolünü çalıştırır:
430
+
431
+ 1. `figma_get_file_data(depth=1, verbosity="summary")` ile hedef sayfayı tara
432
+ 2. Son 5 dakikada oluşmuş, beklenmedik isimde veya duplicate node'ları tespit et
433
+ 3. Her şüpheli node için `figma_get_design_context` ile detayına bak (content sağlamı mı?)
434
+ 4. Kullanıcıya listele:
435
+ ```
436
+ ⚠️ Timeout sonrası şu orphan node'ları buldum:
437
+ 1. 175:12172 "Hesaplarım — Hero Card — iPhone 17" (yarım, child count: 4)
438
+ 2. 175:12302 "Hesaplarım — Hero Card — iPhone 17" (yarım, child count: 8)
439
+
440
+ Silmemi ister misin?
441
+ [✅ Sil] [👁️ Önce screenshot göster] [❌ Kalsın]
442
+ ```
443
+ 5. Onay sonrası `figma_execute` ile `node.remove()` uygula
444
+
445
+ ### Failure Escalation Template
446
+
447
+ 2+ retry sonrası kullanıcıya şu formatla git:
448
+
449
+ ```
450
+ ⚠️ Alternatif N ({name}) oluşturulamadı.
451
+
452
+ **Denenen:**
453
+ - figma_clone_screen_to_device (2 timeout)
454
+ - figma_execute manual fallback (failed)
455
+
456
+ **Orphan node'lar (dosyada kaldı):** [list of IDs]
457
+
458
+ **Seçenekler:**
459
+ [A] Orphan'ları sil ve farklı kaynak node ile yeniden dene
460
+ [B] Orphan'ları sil ve bu alternatifi atla, Turn N+1'e geç
461
+ [C] Dur, test iptal — orphan'ları manuel sileyim
462
+ ```
463
+
464
+ ## Benchmark Selection Validation (v1.8.2+)
465
+
466
+ Kullanıcı benchmark node ID verdiğinde, Claude **HEMEN klonlamaya geçme**.
467
+ Önce benchmark'ı DOĞRULA:
468
+
469
+ ### Adım 1: Node Tipini Kontrol Et
470
+
471
+ `figma_get_design_context(nodeId=<user_input>)` çağır ve `node.type`'ı kontrol et:
472
+
473
+ #### Eğer tip **PAGE** ise → Altındaki child'ları listele, kullanıcıya sor
474
+
475
+ ```
476
+ Verdiğin node bir sayfa (PAGE). Altında şu adaylar var:
477
+
478
+ 1. Vadesiz TL — SUI v10 (Hero Card) — 4 child (temiz, hızlı clone)
479
+ 2. Vadesiz TL — SUI v11 (Segmented) — 5 child (temiz, hızlı clone)
480
+ 3. Vadesiz TL — SUI v12 (Dark Header) — 3 child (temiz, hızlı clone)
481
+ 4. Hesaplarım — 14 child (kaba draft, yavaş)
482
+
483
+ Hangisi asıl benchmark? Önerim: 1/2/3 (temiz v-numaralı alternatifler).
484
+ ```
485
+
486
+ #### Eğer tip **FRAME** ise → `childCount` kontrol et
487
+
488
+ - **≤ 5 child:** Kullan, hızlı
489
+ - **5-15 child:** Kullan ama kullanıcıyı bilgilendir: "Benchmark orta büyüklükte, clone ~30s sürebilir"
490
+ - **15-25 child:** **Uyar:**
491
+ ```
492
+ ⚠️ Benchmark {N} child içeriyor. Clone 60+ saniye sürebilir.
493
+
494
+ Önerim:
495
+ [A] Yine de kullan (sabırlı ol)
496
+ [B] Parent'ın siblings'ini tara, daha küçük bir alternatif öner
497
+ [C] Farklı bir benchmark seç
498
+ ```
499
+ - **25+ child:** **DUR**. Otomatik parent'ın siblings'ini tara, daha küçük alternatifler öner. Büyük benchmark'ı onaysız kullanma.
500
+
501
+ #### Eğer tip başka ise (INSTANCE, COMPONENT, vs.) → Hata
502
+
503
+ "Benchmark FRAME olmalı. {type} tipinde node benchmark olarak kullanılamaz."
504
+
505
+ ### Adım 2: Siblings Tara (PAGE/FRAME için)
506
+
507
+ Parent'ta sibling node'lar varsa, `✦`, `v10`, `v11`, `alternative`, `variant`
508
+ gibi keyword'lerle filtrele ve kullanıcıya alternatif öner:
509
+
510
+ ```
511
+ Verdiğin benchmark: Hesaplarım (14 child)
512
+ Aynı parent'ta daha küçük ve temiz alternatifler var:
513
+ - v10 Hero Card (4 child)
514
+ - v11 Segmented (5 child)
515
+ Bunlardan birini kullanmak ister misin?
516
+ ```
517
+
518
+ ### Adım 3: Responsive/Auto-Layout Ön-Kontrol
519
+
520
+ Benchmark'ı klonlamadan önce onun **zaten** responsive olup olmadığını
521
+ kontrol et:
522
+
523
+ ```js
524
+ // Claude figma_execute ile çalıştırır:
525
+ var n = await figma.getNodeByIdAsync(benchmarkId);
526
+ return {
527
+ layoutMode: n.layoutMode,
528
+ primaryAxisSizingMode: n.primaryAxisSizingMode,
529
+ counterAxisSizingMode: n.counterAxisSizingMode,
530
+ hasAutoLayout: n.layoutMode !== 'NONE',
531
+ };
532
+ ```
533
+
534
+ Eğer `layoutMode === 'NONE'` ise **uyar:**
535
+ ```
536
+ ⚠️ Bu benchmark'ın auto-layout'u yok (layoutMode=NONE).
537
+ Clone yaparsan yeni ekran da responsive olmayacak.
538
+
539
+ Önerilen: clone yerine Step 5 "Build from Scratch" akışı kullan.
540
+ ```
541
+
542
+ ## Anti-Patterns (Claude'un Yapmaması Gerekenler)
543
+
544
+ ❌ **YANLIŞ:** Kullanıcı "ekran yap" deyince direkt `figma_create_frame` çağırmak.
545
+ ✅ **DOĞRU:** Önce Adım 1-6 uygula, onay al, sonra target SKILL'i çalıştır.
546
+
547
+ ❌ **YANLIŞ:** 4 ayrı AskUserQuestion ile tek tek sormak.
548
+ ✅ **DOĞRU:** Mümkün olan en az sayıda AskUserQuestion çağrısı (tek çağrıda 4 soru).
549
+
550
+ ❌ **YANLIŞ:** "Default iPhone 13 kullanayım" diye kendi kendine varsayım yapmak.
551
+ ✅ **DOĞRU:** Device bilgisi yoksa **sor**. Varsayım yapma.
552
+
553
+ ❌ **YANLIŞ:** Onay aşamasını atlamak ("zaten açık") diye execute'a geçmek.
554
+ ✅ **DOĞRU:** Her zaman Adım 6'yı uygula. Fast path bile onay sorusu sorar.
555
+
556
+ ❌ **YANLIŞ:** `last-intent.md`'yi görmezden gelip her seferinde baştan sormak.
557
+ ✅ **DOĞRU:** Aynı session'da ikinci talep → repeat path.
558
+
559
+ ❌ **YANLIŞ:** Bir SKILL'i yükleyip sonra metadata'sını okumamak.
560
+ ✅ **DOĞRU:** Target SKILL'in `required_inputs`'ını ALWAYS parse et.
561
+
562
+ ## Referanslar
563
+
564
+ - Her F-MCP SKILL'in `required_inputs` metadata'sı — bu router'ın kullandığı shape
565
+ - `.claude/design-systems/active-ds.md` — DS context (v1.8.0+)
566
+ - `.claude/design-systems/last-intent.md` — son tamamlanan intent
567
+ - `.claude/design-systems/intent-history.md` — son 5 intent LRU
568
+ - `src/core/instructions.ts` — FMCP_INSTRUCTIONS "INTENT ROUTER ENTRY" bölümü (v1.8.1+)
569
+
570
+ ## Evolution Triggers
571
+
572
+ - Yeni F-MCP SKILL eklendiğinde: Adım 1 keyword tablosuna ekle
573
+ - SKILL'e yeni input eklendiğinde: Adım 4'ün parse mantığı metadata'yı otomatik yakalar, router'ı güncellemeye gerek yok
574
+ - Kullanıcı geri bildirim verirse ("çok soru soruyorsun"): Fast path'lerin aktivasyon eşiklerini düşür
@@ -56,12 +56,16 @@ Hiçbir skill gömülü/hardcoded design token değeri içeremez ve kullanamaz.
56
56
 
57
57
  1. **Önce kayıtlı kütüphaneyi oku:** `.claude/libraries/` dizinindeki kütüphane dosyasını kontrol et. Font ailesi, variable collection'lar ve style listesi orada.
58
58
  2. **Canlı değerleri Figma'dan al:**
59
- - Font → `figma_get_styles()` text style'larından veya kütüphanenin `Font Ailesi` alanından
60
- - Renkler → `figma_get_variables()` veya `figma_get_styles()` paint style'larından
61
- - Boyutlar/spacing → `figma_get_variables()` variable collection'larından
62
- - Gölgeler → `figma_get_styles()` effect style'larından
59
+ - **Kütüphane variable'ları (renkler, spacing)** → `figma_get_library_variables()` veya `figma_execute` ile `figma.teamLibrary.getAvailableLibraryVariableCollectionsAsync()` + `getVariablesInLibraryCollectionAsync()` — DS dosyasına bağlanmak GEREKMEZ, hedef dosyadan çalışır
60
+ - **Lokal variable'lar** → `figma_get_variables()` sadece dosya içi değerler
61
+ - **Lokal stiller** → `figma_get_styles()` sadece dosya içi stiller
62
+ - **Kütüphane text style'ları** cache'den key al, `figma.importStyleByKeyAsync(key)` ile import et. Cache yoksa REST API: `figma_rest_api GET /v1/files/{fileKey}/styles`
63
+ - Font → kütüphane text style'larından veya kütüphanenin `Font Ailesi` alanından
64
+ - Gölgeler → `figma_get_styles()` effect style'larından veya kütüphane cache'inden
63
65
  3. **Bulunamazsa kullanıcıya sor.**
64
- 4. **Kullanıcı "sen seç" derse:** Font için `Inter`, renkler için Figma varsayılanları kullan.
66
+ 4. **Kullanıcı "sen seç" derse:** Önce DS kütüphanesi bağlıysa DS fontunu kullan (text style'lardan çıkar). DS fontu bulunamadıysa `Inter`, renkler için Figma varsayılanları kullan.
67
+
68
+ **ÖNEMLİ:** `figma_get_styles()` ve `figma_get_variables()` sadece dosya İÇİ (local) değerleri döndürür. Team library'den gelen token'lar için `figma_get_library_variables` veya `figma.teamLibrary` API'si kullanılmalıdır.
65
69
 
66
70
  **Skill'lerdeki kod örnekleri:** Örneklerde geçen değerler (renk hex, font adı, piksel boyutu) yalnızca FORMAT gösterimidir. Çalışma anında bu değerler her zaman tasarım sisteminden okunmalıdır.
67
71