@atezer/figma-mcp-bridge 1.7.30 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +408 -0
  2. package/README.md +8 -8
  3. package/agents/_orchestrator-protocol.md +185 -0
  4. package/agents/ds-auditor.md +73 -22
  5. package/agents/screen-builder.md +60 -22
  6. package/agents/token-syncer.md +63 -19
  7. package/dist/core/code-warnings.d.ts +38 -0
  8. package/dist/core/code-warnings.d.ts.map +1 -0
  9. package/dist/core/code-warnings.js +191 -0
  10. package/dist/core/code-warnings.js.map +1 -0
  11. package/dist/core/device-presets.d.ts +49 -0
  12. package/dist/core/device-presets.d.ts.map +1 -0
  13. package/dist/core/device-presets.js +141 -0
  14. package/dist/core/device-presets.js.map +1 -0
  15. package/dist/core/instructions.d.ts +4 -2
  16. package/dist/core/instructions.d.ts.map +1 -1
  17. package/dist/core/instructions.js +239 -29
  18. package/dist/core/instructions.js.map +1 -1
  19. package/dist/core/plugin-bridge-connector.d.ts +26 -0
  20. package/dist/core/plugin-bridge-connector.d.ts.map +1 -1
  21. package/dist/core/plugin-bridge-connector.js +18 -2
  22. package/dist/core/plugin-bridge-connector.js.map +1 -1
  23. package/dist/core/plugin-bridge-server.d.ts +16 -0
  24. package/dist/core/plugin-bridge-server.d.ts.map +1 -1
  25. package/dist/core/plugin-bridge-server.js +83 -1
  26. package/dist/core/plugin-bridge-server.js.map +1 -1
  27. package/dist/core/response-guard.d.ts +23 -0
  28. package/dist/core/response-guard.d.ts.map +1 -1
  29. package/dist/core/response-guard.js +113 -0
  30. package/dist/core/response-guard.js.map +1 -1
  31. package/dist/core/version.d.ts +1 -1
  32. package/dist/core/version.d.ts.map +1 -1
  33. package/dist/core/version.js +1 -1
  34. package/dist/core/version.js.map +1 -1
  35. package/dist/local-plugin-only.d.ts.map +1 -1
  36. package/dist/local-plugin-only.js +334 -101
  37. package/dist/local-plugin-only.js.map +1 -1
  38. package/f-mcp-plugin/code.js +514 -29
  39. package/f-mcp-plugin/ui.html +90 -14
  40. package/package.json +1 -1
  41. package/skills/SKILL_INDEX.md +13 -1
  42. package/skills/apply-figma-design-system/SKILL.md +37 -0
  43. package/skills/audit-figma-design-system/SKILL.md +38 -0
  44. package/skills/code-design-mapper/SKILL.md +37 -0
  45. package/skills/design-token-pipeline/SKILL.md +44 -0
  46. package/skills/figma-canvas-ops/SKILL.md +200 -243
  47. package/skills/fmcp-ds-audit-orchestrator/SKILL.md +205 -0
  48. package/skills/fmcp-intent-router/SKILL.md +574 -0
  49. package/skills/fmcp-screen-orchestrator/SKILL.md +166 -0
  50. package/skills/fmcp-screen-recipes/SKILL.md +528 -0
  51. package/skills/fmcp-token-sync-orchestrator/SKILL.md +198 -0
  52. package/skills/generate-figma-library/SKILL.md +38 -0
  53. package/skills/generate-figma-screen/SKILL.md +360 -6
  54. package/skills/implement-design/SKILL.md +32 -0
  55. package/skills/inspiration-intake/SKILL.md +220 -0
  56. package/skills/visual-qa-compare/SKILL.md +33 -0
@@ -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,13 +1487,50 @@
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)
1460
- setTimeout(function() { if (typeof scanOtherPorts === 'function') scanOtherPorts(); }, 500);
1461
- if (!extraPortScanTimer) {
1462
- extraPortScanTimer = setInterval(function() { if (typeof scanOtherPorts === 'function') scanOtherPorts(); }, 10000);
1490
+ // v1.9.1+: Server'dan gelen aktif bridge listesi varsa, SADECE listed'a bagla
1491
+ // (blind scan elenir DevTools console'da 0 error). Aksi halde fallback scan.
1492
+ if (msg.activeBridges && Array.isArray(msg.activeBridges)) {
1493
+ var _host = getMcpBridgeHost();
1494
+ for (var _i = 0; _i < msg.activeBridges.length; _i++) {
1495
+ var _p = msg.activeBridges[_i];
1496
+ if (typeof _p === 'number' && _p !== mcpConnectedPort && !mcpConnections.has(_p)) {
1497
+ connectToExtraPort(_p, _host);
1498
+ }
1499
+ }
1500
+ // scanOtherPorts ve periyodik timer CAGRILMAZ — server bize dogru listeyi verdi.
1501
+ // Yeni sibling baglanirsa server 'activeBridgesUpdate' push mesajiyla bildirir (30s icinde).
1502
+ } else {
1503
+ // FALLBACK (v1.9.0 server veya uyumsuz): eski scan davranisi korunur.
1504
+ // v1.9.6: Flood azaltma — interval 60s, maksimum 5 tarama sonrası dur.
1505
+ setTimeout(function() { if (typeof scanOtherPorts === 'function') scanOtherPorts(); }, 500);
1506
+ if (!extraPortScanTimer) {
1507
+ var scanCount = 0;
1508
+ var MAX_SCANS = 5;
1509
+ extraPortScanTimer = setInterval(function() {
1510
+ scanCount++;
1511
+ if (scanCount > MAX_SCANS) {
1512
+ clearInterval(extraPortScanTimer);
1513
+ extraPortScanTimer = null;
1514
+ return;
1515
+ }
1516
+ if (typeof scanOtherPorts === 'function') scanOtherPorts();
1517
+ }, 60000);
1518
+ }
1463
1519
  }
1464
1520
  return;
1465
1521
  }
