@atezer/figma-mcp-bridge 1.7.30 → 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 (56) hide show
  1. package/CHANGELOG.md +366 -0
  2. package/README.md +3 -2
  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 +26 -0
  20. package/dist/core/plugin-bridge-connector.d.ts.map +1 -1
  21. package/dist/core/plugin-bridge-connector.js +18 -2
  22. package/dist/core/plugin-bridge-connector.js.map +1 -1
  23. package/dist/core/plugin-bridge-server.d.ts +2 -0
  24. package/dist/core/plugin-bridge-server.d.ts.map +1 -1
  25. package/dist/core/plugin-bridge-server.js +5 -1
  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 +334 -101
  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 -243
  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-screen-orchestrator/SKILL.md +166 -0
  50. package/skills/fmcp-screen-recipes/SKILL.md +528 -0
  51. package/skills/fmcp-token-sync-orchestrator/SKILL.md +198 -0
  52. package/skills/generate-figma-library/SKILL.md +38 -0
  53. package/skills/generate-figma-screen/SKILL.md +360 -6
  54. package/skills/implement-design/SKILL.md +32 -0
  55. package/skills/inspiration-intake/SKILL.md +220 -0
  56. package/skills/visual-qa-compare/SKILL.md +33 -0
@@ -0,0 +1,198 @@
1
+ ---
2
+ name: fmcp-token-sync-orchestrator
3
+ description: Figma design token'larını kod dosyalarıyla (CSS/Tailwind/Swift/Compose) platform-agnostic senkronize eder. Diff preview + onay + write akışı zorunlu. Her platformda çalışır. Condensed-first: Essentials bölümü %80 case'i kapsar, Advanced sadece edge case'lerde.
4
+ metadata:
5
+ mcp-server: user-figma-mcp-bridge
6
+ version: 1.9.0
7
+ priority: 95
8
+ phase: orchestrator
9
+ personas:
10
+ - designops
11
+ - uidev
12
+ token_budget: condensed-first
13
+ required_inputs:
14
+ - name: target_platform
15
+ type: "enum: css | tailwind | swift | compose | sass | auto"
16
+ description: "Hedef platform. 'auto' → hedef dosya uzantısından tespit, belirsizse sor"
17
+ - name: target_file
18
+ type: "string | null"
19
+ description: "Hedef dosya yolu. null → platform defaultuna göre öner"
20
+ - name: direction
21
+ type: "enum: figma-to-code | code-to-figma"
22
+ description: "Senkronizasyon yönü. Default: figma-to-code (export)"
23
+ ---
24
+
25
+ # FMCP Token Sync Orchestrator
26
+
27
+ ## Essentials (Üst Bölüm — %80 Case İçin Yeterli)
28
+
29
+ ### Ortak Protokol (Condensed — full: `agents/_orchestrator-protocol.md`)
30
+
31
+ 1. **Skill Registry** açık — tahmin yasak
32
+ 2. **Intent Routing** — platform belirsiz → kullanıcıya sor (AskUserQuestion / düz metin)
33
+ 3. **Cheap-First** — `figma_get_variables(verbosity="summary")` yeterli, full sadece eksik binding keşfinde
34
+ 4. **Cache-First** — tokens için cache yok (hızlı değişir), opsiyonel `.claude/token-sync-log.md`
35
+ 5. **User Onay** — **diff preview olmadan WRITE YOK** (mutlak kural)
36
+ 6. **Self-Audit** — write sonrası binding coverage raporu (hardcoded kalan node sayısı)
37
+ 7. **Skill Evolution** — yeni platform için iki aşamalı onay
38
+ 8. **Türkçe rapor** — metrik bloğu sonunda
39
+
40
+ ### Skill Registry (Ref Only)
41
+
42
+ | Skill | Dosya yolu | Trigger | Common case lazım mı? |
43
+ |---|---|---|---|
44
+ | `design-token-pipeline` | `skills/design-token-pipeline/SKILL.md` | Token export/import | **HER ZAMAN** (ana motor) |
45
+ | `code-design-mapper` | `skills/code-design-mapper/SKILL.md` | Component ↔ Figma mapping | Sadece component mapping istenirse |
46
+ | `design-system-rules` | `skills/design-system-rules/SKILL.md` | Platform-specific rule generation | Sadece rule generation istenirse |
47
+
48
+ ### Platform Routing
49
+
50
+ | Sinyal | Platform | Standard hedef path |
51
+ |---|---|---|
52
+ | `.css`, `:root`, `var(--...)`, `tokens.css` | CSS | `src/styles/tokens.css` |
53
+ | `tailwind.config.*`, `theme.extend` | Tailwind | `tailwind.config.js` → `theme.extend` |
54
+ | `.swift`, `UIKit`, `SwiftUI`, `Color(...)` | Swift | `Sources/DesignTokens/Tokens.swift` |
55
+ | `.kt`, `Compose`, `@Composable`, `MaterialTheme` | Compose | `app/src/main/java/.../DesignTokens.kt` |
56
+ | `.scss`, `$token-...` | Sass | `src/styles/_tokens.scss` |
57
+ | Hiçbiri net değil | — | AskUserQuestion (4 platform seçeneği) |
58
+
59
+ ### Diff Preview Before Write (Zorunlu Akış)
60
+
61
+ 1. **Dry-run:** `Read("skills/design-token-pipeline/SKILL.md")` + workflow'u çalıştır ama dosyaya yazma → çıktıyı buffer'a al
62
+ 2. **Mevcut dosya varsa:** mevcut içerikle yeni içerik arası **unified diff** üret
63
+ 3. **Diff'i sohbete yaz:**
64
+ ```diff
65
+ --- current tokens.css
66
+ +++ new tokens.css
67
+ @@ -12,3 +12,5 @@
68
+ --color-primary: #0066cc;
69
+ - --color-secondary: #666;
70
+ + --color-secondary: #4a4a4a;
71
+ + --color-success: #10b981;
72
+ ```
73
+ 4. **Onay al:** AskUserQuestion / düz metin: "Bu değişiklikleri uygulayayım mı? (Evet / Hayır / Sadece bazıları)"
74
+ 5. **Onay sonrası** `Write` veya `Edit` ile dosyaya yaz
75
+ 6. **Mevcut dosya yoksa:** sadece yeni içeriği göster, onay al, sonra `Write`
76
+
77
+ ### Self-Audit (Write Sonrası)
78
+
79
+ Binding coverage raporu:
80
+ - **Toplam token:** `figma_get_variables` ile sayım
81
+ - **Binding oranı:** senkronlanan / toplam (yüzde)
82
+ - **Upgraded:** hardcoded değerden variable binding'e dönüşen sayı
83
+ - **Leftover:** hâlâ hardcoded kalan node sayısı (ds-auditor'a yönlendir)
84
+
85
+ ### Rapor Formatı
86
+
87
+ ```markdown
88
+ ## 🔄 Token Sync — <platform>
89
+
90
+ **Yön:** Figma → Kod | Kod → Figma
91
+ **Hedef dosya:** <path>
92
+ **Mod:** export | import
93
+
94
+ ### Diff Özeti
95
+ - Eklenen: <n>
96
+ - Güncellenen: <m>
97
+ - Kaldırılan: <k>
98
+
99
+ ### Binding Coverage
100
+ - Toplam token: <n>
101
+ - Binding oranı: <%>
102
+ - Hardcoded kalanlar: <k> node (ds-auditor ile detaylandır)
103
+
104
+ ---
105
+ 📊 Metrikler
106
+ - Kullanılan skill'ler: <liste>
107
+ - API çağrı sayısı: <n>
108
+ - Dry-run + write: tamamlandı
109
+ ```
110
+
111
+ ---
112
+
113
+ ## Advanced — Only Load If Needed
114
+
115
+ **Bu bölümü Claude aşağıdaki koşullarda tarar:**
116
+ - ⚠️ Multi-platform sync (aynı token'ları hem CSS hem Swift'e)
117
+ - ⚠️ Custom component mapping (code-design-mapper gerektiren)
118
+ - ⚠️ Platform default path kullanıcı için uygun değil (custom path gerekir)
119
+ - ⚠️ Kod → Figma yönünde sync (import mode, daha nadir)
120
+ - ⚠️ Yeni platform desteği (Flutter, Jetpack Multiplatform vb.)
121
+
122
+ ### Detay 1 — Multi-Platform Sync
123
+
124
+ Kullanıcı "hem CSS hem Tailwind hem Swift'e aynı token'ları export et" derse:
125
+ 1. Her platform için ayrı dry-run
126
+ 2. 3 ayrı diff preview sohbette (tek mesajda üç diff bloğu)
127
+ 3. Kullanıcı "hepsini onayla" veya "sadece X ve Y" diyebilmeli (AskUserQuestion çoklu seçim)
128
+ 4. Onaylananları yaz
129
+ 5. Binding coverage raporu 3 platforma göre ayrı
130
+
131
+ ### Detay 2 — Custom Component Mapping
132
+
133
+ Sadece token değil, component → component eşleştirme isteniyorsa:
134
+ 1. `Read("skills/code-design-mapper/SKILL.md")`
135
+ 2. Figma component isim/key → kod dosyası path eşleştirmesi
136
+ 3. Çıktı: `.codeconnect.ts` veya benzeri mapping dosyası
137
+ 4. Token'lardan bağımsız ama tamamlayıcı iş
138
+
139
+ ### Detay 3 — Kod → Figma Import Mode
140
+
141
+ Kod tarafında değişen bir token (örn. Git PR'da renk güncellemesi) Figma'ya geri yansıtılacaksa:
142
+ 1. Kod dosyasını parse et
143
+ 2. `figma_get_variables` ile mevcut Figma değerlerini al
144
+ 3. Diff: kod tarafı vs Figma tarafı
145
+ 4. Kullanıcıya göster: "Kod tarafında şu token'lar değişmiş, Figma'ya yansıtayım mı?"
146
+ 5. Onay → `figma_update_variable` / `figma_setup_design_tokens` ile yaz
147
+ 6. **Destructive mutation** → ortak protokol madde 5 gate (kullanıcı onayı)
148
+
149
+ ### Detay 4 — Platform Default Path Override
150
+
151
+ Plan'daki defaultlar:
152
+ ```
153
+ CSS → src/styles/tokens.css
154
+ Tailwind → tailwind.config.js
155
+ Swift → Sources/DesignTokens/Tokens.swift
156
+ Compose → app/src/main/java/.../DesignTokens.kt
157
+ Sass → src/styles/_tokens.scss
158
+ ```
159
+
160
+ Kullanıcı'nın proje yapısı farklı olabilir. İlk sync'te:
161
+ 1. Default path'i sor: "Bu platform için token dosyası `<default>` yoluna yazılsın mı?"
162
+ 2. Kullanıcı alternatif verirse onu kullan
163
+ 3. İlk başarılı sync sonrası path `.claude/token-sync-log.md`'ye kaydedilir (opsiyonel cache)
164
+
165
+ ### Detay 5 — Error Recovery
166
+
167
+ | Hata | Aksiyon |
168
+ |---|---|
169
+ | Dosya yazma permission | Kullanıcıya bildir, farklı path öner |
170
+ | Mevcut kod formatı tanınmıyor | Örnek satır göster, formatı doğrulat |
171
+ | `figma_get_variables` timeout | `verbosity="summary"` zaten default, retry |
172
+ | Diff çok büyük (100+ değişiklik) | Özetle: "X color, Y spacing, Z typography token değişti, detay görmek ister misin?" |
173
+
174
+ ### Detay 6 — Platform-Specific Notes
175
+
176
+ **Claude Code:**
177
+ - `Write` / `Edit` tool'ları mevcut, doğrudan kod dosyasına yazılır
178
+ - Cache: `.claude/token-sync-log.md` opsiyonel
179
+
180
+ **Cursor:**
181
+ - Aynı tool'lar mevcut, main context'te çalışır
182
+ - `.cursor/rules/fmcp-orchestration.md` bu orchestrator'ı referans eder
183
+
184
+ **Claude Desktop:**
185
+ - **KRİTİK:** Filesystem MCP eklenmediyse `Write` tool'u yok → sadece diff gösterebilir, kullanıcı manuel kopyalar
186
+ - İlk prompt'ta manuel skill referansı zorunlu
187
+
188
+ **Claude Web:**
189
+ - Filesystem yok → tamamen plan-only mod
190
+ - "Bu diff'i kopyala, tokens.css'e yapıştır" talimatı ver
191
+
192
+ ### Detay 7 — Yeni Platform Desteği (Skill Evolution)
193
+
194
+ Kullanıcı "Flutter için export" isterse (mevcut 5 platformda yok):
195
+ 1. **Aşama 1:** Gap'i açıkla, "Flutter desteği eklemek istiyor musun?" sor
196
+ 2. **Aşama 2:** `design-token-pipeline` skill'ine Flutter eklentisi yap (edit) veya yeni bir skill (`fmcp-token-flutter-pipeline`) oluştur (create)
197
+ 3. Create → DRAFT banner + ikinci onay
198
+ 4. Edit → diff preview + onay
@@ -6,6 +6,44 @@ metadata:
6
6
  personas:
7
7
  - designops
8
8
  - designer
9
+ required_inputs:
10
+ - name: source_type
11
+ type: enum
12
+ options:
13
+ - "Kod tabanı (path ver)"
14
+ - "Token JSON dosyası"
15
+ - "Mevcut tasarım sisteminden clone"
16
+ - "Sıfırdan (boş kütüphane)"
17
+ question: "Kütüphaneyi nereden inşa edelim?"
18
+ required: true
19
+ - name: source_path
20
+ type: string
21
+ question: "Kaynak path nedir? (örn: ./src/design-tokens veya ./tokens.json)"
22
+ required: false
23
+ skip_if: "source_type == 'Sıfırdan (boş kütüphane)'"
24
+ - name: library_name
25
+ type: string
26
+ question: "Kütüphane adı nedir? (örn: '❖ My DS')"
27
+ required: true
28
+ - name: components_to_generate
29
+ type: string_list
30
+ question: "Hangi bileşenleri üretelim? (örn: Button, Input, Card, Modal — 'all' veya virgülle ayır)"
31
+ required: false
32
+ default: "all"
33
+ - name: token_categories
34
+ type: string_list
35
+ question: "Hangi token kategorileri? (colors, spacing, typography, radius, shadow — 'all' veya seçili)"
36
+ required: false
37
+ default: "all"
38
+ - name: theme_support
39
+ type: enum
40
+ options:
41
+ - "Single theme (default)"
42
+ - "Light + Dark"
43
+ - "Multi-brand (3+ themes)"
44
+ question: "Tema desteği?"
45
+ required: false
46
+ default: "Single theme (default)"
9
47
  ---
10
48
 
11
49
  # Generate Figma Library — Koddan DS Kütüphanesi İnşa
@@ -6,6 +6,61 @@ metadata:
6
6
  personas:
7
7
  - designer
8
8
  - uidev
9
+ required_inputs:
10
+ - name: device
11
+ type: enum
12
+ options:
13
+ - "iPhone 17 (402×874)"
14
+ - "iPhone 16 Pro Max (440×956)"
15
+ - "iPhone 16 (393×852)"
16
+ - "iPhone 13/14 (390×844)"
17
+ - "Android Compact (412×917)"
18
+ - "Android Medium (700×840)"
19
+ - "iPad Pro 11 (834×1194)"
20
+ - "iPad Pro 13 (1024×1366)"
21
+ - "Desktop (1440×1024)"
22
+ - "Custom (width×height ver)"
23
+ question: "Hangi device boyutunda olsun?"
24
+ required: true
25
+ default_source: ".claude/design-systems/last-intent.md#device"
26
+ - name: design_system
27
+ type: from_state
28
+ source: ".claude/design-systems/active-ds.md#Library Name"
29
+ fallback_question: "Hangi tasarım sistemi kullanılsın? (❖ SUI / Material / Apple HIG / Custom)"
30
+ required: true
31
+ - name: reference_benchmark
32
+ type: node_id_or_none
33
+ question: "Referans alınacak benchmark ekranı var mı? (Node ID veya Figma URL, yoksa 'yok')"
34
+ required: false
35
+ affects: ["screen_type", "sections"]
36
+ - name: screen_type
37
+ type: enum
38
+ options:
39
+ - "Dashboard / özet"
40
+ - "Liste / arama sonuçları"
41
+ - "Detay / profil"
42
+ - "Form / veri girişi"
43
+ - "Login / onboarding"
44
+ - "Confirmation / success"
45
+ - "Empty state"
46
+ - "Error / 404"
47
+ question: "Ne tür bir ekran?"
48
+ required: true
49
+ skip_if: "reference_benchmark != none"
50
+ - name: sections
51
+ type: string_list
52
+ question: "Hangi ana içerik bölümlerini istiyorsun? (örn: header, balance card, quick actions, transactions, bottom nav)"
53
+ required: true
54
+ skip_if: "reference_benchmark != none"
55
+ - name: variants
56
+ type: enum
57
+ options:
58
+ - "Tek varyant"
59
+ - "Light + Dark mode"
60
+ - "2-3 layout alternatifi"
61
+ question: "Kaç varyant istiyorsun?"
62
+ required: false
63
+ default: "Tek varyant"
9
64
  ---
10
65
 
11
66
  # Generate Figma Screen — Kod/Açıklamadan Figma Ekranı
@@ -43,6 +98,33 @@ Topluluk `figma-generate-design` skill'inden uyarlanmış, F-MCP Bridge araçlar
43
98
 
44
99
  **Bu adımları sırayla uygula. Adım atlama.**
45
100
 
101
+ ### Step 0: Aktif Tasarım Sistemi Kontrolü (ZORUNLU - v1.8.0+)
102
+
103
+ **Ekran yapmaya başlamadan önce DS context'inin belirli olduğundan emin ol.**
104
+
105
+ ```
106
+ 1. Read .claude/design-systems/active-ds.md
107
+ 2. Status alanı:
108
+ ✅ Aktif → Library Name'i not al, Step 1'e geç
109
+ ❌ Henüz seçilmedi → Kullanıcıya sor:
110
+ "Hangi tasarım sistemi ile ilerleyelim?
111
+ - ❖ SUI (varsa)
112
+ - Material Design
113
+ - Apple HIG
114
+ - Kendi DS'iniz (Figma library URL verin)
115
+ - Hiçbiri (ham Figma)"
116
+ 3. Kullanıcı yanıtladıktan sonra active-ds.md'yi update et:
117
+ - Status: ✅ Aktif
118
+ - Library Name: <seçim>
119
+ - Selected At: <bugün>
120
+ 4. Sonraki turlarda bu soruyu TEKRAR SORMA — active-ds.md zaten dolu.
121
+ Kullanıcı açıkça "DS değiştir" demediği sürece aynı DS'i kullan.
122
+ ```
123
+
124
+ **Bypass:** Kullanıcı "DS'siz devam et" derse `Status: DS bypass mode` olarak işaretle. Token binding kuralı esnetilir ama yine de kullanıcıya hardcoded değer kullandığını bildir.
125
+
126
+ Detay: [figma-canvas-ops SKILL Section 0 — Design System Context](../figma-canvas-ops/SKILL.md#0-design-system-context-zorunlu--v180).
127
+
46
128
  ### Step 1: Plugin Bağlantısını Doğrula
47
129
 
48
130
  ```
@@ -109,13 +191,31 @@ Proje kökünde `.fmcp-brand-profile.json` varsa:
109
191
 
110
192
  Üç şey gerekiyor: **bileşenler**, **variable'lar**, **stiller**.
111
193
 
112
- **CACHE-FIRST KURALI (ZORUNLU):** Figma API'ye gitmeden önce `.claude/libraries/<ds>.md` dosyasını kontrol et. Cache varsa VE `lastUpdated` 24 saatten eski değilse:
113
- - Text style key'leri cache'den oku (API çağrısı yapma)
114
- - Variable key'leri cache'den oku
115
- - Component key'leri + override notları → cache'den oku
116
- - Font ailesi → cache'den oku
194
+ **⚠️ MCP TOOL SEÇİMİ (v1.8.0+):**
195
+ - F-MCP plugin bağlıysa **`figma_search_assets`** veya **`figma_get_library_variables`** kullan
196
+ - Resmi Figma MCP'nin **`search_design_system`** tool'unu **ÇAĞIRMA** — "Resource links not supported" / "file could not be accessed" hatası verir
197
+ - Detay: FMCP_INSTRUCTIONS "TOOL SELECTION" bölümü
198
+
199
+ **CACHE-FIRST KURALI (MUTLAK ZORUNLU - PRE-FLIGHT BLOCKER):**
200
+
201
+ Figma API'ye gitmeden önce `.claude/design-systems/<library-id>/` cache'ini kontrol et:
202
+
203
+ ```
204
+ 1. Read .claude/design-systems/<library-id>/_meta.md
205
+
206
+ ✅ Var, sync güncel (24h içinde) → cache'leri kullan, devam et
207
+ ❌ Yok / sync eski / yarım kalmış → Step 3a-3d'yi ÇALIŞTIR ve cache'i doldur,
208
+ ANCAK O ZAMAN ekran üretimine başla
209
+ ```
117
210
 
118
- Cache yoksa, eksikse VEYA 24 saatten eskiyse keşif yap, sonucu cache'e yaz, `lastUpdated` alanını güncelle. **Bu, sonraki oturumlarda token tüketimini %60-70 düşürür.**
211
+ **Cache eksik veya stale ise ekran üretimi BAŞLAYAMAZ** önce keşif/cache, sonra üretim. Bu, hardcoded fallback'leri ve tekrar tekrar API çağrılarını engeller.
212
+
213
+ - Text style key'leri → `.claude/design-systems/<library-id>/tokens.md` (text style key cache)
214
+ - Variable key'leri → `.claude/design-systems/<library-id>/tokens.md`
215
+ - Component key'leri + override notları → `.claude/design-systems/<library-id>/components.md`
216
+ - Font ailesi + available weights → `.claude/design-systems/<library-id>/tokens.md` (Font Weights bölümü)
217
+
218
+ Cache doldurulduktan sonra her oturumda 24 saat boyunca tekrar API'ye gitmeden okunabilir. **Bu, sonraki oturumlarda token tüketimini %60-70 düşürür.**
119
219
 
120
220
  **Cache Invalidation:** Cache dosyasının başına `lastUpdated: YYYY-MM-DD HH:mm` ekle. 24 saatten eski cache'ler otomatik yenilenmelidir. Kütüphane güncellendiğinde key'ler değişebilir.
121
221
 
@@ -231,6 +331,55 @@ Ekran oluşturmadan önce kullanılacak tüm DS token'larının **variable key'l
231
331
 
232
332
  Bu adımda toplanan key'ler, sonraki adımlarda `importVariableByKeyAsync` ile hedef dosyaya import edilecek.
233
333
 
334
+ ### Step 3.5: Clone Tool'u Tuzağı — Ne Zaman Clone, Ne Zaman Sıfırdan İnşa (v1.8.2+ ZORUNLU)
335
+
336
+ `figma_clone_screen_to_device` tool'u v1.8.1'de eklendi ama **sadece dar bir use-case için** kullanılmalıdır. Yanlış kullanım, benchmark'ın mevcut yanlışlıklarını (hardcoded rectangle, eksik token binding, non-responsive layout) kopyalayarak disiplin ihlaline yol açar.
337
+
338
+ #### Karar Matrisi
339
+
340
+ | Kullanıcı isteği | Doğru yaklaşım | Tool |
341
+ |---|---|---|
342
+ | "Aynı ekranı iPhone 17'ye migrate et" (sadece boyut değişir) | Clone | `figma_clone_screen_to_device` |
343
+ | "Aynı DS ile benzer ekran" (tek varyant) | Clone + validate | `figma_clone_screen_to_device` + Step 6.5 |
344
+ | **"3 farklı alternatif tasarım"** | **Build from scratch** ⭐ | `figma_execute` + Step 4-5 |
345
+ | **"Hero Card varyasyonu yap"** | **Build from scratch** | `figma_execute` + Step 4-5 |
346
+ | **"Yeni ekran sıfırdan"** | **Build from scratch** | `figma_execute` + Step 4-5 |
347
+ | **"Benchmark'tan ilham al, daha iyisini yap"** | **Build from scratch** (benchmark = inspiration only) | `figma_execute` + Step 4-5 |
348
+ | "Mevcut ekranda DS uyumunu düzelt" | Apply-DS workflow | `apply-figma-design-system` SKILL |
349
+
350
+ #### Kullanıcının Gerçek İstediği Nedir?
351
+
352
+ Kullanıcı "3 alternatif tasarım" dediğinde **neredeyse her zaman** istediği:
353
+ - Farklı layout/renk/tipografi yaklaşımları
354
+ - Her biri gerçekten **AYRI** (sadece isim değil, içerik de)
355
+ - Hepsinde DS uyumu (instance + token binding)
356
+ - Hepsi responsive (auto-layout + FILL sizing)
357
+
358
+ Bu **clone'un kapsamında DEĞİL**. Clone sadece "kopyala, isim değiştir" yapar. Sonuçta **3 identik kopya** + farklı isimler olur. Bu kullanıcının istediği **GERÇEK varyasyon değildir**.
359
+
360
+ #### Doğru Akış: Build-from-Scratch (Step 4-5)
361
+
362
+ Benchmark varsa:
363
+ 1. **Step 3.x'te benchmark'ı `figma_get_design_context` ile OKU** — yapısal anlayış için
364
+ 2. Benchmark'ta kullanılan SUI instance'ları not al (NavigationTopBar, PillTabs, vb.)
365
+ 3. Benchmark'ta **yanlış olan şeyleri kopyalama**:
366
+ - Hardcoded rectangle separator'lar → DS Divider component kullan
367
+ - Non-responsive iç frame'ler → auto-layout FILL'e çevir
368
+ - Missing token bindings → her yerde `setBoundVariable*` kullan
369
+ 4. **Step 4 + Step 5 akışını takip et** — sıfırdan, SUI kurallarıyla
370
+ 5. Her alternatif için benzersiz layout çözümü:
371
+ - Hero Card: bakiye kartı büyütülmüş, quick actions altta sade
372
+ - Liste Odaklı: hesap listesi dominant, özet sağ-altta
373
+ - Dark Header: root fill `Global/primary/default`, text'ler `on-primary` token
374
+ 6. Step 6.5 validate → skor ≥ 80
375
+
376
+ #### Kısıtlama Kuralı
377
+
378
+ **Kullanıcı şu kelimelerden birini kullandıysa → `figma_clone_screen_to_device` KULLANMA:**
379
+ - "alternatif", "varyasyon", "farklı", "yeni", "tasarla", "iyileştir", "redesign"
380
+
381
+ Intent Router bu kelimeleri algıladığında `approach = build-from-scratch` otomatik set eder ve Claude'u Step 4-5 rotasına yönlendirir.
382
+
234
383
  ### Step 4: Boş Alan Bul ve Wrapper Frame Oluştur
235
384
 
236
385
  ```js
@@ -418,6 +567,44 @@ Screen: VERTICAL, counterAxis=CENTER, layoutSizingVertical=HUG
418
567
 
419
568
  **Mode adı eşleşmesi DİKKAT:** `indexOf("Web")` "Mobil & Web Mobil"i de yakalar. `indexOf("Desktop")` kullan.
420
569
 
570
+ ### Step 5.17: Quality Gate — Her Bölüm Yazıldıktan Sonra (ZORUNLU — v1.8.2+)
571
+
572
+ Her bölüm (`figma.createFrame()` sonrası) için **aşağıdaki checklist ZORUNLU**. Herhangi biri ❌ ise → bölümü **yeniden yaz**. Claude bu checklist'i kendi kendine uygulamakla yükümlüdür.
573
+
574
+ ```
575
+ [ ] Frame'in layoutMode'u atandı mı? (ASLA "NONE" olmamalı — HORIZONTAL veya VERTICAL)
576
+ [ ] primaryAxisSizingMode doğru mu? (Hug: AUTO, Fixed width: FIXED)
577
+ [ ] counterAxisSizingMode doğru mu?
578
+ [ ] Tüm fills setBoundVariableForPaint ile DS token'a bağlı mı? (hardcoded SOLID YASAK)
579
+ [ ] Tüm padding (top/bottom/left/right) setBoundVariable ile DS spacing token'a bağlı mı?
580
+ [ ] itemSpacing setBoundVariable ile DS spacing token'a bağlı mı?
581
+ [ ] cornerRadius (varsa) setBoundVariable ile DS radius token'a bağlı mı?
582
+ [ ] Her text node setTextStyleIdAsync ile DS text style'a bağlı mı? (ASLA sadece fontSize hardcoded)
583
+ [ ] Text fills setBoundVariableForPaint ile DS text color token'a bağlı mı?
584
+ [ ] Bölüm içinde en az 1 DS INSTANCE var mı? (importComponentByKeyAsync ile).
585
+ İstisna: Sadece text + frame olan bölümler (ör. başlık row) — bu durumda yine spacing/padding/renk token'ları zorunlu.
586
+ [ ] Tüm child'lar appendChild sonrası layoutSizingHorizontal = "FILL" mi? (text istisna: HUG)
587
+ [ ] Hiçbir node'un fills'i raw hex literal ile atandı mı? (grep: `{r:`, `color:` literal)
588
+ ```
589
+
590
+ **Otomatik kontrol örneği:**
591
+
592
+ ```js
593
+ // Her createFrame sonrası Claude bu kontrolü yapar:
594
+ if (frame.layoutMode === "NONE") throw new Error("Quality Gate FAIL: NO_AUTO_LAYOUT");
595
+ if (!frame.boundVariables || !frame.boundVariables.paddingLeft) {
596
+ console.warn("Quality Gate WARN: padding token binding eksik");
597
+ }
598
+ ```
599
+
600
+ **Quality Gate FAIL olursa ne yap?**
601
+ 1. Bölümü sil: `frame.remove()`
602
+ 2. Eksik token/instance'ı `figma_search_assets` + `figma_get_library_variables` ile ara
603
+ 3. Bölümü **yeniden yaz** — bu sefer tüm kuralları uyarak
604
+ 4. Tekrar kontrol et
605
+
606
+ **Skor hedef:** `figma_validate_screen` sonrası ≥ 80 (Step 6.5). Quality Gate çalışırsa validate zaten geçer.
607
+
421
608
  ### Step 5.2: Instance Override Rehberi (ZORUNLU)
422
609
 
423
610
  **Component PROPERTY (TEXT/BOOLEAN/VARIANT tipi) → `setProperties`:**
@@ -478,6 +665,56 @@ Estetik yön belirlendiyse (Step 2.5), bölüm inşa sırasında şu detaylar ek
478
665
 
479
666
  > **NOT:** Bu öneriler DS bileşen kütüphanesi varsa DS'nin izin verdiği ölçüde uygulanır. DS token'ları dışında hardcoded değer eklenmez.
480
667
 
668
+ ### Step 5.6: Dark Mode / Theme Variants Workflow (ZORUNLU — v1.9.0+)
669
+
670
+ Intent router `variants` input'unda "Light + Dark mode" seçildiyse (veya kullanıcı açıkça dark+light istiyorsa), Step 6'ya geçmeden önce bu alt adımı uygula.
671
+
672
+ **Ön koşul:** DS'de theme modlar tanımlı bir variable collection var. SUI için tipik: `Colors` collection + `Light` mode + `Dark` mode.
673
+
674
+ **Akış (4 adım):**
675
+
676
+ 1. **Light ekranı doğrula (Step 5 sonu):** Wrapper frame ID'sini al. Tüm fill/stroke/background'lar `setBoundVariableForPaint` ile bağlı olmalı (Step 5.17 Quality Gate zaten sağladı). Eğer hardcoded değer varsa Step 5'e dön, düzelt.
677
+
678
+ 2. **Klon oluştur:**
679
+ ```javascript
680
+ // figma_execute
681
+ const lightFrame = await figma.getNodeByIdAsync("<wrapper_id>");
682
+ const darkFrame = lightFrame.clone();
683
+ figma.currentPage.appendChild(darkFrame);
684
+ darkFrame.x = lightFrame.x + lightFrame.width + 80; // sağda, 80px boşluk
685
+ darkFrame.name = lightFrame.name + " — Dark";
686
+ return { darkFrameId: darkFrame.id };
687
+ ```
688
+
689
+ 3. **Dark mode'u klon frame'e uygula:**
690
+ ```javascript
691
+ // figma_execute (ayrı çağrı)
692
+ const collections = await figma.variables.getLocalVariableCollectionsAsync();
693
+ const colorCol = collections.find(c => c.name === "Colors" || c.name.toLowerCase().includes("color"));
694
+ if (!colorCol) throw new Error("Theme collection bulunamadı — DS'de mode tanımlı değil");
695
+ const darkMode = colorCol.modes.find(m => m.name.toLowerCase().includes("dark"));
696
+ if (!darkMode) throw new Error("Dark mode bulunamadı — DS tek modlu");
697
+
698
+ const darkFrame = await figma.getNodeByIdAsync("<darkFrameId>");
699
+ darkFrame.setExplicitVariableModeForCollection(colorCol, darkMode.modeId);
700
+ return { status: "dark mode applied", mode: darkMode.name };
701
+ ```
702
+
703
+ **Sihir burada:** `setExplicitVariableModeForCollection` ile tüm bound variable'lar otomatik olarak dark mode değerleri kullanır. Manuel swap gerekmez — tek bir API çağrısı tüm renkleri günceller. **Bu yüzden Step 5.17'de her fill/stroke mutlaka variable'a bağlı olmalı** — hardcoded kalanlar dark mode'da güncellenmez, light rengini taşır.
704
+
705
+ 4. **Her iki frame'i ayrı validate et:**
706
+ ```javascript
707
+ figma_validate_screen(nodeId: <lightFrameId>, minScore: 80)
708
+ figma_validate_screen(nodeId: <darkFrameId>, minScore: 80)
709
+ ```
710
+ İkisi de ≥80 olmalı. Biri fail ederse hardcoded değerler kaldı demektir — Step 5.17 Quality Gate'e dön.
711
+
712
+ **Edge case:** DS'de dark mode yoksa (sadece light), `variants: "Light + Dark"` seçimi kullanıcıya hata raporla: "Aktif DS'de dark mode tanımlı değil, sadece light üretildi. Dark mode için DS'nin `Colors` collection'ında `Dark` modu eklenmelidir."
713
+
714
+ **Responsive + theme kombinasyonu:** `variants: ["Light + Dark", "Mobile + Web"]` seçilirse matris oluşur (Light+Mobile / Light+Web / Dark+Mobile / Dark+Web = 4 frame). Her biri için ayrı wrapper, ayrı mode/device binding, ayrı validate. Turn budget'e dikkat — 4 frame için 4 turn harca (inter-screen checkpoint gate Step 6.6).
715
+
716
+ **Known limitation:** `figma_validate_screen` skorlama algoritması **dark mode variable binding coverage'ını ayrıca ölçmez** (plugin-side: f-mcp-plugin/code.js). Dark frame'de hardcoded renk kalmış olsa bile skor ≥80 alabilir. Bu yüzden Step 5.17 Quality Gate ve Step 5.6 adım 4'teki manuel binding kontrolü zorunludur — scora tek başına güvenme.
717
+
481
718
  ### Step 6: Görsel Doğrulama
482
719
 
483
720
  ```
@@ -498,6 +735,123 @@ Screenshot'ı incele:
498
735
 
499
736
  Sorun varsa hedefli `figma_execute` ile düzelt.
500
737
 
738
+ ### Step 6.5: Self-Audit Mandate (ZORUNLU — v1.8.1+)
739
+
740
+ **Ekranı kullanıcıya sunmadan ÖNCE kendi kendini denetle.** Bu adım **atlanamaz** — screenshot yeterli değil çünkü Claude görsel olarak "güzel" görünen ama token/bileşen disiplininden uzak ekranları fark edemez.
741
+
742
+ #### Adım 1 — `figma_validate_screen` çağır
743
+
744
+ ```
745
+ figma_validate_screen(nodeId="wrapper-frame-id", expectedDs="❖ SUI", minScore=80)
746
+ ```
747
+
748
+ Tool şunu döner:
749
+ ```json
750
+ {
751
+ "score": 92,
752
+ "passed": true,
753
+ "minScore": 80,
754
+ "breakdown": {
755
+ "instanceCoverage": 85,
756
+ "libraryInstanceCount": 7,
757
+ "autoLayoutCoverage": 100,
758
+ "tokenBindingCoverage": 90
759
+ },
760
+ "violations": [],
761
+ "recommendation": "Score 92/100 passed minimum 80. Screen is DS-compliant."
762
+ }
763
+ ```
764
+
765
+ #### Adım 2 — Skor değerlendirmesi
766
+
767
+ | Skor | Karar | Davranış |
768
+ |---|---|---|
769
+ | **≥ 80** | ✅ Passed | Kullanıcıya sun, rapor et |
770
+ | **60-79** | ⚠️ Kısmi | Violations listesini oku, targeted fix'ler uygula, tekrar validate et |
771
+ | **< 60** | ❌ Failed | **Ekranı sil** (`figma_execute` → `node.remove()`), Step 3-5'e dön, DS bileşenleriyle yeniden inşa et |
772
+
773
+ #### Adım 3 — Retry Loop (max 3 deneme)
774
+
775
+ Eğer ilk denemede score < 80 ise:
776
+ 1. Violations listesini oku (en kritik 5'i)
777
+ 2. Her bir violation için `figma_execute` ile targeted fix uygula:
778
+ - `HARDCODED_FILL` → `figma_bind_variable` ile binding ekle
779
+ - `NO_AUTO_LAYOUT` → `layoutMode = "VERTICAL"` ekle
780
+ 3. Tekrar `figma_validate_screen` çağır
781
+ 4. **Max 3 deneme.** 3. denemede de fail ise:
782
+ - Ekranı sil
783
+ - Kullanıcıya rapor et: "3 denemede de minimum skoru yakalayamadım. Muhtemel sebepler: [list]. Elle düzeltmek mi, farklı yaklaşım mı denemek istersiniz?"
784
+
785
+ #### Adım 4 — Pass sonrası raporlama
786
+
787
+ Validation passed ise kullanıcıya özet çıkar:
788
+ ```
789
+ ✅ Ekran hazır: "Vadesiz TL - iPhone 17"
790
+ 📊 DS Compliance Score: 92/100
791
+ 🧩 Library Instances: 7
792
+ 🎨 Token Bindings: 24
793
+ 📐 Auto-Layout Coverage: 100%
794
+ ⏱️ Süre: 18 saniye
795
+ ```
796
+
797
+ #### Anti-patterns (Self-Audit atlamak)
798
+
799
+ ❌ **YANLIŞ:** "Screenshot güzel görünüyor, validate'e gerek yok" → Bu bir **disiplin kaçırmasıdır**
800
+ ✅ **DOĞRU:** Screenshot güzel olsa bile validate çalıştır. Token binding eksikliği gözle görülmez.
801
+
802
+ ❌ **YANLIŞ:** Score 75 → "yeterince iyi, kullanıcıya sun"
803
+ ✅ **DOĞRU:** Score < 80 → retry loop, ekranı düzelt
804
+
805
+ ❌ **YANLIŞ:** Self-audit'i opsiyonel sayma
806
+ ✅ **DOĞRU:** generate-figma-screen akışının **tamamlanma koşulu** bu adımdır. Validate çalıştırılmadan akış TAMAMLANMIŞ sayılmaz.
807
+
808
+ ### Step 6.6: Inter-Screen Checkpoint Gate + Turn Budget (ZORUNLU — v1.8.2+)
809
+
810
+ Kullanıcı birden fazla alternatif istediğinde (N > 1), her alternatif **ayrı bir turn** olmalıdır. Tek turn'de 2+ alternatif yapmak **YASAK** — tool-use limit'e takılır, chat donar.
811
+
812
+ #### Turn Budget Kuralı
813
+
814
+ **Her turn'ün bütçesi:**
815
+ - Maksimum **90 saniye** toplam süre
816
+ - Maksimum **2 başarısız tool call** (timeout/error)
817
+
818
+ Eğer turn içinde:
819
+ - 2 başarısız tool call (timeout/error) olursa, **VEYA**
820
+ - 60+ saniye geçti ve sonuç gelmediyse
821
+
822
+ → **Turn'ü "FAILED" olarak işaretle.** Orphan cleanup uygula (fmcp-intent-router Tool Failure Recovery Protocol). Kullanıcıya checkpoint sorusunu sor.
823
+
824
+ #### Checkpoint Gate (Her Turn Sonrası)
825
+
826
+ Alternatif N tamamlandığında (başarılı veya fail), kullanıcıya `AskUserQuestion` ile sor:
827
+
828
+ ```
829
+ ✅/⚠️ Alternatif N/M ({name}) tamamlandı
830
+ Node ID: 173:xxxxx
831
+ Skor: XX/100
832
+ Library instances: X
833
+ Token bindings: Y
834
+ Süre: Xs
835
+
836
+ Ne yapayım?
837
+ [✅ Beğendim, Alternatif N+1'e geç]
838
+ [✏️ Revize et (ne değişsin söyle)]
839
+ [🛑 Dur, bu yeter]
840
+ ```
841
+
842
+ **Kullanıcı yanıtı gelmeden bir sonraki alternatife GEÇME.** Turn boundary kuralı budur.
843
+
844
+ #### Yasaklar
845
+
846
+ ❌ **YANLIŞ:** Tek turn'de 3 alternatifi de yap, en sonda tek özet
847
+ ✅ **DOĞRU:** Her alternatif ayrı turn, her biri sonunda checkpoint
848
+
849
+ ❌ **YANLIŞ:** Turn içinde 3+ retry (sonsuz döngü)
850
+ ✅ **DOĞRU:** 2 retry max, sonra Turn FAILED + kullanıcıya sor
851
+
852
+ ❌ **YANLIŞ:** Alternatif N başarısız, sessizce N+1'e geç
853
+ ✅ **DOĞRU:** N başarısız olunca orphan cleanup + rapor + checkpoint
854
+
501
855
  ### Step 7: Güncelleme Senaryosu
502
856
 
503
857
  Mevcut bir ekranı güncellerken: