@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.
- package/CHANGELOG.md +403 -0
- package/README.md +4 -3
- package/agents/_orchestrator-protocol.md +185 -0
- package/agents/ds-auditor.md +73 -22
- package/agents/screen-builder.md +60 -22
- package/agents/token-syncer.md +63 -19
- package/dist/core/code-warnings.d.ts +38 -0
- package/dist/core/code-warnings.d.ts.map +1 -0
- package/dist/core/code-warnings.js +191 -0
- package/dist/core/code-warnings.js.map +1 -0
- package/dist/core/device-presets.d.ts +49 -0
- package/dist/core/device-presets.d.ts.map +1 -0
- package/dist/core/device-presets.js +141 -0
- package/dist/core/device-presets.js.map +1 -0
- package/dist/core/instructions.d.ts +4 -2
- package/dist/core/instructions.d.ts.map +1 -1
- package/dist/core/instructions.js +239 -29
- package/dist/core/instructions.js.map +1 -1
- package/dist/core/plugin-bridge-connector.d.ts +32 -0
- package/dist/core/plugin-bridge-connector.d.ts.map +1 -1
- package/dist/core/plugin-bridge-connector.js +31 -2
- package/dist/core/plugin-bridge-connector.js.map +1 -1
- package/dist/core/plugin-bridge-server.d.ts +8 -0
- package/dist/core/plugin-bridge-server.d.ts.map +1 -1
- package/dist/core/plugin-bridge-server.js +27 -2
- package/dist/core/plugin-bridge-server.js.map +1 -1
- package/dist/core/response-guard.d.ts +23 -0
- package/dist/core/response-guard.d.ts.map +1 -1
- package/dist/core/response-guard.js +113 -0
- package/dist/core/response-guard.js.map +1 -1
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.d.ts.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/core/version.js.map +1 -1
- package/dist/local-plugin-only.d.ts.map +1 -1
- package/dist/local-plugin-only.js +504 -85
- package/dist/local-plugin-only.js.map +1 -1
- package/f-mcp-plugin/code.js +514 -29
- package/f-mcp-plugin/ui.html +62 -6
- package/package.json +1 -1
- package/skills/SKILL_INDEX.md +13 -1
- package/skills/apply-figma-design-system/SKILL.md +37 -0
- package/skills/audit-figma-design-system/SKILL.md +38 -0
- package/skills/code-design-mapper/SKILL.md +37 -0
- package/skills/design-token-pipeline/SKILL.md +44 -0
- package/skills/figma-canvas-ops/SKILL.md +200 -240
- package/skills/fmcp-ds-audit-orchestrator/SKILL.md +205 -0
- package/skills/fmcp-intent-router/SKILL.md +574 -0
- package/skills/fmcp-project-rules/SKILL.md +9 -5
- package/skills/fmcp-screen-orchestrator/SKILL.md +166 -0
- package/skills/fmcp-screen-recipes/SKILL.md +528 -0
- package/skills/fmcp-token-sync-orchestrator/SKILL.md +198 -0
- package/skills/generate-figma-library/SKILL.md +38 -0
- package/skills/generate-figma-screen/SKILL.md +382 -19
- package/skills/implement-design/SKILL.md +32 -0
- package/skills/inspiration-intake/SKILL.md +220 -0
- package/skills/visual-qa-compare/SKILL.md +33 -0
package/f-mcp-plugin/ui.html
CHANGED
|
@@ -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;
|
|
745
|
-
if (options.scale) params.scale = options.scale;
|
|
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
|
-
|
|
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
package/skills/SKILL_INDEX.md
CHANGED
|
@@ -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 (
|
|
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)
|