@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.
- package/CHANGELOG.md +408 -0
- package/README.md +8 -8
- 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 +26 -0
- package/dist/core/plugin-bridge-connector.d.ts.map +1 -1
- package/dist/core/plugin-bridge-connector.js +18 -2
- package/dist/core/plugin-bridge-connector.js.map +1 -1
- package/dist/core/plugin-bridge-server.d.ts +16 -0
- package/dist/core/plugin-bridge-server.d.ts.map +1 -1
- package/dist/core/plugin-bridge-server.js +83 -1
- 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 +334 -101
- package/dist/local-plugin-only.js.map +1 -1
- package/f-mcp-plugin/code.js +514 -29
- package/f-mcp-plugin/ui.html +90 -14
- 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 -243
- package/skills/fmcp-ds-audit-orchestrator/SKILL.md +205 -0
- package/skills/fmcp-intent-router/SKILL.md +574 -0
- 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 +360 -6
- 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,13 +1487,50 @@
|
|
|
1456
1487
|
status: 'ready'
|
|
1457
1488
|
});
|
|
1458
1489
|
mcpActivePort = mcpConnectedPort;
|
|
1459
|
-
//
|
|
1460
|
-
|
|
1461
|
-
if (
|
|
1462
|
-
|
|
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
|
-
//
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
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
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)
|