@atezer/figma-mcp-bridge 1.7.29 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +403 -0
  2. package/README.md +4 -3
  3. package/agents/_orchestrator-protocol.md +185 -0
  4. package/agents/ds-auditor.md +73 -22
  5. package/agents/screen-builder.md +60 -22
  6. package/agents/token-syncer.md +63 -19
  7. package/dist/core/code-warnings.d.ts +38 -0
  8. package/dist/core/code-warnings.d.ts.map +1 -0
  9. package/dist/core/code-warnings.js +191 -0
  10. package/dist/core/code-warnings.js.map +1 -0
  11. package/dist/core/device-presets.d.ts +49 -0
  12. package/dist/core/device-presets.d.ts.map +1 -0
  13. package/dist/core/device-presets.js +141 -0
  14. package/dist/core/device-presets.js.map +1 -0
  15. package/dist/core/instructions.d.ts +4 -2
  16. package/dist/core/instructions.d.ts.map +1 -1
  17. package/dist/core/instructions.js +239 -29
  18. package/dist/core/instructions.js.map +1 -1
  19. package/dist/core/plugin-bridge-connector.d.ts +32 -0
  20. package/dist/core/plugin-bridge-connector.d.ts.map +1 -1
  21. package/dist/core/plugin-bridge-connector.js +31 -2
  22. package/dist/core/plugin-bridge-connector.js.map +1 -1
  23. package/dist/core/plugin-bridge-server.d.ts +8 -0
  24. package/dist/core/plugin-bridge-server.d.ts.map +1 -1
  25. package/dist/core/plugin-bridge-server.js +27 -2
  26. package/dist/core/plugin-bridge-server.js.map +1 -1
  27. package/dist/core/response-guard.d.ts +23 -0
  28. package/dist/core/response-guard.d.ts.map +1 -1
  29. package/dist/core/response-guard.js +113 -0
  30. package/dist/core/response-guard.js.map +1 -1
  31. package/dist/core/version.d.ts +1 -1
  32. package/dist/core/version.d.ts.map +1 -1
  33. package/dist/core/version.js +1 -1
  34. package/dist/core/version.js.map +1 -1
  35. package/dist/local-plugin-only.d.ts.map +1 -1
  36. package/dist/local-plugin-only.js +504 -85
  37. package/dist/local-plugin-only.js.map +1 -1
  38. package/f-mcp-plugin/code.js +514 -29
  39. package/f-mcp-plugin/ui.html +62 -6
  40. package/package.json +1 -1
  41. package/skills/SKILL_INDEX.md +13 -1
  42. package/skills/apply-figma-design-system/SKILL.md +37 -0
  43. package/skills/audit-figma-design-system/SKILL.md +38 -0
  44. package/skills/code-design-mapper/SKILL.md +37 -0
  45. package/skills/design-token-pipeline/SKILL.md +44 -0
  46. package/skills/figma-canvas-ops/SKILL.md +200 -240
  47. package/skills/fmcp-ds-audit-orchestrator/SKILL.md +205 -0
  48. package/skills/fmcp-intent-router/SKILL.md +574 -0
  49. package/skills/fmcp-project-rules/SKILL.md +9 -5
  50. package/skills/fmcp-screen-orchestrator/SKILL.md +166 -0
  51. package/skills/fmcp-screen-recipes/SKILL.md +528 -0
  52. package/skills/fmcp-token-sync-orchestrator/SKILL.md +198 -0
  53. package/skills/generate-figma-library/SKILL.md +38 -0
  54. package/skills/generate-figma-screen/SKILL.md +382 -19
  55. package/skills/implement-design/SKILL.md +32 -0
  56. package/skills/inspiration-intake/SKILL.md +220 -0
  57. package/skills/visual-qa-compare/SKILL.md +33 -0
@@ -422,6 +422,9 @@
422
422
  window.__figmaPendingRequests = new Map();
423
423
  window.__figmaFileKey = null;
