@atezer/figma-mcp-bridge 1.9.7 → 1.9.11

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.
@@ -0,0 +1,315 @@
1
+ ---
2
+ name: figma-prototype-flow
3
+ description: Üretilen Figma ekranları arasında otomatik prototip bağlantıları, animasyonlar ve flow starting point oluşturur. Screen envanteri → navigasyon haritası → reactions → validate → dokümantasyon. "prototip bağla", "ekranları bağla", "prototype connections", "flow oluştur", "navigasyon kur", "animasyon ekle", "interaction ekle" ifadeleriyle tetiklenir. F-MCP Bridge ve figma_create_prototype_connection gerektirir.
4
+ metadata:
5
+ mcp-server: user-figma-mcp-bridge
6
+ version: 1.9.9
7
+ personas:
8
+ - designer
9
+ - uidev
10
+ required_inputs:
11
+ - name: screen_scope
12
+ type: enum
13
+ options:
14
+ - "Tüm sayfa"
15
+ - "Seçili frame'ler"
16
+ - "Node ID listesi"
17
+ question: "Hangi ekranları bağlayalım?"
18
+ required: true
19
+ default: "Tüm sayfa"
20
+ - name: flow_name
21
+ type: string
22
+ question: "Flow adı ne olsun? (örn. 'Login Akışı')"
23
+ required: true
24
+ - name: starting_screen
25
+ type: node_id_or_auto
26
+ question: "Başlangıç ekranı hangisi? ('auto' derseniz ilk Login/Onboarding/Home tipindeki ekran seçilir.)"
27
+ required: false
28
+ default: "auto"
29
+ - name: animation_profile
30
+ type: enum
31
+ options:
32
+ - "Varsayılan (FUTURE.md animasyon tablosu)"
33
+ - "Hızlı (200ms EASE_OUT)"
34
+ - "Yumuşak (400ms GENTLE)"
35
+ - "Özel (her bağlantı için sor)"
36
+ required: false
37
+ default: "Varsayılan (FUTURE.md animasyon tablosu)"
38
+ - name: autonomy_mode
39
+ type: enum
40
+ options:
41
+ - "Otonom (varsayılan — kritik dallanmada sorar)"
42
+ - "Onaylı (her adımda kullanıcı onayı ister)"
43
+ required: false
44
+ default: "Otonom (varsayılan — kritik dallanmada sorar)"
45
+ ---
46
+
47
+ # Figma Prototype Flow — Ekranlar Arası Navigasyon ve Animasyon
48
+
49
+ > **Otonom çalışma ilkesi (v1.9.9+):** Bu skill varsayılan olarak otonom çalışır. Screen envanteri, button text heuristic'i, animasyon eşleme ve bağlantı oluşturma kullanıcı onayı gerektirmeden yürütülür. Kullanıcıya yalnızca **kritik dallanma** noktalarında sorulur: (1) heuristic hedef çözümleyemediğinde, (2) 50+ bağlantı tespit edildiğinde, (3) orphan/circular overlay bulunduğunda, (4) `autonomy_mode=Onaylı` seçildiğinde her adımda.
50
+
51
+ ## Overview
52
+
53
+ Bu skill, Figma sayfasındaki ekranlar (FRAME'ler) arasında prototip bağlantıları, animasyonlar ve flow starting point'i otomatik oluşturur. Figma Prototype panel'inin tüm özellikleri (9 trigger, 8 action, 9 transition tipi × 4 yön, 11 easing, scroll behavior, overlay ayarları) desteklenir.
54
+
55
+ **Temel ilke:** Kullanıcının ekranlarını tarar, button/link text'lerinden niyeti çıkarır, navigasyon haritasını üretir ve `setReactionsAsync` ile Figma reactions API'sini çağırır. Her şey plugin context'inde çalışır, REST API gerekmez.
56
+
57
+ ## Skill Boundaries
58
+
59
+ - **Bu skill:** prototip bağlantı + animasyon + flow starting point + scroll behavior
60
+ - Ekran üretimi → [generate-figma-screen](../generate-figma-screen/SKILL.md)
61
+ - Code Connect eşlemesi → [code-design-mapper](../code-design-mapper/SKILL.md)
62
+ - A11y focus order → [figma-a11y-audit](../figma-a11y-audit/SKILL.md)
63
+ - Handoff diagram → [ai-handoff-export](../ai-handoff-export/SKILL.md)
64
+
65
+ ## Prerequisites
66
+
67
+ - F-MCP Bridge plugin bağlı (`figma_get_status` yeşil dönmeli)
68
+ - Hedef sayfada en az 2 FRAME
69
+ - Ekranlar içinde Button/Link instance'ları isimlendirilmiş olmalı (navigasyon haritası için — isimlendirilmemiş jenerik Rectangle'lar yakalanmaz)
70
+
71
+ ## F-MCP skill koordinasyonu
72
+
73
+ - **Önce:** `generate-figma-screen` veya `fmcp-screen-recipes` ile ekranlar üretilmiş olmalı
74
+ - **Birlikte:** `figma-canvas-ops` (her `figma_execute` öncesi zorunlu)
75
+ - **Sonra:** `figma-a11y-audit` (focus sırası cross-check), `ai-handoff-export` (flow diagram)
76
+
77
+ ## Required Workflow
78
+
79
+ **Bu adımları sırayla uygula. Adım atlama.**
80
+
81
+ ### Step 0: Ön koşullar ve Otonom Mod Ayarı
82
+
83
+ ```
84
+ 1. figma_get_status() → plugin bağlı mı?
85
+ 2. .claude/design-systems/active-ds.md kontrolü (DS context bilgisi için)
86
+ 3. autonomy_mode girdisini oku:
87
+ - "Otonom" → varsayılan, kritik dallanmalarda sor
88
+ - "Onaylı" → her Step sonunda kullanıcıya özet + AskUserQuestion
89
+ ```
90
+
91
+ ### Step 1: Screen Envanteri
92
+
93
+ ```js
94
+ // Plan A: figma_get_file_data(depth=1) ile üst seviye FRAME listesi
95
+ const data = await figma_get_file_data({ depth: 1, verbosity: "standard" });
96
+ // Plan B (daha zengin): figma_execute ile page.children filtrele
97
+ // return figma.currentPage.children.filter(c => c.type === "FRAME").map(f => ({ id: f.id, name: f.name, width: f.width, height: f.height }));
98
+ ```
99
+
100
+ Çıktı tablosu:
101
+
102
+ | # | Frame ID | Frame Adı | Rol Tahmini | Boyut |
103
+ |---|---|---|---|---|
104
+ | 1 | `1:2` | "Login / Mobile" | Login | 402×874 |
105
+ | 2 | `1:3` | "Home / Mobile" | Home | 402×874 |
106
+ | 3 | `1:4` | "Register" | Register | 402×874 |
107
+
108
+ **Rol tahmini regex'leri (case-insensitive):**
109
+ - Login: `/^(login|giriş|sign ?in)/i`
110
+ - Home / Dashboard: `/^(home|anasayfa|dashboard|main)/i`
111
+ - Register: `/^(register|kayıt|sign ?up)/i`
112
+ - ForgotPassword: `/^(forgot|şifre)/i`
113
+ - Check Email: `/^(check email|e-posta kontrol|onay)/i`
114
+ - Settings / Profile: `/^(settings|ayarlar|profile|profil)/i`
115
+ - Onboarding: `/^(onboard|welcome|hoşgeldin)/i`
116
+
117
+ Eşleşme yoksa rol = `Generic`; heuristic'te kullanıcıya sorulur.
118
+
119
+ ### Step 2: Navigasyon Haritası (Heuristic-Based)
120
+
121
+ #### 2a. Etkileşimli eleman tespiti
122
+
123
+ Her frame içinde:
124
+
125
+ ```js
126
+ frame.findAll(n =>
127
+ (n.type === "INSTANCE" && /button|btn|cta|link|action/i.test((n.mainComponent?.name || n.name))) ||
128
+ (n.type === "TEXT" && n.parent?.type !== "TEXT" && /^(Giriş|Kayıt|Şifre|Devam|Geri|İptal|Tamam|Login|Sign|Back|Cancel|Submit|Continue)/i.test(n.characters || "")) ||
129
+ (n.type === "FRAME" && /clickable|hotspot|tappable/i.test(n.name))
130
+ )
131
+ ```
132
+
133
+ Button text'i: `button.findOne(t => t.type === "TEXT")?.characters` ile okunur.
134
+
135
+ #### 2b. Button text → hedef heuristic tablosu (TR + EN)
136
+
137
+ | Button text pattern (regex, case-insensitive) | Muhtemel hedef rol | Action | Transition |
138
+ |---|---|---|---|
139
+ | `^(giriş yap\|giriş\|login\|sign ?in)` | Home \| Dashboard \| Main | NAVIGATE | SLIDE_IN / RIGHT |
140
+ | `^(kayıt ol\|kayıt\|sign ?up\|register)` | Register \| SignUp | NAVIGATE | SLIDE_IN / RIGHT |
141
+ | `^(şifremi unuttum\|forgot)` | ForgotPassword | NAVIGATE | SLIDE_IN / RIGHT |
142
+ | `^(gönder\|submit\|send)` | Success \| Confirmation \| CheckEmail | NAVIGATE | SLIDE_IN / RIGHT |
143
+ | `^(geri\|back\|<)` | — (navigation history) | BACK | SLIDE_IN / LEFT |
144
+ | `^(iptal\|cancel\|×\|✕\|kapat\|close)` | — (overlay ise CLOSE, aksi BACK) | CLOSE / BACK | DISSOLVE |
145
+ | `^(devam\|continue\|ileri\|next)` | Sayfa sıralamasında sonraki frame | NAVIGATE | SLIDE_IN / RIGHT |
146
+ | `^(google ile\|facebook ile\|apple ile\|sign in with)` | Auth overlay | OVERLAY | DISSOLVE |
147
+ | `^(kaydet\|save\|onayla\|confirm)` | Success \| Confirmation | NAVIGATE | SLIDE_IN / RIGHT |
148
+ | `^(çıkış\|logout\|sign ?out)` | Login \| Landing | NAVIGATE | SLIDE_IN / LEFT |
149
+ | Hedef eşleşmiyor | — | **Kullanıcıya sor** (AskUserQuestion — kritik dallanma) | — |
150
+
151
+ #### 2c. Frame adı çözümleme
152
+
153
+ Heuristic'teki "Muhtemel hedef rol" → sayfadaki frame adıyla eşle:
154
+ - Regex: `home` → `/home|dashboard|anasayfa|main/i`
155
+ - TR↔EN yaklaşıklığı: `home ≈ anasayfa`, `register ≈ kayıt`, `success ≈ onay`
156
+
157
+ Eşleşme yoksa → `destination: "?"` → kullanıcıya sor (kritik dallanma).
158
+
159
+ #### 2d. Otonom mod davranışı
160
+
161
+ - **`autonomy_mode=Otonom` (varsayılan):** Heuristic %100 eşleşen bağlantılar otomatik uygulanır. Sadece `destination: "?"` olan satırlar için AskUserQuestion.
162
+ - **`autonomy_mode=Onaylı`:** Tüm harita markdown tablo olarak `AskUserQuestion` ile sunulur, kullanıcı satır-bazlı onaylar.
163
+
164
+ **Çıktı formatı (her iki modda gösterilir):**
165
+ ```
166
+ | # | Kaynak | Button | → Hedef | Action | Transition | Mod |
167
+ |---|--------|--------|---------|--------|------------|-----|
168
+ | 1 | Login | "Giriş Yap" | Home | NAVIGATE | SLIDE_IN/RIGHT | auto |
169
+ | 2 | Login | "Kayıt Ol" | Register | NAVIGATE | SLIDE_IN/RIGHT | auto |
170
+ | 3 | Login | "Devam" | ? | ? | ? | ask |
171
+ ```
172
+
173
+ ### Step 3: Reactions Oluştur (Chunking Kuralı)
174
+
175
+ #### 3a. Ölçek tespiti
176
+
177
+ | Bağlantı sayısı | Strateji |
178
+ |---|---|
179
+ | ≤ 20 | Tek seferde hepsi, her 5 bağlantıda 1 micro-report |
180
+ | 21-50 | 10'lu chunk'lara böl, her chunk sonrası `figma_capture_screenshot` + progress |
181
+ | > 50 | **Kritik dallanma** — kullanıcıya sor: "Önce kritik flow'ları mı (Auth/Onboarding/Ana akış)?" |
182
+ | > 100 | **HARD STOP** — "Bu ölçekte batch modu gelecekte. Şimdi en kritik 50 bağlantıyı seç." |
183
+
184
+ #### 3b. Animasyon standartları (FUTURE.md:232-241)
185
+
186
+ | Geçiş | transitionType | direction | duration | easing | matchLayers |
187
+ |---|---|---|---|---|---|
188
+ | İleri navigasyon | `SLIDE_IN` | `RIGHT` | 300 | `EASE_OUT` | — |
189
+ | Geri navigasyon | `SLIDE_IN` | `LEFT` | 300 | `EASE_OUT` | — |
190
+ | Push ileri | `PUSH` | `RIGHT` | 300 | `EASE_OUT` | — |
191
+ | Modal açma | `DISSOLVE` | — | 200 | `EASE_IN` | — |
192
+ | Modal kapama | `DISSOLVE` | — | 150 | `EASE_OUT` | — |
193
+ | Smart variant | `SMART_ANIMATE` | — | 300 | `EASE_IN_AND_OUT` | `true` |
194
+ | Hover state | `SMART_ANIMATE` | — | 150 | `EASE_IN` | `true` |
195
+ | Press state | `SMART_ANIMATE` | — | 100 | `EASE_OUT` | `true` |
196
+ | Anlık | `INSTANT` | — | — | — | — |
197
+
198
+ #### 3c. Her bağlantı için tool çağrısı
199
+
200
+ ```js
201
+ await figma_create_prototype_connection({
202
+ sourceNodeId: button.id,
203
+ destinationNodeId: homeFrame.id,
204
+ trigger: "ON_CLICK",
205
+ action: "NAVIGATE",
206
+ transitionType: "SLIDE_IN",
207
+ direction: "RIGHT",
208
+ duration: 300,
209
+ easing: "EASE_OUT"
210
+ });
211
+ ```
212
+
213
+ **Çoklu trigger:** Aynı node'a birden fazla reaction gerekiyorsa (hover + click aynı button'da), default `replace: false` sayesinde append edilir.
214
+
215
+ ### Step 4: Flow Starting Point
216
+
217
+ ```js
218
+ // autonomy_mode=Otonom: starting_screen="auto" ise ilk Login/Onboarding/Home tipi frame seçilir
219
+ const start = startingScreen === "auto"
220
+ ? screens.find(s => ["Login","Onboarding","Home"].includes(s.role)) || screens[0]
221
+ : screens.find(s => s.id === startingScreen);
222
+
223
+ await figma_set_flow_starting_point({
224
+ nodeId: start.id,
225
+ name: flowName,
226
+ description: `Auto-generated by figma-prototype-flow skill on ${new Date().toISOString()}`
227
+ });
228
+ ```
229
+
230
+ ### Step 5: Scroll Behavior (Opsiyonel)
231
+
232
+ Sayfada scroll gereken ekranlar varsa (uzun content, header'ı sticky yapılacak element):
233
+
234
+ ```js
235
+ // Ana frame vertical scroll
236
+ await figma_set_scroll_behavior({ nodeId: frame.id, overflowDirection: "VERTICAL" });
237
+ // Header sticky
238
+ await figma_set_scroll_behavior({ nodeId: header.id, scrollBehavior: "FIXED" });
239
+ ```
240
+
241
+ Otonom modda: frame height > viewport height ise otomatik `overflowDirection: "VERTICAL"` öner.
242
+
243
+ ### Step 6: Validasyon
244
+
245
+ ```js
246
+ const audit = await figma_get_prototype_connections({ pageScope: true });
247
+ ```
248
+
249
+ Kontroller:
250
+ - Haritadaki her kaynağın `audit.connections[]` içinde en az 1 reaction'ı var mı?
251
+ - Tüm `destinationId`'ler hâlâ çözülüyor mu? (silinen frame → orphan)
252
+ - `audit.flowStartingPoints` doldu mu?
253
+ - Circular overlay var mı? — OVERLAY graph DFS, A→B→A kontrolü
254
+
255
+ Orphan veya circular bulunursa → **kritik dallanma**, kullanıcıya rapor.
256
+
257
+ ### Step 7: Dokümantasyon
258
+
259
+ - `figma_capture_screenshot({ nodeId: pageRoot, scale: 1 })` ile flow overview
260
+ - JSON özet → `ai-handoff-export` ile uyumlu şekilde `prototypeFlow` anahtarı altında
261
+ - Mermaid `graph TD` diagram (handoff entegrasyonu için)
262
+
263
+ **Final Türkçe rapor:**
264
+ ```
265
+ ✅ Flow "Login Akışı" oluşturuldu
266
+ - 12 bağlantı (11 auto, 1 manual)
267
+ - Flow starting point: Login / Mobile
268
+ - Orphan reaction: 0
269
+ - Circular overlay: 0
270
+ - Screenshot: ~/.fmcp/screenshots/<timestamp>-<nodeId>.png
271
+ ```
272
+
273
+ ## Türkçe Karakter Kuralı (ZORUNLU)
274
+
275
+ Tüm çıktılarda Türkçe karakterler (ş, ç, ğ, ö, ü, ı, İ) doğru kullanılmalı. Her Write sonrası bozuk encoding kontrolü:
276
+ ```bash
277
+ grep -P "[ÃÄ]" <dosya>
278
+ ```
279
+
280
+ ## Hata Yonetimi
281
+
282
+ | Err prefix | Neden | Ne yap |
283
+ |---|---|---|
284
+ | `SOURCE_NOT_FOUND` | sourceNodeId geçersiz | Node ID'yi doğrula, sayfa değişmiş olabilir |
285
+ | `DESTINATION_NOT_FOUND` | destinationNodeId geçersiz | Hedef frame silinmiş olabilir — haritayı yeniden oluştur |
286
+ | `DESTINATION_REQUIRED` | NAVIGATE/OVERLAY vb. için hedef verilmemiş | BACK/CLOSE/URL dışında destinationNodeId zorunlu |
287
+ | `NAVIGATE_REQUIRES_FRAME` | NAVIGATE hedefi FRAME değil | Hedef node'u FRAME'e çevir |
288
+ | `UNSUPPORTED_NODE_TYPE` | Source reactions desteklemiyor (SLICE/CONNECTOR) | FRAME/INSTANCE/COMPONENT/GROUP/SECTION kullan |
289
+ | `KEYCODES_REQUIRED` | ON_KEY_DOWN trigger için keyCodes eksik | En az 1 tuş kodu (örn. [13]=Enter) ver |
290
+ | `DIRECTION_REQUIRED` | DirectionalTransition için direction eksik | LEFT/RIGHT/TOP/BOTTOM ver |
291
+ | `NO_COMPONENT_SET` | Variant değişimi için COMPONENT_SET context yok | Instance'ın main component'i COMPONENT_SET içinde olmalı |
292
+ | `VARIANT_NOT_FOUND` | targetVariantName set içinde yok | `figma_get_component_for_development` ile variant adlarını doğrula |
293
+ | `FLOW_REQUIRES_FRAME` | Flow starting point FRAME olmalı | nodeId'yi FRAME olarak seç |
294
+ | `MISSING_SCOPE` | `figma_get_prototype_connections`'a ne nodeId ne pageScope verilmiş | En az birini belirt |
295
+ | `OVERFLOW_REQUIRES_FRAME_LIKE` | overflowDirection FRAME benzeri node gerektirir | FRAME/COMPONENT/COMPONENT_SET/INSTANCE kullan |
296
+ | `SCROLL_BEHAVIOR_UNSUPPORTED` | scrollBehavior node tipi desteklemiyor | SceneNode subtype kullan |
297
+ | `MISSING_PARAM` | `figma_set_scroll_behavior` — en az bir param gerekli | overflowDirection veya scrollBehavior ver |
298
+
299
+ ## Çıktı Formatı
300
+
301
+ Her oturum sonunda kullanıcıya:
302
+ - Toplam bağlantı sayısı (auto + manual ayrımı)
303
+ - Flow starting point: ad + node id
304
+ - Validasyon raporu: orphan reactions, circular overlays, eksik bağlantılar
305
+ - Screenshot path: flow overview
306
+ - Animasyon kullanım özeti: kaç SLIDE_IN, kaç DISSOLVE, kaç SMART_ANIMATE
307
+
308
+ ## Evolution Triggers
309
+
310
+ - Figma Plugin API yeni Transition tipi eklerse → `transitionType` enum'a ekle
311
+ - SET_VARIABLE / CONDITIONAL action v2'de desteklenecek → ayrı tool adı önerisi: figma\_create\_prototype\_variable\_action (gelecek sürüm, henüz YOK)
312
+ - ON_KEY_DOWN gamepad desteği gerekirse → `device` enum zaten mevcut (XBOX_ONE/PS4/SWITCH_PRO)
313
+ - `batch` modu eklenirse → 100+ bağlantı için performans iyileşir (şu an her çağrı tek reaction = N roundtrip)
314
+ - Smart Animate için otomatik child matching heuristics → kullanıcı matchLayers seçmek zorunda kalmaz
315
+ - Overlay preset konumlar (centered/top/bottom) — şu an sadece manual `overlayRelativePosition`
@@ -85,6 +85,7 @@ Kullanıcı talebini oku. Anahtar kelimeleri tara:
85
85
  | "drift", "kod/tasarım sapması", "out of sync" | `design-drift-detector` |
86
86
  | "UX copy", "microcopy", "buton metni", "empty state" | `ux-copy-guidance` |
87
87
  | "bu görselden ilham al", "şu resim gibi", "link'teki tasarımdan", "dribbble/behance", "benchmark'tan varyasyon" | `inspiration-intake` → `generate-figma-screen` |
88
+ | "prototip bağla", "ekranları bağla", "prototype connections", "flow oluştur", "navigasyon kur", "animasyon ekle", "interaction ekle", "geçiş animasyonu", "scroll behavior" | `figma-prototype-flow` |
88
89
 
89
90
  **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.
90
91
 
@@ -852,6 +852,24 @@ Ne yapayım?
852
852
  ❌ **YANLIŞ:** Alternatif N başarısız, sessizce N+1'e geç
853
853
  ✅ **DOĞRU:** N başarısız olunca orphan cleanup + rapor + checkpoint
854
854
 
855
+ ### Step 6.7: Prototip Bağlantı Teklifi (Opsiyonel, v1.9.9+)
856
+
857
+ Oturumda **2 veya daha fazla frame üretildiyse** kullanıcıya öner:
858
+
859
+ ```
860
+ "Bu oturumda X ekran ürettim (Login, Home, Register). Bunları birbirine bağlamak için
861
+ `figma-prototype-flow` skill'ini kullanabiliriz — otomatik navigasyon haritası çıkarır,
862
+ animasyon + flow starting point oluşturur.
863
+
864
+ Şimdi başlatayım mı? (Üretilen frame ID'leri hazır: 1:2, 1:3, 1:4)"
865
+ ```
866
+
867
+ - **Skill-to-skill invoke YOK** — FMCP'de programatik skill tetikleme mekanizması yok. Kullanıcı onaylarsa Claude yeni bir intent olarak skill'i tetikler (`fmcp-intent-router` üzerinden).
868
+ - Kullanıcı evet derse: `screen_scope=Node ID listesi` parametresiyle, üretilen frame ID'lerini listele.
869
+ - Kullanıcı hayır veya sessiz kalırsa: önerme kaydedilir, Step 7'ye geç.
870
+
871
+ **Önkoşul:** Üretilen frame'lerin içinde en az 1 Button/Link instance'ı olmalı (aksi halde heuristic işe yaramaz).
872
+
855
873
  ### Step 7: Güncelleme Senaryosu
856
874
 
857
875
  Mevcut bir ekranı güncellerken: