@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,325 @@
1
+ ---
2
+ name: figma-canvas-ops
3
+ description: F-MCP Bridge ile Figma tuvalinde güvenli yazma/düzenleme için zorunlu önkoşul kılavuzu. figma_execute çağrısı öncesi bu skill yüklenmelidir. Renk aralığı, font yükleme, array klonlama, atomik hata yönetimi, node ID return kuralları ve sayfa konteksti sıfırlanmasını kapsar. "figma'da düzenle", "tuvale yaz", "node oluştur", "figma execute kılavuz", "canvas ops", "tuval işlemi" ifadeleriyle tetiklenir.
4
+ metadata:
5
+ mcp-server: user-figma-mcp-bridge
6
+ personas:
7
+ - designer
8
+ - designops
9
+ ---
10
+
11
+ # Figma Canvas Ops — figma_execute Güvenli Kullanım Kılavuzu
12
+
13
+ ## Overview
14
+
15
+ Bu skill, `figma_execute` aracıyla Figma tuvalinde yazma/düzenleme yapılmadan önce **zorunlu** olarak yüklenmesi gereken önkoşul kılavuzudur. Topluluk `figma-use` skill'inden uyarlanmış, F-MCP Bridge araçlarına göre yeniden yazılmıştır.
16
+
17
+ **Tuval yazan her skill** (apply-figma-design-system, fix-figma-design-system-finding, generate-figma-screen, generate-figma-library, figjam-diagram-builder) bu kılavuzdaki kuralları uygulamalıdır.
18
+
19
+ ## Araç eşleme (topluluk → F-MCP)
20
+
21
+ | Topluluk (resmi MCP) | F-MCP Bridge | Not |
22
+ |---|---|---|
23
+ | `use_figma` | `figma_execute` | JS çalıştırma; `code` parametresi |
24
+ | `get_metadata` | `figma_get_file_data` | Yapı/metadata; `depth` parametresi |
25
+ | `get_screenshot` | `figma_capture_screenshot` | Node bazlı görsel doğrulama |
26
+ | `search_design_system` | `figma_search_components` + `figma_get_design_system_summary` | İki araç birlikte |
27
+
28
+ Detaylı eşleme: [TOOL_MAPPING.md](../TOOL_MAPPING.md)
29
+
30
+ ## Prerequisites
31
+
32
+ - F-MCP Bridge plugin Figma'da çalışıyor ve bağlı olmalı
33
+ - `figma_get_status()` ile bağlantı doğrulanmalı
34
+
35
+ ## 1. Kritik Kurallar
36
+
37
+ 1. **`return` ile veri dön.** Return değeri otomatik JSON serialize edilir (object, array, string, number). `figma.closePlugin()` çağırma — bu bridge tarafından yönetilir.
38
+
39
+ 2. **Düz JavaScript yaz, top-level `await` kullan.** Kod otomatik async bağlama sarılır. `(async () => { ... })()` ile sarma.
40
+
41
+ 3. **`figma.notify()` çalışmaz** — kullanma.
42
+
43
+ 4. **`console.log()` dönmez** — çıktı için `return` kullan.
44
+
45
+ 5. **Küçük adımlarla çalış.** Büyük işlemleri birden fazla `figma_execute` çağrısına böl. Her adımdan sonra doğrula. Bug'lardan kaçınmanın en önemli pratiği budur.
46
+
47
+ **Timeout yapılandırması:** `figma_execute` varsayılan timeout 5000ms'dir. Çok node oluşturma veya karmaşık işlemlerde `timeout` parametresini artır (maksimum 30000ms):
48
+ ```
49
+ figma_execute({ code: "...", timeout: 15000 })
50
+ ```
51
+ Kılavuz: 1-5 node → 5000ms | 6-12 node → 10000ms | 13+ node → işlemi böl veya 15000-30000ms
52
+
53
+ 6. **Renkler 0–1 aralığında** (0–255 değil): `{r: 1, g: 0, b: 0}` = kırmızı. Renk değerlerini hardcoded yazma — tasarım sisteminden (`figma_get_variables` / `figma_get_styles`) oku.
54
+
55
+ 7. **Fills/strokes read-only array** — klonla, değiştir, geri ata:
56
+ ```js
57
+ // Renk değerini DS'den oku, aşağıdaki sadece API FORMAT örneğidir
58
+ const fills = [...node.fills];
59
+ fills[0] = { ...fills[0], color: DS_COLOR }; // DS'den okunan değer
60
+ node.fills = fills;
61
+ ```
62
+
63
+ 8. **Font yükleme zorunlu** — metin işleminden önce font yükle. Hangi fontu kullanacağını belirlemek için şu sırayı takip et:
64
+
65
+ **a)** Kayıtlı kütüphane varsa (`.claude/libraries/`) text style'lardan veya variable'lardan font ailesini oku. Örnek: kütüphanedeki text style `global/surface/body` → font family ve style bilgisini al.
66
+
67
+ **b)** Kütüphane yoksa veya font bilgisi bulunamazsa kullanıcıya sor: "Hangi fontu kullanmamı istersiniz?"
68
+
69
+ **c)** Kullanıcı "sen seç" derse `Inter` kullan.
70
+
71
+ ```js
72
+ // Fontu belirledikten sonra yükle:
73
+ await figma.loadFontAsync({ family: "FONT_ADI", style: "Regular" });
74
+ // Gerekli diğer ağırlıklar:
75
+ await figma.loadFontAsync({ family: "FONT_ADI", style: "Bold" });
76
+ ```
77
+ **Asla** hardcoded font varsayma — her zaman bu sırayı takip et. Bu kural font, renk, boyut, spacing dahil TÜM design token'lar için geçerlidir. Detay: `project-context.md` → "Design Token Kuralı".
78
+
79
+ **FigJam özel durumu:** `createShapeWithText()` varsayılan fontu **"Inter Medium"**'dir ("Inter Regular" DEĞİL). FigJam shape text'i düzenlemek için:
80
+ ```js
81
+ await figma.loadFontAsync({ family: "Inter", style: "Medium" });
82
+ const shape = figma.createShapeWithText();
83
+ shape.text.characters = "Metin"; // Medium yüklenmeden hata verir
84
+ ```
85
+ Genel kural: metin düzenlemeden önce **mevcut fontu kontrol et** ve o fontu yükle:
86
+ ```js
87
+ await figma.loadFontAsync(shape.text.fontName); // dinamik font algılama
88
+ ```
89
+
90
+ 9. **Sayfa konteksti her çağrıda sıfırlanır** — `figma.currentPage` her `figma_execute` çağrısında ilk sayfaya döner. Farklı sayfada çalışacaksan:
91
+ ```js
92
+ const page = figma.root.children.find(p => p.name === "Hedef Sayfa");
93
+ await figma.setCurrentPageAsync(page);
94
+ ```
95
+
96
+ 10. **Tüm tasarım değerleri DS variable'larına BAĞLANMALI (ZORUNLU).** Renk, spacing, padding, radius gibi hiçbir değer hardcoded yazılmaz. Akış:
97
+
98
+ **a) Kütüphaneden variable key'lerini oku:** `.claude/libraries/` dosyasını kontrol et. Key yoksa SUI/DS dosyasında `figma_execute` ile çek:
99
+ ```js
100
+ // DS dosyasında çalıştır (fileKey = DS dosyasının key'i)
101
+ const v = await figma.variables.getVariableByIdAsync("VariableID:...");
102
+ return { name: v.name, key: v.key };
103
+ ```
104
+
105
+ **b) Hedef dosyada variable'ı import et:**
106
+ ```js
107
+ const variable = await figma.variables.importVariableByKeyAsync("VARIABLE_KEY");
108
+ ```
109
+
110
+ **c) Renk bağlama (fill/stroke):** `setBoundVariableForPaint` kullan — DİKKAT: yeni paint döner, yakala ve geri ata:
111
+ ```js
112
+ const fills = [...node.fills];
113
+ const boundPaint = figma.variables.setBoundVariableForPaint(fills[0], "color", variable);
114
+ node.fills = [boundPaint];
115
+ ```
116
+
117
+ **d) Spacing/padding/radius bağlama:** `setBoundVariable` kullan:
118
+ ```js
119
+ node.setBoundVariable("paddingLeft", variable);
120
+ node.setBoundVariable("paddingRight", variable);
121
+ node.setBoundVariable("itemSpacing", variable);
122
+ node.setBoundVariable("topLeftRadius", variable);
123
+ ```
124
+
125
+ **e) Text style bağlama:** Doğrudan text style ID'si ile uygula:
126
+ ```js
127
+ const textStyles = await figma.getLocalTextStylesAsync();
128
+ const bodyStyle = textStyles.find(s => s.name === "global/surface/body");
129
+ await textNode.setTextStyleIdAsync(bodyStyle.id);
130
+ ```
131
+
132
+ **f) Text rengi bağlama (text node fill):**
133
+ ```js
134
+ const textFills = [...textNode.fills];
135
+ const boundTextPaint = figma.variables.setBoundVariableForPaint(textFills[0], "color", textColorVar);
136
+ textNode.fills = [boundTextPaint];
137
+ ```
138
+
139
+ **Asla** `node.fills = [{ type: "SOLID", color: { r: X, g: Y, b: Z } }]` gibi hardcoded renk yazma. Her zaman variable import et ve bağla.
140
+
141
+ 11. **`layoutSizingHorizontal/Vertical = 'FILL'` appendChild'DAN SONRA** ayarlanmalı — öncesinde hata verir.
142
+
143
+ 12. **Yeni üst-düzey node'ları (0,0)'dan uzağa konumlandır.** `figma.currentPage.children` tarayarak boş alan bul.
144
+
145
+ 13. **Hata durumunda DUR.** Hemen tekrar deneme. Hata mesajını oku, scripti düzelt, sonra tekrar çalıştır. Başarısız scriptler atomiktir — hata olursa hiçbir değişiklik uygulanmaz.
146
+
147
+ 14. **Tüm oluşturulan/değiştirilen node ID'lerini RETURN ET:**
148
+ ```js
149
+ return { createdNodeIds: [...], mutatedNodeIds: [...] };
150
+ ```
151
+
152
+ 15. **Variable scope'larını açıkça ayarla.** Varsayılan `ALL_SCOPES` her property picker'ı kirletir. Spesifik scope kullan:
153
+ - Arka plan: `["FRAME_FILL", "SHAPE_FILL"]`
154
+ - Metin rengi: `["TEXT_FILL"]`
155
+ - Boşluk: `["GAP"]`
156
+
157
+ 16. **Her Promise'i `await` et.** `await` olmadan async çağrılar sessizce başarısız olur.
158
+
159
+ ## 2. Sayfa Kuralları
160
+
161
+ ### Sayfalar arası geçiş
162
+
163
+ ```js
164
+ const targetPage = figma.root.children.find(p => p.name === "Sayfa Adı");
165
+ await figma.setCurrentPageAsync(targetPage);
166
+ // targetPage.children artık yüklü
167
+ ```
168
+
169
+ **Sync setter `figma.currentPage = page` hata verir** — her zaman `await figma.setCurrentPageAsync(page)` kullan.
170
+
171
+ ### Çağrılar arası
172
+
173
+ Her `figma_execute` çağrısında `figma.currentPage` ilk sayfaya sıfırlanır. Çoklu çağrı gerektiren iş akışlarında her çağrının başında `setCurrentPageAsync` çağır.
174
+
175
+ ## 3. Auto-Layout Kalıpları
176
+
177
+ ### Frame oluşturma
178
+
179
+ ```js
180
+ const frame = figma.createFrame();
181
+ frame.layoutMode = "VERTICAL";
182
+ frame.primaryAxisSizingMode = "AUTO";
183
+ frame.counterAxisSizingMode = "AUTO";
184
+ frame.itemSpacing = 16;
185
+ frame.paddingTop = frame.paddingBottom = 24;
186
+ frame.paddingLeft = frame.paddingRight = 24;
187
+ ```
188
+
189
+ ### FILL boyutlandırma (sıralama kritik)
190
+
191
+ ```js
192
+ const parent = figma.createFrame();
193
+ parent.layoutMode = "VERTICAL";
194
+ const child = figma.createFrame();
195
+ parent.appendChild(child); // ÖNCE ekle
196
+ child.layoutSizingHorizontal = "FILL"; // SONRA FILL ayarla
197
+ ```
198
+
199
+ ## 4. Bileşen ve Instance Kalıpları
200
+
201
+ ### Mevcut bileşen ile instance oluşturma
202
+
203
+ Tercihen `figma_instantiate_component` aracını kullan. `figma_execute` içinde:
204
+
205
+ ```js
206
+ const component = figma.root.findOne(
207
+ n => n.type === "COMPONENT" && n.name === "Button"
208
+ );
209
+ if (!component) return { error: "Bileşen bulunamadı" };
210
+ const instance = component.createInstance();
211
+ return { instanceId: instance.id, componentName: component.name };
212
+ ```
213
+
214
+ ### Variant seçimi
215
+
216
+ ```js
217
+ const componentSet = figma.root.findOne(
218
+ n => n.type === "COMPONENT_SET" && n.name === "Button"
219
+ );
220
+ const variant = componentSet.children.find(
221
+ c => c.name === "Size=Large, Type=Primary"
222
+ );
223
+ const instance = variant.createInstance();
224
+ ```
225
+
226
+ ## 5. Variable Bağlama Kalıpları
227
+
228
+ ```js
229
+ const collections = await figma.variables.getLocalVariableCollectionsAsync();
230
+ const colorCollection = collections.find(c => c.name === "Colors");
231
+ const variables = await Promise.all(
232
+ colorCollection.variableIds.map(id =>
233
+ figma.variables.getVariableByIdAsync(id)
234
+ )
235
+ );
236
+ const primaryColor = variables.find(v => v.name === "primary/500");
237
+
238
+ // Fill'e bağla
239
+ const fills = [...node.fills];
240
+ const boundPaint = figma.variables.setBoundVariableForPaint(
241
+ fills[0], "color", primaryColor
242
+ );
243
+ node.fills = [boundPaint]; // YENİ paint'i geri ata
244
+ ```
245
+
246
+ ## 6. Ek API Gotcha'lar (Canlı Testte Keşfedilen)
247
+
248
+ 17. **`import` keyword yasağı.** Plugin sandbox'ta `eval()` ile kod çalıştırılır. `import` JavaScript reserved word olduğundan function/variable adında kullanılamaz:
249
+ ```js
250
+ // YANLIŞ — syntax error verir
251
+ const iv = async (k) => await figma.variables.importVariableByKeyAsync(k);
252
+
253
+ // DOĞRU
254
+ async function getVar(k) { return await figma.variables.importVariableByKeyAsync(k); }
255
+ ```
256
+
257
+ 18. **`setEffectStyleIdAsync` zorunlu.** Sync setter `node.effectStyleId = style.id` dynamic-page mode'da hata verir:
258
+ ```js
259
+ // YANLIŞ
260
+ card.effectStyleId = esCard.id;
261
+
262
+ // DOĞRU
263
+ await card.setEffectStyleIdAsync(esCard.id);
264
+ ```
265
+
266
+ 19. **`setTextStyleIdAsync` kullan, fontSize variable binding YASAK.** Text style atamak font, size, line-height, letter-spacing'i tek seferde bağlar:
267
+ ```js
268
+ // YANLIŞ — sadece font size bağlar, style bağlamaz
269
+ textNode.setBoundVariable("fontSize", fontSizeVar);
270
+
271
+ // DOĞRU — tüm tipografi token'larını tek seferde uygular
272
+ const style = await figma.importStyleByKeyAsync("TEXT_STYLE_KEY");
273
+ await textNode.setTextStyleIdAsync(style.id);
274
+ ```
275
+
276
+ 20. **`setExplicitVariableModeForCollection` — string ID çalışmaz.** Library API chain ile collection OBJECT alınmalı:
277
+ ```js
278
+ // YANLIŞ — hata verir
279
+ frame.setExplicitVariableModeForCollection("VariableCollectionId:3015:5729", "3019:3");
280
+
281
+ // DOĞRU — library API chain
282
+ var colls = await figma.teamLibrary.getAvailableLibraryVariableCollectionsAsync();
283
+ var sem = colls.find(function(c){ return c.name.indexOf("Semantic Colors") !== -1; });
284
+ var vars = await figma.teamLibrary.getVariablesInLibraryCollectionAsync(sem.key);
285
+ var first = await figma.variables.importVariableByKeyAsync(vars[0].key);
286
+ var coll = await figma.variables.getVariableCollectionByIdAsync(first.variableCollectionId);
287
+ var darkMode = coll.modes.find(function(m){ return m.name === "Dark"; });
288
+ frame.setExplicitVariableModeForCollection(coll, darkMode.modeId);
289
+ ```
290
+
291
+ 21. **Escaped quote dikkat.** `figma_execute` code parametresinde `\"` yerine düz `"` kullan. Template literal içinde kaçış karakteri syntax error verir.
292
+
293
+ ## 7. Hata Kurtarma
294
+
295
+ 1. `figma_execute` hata dönerse **hemen tekrar deneme**
296
+ 2. Hata mesajını oku ve analiz et
297
+ 3. Yaygın hatalar:
298
+ - `Cannot read property of undefined` → Node ID geçersiz veya sayfa yüklenmemiş
299
+ - `Font not loaded` → `loadFontAsync` eksik
300
+ - `Cannot set FILL before appendChild` → Sıralama hatası
301
+ - `Maximum call stack` → Sonsuz döngü; daha küçük parçalara böl
302
+ 4. Scripti düzelt ve yeni çağrı yap
303
+
304
+ ## 7. Doğrulama Adımları
305
+
306
+ Her yazma işleminden sonra:
307
+
308
+ 1. `figma_capture_screenshot` ile görsel doğrulama
309
+ 2. Gerekirse `figma_get_file_data` ile yapı kontrolü
310
+ 3. Oluşturulan node ID'lerini sonraki çağrılarda referans olarak kullan
311
+
312
+ ## F-MCP skill koordinasyonu
313
+
314
+ Bu skill şu skill'lerle birlikte kullanılır:
315
+ - **generate-figma-screen** — Ekran oluşturma iş akışı
316
+ - **generate-figma-library** — DS kütüphanesi inşa
317
+ - **apply-figma-design-system** — DS hizalama
318
+ - **fix-figma-design-system-finding** — Tek bulgu düzeltme
319
+ - **figjam-diagram-builder** — FigJam diyagram oluşturma
320
+
321
+ ## Evolution Triggers
322
+
323
+ - Bridge'e yeni `figma_*` yazma aracı eklendiğinde ilgili kalıp bölümü güncellenmeli
324
+ - `figma_execute` parametrelerinde değişiklik olursa Kural 1–2 güncellenmeli
325
+ - Yeni Plugin API yetenekleri bridge'e eklendiğinde ilgili örnekler eklenmeli
@@ -0,0 +1,235 @@
1
+ ---
2
+ name: figma-screen-analyzer
3
+ description: Figma ekranını teknik olmayan dilde analiz eder. Bileşen envanteri, DS uyum oranı, görsel hiyerarşi, kullanıcı akışı özeti ve design token kapsamı raporlar. PO, PM ve SEM'lerin tasarım durumunu anlamaları için tasarlanmıştır. "ekranı analiz et", "tasarım raporu", "screen analysis", "UI raporu çıkar", "ne var bu ekranda", "bileşen sayısı", "DS uyum oranı" ifadeleriyle tetiklenir. F-MCP Bridge plugin bağlantısı gerektirir.
4
+ metadata:
5
+ mcp-server: user-figma-mcp-bridge
6
+ personas:
7
+ - po
8
+ - designer
9
+ ---
10
+
11
+ # Figma Screen Analyzer — UI Analiz Raporu
12
+
13
+ ## Overview
14
+
15
+ Bu skill, Figma ekranını **teknik olmayan** dilde analiz ederek PO, PM ve SEM'ler için anlaşılır bir rapor üretir. DS uyum oranı, bileşen envanteri, görsel hiyerarşi değerlendirmesi ve aksiyon önerileri içerir.
16
+
17
+ **Salt okunur** — Figma tuvalinde değişiklik yapmaz.
18
+
19
+ ## Prerequisites
20
+
21
+ - F-MCP Bridge plugin bağlı olmalı
22
+ - Hedef ekranın node ID'si veya URL'i bilinmeli
23
+
24
+ ## F-MCP skill koordinasyonu
25
+
26
+ - **İlişkili:** `audit-figma-design-system` (teknik DS denetimi — bu skill'in PO/PM versiyonu)
27
+ - **Sonra:** Bulgulara göre `apply-figma-design-system` veya `ai-handoff-export` önerilir
28
+ - **Karşılaştırma:** İki ekran karşılaştırması için her ikisine de ayrı analiz yapılır
29
+
30
+ ## Required Workflow
31
+
32
+ ### Step 1: Plugin Bağlantısını Doğrula
33
+
34
+ ```
35
+ figma_get_status()
36
+ ```
37
+
38
+ ### Step 2: Ekran Verisi Topla
39
+
40
+ > **DERİN ANALİZ KURALI:** Sadece frame/node isimlerine bakarak sonuç çıkarma. Her node'un içindeki text content (`characters`), instance prop'ları ve child yapılarını detaylı oku. Bir şeyin "eksik" veya "yok" olduğunu iddia etmeden önce tüm child node'ların içeriğini kontrol et.
41
+
42
+ > **GÖRSEL DOĞRULAMA KURALI:** Analiz sonucunu raporlamadan önce `figma_capture_screenshot` ile ekran görüntüsü al ve görsel olarak kontrol et. Text content ile screenshot'ın tutarlı olduğunu teyit et. Çelişki varsa screenshot'ı esas al.
43
+
44
+ ```
45
+ figma_get_design_context(
46
+ nodeId="<NODE_ID>",
47
+ depth=3,
48
+ verbosity="full",
49
+ includeLayout=true,
50
+ includeVisual=true,
51
+ includeTypography=true
52
+ )
53
+ ```
54
+
55
+ ```
56
+ figma_capture_screenshot(nodeId="<NODE_ID>")
57
+ ```
58
+
59
+ ### Step 3: İlk İzlenim Analizi (2 Saniye Testi)
60
+
61
+ Screenshot'a bakarak hızlı sezgisel değerlendirme yap (DS metriklerinden ÖNCE):
62
+
63
+ 1. **Göz çekimi:** İlk bakışta göz nereye gidiyor? Bu doğru öğe mi? (CTA, başlık, hero görsel?)
64
+ 2. **Duygusal tepki:** Ekran güven mi, kafa karışıklığı mı, heyecan mı uyandırıyor?
65
+ 3. **Amaç netliği:** Ekranın ne için olduğu 2 saniyede anlaşılıyor mu?
66
+ 4. **Görsel yoğunluk:** Sıkışık mı, dengeli mi, çok boş mu?
67
+
68
+ > Bu bölüm **sezgisel** — metrik değil, izlenim. Raporda "İlk İzlenim" başlığı altında 2-3 cümle.
69
+
70
+ ### Step 4: DS Uyum Analizi
71
+
72
+ ```
73
+ figma_get_design_system_summary()
74
+ ```
75
+
76
+ `figma_execute` ile instance ve token sayımı:
77
+
78
+ ```js
79
+ const page = figma.currentPage;
80
+ const target = page.findOne(n => n.id === "<NODE_ID>");
81
+ if (!target) return { error: "Node bulunamadı" };
82
+
83
+ const allNodes = target.findAll(() => true);
84
+ const instances = target.findAll(n => n.type === "INSTANCE");
85
+ const textNodes = target.findAll(n => n.type === "TEXT");
86
+ const frames = target.findAll(n => n.type === "FRAME");
87
+
88
+ let boundVariableCount = 0;
89
+ let unboundCount = 0;
90
+ allNodes.forEach(n => {
91
+ if (n.boundVariables && Object.keys(n.boundVariables).length > 0) {
92
+ boundVariableCount++;
93
+ }
94
+ if (n.fills && n.fills.length > 0 && n.type !== "INSTANCE") {
95
+ const hasBound = n.boundVariables && n.boundVariables.fills;
96
+ if (!hasBound) unboundCount++;
97
+ }
98
+ });
99
+
100
+ const uniqueComponents = new Map();
101
+ instances.forEach(inst => {
102
+ const mc = inst.mainComponent;
103
+ const key = mc?.key || mc?.id;
104
+ const name = mc?.name || "Bilinmeyen";
105
+ if (key) {
106
+ if (!uniqueComponents.has(key)) uniqueComponents.set(key, { name, count: 0 });
107
+ uniqueComponents.get(key).count++;
108
+ }
109
+ });
110
+
111
+ return {
112
+ totalNodes: allNodes.length,
113
+ instanceCount: instances.length,
114
+ textNodeCount: textNodes.length,
115
+ frameCount: frames.length,
116
+ boundVariableCount,
117
+ unboundFillCount: unboundCount,
118
+ uniqueComponents: [...uniqueComponents.values()],
119
+ dsComplianceRate: Math.round(((instances.length + boundVariableCount) / Math.max(allNodes.length, 1)) * 100)
120
+ };
121
+ ```
122
+
123
+ ### Step 5: Görsel Hiyerarşi Değerlendirmesi
124
+
125
+ AI analizi ile:
126
+
127
+ 1. **Ana bölümler:** Ekranın kaç ana bölümü var (header, content, footer, sidebar vb.)
128
+ 2. **Görsel akış:** Kullanıcı gözünün doğal akışı (F-pattern, Z-pattern, üstten alta)
129
+ 3. **Öne çıkan öğeler:** CTA butonları, başlıklar, görsel odak noktaları
130
+ 4. **Boşluk dengesi:** Sıkışık mı, dengeli mi, çok boş mu
131
+ 5. **Okuma sırası doğru mu?** Başlık → alt başlık → içerik → CTA sırası mantıklı mı?
132
+ 6. **Vurgu doğru elemanda mı?** CTA görsel olarak en dikkat çekici mi, yoksa dekoratif bir öğe mi öne çıkıyor?
133
+ 7. **Tipografi hiyerarşisi net mi?** Kaç farklı boyut var? 3-4 kademe yeterli, 7+ sorun işareti
134
+ 8. **Beyaz alan etkili mi?** Kasıtlı dramatik boşluk mu, dengesiz dağılım mı, sıkışıklık mı?
135
+
136
+ ### Step 6: Geri Bildirim Prensipleri
137
+
138
+ Rapor üretilirken aşağıdaki prensiplere uyulmalı:
139
+
140
+ 1. **Spesifik ol** — "CTA navigasyonla yarışıyor" yaz, "layout kafa karıştırıcı" yazma
141
+ 2. **Neden'i açıkla** — Geri bildirimi tasarım prensibine veya kullanıcı ihtiyacına bağla
142
+ 3. **Alternatif öner** — Sadece sorun tespit etme, çözüm de sun
143
+ 4. **İyi olanı kabul et** — Yalnızca eleştiri değil, iyi yapılan şeyleri de raporla
144
+ 5. **Aşamaya göre ayarla** — Erken keşif farklı feedback alır, son düzeltme farklı
145
+
146
+ ### Step 7: Rapor Üret
147
+
148
+ > **Marka Profili Entegrasyonu:** `.fmcp-brand-profile.json` varsa `aestheticDirection` ve `typography` bilgisiyle değerlendir — ekranın marka estetiğiyle uyumu raporla.
149
+
150
+ ## Çıktı Formatı
151
+
152
+ ### Executive Summary (Varsayılan)
153
+
154
+ ```markdown
155
+ # Ekran Analiz Raporu — [Ekran Adı]
156
+
157
+ ## Özet Tablo
158
+
159
+ | Metrik | Değer | Durum |
160
+ |---|---|---|
161
+ | Toplam öğe | 127 | — |
162
+ | DS bileşeni (instance) | 23 | ✓ İyi |
163
+ | Benzersiz bileşen türü | 8 | — |
164
+ | Token'a bağlı öğe | 45 | ✓ İyi |
165
+ | Bağsız renk (hardcode) | 5 | ⚠ Düzeltilmeli |
166
+ | DS Uyum Oranı | %85 | ✓ Kabul edilebilir |
167
+
168
+ ## Bileşen Envanteri
169
+
170
+ | Bileşen | Kullanım Sayısı |
171
+ |---|---|
172
+ | Button | 5 |
173
+ | Input | 3 |
174
+ | Card | 4 |
175
+ | NavBar | 1 |
176
+ | Avatar | 2 |
177
+ | Badge | 3 |
178
+ | Icon | 5 |
179
+
180
+ ## Görsel Hiyerarşi
181
+
182
+ - **Ana akış:** Üstten alta, F-pattern
183
+ - **Bölümler:** Header → Arama → Filtreler → Kart Listesi → Footer
184
+ - **CTA:** "Yeni Ekle" butonu sağ üstte — dikkat çekici konumda ✓
185
+ - **Boşluk:** Dengeli — bölümler arası tutarlı spacing
186
+
187
+ ## Öneriler
188
+
189
+ 1. 5 hardcode renk token'a bağlanmalı (tema değişikliğinde kırılır)
190
+ 2. Alt bölümdeki 2 custom card DS Card bileşenine çevrilebilir
191
+ 3. Genel DS uyumu iyi — üretime hazır
192
+
193
+ ## Sonraki Adımlar
194
+ → `audit-figma-design-system` ile detaylı teknik denetim
195
+ → `ai-handoff-export` ile implementasyon paketi
196
+ ```
197
+
198
+ ### Karşılaştırmalı Rapor (İki Ekran)
199
+
200
+ İki ekran ID'si verildiğinde yan yana karşılaştırma:
201
+
202
+ ```markdown
203
+ ## Karşılaştırma — Ekran A vs Ekran B
204
+
205
+ | Metrik | Ekran A | Ekran B | Fark |
206
+ |---|---|---|---|
207
+ | DS Uyum | %85 | %72 | Ekran B %13 düşük |
208
+ | Instance sayısı | 23 | 15 | Ekran B'de daha az DS kullanımı |
209
+ | Hardcode renk | 5 | 12 | Ekran B'de 2.4x daha fazla |
210
+ ```
211
+
212
+ ### JSON Çıktı (`--json`)
213
+
214
+ Yapılandırılmış JSON — dashboard veya CI entegrasyonu için.
215
+
216
+ ## Türkçe Karakter Kuralı (ZORUNLU)
217
+
218
+ Tüm Türkçe metin içeriklerinde (Figma text node, kod string, dokümantasyon) doğru Unicode karakterler kullanılmalıdır. ASCII karşılıkları YASAKTIR:
219
+
220
+ | Doğru | Yanlış | Doğru | Yanlış |
221
+ |-------|--------|-------|--------|
222
+ | ş | s | Ş | S |
223
+ | ı | i | İ | I |
224
+ | ö | o | Ö | O |
225
+ | ü | u | Ü | U |
226
+ | ç | c | Ç | C |
227
+ | ğ | g | Ğ | G |
228
+
229
+ Son adım: Üretilen tüm Türkçe metinleri karakter kontrolünden geçir.
230
+
231
+ ## Evolution Triggers
232
+
233
+ - PO/PM geri bildirimine göre rapor metrikleri genişletilmeli
234
+ - Yeni DS analiz araçları bridge'e eklenirse daha detaylı metrikler çıkarılmalı
235
+ - Sprint/milestone bazlı trend izleme desteği eklenebilir
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: fix-figma-design-system-finding
3
+ description: audit-figma-design-system ile tespit edilen tek bir design system bulgusunu Figma tuvalinde dar kapsamda düzeltir (swap, token bağlama, variant hizalama). F-MCP Bridge ve figma_execute gerektirir. "tek bulguyu düzelt", "ds finding fix", "şu node'u kütüphaneye bağla", "bileşeni değiştir", "token bağla" ifadeleriyle tetiklenir.
4
+ metadata:
5
+ mcp-server: user-figma-mcp-bridge
6
+ personas:
7
+ - designer
8
+ - designops
9
+ ---
10
+
11
+ # Fix Figma Design System Finding (dar yazma)
12
+
13
+ ## Overview
14
+
15
+ **Tek bulgu**, **tek sorunlu node veya minimal küme**, **minimal okuma/yazma**. `audit-figma-design-system` çıktısı veya eşdeğer net görev tanımı olmadan kapsamı sessizce genişletme.
16
+
17
+ Ekran geneli veya çoklu bölüm için **apply-figma-design-system** kullan.
18
+
19
+ ## F-MCP araç eşlemesi
20
+
21
+ | Niyet | F-MCP Bridge |
22
+ |--------|----------------|
23
+ | Okuma | `figma_get_design_context`, `figma_capture_screenshot`, `figma_get_file_data` (gerekirse düşük `depth`), `figma_get_component`, `figma_get_variables`, `figma_get_styles` |
24
+ | Kütüphane adayı | `figma_search_components`, `figma_get_component` |
25
+ | Tuval yazma / Plugin API | `figma_execute` (Figma plugin JS; swap, import, yedek kopya) |
26
+ | Bağlantı | `figma_get_status()` |
27
+
28
+ `figma_execute` içinde büyük JSON döndürme; **figjam-diagram-builder** skill’indeki kısa dönüş disiplinine benzer şekilde özet sonuç tercih et.
29
+
30
+ ## F-MCP skill koordinasyonu
31
+
32
+ | Durum | Sonraki skill |
33
+ |--------|----------------|
34
+ | Audit’ten önce tek düzeltme istendi | İsteğe bağlı kısa `audit-figma-design-system` ile doğrula; sonra bu skill |
35
+ | Birden fazla bulgu, koordineli reconcile | **apply-figma-design-system** |
36
+ | Sadece kod token dosyası güncellemesi | **design-token-pipeline** (tuval + kod ayrı) |
37
+ | Düzeltme sonrası kod parity | **design-drift-detector** |
38
+ | Mapping güncellemesi | **code-design-mapper** |
39
+ | İsteğe bağlı regresyon (tuval) | **audit-figma-design-system** ile aynı node’u yeniden denetle |
40
+
41
+ ## Beklenen girdi
42
+
43
+ Bu skill üç farklı girdi formatını otomatik algılar:
44
+
45
+ 1. **Tek finding JSON** — `audit-figma-design-system` çıktısından tek `finding` objesi. `code_location` alanı varsa bu format algılanır.
46
+ 2. **Tam audit JSON + indeks** — Tüm audit çıktısı + hangi bulgunun düzeltileceği (indeks veya `ruleId`). `findings` dizisi varsa bu format algılanır.
47
+ 3. **Serbest metin + URL** — Sorun özeti + Figma URL / `fileKey` + `nodeId`. Yapılandırılmış JSON yoksa bu format algılanır.
48
+
49
+ **Format algılama sırası:** `code_location` → `findings[]` → serbest metin fallback.
50
+
51
+ Audit JSON kullanılıyorsa `code_location.absolute_file_path` içinden `fileKey` ve `nodeId` çıkar: `/figma/<fileKey>/nodes/<nodeId>`.
52
+
53
+ ## Kapsam kuralı
54
+
55
+ Seçilen bulgu çözülene, **blocked** veya **needs-follow-up** raporlanana kadar başka cleanup yapma. Birden fazla bulgu kullanıcıda varsa birini seç veya en yüksek öncelikli tekini uygula; geri kalanı için audit/apply yönlendir.
56
+
57
+ ## Required Workflow
58
+
59
+ 1. **Plugin bağlantısını doğrula:** `figma_get_status()` — bağlantı yoksa devam etme.
60
+ 3. **Normalize:** `fileKey`, `nodeId`, bulgu başlığı ve gerekçe.
61
+ 3. **Uyumluluk (belirsiz replacement’ta):** Yazmadan önce hangi component/variant, override’lar, layout sözleşmesi — sonuç `safe-to-apply` \| `blocked` \| `needs-human-choice`. `blocked` / `needs-human-choice` ise yazma; durumu bildir.
62
+ 4. **Minimal kanıt:** `figma_capture_screenshot`; yapı için `figma_get_design_context` veya `figma_get_file_data` (dar kapsam); token bulgusuysa `figma_get_variables` / `figma_get_styles`; gerekirse `figma_search_components`.
63
+ 5. **Remediasyon modu (tek seç):** `swap-instance` \| `compose-from-primitives` \| `bind-tokens` \| `align-variant` \| `blocked`. En küçük yeterli değişiklik.
64
+ 6. **Yedek:** Yıkıcı düzenlemeden önce yalnızca etkilenen alt ağacı veya minimal üst section’ı çoğalt; net isimlendir (`Backup - Fix finding …`). Mümkünse ayrı `figma_execute` çağrısı; dönen node id’yi not et.
65
+ 7. **Uygula:** `figma_execute` ile adım adım. Remediasyon modu örnekleri:
66
+
67
+ **swap-instance** (mevcut node'u kütüphane bileşeniyle değiştir):
68
+ ```js
69
+ const node = await figma.getNodeByIdAsync("<NODE_ID>");
70
+ const comp = await figma.importComponentByKeyAsync("<COMPONENT_KEY>");
71
+ // veya local: figma.root.findOne(n => n.type === "COMPONENT" && n.name === "<NAME>");
72
+ const instance = comp.createInstance();
73
+ instance.x = node.x; instance.y = node.y;
74
+ instance.resize(node.width, node.height);
75
+ if (node.parent) node.parent.insertChild(node.parent.children.indexOf(node), instance);
76
+ node.remove();
77
+ return { swapped: instance.id, replacedName: node.name };
78
+ ```
79
+
80
+ **bind-tokens** (hard-coded değeri variable'a bağla):
81
+ ```js
82
+ const node = await figma.getNodeByIdAsync("<NODE_ID>");
83
+ const variable = await figma.variables.getVariableByIdAsync("<VAR_ID>");
84
+ const fills = [...node.fills];
85
+ const boundPaint = figma.variables.setBoundVariableForPaint(fills[0], "color", variable);
86
+ node.fills = [boundPaint];
87
+ return { bound: node.name, variable: variable.name };
88
+ ```
89
+
90
+ **align-variant** (yanlış variant'ı doğrusuyla değiştir):
91
+ ```js
92
+ const instance = await figma.getNodeByIdAsync("<INSTANCE_ID>");
93
+ instance.setProperties({ "Variant": "Primary" });
94
+ return { aligned: instance.id, newVariant: "Primary" };
95
+ ```
96
+
97
+ 8. **Doğrula:** Bulgunun özellikle çözüldüğünü screenshot ve yapı ile kanıtla; global pattern dokunduysa genişlet.
98
+ 9. **İsteğe bağlı:** Regresyon için **audit-figma-design-system** ile aynı kapsamı yeniden çalıştır (özellikle çok adımlı fix sonrası).
99
+
100
+ ## Yazma kuralları
101
+
102
+ - Belirsiz replacement’ta `safe-to-apply` yoksa yazma.
103
+ - Tek bulgu düzeltildi diye tüm ekranı “sistemde” ilan etme.
104
+ - Component key ve variable id’leri isimden önce tercih et.
105
+ - Import timeout / erişilemeyen kütüphane → `blocked`, zorla devam etme.
106
+
107
+ ## Kapanış raporu
108
+
109
+ - **Finding fixed:** Ne değişti, hangi node.
110
+ - **Validation:** Orijinal şikayetin giderildiği kanıtı.
111
+ - **Blocked / Follow-up:** Varsa kısa.
112
+
113
+ ## Evolution Triggers
114
+
115
+ - Bridge'e yeni `figma_execute` kalıpları eklendiğinde remediasyon modları güncellenmeli
116
+ - Audit bulgu formatı değişirse girdi normalize adımı uyarlanmalı
117
+ - Batch düzeltme desteği eklenirse tek/toplu mod ayrımı yapılmalı