424
424
  window.__figmaFileName = null;
425
+ // v1.8.0+: Plugin version reported in WebSocket "ready" handshake.
426
+ // Keep in sync with package.json, src/core/version.ts, f-mcp-plugin/code.js.
427
+ var FMCP_PLUGIN_VERSION = '1.8.2';
425
428
 
426
429
  let requestIdCounter = 0;
427
430
 
@@ -699,6 +702,32 @@
699
702
  .catch(function(err) { return { success: false, error: err.message || String(err) }; });
700
703
  };
701
704
 
705
+ // v1.8.1+: High-level clone-to-device (preserves instances + bindings)
706
+ // v1.8.2: Timeout 30s → 120s (complex benchmarks with 200+ children are slow)
707
+ window.cloneScreenToDevice = (params) => {
708
+ return window.sendPluginCommand('CLONE_SCREEN_TO_DEVICE', {
709
+ sourceNodeId: params.sourceNodeId,
710
+ targetWidth: params.targetWidth,
711
+ targetHeight: params.targetHeight,
712
+ targetDeviceName: params.targetDeviceName,
713
+ newName: params.newName || null,
714
+ targetParentId: params.targetParentId || null,
715
+ position: params.position || null,
716
+ }, 120000)
717
+ .catch(function(err) { return { success: false, error: err.message || String(err) }; });
718
+ };
719
+
720
+ // v1.8.1+: Validate screen DS compliance (read-only audit)
721
+ // v1.8.2: Timeout 30s → 90s (tree walker with Promise.all on getMainComponentAsync is slow for 100+ nodes)
722
+ window.validateScreen = (params) => {
723
+ return window.sendPluginCommand('VALIDATE_SCREEN', {
724
+ nodeId: params.nodeId,
725
+ expectedDs: params.expectedDs || null,
726
+ minScore: typeof params.minScore === 'number' ? params.minScore : 80,
727
+ }, 90000)
728
+ .catch(function(err) { return { success: false, error: err.message || String(err) }; });
729
+ };
730
+
702
731
  // Delete a node
703
732
  window.deleteNode = (nodeId) => {
704
733
  return window.sendPluginCommand('DELETE_NODE', { nodeId: nodeId })
@@ -741,8 +770,9 @@
741
770
  window.captureScreenshot = (nodeId, options) => {
742
771
  var params = { nodeId: nodeId };
743
772
  if (options) {
744
- if (options.format) params.format = options.format; // PNG, JPG, SVG
745
- if (options.scale) params.scale = options.scale; // 1, 2, 4, etc.
773
+ if (options.format) params.format = options.format; // PNG, JPG
774
+ if (options.scale != null) params.scale = options.scale; // 1, 2, 4, etc.
775
+ if (options.jpegQuality != null) params.jpegQuality = options.jpegQuality; // 30-100 (v1.8.0)
746
776
  }
747
777
  return window.sendPluginCommand('CAPTURE_SCREENSHOT', params, 30000)
748
778
  .catch(function(err) { return { success: false, error: err.message || String(err) }; });
@@ -1409,7 +1439,8 @@
1409
1439
  currentWs.send(JSON.stringify({
1410
1440
  type: 'ready',
1411
1441
  fileKey: window.__figmaFileKey || null,
1412
- fileName: window.__figmaFileName || null
1442
+ fileName: window.__figmaFileName || null,
1443
+ pluginVersion: (typeof FMCP_PLUGIN_VERSION !== 'undefined' ? FMCP_PLUGIN_VERSION : '1.8.0')
1413
1444
  }));
1414
1445
  startKeepAlive(currentWs);
1415
1446
  if (mcpHandshakeTimer) clearTimeout(mcpHandshakeTimer);
@@ -1456,10 +1487,26 @@
1456
1487
  status: 'ready'
1457
1488
  });
1458
1489
  mcpActivePort = mcpConnectedPort;
