@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,373 @@
1
+ ---
2
+ name: ux-copy-guidance
3
+ description: UX yazarlık rehberi — CTA, hata mesajı, boş durum, onay diyaloğu, başarı mesajı ve yükleme durumu için copy kalıpları üretir. Marka ses/ton profili ile kişiselleştirir. Figma text node'larına doğrudan uygulayabilir. "UX copy yaz", "buton metni ne olsun", "hata mesajı", "empty state copy", "boş durum metni", "copy kılavuzu", "marka sesi", "ton rehberi", "microcopy" ifadeleriyle tetiklenir. F-MCP Bridge plugin bağlantısı gerektirir (Figma entegrasyonu için).
4
+ metadata:
5
+ mcp-server: user-figma-mcp-bridge
6
+ personas:
7
+ - designer
8
+ - uidev
9
+ - po
10
+ ---
11
+
12
+ # UX Copy Guidance — Yazarlık ve Marka Sesi Rehberi
13
+
14
+ ## Overview
15
+
16
+ Bu skill, arayüz metinlerini (microcopy) tasarım prensipleri ve marka sesiyle uyumlu şekilde üretir veya değerlendirir. Figma text node'larına doğrudan uygulayabilir.
17
+
18
+ **Okuma + Yazma** — Onay ile Figma text node'larını güncelleyebilir.
19
+
20
+ ## Prerequisites
21
+
22
+ - F-MCP Bridge plugin bağlı olmalı (Figma entegrasyonu için)
23
+ - İsteğe bağlı: Proje kökünde `.fmcp-brand-profile.json` (marka kişiselleştirmesi)
24
+
25
+ ## F-MCP skill koordinasyonu
26
+
27
+ - **Referans veren skill'ler:**
28
+ - `ai-handoff-export` → İçerik Spesifikasyonları bölümü bu skill'e yönlendirir
29
+ - `figma-screen-analyzer` → Copy kalitesi değerlendirmesinde bu skill'in prensiplerini uygular
30
+ - `component-documentation` → Bileşen label/placeholder copy'si bu skill'in kalıplarını kullanır
31
+ - `generate-figma-screen` → Text node oluştururken bu skill'in kalıplarını kullanır
32
+ - **Profil oluşturma:** Bu skill profil yoksa otomatik oluşturma akışı başlatır
33
+
34
+ ---
35
+
36
+ ## 5 Temel Prensip
37
+
38
+ Her arayüz metni bu 5 prensibe uygun olmalıdır:
39
+
40
+ | # | Prensip | Açıklama | Örnek |
41
+ |---|---------|----------|-------|
42
+ | 1 | **Anlaşılır** | Jargon yok, belirsizlik yok, açık söyle | "Dosyayı kaldır" ✓ — "Öğeyi kuyruğunuzdan çıkarın" ✗ |
43
+ | 2 | **Kısa** | Tam anlamı en az kelimeyle ifade et | "Kaydet" ✓ — "Değişikliklerinizi kaydetmek için tıklayın" ✗ |
44
+ | 3 | **Tutarlı** | Aynı kavram her yerde aynı terim | "Sil" her yerde "sil" — bazen "kaldır" bazen "çıkar" değil |
45
+ | 4 | **Faydalı** | Her kelime kullanıcının hedefine hizmet etsin | Hata mesajında çözüm yolu ✓ — sadece "Hata oluştu" ✗ |
46
+ | 5 | **İnsanca** | Yardımsever bir insan gibi yaz, robot gibi değil | "Bir sorun oluştu" ✓ — "Exception 403: Forbidden" ✗ |
47
+
48
+ ---
49
+
50
+ ## Kopya Kalıpları
51
+
52
+ ### CTA (Call to Action)
53
+
54
+ **Formül:** Fiille başla + spesifik ol + sonuca eşle
55
+
56
+ | Doğru | Yanlış | Neden |
57
+ |-------|--------|-------|
58
+ | Hesap oluştur | Gönder | Sonuç belirsiz |
59
+ | Ücretsiz dene | Başla | Ne başlıyor? |
60
+ | Raporu indir | Tamam | Eylem belirsiz |
61
+ | Değişiklikleri kaydet | İleri | Ne olacak? |
62
+
63
+ **Kurallar:**
64
+ - Max uzunluk: `.fmcp-brand-profile.json` → `copyRules.maxCTALength` (varsayılan: 24 karakter)
65
+ - Kaçınılacak kelimeler: `.fmcp-brand-profile.json` → `copyRules.avoidWords`
66
+ - Tercih edilecek kelimeler: `.fmcp-brand-profile.json` → `copyRules.preferWords`
67
+
68
+ ### Hata Mesajları
69
+
70
+ **Formül:** Ne oldu + Neden + Nasıl düzeltilir
71
+
72
+ ```
73
+ "Ödeme reddedildi. Bankanız kartı onaylamadı. Farklı bir kart deneyin veya bankanızla iletişime geçin."
74
+ ───────────── ────────────────────── ─────────────────────────────────────────────────────
75
+ Ne oldu Neden Nasıl düzeltilir
76
+ ```
77
+
78
+ | Durum | Örnek |
79
+ |-------|-------|
80
+ | Doğrulama hatası | "E-posta adresi geçersiz. Lütfen @ işareti içeren bir adres girin." |
81
+ | Sunucu hatası | "Bir sorun oluştu. Birkaç dakika sonra tekrar deneyin." |
82
+ | Bağlantı hatası | "İnternet bağlantınız kesildi. Bağlantınızı kontrol edip tekrar deneyin." |
83
+ | Yetki hatası | "Bu sayfaya erişim izniniz yok. Yöneticinizden izin isteyin." |
84
+
85
+ **Ton:** `.fmcp-brand-profile.json` → `copyRules.errorTone`
86
+ - `empathetic-actionable` (varsayılan): Empatik + çözüm odaklı
87
+ - `technical`: Doğrudan teknik bilgi
88
+ - `minimal`: Sadece gerekli bilgi
89
+
90
+ ### Boş Durumlar (Empty State)
91
+
92
+ **Formül:** Bu ne + Neden boş + Nasıl başlanır
93
+
94
+ ```
95
+ "Henüz proje yok. İlk projenizi oluşturarak ekibinizle çalışmaya başlayın."
96
+ ────────────── ──────────────────────────────────────────────────────
97
+ Bu ne + neden boş Nasıl başlanır
98
+ ```
99
+
100
+ | Durum | Örnek |
101
+ |-------|-------|
102
+ | İlk kullanım | "Henüz mesaj yok. İlk mesajınızı gönderin!" |
103
+ | Arama sonuçsuz | "Sonuç bulunamadı. Farklı anahtar kelimelerle deneyin." |
104
+ | Filtre sonuçsuz | "Bu filtreyle eşleşen öğe yok. Filtreleri temizleyin." |
105
+ | Silme sonrası | "Tüm bildirimler okundu. Yeni bildirimler burada görünecek." |
106
+
107
+ ### Onay Diyalogları
108
+
109
+ **Formül:** Eylemi netleştir + sonuçları belirt + butonlara eylem fiili
110
+
111
+ ```
112
+ Başlık: "3 dosya silinsin mi?"
113
+ Açıklama: "Bu işlem geri alınamaz. Silinen dosyalar çöp kutusuna taşınmaz."
114
+ Butonlar: [ Dosyaları sil ] [ Vazgeç ]
115
+ ✓ Eylem fiili ✓ Net
116
+ YANLIŞ: [ Tamam ] [ İptal ]
117
+ ```
118
+
119
+ | Durum | Başlık | Açıklama | Butonlar |
120
+ |-------|--------|----------|----------|
121
+ | Silme | "3 dosya silinsin mi?" | "Bu geri alınamaz" | Sil / Vazgeç |
122
+ | Çıkış | "Kaydedilmemiş değişiklikler var" | "Çıkarsanız değişiklikler kaybolur" | Kaydetmeden çık / Kaydet |
123
+ | Yayın | "Makale yayınlansın mı?" | "Yayın sonrası herkes görebilir" | Yayınla / Geri dön |
124
+
125
+ ### Başarı Mesajları
126
+
127
+ **Formül:** Kısa kutla + sonraki adım (isteğe bağlı)
128
+
129
+ | Durum | Örnek |
130
+ |-------|-------|
131
+ | Kaydetme | "Değişiklikler kaydedildi." |
132
+ | Oluşturma | "Proje oluşturuldu. Ekip üyelerini davet edebilirsiniz." |
133
+ | Gönderme | "Mesaj gönderildi." |
134
+ | Silme | "Dosya silindi." (nötr ton — kutlama yok) |
135
+
136
+ ### Yükleme Durumları
137
+
138
+ **Formül:** Ne yapılıyor + beklenti süresi (uzunsa)
139
+
140
+ | Süre | Örnek |
141
+ |------|-------|
142
+ | 1-3 sn | "Yükleniyor..." (spinner yeterli) |
143
+ | 3-10 sn | "Raporunuz hazırlanıyor..." |
144
+ | >10 sn | "Bu birkaç dakika sürebilir. Sayfayı kapatmayın." |
145
+ | Belirsiz | "İşleminiz sıraya alındı. Tamamlandığında bildirim alacaksınız." |
146
+
147
+ ---
148
+
149
+ ## Ses ve Ton Rehberi
150
+
151
+ ### Varsayılan Ton Matrisi
152
+
153
+ | Bağlam | Ton | Örnek |
154
+ |--------|-----|-------|
155
+ | **Başarı** | Kutlayıcı ama abartısız | "Harika! Profiliniz güncellendi." |
156
+ | **Hata** | Empatik + aksiyon odaklı | "Bir sorun oluştu. Tekrar deneyebilirsiniz." |
157
+ | **Uyarı** | Net + acil | "Dikkat: Bu işlem geri alınamaz." |
158
+ | **Nötr** | Bilgilendirici + kısa | "Son güncelleme: 5 dakika önce." |
159
+ | **Onboarding** | Teşvik edici + yönlendirici | "İlk adım: Profilinizi tamamlayın." |
160
+ | **Tebrik** | Sıcak ama profesyonel | "Tebrikler! İlk projenizi oluşturdunuz." |
161
+
162
+ ### Marka Profili ile Kişiselleştirme
163
+
164
+ Proje kökünde `.fmcp-brand-profile.json` varsa:
165
+
166
+ 1. **`voiceTone.personality`** → Ton kalibrasyonu:
167
+ - `["samimi", "cesur"]` → kısa, direkt, enerjik
168
+ - `["profesyonel", "güvenilir"]` → formel, ölçülü, sakin
169
+ - `["playful", "genç"]` → emoji uygun, günlük dil, cesur kısaltmalar
170
+
171
+ 2. **`voiceTone.formality`** → Kelime seçimi:
172
+ - `formal`: "İşleminiz başarıyla tamamlanmıştır."
173
+ - `semi-formal`: "İşlem tamamlandı."
174
+ - `casual`: "Tamam, bitti!"
175
+
176
+ 3. **`voiceTone.humor`** → Humor seviyesi:
177
+ - `none`: Asla espri veya şaka tonu
178
+ - `subtle`: Hafif sıcaklık, ince humor ("Harika iş!")
179
+ - `playful`: Emoji, şakacı ton ("Boom! Proje hazır 🚀")
180
+
181
+ 4. **`voiceTone.examples`** → Gerçek örnekleri ton referansı olarak kullan
182
+
183
+ ### Profil Yoksa: Otomatik Oluşturma Akışı
184
+
185
+ `.fmcp-brand-profile.json` dosyası bulunamadığında, kullanıcıya 3 soru sor:
186
+
187
+ **Soru 1:** "Markanız bir insan olsa nasıl konuşurdu? 3 sıfatla tanımlayın."
188
+ - Örnek: samimi, cesur, profesyonel
189
+
190
+ **Soru 2:** "Formallik seviyesi?"
191
+ - Formal (kurumsal, mesafeli)
192
+ - Yarı-formal (profesyonel ama sıcak)
193
+ - Casual (arkadaşça, günlük)
194
+
195
+ **Soru 3:** "Bir başarı mesajı örneği verin (uygulamanızda kullanılmış veya hayal ettiğiniz)."
196
+ - Örnek: "Harika! Profilin güncellendi."
197
+
198
+ Cevaplardan minimal `.fmcp-brand-profile.json` oluştur ve proje köküne kaydet.
199
+
200
+ ---
201
+
202
+ ## Çok Dilli / i18n Kuralları
203
+
204
+ Çoklu dil desteği olan projelerde copy üretirken:
205
+
206
+ ### Metin Uzunluğu Farkları
207
+
208
+ | Dil | Türkçeye göre uzunluk farkı |
209
+ |-----|----------------------------|
210
+ | Almanca | %20-40 daha uzun |
211
+ | Fince | %20-30 daha uzun |
212
+ | İngilizce | %10-20 daha kısa |
213
+ | Japonca/Çince | %30-50 daha kısa (karakter bazlı) |
214
+ | Arapça | Benzer uzunluk ama RTL layout |
215
+
216
+ **Kural:** En uzun dili (`.fmcp-brand-profile.json` → `i18n.longestLocale`) baz alarak tasarımda truncation planla.
217
+
218
+ ### RTL (Sağdan Sola) Desteği
219
+
220
+ - Arapça, İbranice, Farsça: layout tamamen ayna
221
+ - İkonlar: yön belirten ikonlar (ok, geri/ileri) ters çevrilmeli
222
+ - Sayılar: RTL dillerde de soldan sağa yazılır (istisna)
223
+
224
+ ### Kültür-Nötr Dil
225
+
226
+ - Metafor ve deyimlerden kaçın ("taşı gediğine koymak" → "düzeltmek")
227
+ - Kültüre bağlı emoji dikkatli kullan (🙏 bazı kültürlerde "teşekkür", bazılarında "dua")
228
+ - Tarih formatı: yerelleştir (TR: 07.04.2026, US: 04/07/2026, ISO: 2026-04-07)
229
+ - Para birimi: sembol + format yerelleştir (₺1.234,56 vs $1,234.56)
230
+
231
+ ---
232
+
233
+ ## Figma Entegrasyonu
234
+
235
+ ### Tekli Text Node Güncelleme
236
+
237
+ ```js
238
+ // figma_execute — Tek text node'a copy uygula
239
+ const node = await figma.getNodeByIdAsync("<TEXT_NODE_ID>");
240
+ await figma.loadFontAsync(node.fontName);
241
+ node.characters = "Yeni copy metni";
242
+ return { updated: node.id, text: node.characters };
243
+ ```
244
+
245
+ ### Toplu Copy İnceleme ve Güncelleme
246
+
247
+ 1. Ekrandaki tüm text node'ları listele:
248
+
249
+ ```js
250
+ const root = await figma.getNodeByIdAsync("<SCREEN_NODE_ID>");
251
+ const textNodes = root.findAll(n => n.type === "TEXT");
252
+ const copyList = textNodes.map(n => ({
253
+ id: n.id,
254
+ name: n.name,
255
+ current: n.characters,
256
+ fontSize: n.fontSize,
257
+ parent: n.parent?.name || "—"
258
+ }));
259
+ return { totalTextNodes: copyList.length, nodes: copyList.slice(0, 50) };
260
+ ```
261
+
262
+ 2. Kullanıcıya tablo olarak sun:
263
+
264
+ | # | Node | Mevcut Copy | Önerilen Copy | Durum |
265
+ |---|------|------------|---------------|-------|
266
+ | 1 | CTA Button | "Gönder" | "Hesap oluştur" | Değişecek |
267
+ | 2 | Error Text | "Hata" | "E-posta adresi geçersiz. @ işareti olmalı." | Değişecek |
268
+ | 3 | Page Title | "Hoş Geldiniz" | — | Uygun |
269
+
270
+ 3. **Kullanıcı onayı al** — onaylanan node'ları toplu güncelle:
271
+
272
+ ```js
273
+ const updates = [
274
+ { id: "<ID_1>", text: "Hesap oluştur" },
275
+ { id: "<ID_2>", text: "E-posta adresi geçersiz. @ işareti olmalı." }
276
+ ];
277
+
278
+ for (const u of updates) {
279
+ const node = await figma.getNodeByIdAsync(u.id);
280
+ await figma.loadFontAsync(node.fontName);
281
+ node.characters = u.text;
282
+ }
283
+
284
+ return { updatedCount: updates.length };
285
+ ```
286
+
287
+ > **ONAY KURALI:** Text node güncellemeleri kullanıcı onayı olmadan yapılmaz. Önce tablo sun, onay al, sonra uygula.
288
+
289
+ ---
290
+
291
+ ## Required Workflow
292
+
293
+ ### Step 1: Plugin Bağlantısını Doğrula
294
+
295
+ ```
296
+ figma_get_status()
297
+ ```
298
+
299
+ ### Step 2: Marka Profili Kontrol
300
+
301
+ Proje kökünde `.fmcp-brand-profile.json` ara.
302
+ - **Varsa:** Oku, `voiceTone` ve `copyRules` alanlarını not al.
303
+ - **Yoksa:** Kullanıcıya "Marka profili bulunamadı. Oluşturmak ister misiniz?" sor.
304
+ - Evet → 3 soru akışı → profil oluştur
305
+ - Hayır → varsayılan ton matrisiyle devam et
306
+
307
+ ### Step 3: Hedef Belirle
308
+
309
+ Kullanıcının isteğine göre:
310
+
311
+ **A) Tek copy üretimi:** CTA, hata mesajı, boş durum vb. → ilgili kalıbı uygula, 3 alternatif sun.
312
+
313
+ **B) Ekran copy incelemesi:** Figma ekranındaki tüm text node'ları tara → mevcut copy'yi değerlendir → öneriler sun.
314
+
315
+ **C) Copy spec üretimi:** Bir bileşen veya ekran için tüm copy kurallarını dokümante et (karakter limitleri, truncation, durum metinleri).
316
+
317
+ ### Step 4: Copy Üret / Değerlendir
318
+
319
+ - 5 temel prensibe uygunluk kontrolü
320
+ - Marka profili varsa ton kalibrasyonu
321
+ - Her copy için 2-3 alternatif sun (kullanıcı seçsin)
322
+ - i18n gerekiyorsa en uzun dili baz al
323
+
324
+ ### Step 5: Figma'ya Uygula (İsteğe Bağlı)
325
+
326
+ Kullanıcı isterse text node'ları güncelle (onay akışı ile).
327
+
328
+ ### Step 6: Copy Spec Çıktısı
329
+
330
+ İstenirse yapılandırılmış copy spec raporu üret:
331
+
332
+ ```markdown
333
+ ## Copy Spec — [Ekran Adı]
334
+
335
+ ### CTA'lar
336
+ | Buton | Copy | Max Karakter | Alternatifler |
337
+ |-------|------|-------------|---------------|
338
+ | Ana CTA | "Hesap oluştur" | 24 | "Kaydol", "Ücretsiz başla" |
339
+
340
+ ### Hata Mesajları
341
+ | Alan | Mesaj | Ton |
342
+ |------|-------|-----|
343
+ | E-posta | "Geçerli bir e-posta girin" | empathetic-actionable |
344
+
345
+ ### Boş Durumlar
346
+ | Ekran | Mesaj |
347
+ |-------|-------|
348
+ | Proje listesi | "Henüz proje yok. İlk projenizi oluşturun." |
349
+ ```
350
+
351
+ ---
352
+
353
+ ## Türkçe Karakter Kuralı (ZORUNLU)
354
+
355
+ 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:
356
+
357
+ | Doğru | Yanlış | Doğru | Yanlış |
358
+ |-------|--------|-------|--------|
359
+ | ş | s | Ş | S |
360
+ | ı | i | İ | I |
361
+ | ö | o | Ö | O |
362
+ | ü | u | Ü | U |
363
+ | ç | c | Ç | C |
364
+ | ğ | g | Ğ | G |
365
+
366
+ Son adım: Üretilen tüm Türkçe metinleri karakter kontrolünden geçir.
367
+
368
+ ## Evolution Triggers
369
+
370
+ - Yeni copy kalıbı ihtiyacı (notification, tooltip, placeholder) eklenebilir
371
+ - Marka profili şeması genişletilirse alan okuma güncellenmeli
372
+ - AI ile otomatik copy kalite skoru (5 prensibe uyum puanı) eklenebilir
373
+ - Çoklu dil desteği genişletilirse dil bazlı kalıp varyantları eklenebilir
@@ -0,0 +1,166 @@
1
+ ---
2
+ name: visual-qa-compare
3
+ description: Figma tasarımı ile kodlanmış UI arasında görsel karşılaştırma yapar. Screenshot tabanlı fark tespiti, spacing/color/typography sapmaları raporlar. "visual QA", "görsel karşılaştır", "Figma vs kod", "pixel compare", "QA kontrol", "implementasyon doğrula" ifadeleriyle tetiklenir. F-MCP Bridge plugin bağlantısı gerektirir.
4
+ metadata:
5
+ mcp-server: user-figma-mcp-bridge
6
+ personas:
7
+ - uidev
8
+ - designops
9
+ ---
10
+
11
+ # Visual QA Compare — Figma vs Kod Görsel Karşılaştırma
12
+
13
+ > **Design Token Kuralı:** Bu skill'deki kod örneklerinde geçen font adları, renk kodları, piksel boyutları yalnızca FORMAT gösterimidir. Çalışma anında tüm design token değerleri (font, renk, boyut, spacing, radius, gölge) kayıtlı kütüphaneden (`figma_get_variables`, `figma_get_styles`) veya kullanıcıdan okunmalıdır. Hardcoded token değeri kullanma. Detay: `project-context.md` → "Design Token Kuralı".
14
+
15
+ ## Overview
16
+
17
+ Bu skill, Figma tasarımı ile kodlanmış UI arasındaki **görsel** farkları tespit eder. `design-drift-detector` token/kod tabanlı çalışırken, bu skill **pixel/görsel** tabanlı karşılaştırma yapar.
18
+
19
+ **Salt okunur** — Figma tuvalinde değişiklik yapmaz.
20
+
21
+ ## Fark: visual-qa-compare vs design-drift-detector
22
+
23
+ | Özellik | visual-qa-compare | design-drift-detector |
24
+ |---|---|---|
25
+ | **Odak** | Görsel/pixel farklar | Token/kod değer farkları |
26
+ | **Girdi** | Figma screenshot + kod UI screenshot | Figma variable'lar + kod token dosyaları |
27
+ | **Çıktı** | Görsel fark raporu (spacing, renk, tipografi) | Drift raporu (değer uyumsuzlukları) |
28
+ | **Araç** | `figma_capture_screenshot` + `figma_get_design_context` | `figma_check_design_parity` + `figma_get_variables` |
29
+
30
+ ## Prerequisites
31
+
32
+ - F-MCP Bridge plugin bağlı olmalı
33
+ - Kodlanmış UI'ın çalışır durumda screenshot'ı alınabilmeli (dev server veya deploy)
34
+ - Hedef Figma ekranın node ID'si bilinmeli
35
+
36
+ ## F-MCP skill koordinasyonu
37
+
38
+ - **Birlikte:** `design-drift-detector` ile token bazlı kontrol (görsel + token = tam QA)
39
+ - **Önce (isteğe bağlı):** `implement-design` çıktısı sonrası doğrulama
40
+ - **Sonra:** Fark varsa `fix-figma-design-system-finding` (Figma tarafı) veya kod düzeltme
41
+
42
+ ## Required Workflow
43
+
44
+ ### Step 1: Plugin Bağlantısını Doğrula
45
+
46
+ ```
47
+ figma_get_status()
48
+ ```
49
+
50
+ ### Step 2: Figma Screenshot Al
51
+
52
+ ```
53
+ figma_capture_screenshot(nodeId="<NODE_ID>", format="PNG", scale=2)
54
+ ```
55
+
56
+ ### Step 3: Figma Design Context Al
57
+
58
+ > **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.
59
+
60
+ > **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.
61
+
62
+ ```
63
+ figma_get_design_context(
64
+ nodeId="<NODE_ID>",
65
+ depth=3,
66
+ verbosity="full",
67
+ includeLayout=true,
68
+ includeVisual=true,
69
+ includeTypography=true
70
+ )
71
+ ```
72
+
73
+ Bu veriden referans değerleri çıkar:
74
+ - **Spacing:** padding, margin, item spacing değerleri
75
+ - **Renk:** fill, stroke, text renkleri (hex)
76
+ - **Tipografi:** font family, size, weight, line height
77
+ - **Boyut:** width, height, corner radius
78
+
79
+ ### Step 4: Kod UI Referansı Al
80
+
81
+ Kullanıcıdan kodlanmış UI'ın screenshot'ını veya canlı URL'ini iste. Yöntemler:
82
+
83
+ 1. **Kullanıcı screenshot paylaşır** — doğrudan karşılaştır
84
+ 2. **Dev server URL** — browser aracıyla screenshot al (varsa)
85
+ 3. **Deploy URL** — production/staging screenshot'ı
86
+
87
+ ### Step 5: Karşılaştırma Analizi
88
+
89
+ AI ile Figma screenshot ve design context verilerini kullanarak kodlanmış UI ile karşılaştır:
90
+
91
+ #### 5a: Spacing Analizi
92
+
93
+ ```markdown
94
+ | Öğe | Figma | Kod | Fark | Öncelik |
95
+ |---|---|---|---|---|
96
+ | Header padding | 24px | 20px | -4px | Orta |
97
+ | Card spacing | 16px | 16px | 0 | ✓ |
98
+ | Button padding H | 24px | 16px | -8px | Yüksek |
99
+ ```
100
+
101
+ #### 5b: Renk Analizi
102
+
103
+ ```markdown
104
+ | Öğe | Figma | Kod | Fark | Öncelik |
105
+ |---|---|---|---|---|
106
+ | Primary button | #2563EB | #2563EB | — | ✓ |
107
+ | Body text | #1F2937 | #374151 | Farklı | Orta |
108
+ | Background | #FFFFFF | #FAFAFA | Hafif fark | Düşük |
109
+ ```
110
+
111
+ #### 5c: Tipografi Analizi
112
+
113
+ ```markdown
114
+ | Öğe | Figma | Kod | Fark | Öncelik |
115
+ |---|---|---|---|---|
116
+ | H1 | Inter 32/40 Bold | Inter 32/40 Bold | — | ✓ |
117
+ | Body | Inter 16/24 Regular | Inter 14/20 Regular | Size farkı | Yüksek |
118
+ | Caption | Inter 12/16 Regular | Inter 12/16 Regular | — | ✓ |
119
+ ```
120
+
121
+ ### Step 6: Token Parity Kontrolü (opsiyonel)
122
+
123
+ Görsel farkların token kaynaklı olup olmadığını kontrol et:
124
+
125
+ ```
126
+ figma_check_design_parity(
127
+ codeTokens='{"color/primary": "#2563EB", "spacing/md": 16, "font/body-size": 16}'
128
+ )
129
+ ```
130
+
131
+ ### Step 7: Rapor Üret
132
+
133
+ Tüm karşılaştırma sonuçlarını aşağıdaki formatta yapılandırılmış QA raporu olarak oluştur.
134
+
135
+ ## Çıktı Formatı
136
+
137
+ ```markdown
138
+ # Visual QA Raporu — [Ekran Adı]
139
+
140
+ ## Genel Uyum: %87 (26/30 öğe eşleşiyor)
141
+
142
+ ### Kritik Farklar (4)
143
+ 1. **Body text font size** — Figma: 16px, Kod: 14px → Token güncellenmeli
144
+ 2. **Button horizontal padding** — Figma: 24px, Kod: 16px → CSS düzeltmesi
145
+ 3. **Card corner radius** — Figma: 12px, Kod: 8px → Token kontrolü
146
+ 4. **Body text color** — Figma: #1F2937, Kod: #374151 → Token eşlemesi kontrol
147
+
148
+ ### Eşleşen Öğeler (26)
149
+ ✓ Header layout, ✓ Primary colors, ✓ H1 typography, ✓ Spacing grid, ...
150
+
151
+ ### Öneriler
152
+ 1. `design-drift-detector` ile token kaynaklı farkları tespit et
153
+ 2. CSS token değişkenlerini Figma variable isimleriyle hizala
154
+ 3. Body text size'ı 16px'e güncelle (DS standardı)
155
+
156
+ ### Platform-Spesifik Notlar
157
+ - **iOS:** Dynamic Type ile font scaling kontrol edilmeli
158
+ - **Android:** density-independent pixel (dp) doğrulaması
159
+ - **Web:** Responsive breakpoint'lerde tekrar kontrol
160
+ ```
161
+
162
+ ## Evolution Triggers
163
+
164
+ - Bridge'e görsel diff aracı eklenirse (ör. visual diff aracı) otomatik karşılaştırma adımı eklenmeli
165
+ - Browser otomasyon araçlarıyla entegrasyon genişletilirse Step 4 otomatikleştirilebilir
166
+ - CI entegrasyonu için JSON çıktı formatı eklenebilir
@@ -1,50 +0,0 @@
1
- /**
2
- * Browser Manager Interface
3
- * Abstract interface for browser automation across different runtimes
4
- */
5
- /**
6
- * Browser Manager Interface
7
- * Provides unified API for browser automation regardless of runtime (Cloudflare/Local)
8
- *
9
- * Note: Uses 'any' for Page type to support both puppeteer-core and @cloudflare/puppeteer
10
- * implementations which have incompatible type definitions but compatible runtime behavior
11
- */
12
- export interface IBrowserManager {
13
- /**
14
- * Launch or connect to browser instance
15
- */
16
- launch(): Promise<void>;
17
- /**
18
- * Get active page instance
19
- */
20
- getPage(): Promise<any>;
21
- /**
22
- * Navigate to Figma URL
23
- */
24
- navigateToFigma(url?: string): Promise<any>;
25
- /**
26
- * Reload current page
27
- */
28
- reload(hardReload?: boolean): Promise<void>;
29
- /**
30
- * Evaluate JavaScript in page context
31
- */
32
- evaluate<T>(fn: () => T): Promise<T>;
33
- /**
34
- * Check if browser is running
35
- */
36
- isRunning(): boolean;
37
- /**
38
- * Close browser instance
39
- */
40
- close(): Promise<void>;
41
- /**
42
- * Get current URL
43
- */
44
- getCurrentUrl(): string | null;
45
- /**
46
- * Wait for navigation to complete
47
- */
48
- waitForNavigation(timeout?: number): Promise<void>;
49
- }
50
- //# sourceMappingURL=base.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/browser/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAExB;;OAEG;IACH,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE5C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAKrC;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC;IAErB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;OAEG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI,CAAC;IAE/B;;OAEG;IACH,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Browser Manager Interface
3
- * Abstract interface for browser automation across different runtimes
4
- */
5
- export {};
6
- //# sourceMappingURL=base.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/browser/base.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1,81 +0,0 @@
1
- /**
2
- * Local Browser Manager
3
- * Connects to Figma Desktop via Chrome Remote Debugging Protocol
4
- */
5
- import { type Page } from 'puppeteer-core';
6
- import type { IBrowserManager } from './base.js';
7
- /**
8
- * Local browser configuration
9
- */
10
- export interface LocalBrowserConfig {
11
- debugPort: number;
12
- debugHost: string;
13
- }
14
- /**
15
- * Local Browser Manager
16
- * Connects to existing Figma Desktop instance via remote debugging port
17
- */
18
- export declare class LocalBrowserManager implements IBrowserManager {
19
- private browser;
20
- private page;
21
- private config;
22
- constructor(config: LocalBrowserConfig);
23
- /**
24
- * Connect to Figma Desktop via remote debugging port
25
- */
26
- launch(): Promise<void>;
27
- /**
28
- * Find the best page for plugin debugging
29
- * Actively searches for pages with workers across ALL tabs
30
- */
31
- private findBestPage;
32
- /**
33
- * Get active Figma page or create new one
34
- * Prefers pages with active plugin workers for plugin debugging
35
- */
36
- getPage(): Promise<Page>;
37
- /**
38
- * Navigate to Figma URL
39
- */
40
- navigateToFigma(figmaUrl?: string): Promise<Page>;
41
- /**
42
- * Reload current page
43
- */
44
- reload(hardReload?: boolean): Promise<void>;
45
- /**
46
- * Execute JavaScript in page context
47
- */
48
- evaluate<T>(fn: () => T): Promise<T>;
49
- /**
50
- * Check if browser is connected
51
- */
52
- isRunning(): boolean;
53
- /**
54
- * Disconnect from browser (doesn't close Figma Desktop)
55
- */
56
- close(): Promise<void>;
57
- /**
58
- * Get current page URL
59
- */
60
- getCurrentUrl(): string | null;
61
- /**
62
- * Check if the browser connection is still alive
63
- * Returns false if connection is stale (e.g., after computer sleep)
64
- */
65
- isConnectionAlive(): Promise<boolean>;
66
- /**
67
- * Reconnect to Figma Desktop if connection was lost
68
- * Call this before any operation that requires a live connection
69
- */
70
- ensureConnection(): Promise<void>;
71
- /**
72
- * Force a complete reconnection to Figma Desktop
73
- * Use this when frames become detached or stale even though the browser appears connected
74
- */
75
- forceReconnect(): Promise<void>;
76
- /**
77
- * Wait for navigation
78
- */
79
- waitForNavigation(timeout?: number): Promise<void>;
80
- }
81
- //# sourceMappingURL=local.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/browser/local.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAkB,EAAgB,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAIjD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IAC1D,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,kBAAkB;IAItC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C7B;;;OAGG;YACW,YAAY;IA4C1B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC9B;;OAEG;IACG,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBvD;;OAEG;IACG,MAAM,CAAC,UAAU,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB/C;;OAEG;IACG,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAQ1C;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB5B;;OAEG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI;IAQ9B;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAe3C;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBvC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrC;;OAEG;IACG,iBAAiB,CAAC,OAAO,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAUvD"}