1522
+ // v1.9.1+: Server push update — yeni sibling kesfedilince gelir.
1523
+ if (msg.type === 'activeBridgesUpdate' && Array.isArray(msg.activeBridges)) {
1524
+ var _upHost = getMcpBridgeHost();
1525
+ for (var _ui = 0; _ui < msg.activeBridges.length; _ui++) {
1526
+ var _up = msg.activeBridges[_ui];
1527
+ if (typeof _up === 'number' && _up !== mcpConnectedPort && !mcpConnections.has(_up)) {
1528
+ connectToExtraPort(_up, _upHost);
1529
+ }
1530
+ }
1531
+ // Kapanmis port'larin baglantisi onclose ile otomatik mcpConnections'dan silinir.
1532
+ return;
1533
+ }
1466
1534
  if (msg.type === 'tokenStatus') {
1467
1535
  updateTokenUI(msg.hasToken, msg.rateLimit || null, __tokenExpiresAt);
1468
1536
  return;
@@ -1573,6 +1641,12 @@
1573
1641
  if (method === 'setNodeCornerRadius') {
1574
1642
  return window.setNodeCornerRadius(params.nodeId, params.radius);
1575
1643
  }
1644
+ if (method === 'cloneScreenToDevice') {
1645
+ return window.cloneScreenToDevice(params);
1646
+ }
1647
+ if (method === 'validateScreen') {
1648
+ return window.validateScreen(params);
1649
+ }
1576
1650
  if (method === 'cloneNode') {
1577
1651
  return window.cloneNode(params.nodeId);
1578
1652
  }
@@ -1709,7 +1783,8 @@
1709
1783
  ws.send(JSON.stringify({
1710
1784
  type: 'ready',
1711
1785
  fileKey: window.__figmaFileKey || null,
1712
- fileName: window.__figmaFileName || null
1786
+ fileName: window.__figmaFileName || null,
1787
+ pluginVersion: (typeof FMCP_PLUGIN_VERSION !== 'undefined' ? FMCP_PLUGIN_VERSION : '1.8.0')
1713
1788
  }));
1714
1789
  handshakeTimer = setTimeout(function() {
1715
1790
  if (!handshakeOk) { try { ws.close(); } catch(e) {} }
@@ -1799,6 +1874,8 @@
1799
1874
  if (method === 'setNodeStrokes') return window.setNodeStrokes(params.nodeId, params.strokes, params.strokeWeight);
1800
1875
  if (method === 'setNodeOpacity') return window.setNodeOpacity(params.nodeId, params.opacity);
1801
1876
  if (method === 'setNodeCornerRadius') return window.setNodeCornerRadius(params.nodeId, params.radius);
1877
+ if (method === 'cloneScreenToDevice') return window.cloneScreenToDevice(params);
1878
+ if (method === 'validateScreen') return window.validateScreen(params);
1802
1879
  if (method === 'cloneNode') return window.cloneNode(params.nodeId);
1803
1880
  if (method === 'deleteNode') return window.deleteNode(params.nodeId);
1804
1881
  if (method === 'renameNode') return window.renameNode(params.nodeId, params.newName);
@@ -1895,12 +1972,11 @@
1895
1972
  }
1896
1973
  var nextIdx = (currentIdx + direction + ports.length) % ports.length;
1897
1974
  mcpActivePort = ports[nextIdx].port;
1898
- // Geriye uyumluluk: mcpBridgeWs aktif bağlantıya çevir
1899
- var activeConn = mcpConnections.get(mcpActivePort);
1900
- if (activeConn && activeConn.ws) {
1901
- mcpBridgeWs = activeConn.ws;
1902
- mcpConnectedPort = mcpActivePort;
1903
- }
1975
+ // v1.9.1+ FIX: mcpBridgeWs ve mcpConnectedPort DEGISTIRILMEZ.
1976
+ // Her connection kendi closure ws'inde zaten paralel calisir (main: line 1682 wsRef=mcpBridgeWs,
1977
+ // extra: line 1866 wsRef=ws). Onceki kod mcpBridgeWs'i degistirerek main handler'in response
1978
+ // routing'ini bozuyordu (switch sonrasi main'den gelen istekler yanlis porta cevap veriyordu).
1979
+ // Simdi switch sadece UI "aktif port" gostergesi (port label + buton vurgulamasi) icin kullanilir.
1904
1980
  updatePortLabel();
1905
1981
  updateStatus('Ready', true, false);
1906
1982
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atezer/figma-mcp-bridge",
3
- "version": "1.7.30",
3
+ "version": "1.9.1",
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)