1459
- // Adım 4: Ana bağlantı hazır — diğer portları da tara (ilk + periyodik)
1490
+ // Adım 4: Ana bağlantı hazır — diğer portları da tara (ilk + sınırlı periyodik)
1491
+ // v1.9.6: Flood azaltma — interval 10s → 60s, maksimum 5 tarama sonrası dur.
1492
+ // Gerekçe: Önceki davranış her 10s'de 15 başarısız WebSocket denemesi yapıyordu
1493
+ // (dakikada ~90 console error). 137 dk'lık oturumda 12000+ teorik error birikimi.
1494
+ // Yeni davranış: ilk 500ms + sonraki 5 dk'da dakikada 1 scan → toplam 6 scan,
1495
+ // sonra otomatik dur. Yeni client sonradan bağlanırsa onConnect event'i ile yeniden
1496
+ // tetiklenir (connectToExtraPort başarılı olursa mcpConnections güncellenir).
1460
1497
  setTimeout(function() { if (typeof scanOtherPorts === 'function') scanOtherPorts(); }, 500);
1461
1498
  if (!extraPortScanTimer) {
1462
- extraPortScanTimer = setInterval(function() { if (typeof scanOtherPorts === 'function') scanOtherPorts(); }, 10000);
1499
+ var scanCount = 0;
1500
+ var MAX_SCANS = 5; // 5 × 60s = 5 dk boyunca periyodik tarama, sonra dur
1501
+ extraPortScanTimer = setInterval(function() {
1502
+ scanCount++;
1503
+ if (scanCount > MAX_SCANS) {
1504
+ clearInterval(extraPortScanTimer);
1505
+ extraPortScanTimer = null;
1506
+ return;
1507
+ }
1508
+ if (typeof scanOtherPorts === 'function') scanOtherPorts();
1509
+ }, 60000); // v1.9.6: 10000 → 60000 (dakikada 1 scan)
1463
1510
  }
1464
1511
  return;
1465
1512
  }
@@ -1573,6 +1620,12 @@
1573
1620
  if (method === 'setNodeCornerRadius') {
1574
1621
  return window.setNodeCornerRadius(params.nodeId, params.radius);
1575
1622
  }
1623
+ if (method === 'cloneScreenToDevice') {
1624
+ return window.cloneScreenToDevice(params);
1625
+ }
1626
+ if (method === 'validateScreen') {
1627
+ return window.validateScreen(params);
1628
+ }
1576
1629
  if (method === 'cloneNode') {
1577
1630
  return window.cloneNode(params.nodeId);
1578
1631
  }
@@ -1709,7 +1762,8 @@
1709
1762
  ws.send(JSON.stringify({
1710
1763
  type: 'ready',
1711
1764
  fileKey: window.__figmaFileKey || null,
1712
- fileName: window.__figmaFileName || null
1765
+ fileName: window.__figmaFileName || null,
1766
+ pluginVersion: (typeof FMCP_PLUGIN_VERSION !== 'undefined' ? FMCP_PLUGIN_VERSION : '1.8.0')
1713
1767
  }));
1714
1768
  handshakeTimer = setTimeout(function() {
1715
1769
  if (!handshakeOk) { try { ws.close(); } catch(e) {} }
@@ -1799,6 +1853,8 @@
1799
1853
  if (method === 'setNodeStrokes') return window.setNodeStrokes(params.nodeId, params.strokes, params.strokeWeight);
1800
1854
  if (method === 'setNodeOpacity') return window.setNodeOpacity(params.nodeId, params.opacity);
1801
1855
  if (method === 'setNodeCornerRadius') return window.setNodeCornerRadius(params.nodeId, params.radius);
1856
+ if (method === 'cloneScreenToDevice') return window.cloneScreenToDevice(params);
1857
+ if (method === 'validateScreen') return window.validateScreen(params);
1802
1858
  if (method === 'cloneNode') return window.cloneNode(params.nodeId);
1803
1859
  if (method === 'deleteNode') return window.deleteNode(params.nodeId);
1804
1860
  if (method === 'renameNode') return window.renameNode(params.nodeId, params.newName);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atezer/figma-mcp-bridge",
3
- "version": "1.7.29",
3
+ "version": "1.9.0",
4
4
  "description": "F-MCP ATezer: MCP server and Figma plugin bridge for Claude/Cursor. No REST token required.",
5
5
  "type": "module",
6
6
  "main": "dist/local-plugin-only.js",
@@ -19,7 +19,7 @@ Tüm skill'ler `.fmcp-brand-profile.json` dosyasını okuyarak marka ses/ton, ti
19
19
 
20
20
  **Oluşturma:** `ux-copy-guidance` skill'i profil yoksa otomatik 3-soru akışı başlatır. Manuel olarak da proje köküne `.fmcp-brand-profile.json` dosyası eklenebilir.
21
21
 
22
- ## Skill Listesi (20 skill)
22
+ ## Skill Listesi (25 skill)
23
23
 
24
24
  ### Temel Kurallar
25
25
 
@@ -42,6 +42,18 @@ Tüm skill'ler `.fmcp-brand-profile.json` dosyasını okuyarak marka ses/ton, ti
42
42
  | `generate-figma-screen` | [generate-figma-screen/SKILL.md](generate-figma-screen/SKILL.md) | designer, uidev | Kod/açıklamadan Figma'da ekran oluşturma |
43
43
  | `generate-figma-library` | [generate-figma-library/SKILL.md](generate-figma-library/SKILL.md) | designops, designer | Koddan DS kütüphanesi inşa (5 fazlı) |
44
44
  | `figjam-diagram-builder` | [figjam-diagram-builder/SKILL.md](figjam-diagram-builder/SKILL.md) | designer, designops, po | FigJam diyagram/süreç şeması |
45
+ | `inspiration-intake` | [inspiration-intake/SKILL.md](inspiration-intake/SKILL.md) | designer, uidev | Image / Figma benchmark / URL'den structural_intent çıkarma ("inspiration only" disiplinle, değer çıkarmaz — ön-işleme katmanı) |
46
+
47
+ ### Cross-Platform Orkestratörler
48
+
49
+ Agent orkestrasyon mantığını tek kaynaktan 4 platforma taşıyan skill'ler (Claude Code / Cursor / Claude Desktop / Claude Web). Condensed-first: her orchestrator Essentials bölümü %80 case'i kapsar, Advanced sadece edge case'lerde okunur. Kurulum rehberleri: [install/](../install/)
50
+
51
+ | Skill | Dosya | Personalar | Kısa açıklama |
52
+ |---|---|---|---|
53
+ | `fmcp-screen-orchestrator` | [fmcp-screen-orchestrator/SKILL.md](fmcp-screen-orchestrator/SKILL.md) | designer, uidev | DS-compliant Figma ekran üretimi orkestratörü — 4 intake modu (text/benchmark/image/no_idea), DS fallback chain, step-by-step mode, self-audit gate |
54
+ | `fmcp-ds-audit-orchestrator` | [fmcp-ds-audit-orchestrator/SKILL.md](fmcp-ds-audit-orchestrator/SKILL.md) | designops, uidev | 5 audit tipi orkestrasyonu (compliance / a11y / drift / visual_qa / impact), read-only discipline, cache-first audit |
55
+ | `fmcp-token-sync-orchestrator` | [fmcp-token-sync-orchestrator/SKILL.md](fmcp-token-sync-orchestrator/SKILL.md) | designops, uidev | Token sync orkestratörü (CSS / Tailwind / Swift / Compose / Sass), diff preview zorunluluğu, binding coverage raporu |
56
+ | `fmcp-screen-recipes` | [fmcp-screen-recipes/SKILL.md](fmcp-screen-recipes/SKILL.md) | designer, uidev | Fast Path cookbook — 9 standart ekran tipi (login/payment/profile/list/detail/form/onboarding/dashboard/settings) için linear 9-adımlı recipe. Figma native device presets, SUI native variable modes, chunking built-in (Rule 5a), her adımda Türkçe micro-report. Common case'de %40-50 daha hızlı, generate-figma-screen'i atlar. |
45
57
 
46
58
  ### DS Denetim ve Düzeltme
47
59
 
@@ -6,6 +6,43 @@ metadata:
6
6
  personas:
7
7
  - designer
8
8
  - designops
9
+ required_inputs:
10
+ - name: target_scope
11
+ type: enum
12
+ options:
13
+ - "Seçili frame (node ID ver)"
14
+ - "Mevcut sayfa (tüm frameler)"
15
+ - "Tüm dosya (tüm sayfalar)"
16
+ question: "Hangi kapsamı DS'ye hizalayalım?"
17
+ required: true
18
+ - name: target_node_id
19
+ type: string
20
+ question: "Hedef node ID nedir? (target_scope 'Seçili frame' ise zorunlu)"
21
+ required: false
22
+ skip_if: "target_scope != 'Seçili frame (node ID ver)'"
23
+ - name: design_system
24
+ type: from_state
25
+ source: ".claude/design-systems/active-ds.md#Library Name"
26
+ fallback_question: "Hangi tasarım sistemine hizalayalım? (❖ SUI / Material / Custom)"
27
+ required: true
28
+ - name: backup_before_apply
29
+ type: boolean
30
+ question: "Yazmadan önce mevcut ekranın yedeğini (duplicate) alayım mı?"
31
+ required: false
32
+ default: true
33
+ - name: preserve_content
34
+ type: boolean
35
+ question: "İçeriği (metin, değerler) koruyayım mı yoksa DS default'larıyla mı değiştirelim?"
36
+ required: false
37
+ default: true
38
+ - name: swap_strategy
39
+ type: enum
40
+ options:
41
+ - "Bölüm bölüm (güvenli, yavaş)"
42
+ - "Tümünü tek seferde (hızlı, risk)"
43
+ question: "Hangi swap stratejisi?"
44
+ required: false
45
+ default: "Bölüm bölüm (güvenli, yavaş)"
9
46
  ---
10
47
 
11
48
  # Apply Figma Design System (geniş yazma)
@@ -7,6 +7,44 @@ metadata:
7
7
  - designer
8
8
  - designops
9
9
  - po
10
+ required_inputs:
11
+ - name: target_scope
12
+ type: enum
13
+ options:
14
+ - "Seçili frame (node ID ver)"
15
+ - "Mevcut sayfa"
16
+ - "Tüm dosya"
17
+ - "Son oluşturulan ekran (last-intent.md'den)"
18
+ question: "Ne denetleyelim?"
19
+ required: true
20
+ - name: target_node_id
21
+ type: string
22
+ question: "Hedef node ID? (target_scope 'Seçili frame' ise zorunlu)"
23
+ required: false
24
+ skip_if: "target_scope != 'Seçili frame (node ID ver)'"
25
+ - name: design_system
26
+ type: from_state
27
+ source: ".claude/design-systems/active-ds.md#Library Name"
28
+ fallback_question: "Hangi DS'ye göre denet? (❖ SUI / Material / Custom)"
29
+ required: true
30
+ - name: severity_threshold
31
+ type: enum
32
+ options:
33
+ - "low (tüm bulgular)"
34
+ - "medium (önemli olanlar)"
35
+ - "high (sadece kritik)"
36
+ question: "En düşük severity seviyesi nedir?"
37
+ required: false
38
+ default: "medium (önemli olanlar)"
39
+ - name: report_format
40
+ type: enum
41
+ options:
42
+ - "Markdown rapor"
43
+ - "JSON çıktı"
44
+ - "Chat inline özet"
45
+ question: "Raporu nasıl istersin?"
46
+ required: false
47
+ default: "Markdown rapor"
10
48
  ---
11
49
 
12
50
  # Audit Figma Design System (tuval içi)
@@ -6,6 +6,43 @@ metadata:
6
6
  personas:
7
7
  - uidev
8
8
  - designops
9
+ required_inputs:
10
+ - name: direction
11
+ type: enum
12
+ options:
13
+ - "Figma → Kod (tek component kodla)"
14
+ - "Kod → Figma (mevcut koddan Figma component üret)"
15
+ - "Bi-directional mapping (mapping tablosu)"
16
+ question: "Hangi yönde eşleştirme?"
17
+ required: true
18
+ - name: figma_component_id
19
+ type: string
20
+ question: "Hangi Figma component? (node ID veya component key)"
21
+ required: false
22
+ skip_if: "direction == 'Kod → Figma (mevcut koddan Figma component üret)'"
23
+ - name: code_component_path
24
+ type: string
25
+ question: "Kod tarafındaki component path nedir? (örn: ./src/components/Button.tsx)"
26
+ required: false
27
+ - name: platform
28
+ type: enum
29
+ options:
30
+ - "iOS (SwiftUI)"
31
+ - "Android (Compose)"
32
+ - "Web (React)"
33
+ - "Web (Vue)"
34
+ - "Multi-platform (hepsi)"
35
+ question: "Hangi platform?"
36
+ required: true
37
+ - name: mapping_output
38
+ type: enum
39
+ options:
40
+ - "JSON mapping file"
41
+ - "Markdown tablo"
42
+ - "Code Connect format"
43
+ question: "Mapping çıktısı nasıl istersen?"
44
+ required: false
45
+ default: "Markdown tablo"
9
46
  ---
10
47
 
11
48
  # Code-Design Mapper (Multi-Platform)
@@ -6,6 +6,50 @@ metadata:
6
6
  personas:
7
7
  - uidev
8
8
  - designops
9
+ required_inputs:
10
+ - name: direction
11
+ type: enum
12
+ options:
13
+ - "Figma → Kod (variable'ları export et)"
14
+ - "Kod → Figma (kod token'larını Figma'ya yaz)"
15
+ - "Bi-directional sync (iki yönlü)"
16
+ question: "Hangi yönde token pipeline?"
17
+ required: true
18
+ - name: target_format
19
+ type: enum
20
+ options:
21
+ - "iOS Swift (Color/Font/Spacing)"
22
+ - "Android colors.xml + dimens.xml"
23
+ - "Android Compose Theme.kt"
24
+ - "Web CSS variables"
25
+ - "Web Tailwind config"
26
+ - "Web Sass/SCSS"
27
+ - "Web TypeScript/JSON"
28
+ - "Multi-format (tümü)"
29
+ question: "Hangi format(lar)?"
30
+ required: true
31
+ skip_if: "direction == 'Kod → Figma (kod token''larını Figma''ya yaz)'"
32
+ - name: source_path
33
+ type: string
34
+ question: "Kaynak path nedir? (Kod kaynağı için, örn: ./src/tokens veya ./design-tokens.json)"
35
+ required: false
36
+ skip_if: "direction == 'Figma → Kod (variable''ları export et)'"
37
+ - name: output_path
38
+ type: string
39
+ question: "Çıktı path nedir? (örn: ./src/design-tokens)"
40
+ required: false
41
+ default: "./design-tokens"
42
+ skip_if: "direction == 'Kod → Figma (kod token''larını Figma''ya yaz)'"
43
+ - name: token_types
44
+ type: string_list
45
+ question: "Hangi token türleri? (colors, typography, spacing, radius, shadow, z-index — 'all' veya seçili)"
46
+ required: false
47
+ default: "all"
48
+ - name: include_themes
49
+ type: boolean
50
+ question: "Theme modları (light/dark) dahil edilsin mi?"
51
+ required: false
52
+ default: true
9
53
  ---
10
54
 
11
55
  # Design Token Pipeline (Multi-Platform)