@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.
- package/.claude-plugin/plugin.json +37 -0
- package/.cursor-plugin/plugin.json +21 -0
- package/CHANGELOG.md +30 -0
- package/README.md +4 -3
- package/agents/ds-auditor.md +29 -0
- package/agents/screen-builder.md +29 -0
- package/agents/token-syncer.md +26 -0
- package/assets/logo.png +0 -0
- package/commands/add-library.md +122 -0
- package/commands/ds-add.md +255 -0
- package/commands/ds-sync.md +314 -0
- package/commands/implement.md +43 -0
- package/commands/install-library.md +73 -0
- package/commands/setup.md +26 -0
- package/commands/test.md +39 -0
- package/commands/update.md +25 -0
- package/dist/core/config.d.ts +1 -5
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +11 -111
- package/dist/core/config.js.map +1 -1
- package/dist/core/plugin-bridge-server.d.ts.map +1 -1
- package/dist/core/plugin-bridge-server.js +1 -2
- package/dist/core/plugin-bridge-server.js.map +1 -1
- package/dist/core/response-guard.d.ts +1 -1
- package/dist/core/response-guard.js +1 -1
- package/dist/core/types/index.d.ts +2 -98
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/local-plugin-only.d.ts.map +1 -1
- package/dist/local-plugin-only.js +14 -13
- package/dist/local-plugin-only.js.map +1 -1
- package/f-mcp-plugin/README.md +8 -15
- package/f-mcp-plugin/manifest.json +1 -3
- package/hooks/hooks.json +26 -0
- package/package.json +15 -31
- package/skills/BRAND_PROFILE_SCHEMA.md +113 -0
- package/skills/SKILL_INDEX.md +194 -0
- package/skills/TOOL_MAPPING.md +111 -0
- package/skills/ai-handoff-export/SKILL.md +254 -0
- package/skills/apply-figma-design-system/SKILL.md +104 -0
- package/skills/audit-figma-design-system/SKILL.md +278 -0
- package/skills/code-design-mapper/SKILL.md +370 -0
- package/skills/component-documentation/SKILL.md +190 -0
- package/skills/design-drift-detector/SKILL.md +407 -0
- package/skills/design-system-rules/SKILL.md +407 -0
- package/skills/design-token-pipeline/SKILL.md +619 -0
- package/skills/ds-impact-analysis/SKILL.md +266 -0
- package/skills/figjam-diagram-builder/SKILL.md +172 -0
- package/skills/figma-a11y-audit/SKILL.md +587 -0
- package/skills/figma-canvas-ops/SKILL.md +325 -0
- package/skills/figma-screen-analyzer/SKILL.md +235 -0
- package/skills/fix-figma-design-system-finding/SKILL.md +117 -0
- package/skills/fmcp-project-rules/SKILL.md +93 -0
- package/skills/generate-figma-library/SKILL.md +598 -0
- package/skills/generate-figma-screen/SKILL.md +689 -0
- package/skills/implement-design/SKILL.md +473 -0
- package/skills/ux-copy-guidance/SKILL.md +373 -0
- package/skills/visual-qa-compare/SKILL.md +166 -0
- package/dist/browser/base.d.ts +0 -50
- package/dist/browser/base.d.ts.map +0 -1
- package/dist/browser/base.js +0 -6
- package/dist/browser/base.js.map +0 -1
- package/dist/browser/local.d.ts +0 -81
- package/dist/browser/local.d.ts.map +0 -1
- package/dist/browser/local.js +0 -283
- package/dist/browser/local.js.map +0 -1
- package/dist/core/console-monitor.d.ts +0 -82
- package/dist/core/console-monitor.d.ts.map +0 -1
- package/dist/core/console-monitor.js +0 -428
- package/dist/core/console-monitor.js.map +0 -1
- package/dist/core/design-system-manifest.d.ts +0 -272
- package/dist/core/design-system-manifest.d.ts.map +0 -1
- package/dist/core/design-system-manifest.js +0 -261
- package/dist/core/design-system-manifest.js.map +0 -1
- package/dist/core/enrichment/enrichment-service.d.ts +0 -52
- package/dist/core/enrichment/enrichment-service.d.ts.map +0 -1
- package/dist/core/enrichment/enrichment-service.js +0 -272
- package/dist/core/enrichment/enrichment-service.js.map +0 -1
- package/dist/core/enrichment/index.d.ts +0 -8
- package/dist/core/enrichment/index.d.ts.map +0 -1
- package/dist/core/enrichment/index.js +0 -8
- package/dist/core/enrichment/index.js.map +0 -1
- package/dist/core/enrichment/relationship-mapper.d.ts +0 -106
- package/dist/core/enrichment/relationship-mapper.d.ts.map +0 -1
- package/dist/core/enrichment/relationship-mapper.js +0 -352
- package/dist/core/enrichment/relationship-mapper.js.map +0 -1
- package/dist/core/enrichment/style-resolver.d.ts +0 -80
- package/dist/core/enrichment/style-resolver.d.ts.map +0 -1
- package/dist/core/enrichment/style-resolver.js +0 -327
- package/dist/core/enrichment/style-resolver.js.map +0 -1
- package/dist/core/figma-api.d.ts +0 -137
- package/dist/core/figma-api.d.ts.map +0 -1
- package/dist/core/figma-api.js +0 -274
- package/dist/core/figma-api.js.map +0 -1
- package/dist/core/figma-desktop-connector.d.ts +0 -242
- package/dist/core/figma-desktop-connector.d.ts.map +0 -1
- package/dist/core/figma-desktop-connector.js +0 -1042
- package/dist/core/figma-desktop-connector.js.map +0 -1
- package/dist/core/figma-reconstruction-spec.d.ts +0 -162
- package/dist/core/figma-reconstruction-spec.d.ts.map +0 -1
- package/dist/core/figma-reconstruction-spec.js +0 -387
- package/dist/core/figma-reconstruction-spec.js.map +0 -1
- package/dist/core/figma-tools.d.ts +0 -21
- package/dist/core/figma-tools.d.ts.map +0 -1
- package/dist/core/figma-tools.js +0 -2920
- package/dist/core/figma-tools.js.map +0 -1
- package/dist/core/snippet-injector.d.ts +0 -24
- package/dist/core/snippet-injector.d.ts.map +0 -1
- package/dist/core/snippet-injector.js +0 -97
- package/dist/core/snippet-injector.js.map +0 -1
- package/dist/core/types/enriched.d.ts +0 -213
- package/dist/core/types/enriched.d.ts.map +0 -1
- package/dist/core/types/enriched.js +0 -6
- package/dist/core/types/enriched.js.map +0 -1
- package/dist/local.d.ts +0 -73
- package/dist/local.d.ts.map +0 -1
- package/dist/local.js +0 -2605
- package/dist/local.js.map +0 -1
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: figma-canvas-ops
|
|
3
|
+
description: F-MCP Bridge ile Figma tuvalinde güvenli yazma/düzenleme için zorunlu önkoşul kılavuzu. figma_execute çağrısı öncesi bu skill yüklenmelidir. Renk aralığı, font yükleme, array klonlama, atomik hata yönetimi, node ID return kuralları ve sayfa konteksti sıfırlanmasını kapsar. "figma'da düzenle", "tuvale yaz", "node oluştur", "figma execute kılavuz", "canvas ops", "tuval işlemi" ifadeleriyle tetiklenir.
|
|
4
|
+
metadata:
|
|
5
|
+
mcp-server: user-figma-mcp-bridge
|
|
6
|
+
personas:
|
|
7
|
+
- designer
|
|
8
|
+
- designops
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Figma Canvas Ops — figma_execute Güvenli Kullanım Kılavuzu
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
Bu skill, `figma_execute` aracıyla Figma tuvalinde yazma/düzenleme yapılmadan önce **zorunlu** olarak yüklenmesi gereken önkoşul kılavuzudur. Topluluk `figma-use` skill'inden uyarlanmış, F-MCP Bridge araçlarına göre yeniden yazılmıştır.
|
|
16
|
+
|
|
17
|
+
**Tuval yazan her skill** (apply-figma-design-system, fix-figma-design-system-finding, generate-figma-screen, generate-figma-library, figjam-diagram-builder) bu kılavuzdaki kuralları uygulamalıdır.
|
|
18
|
+
|
|
19
|
+
## Araç eşleme (topluluk → F-MCP)
|
|
20
|
+
|
|
21
|
+
| Topluluk (resmi MCP) | F-MCP Bridge | Not |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| `use_figma` | `figma_execute` | JS çalıştırma; `code` parametresi |
|
|
24
|
+
| `get_metadata` | `figma_get_file_data` | Yapı/metadata; `depth` parametresi |
|
|
25
|
+
| `get_screenshot` | `figma_capture_screenshot` | Node bazlı görsel doğrulama |
|
|
26
|
+
| `search_design_system` | `figma_search_components` + `figma_get_design_system_summary` | İki araç birlikte |
|
|
27
|
+
|
|
28
|
+
Detaylı eşleme: [TOOL_MAPPING.md](../TOOL_MAPPING.md)
|
|
29
|
+
|
|
30
|
+
## Prerequisites
|
|
31
|
+
|
|
32
|
+
- F-MCP Bridge plugin Figma'da çalışıyor ve bağlı olmalı
|
|
33
|
+
- `figma_get_status()` ile bağlantı doğrulanmalı
|
|
34
|
+
|
|
35
|
+
## 1. Kritik Kurallar
|
|
36
|
+
|
|
37
|
+
1. **`return` ile veri dön.** Return değeri otomatik JSON serialize edilir (object, array, string, number). `figma.closePlugin()` çağırma — bu bridge tarafından yönetilir.
|
|
38
|
+
|
|
39
|
+
2. **Düz JavaScript yaz, top-level `await` kullan.** Kod otomatik async bağlama sarılır. `(async () => { ... })()` ile sarma.
|
|
40
|
+
|
|
41
|
+
3. **`figma.notify()` çalışmaz** — kullanma.
|
|
42
|
+
|
|
43
|
+
4. **`console.log()` dönmez** — çıktı için `return` kullan.
|
|
44
|
+
|
|
45
|
+
5. **Küçük adımlarla çalış.** Büyük işlemleri birden fazla `figma_execute` çağrısına böl. Her adımdan sonra doğrula. Bug'lardan kaçınmanın en önemli pratiği budur.
|
|
46
|
+
|
|
47
|
+
**Timeout yapılandırması:** `figma_execute` varsayılan timeout 5000ms'dir. Çok node oluşturma veya karmaşık işlemlerde `timeout` parametresini artır (maksimum 30000ms):
|
|
48
|
+
```
|
|
49
|
+
figma_execute({ code: "...", timeout: 15000 })
|
|
50
|
+
```
|
|
51
|
+
Kılavuz: 1-5 node → 5000ms | 6-12 node → 10000ms | 13+ node → işlemi böl veya 15000-30000ms
|
|
52
|
+
|
|
53
|
+
6. **Renkler 0–1 aralığında** (0–255 değil): `{r: 1, g: 0, b: 0}` = kırmızı. Renk değerlerini hardcoded yazma — tasarım sisteminden (`figma_get_variables` / `figma_get_styles`) oku.
|
|
54
|
+
|
|
55
|
+
7. **Fills/strokes read-only array** — klonla, değiştir, geri ata:
|
|
56
|
+
```js
|
|
57
|
+
// Renk değerini DS'den oku, aşağıdaki sadece API FORMAT örneğidir
|
|
58
|
+
const fills = [...node.fills];
|
|
59
|
+
fills[0] = { ...fills[0], color: DS_COLOR }; // DS'den okunan değer
|
|
60
|
+
node.fills = fills;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
8. **Font yükleme zorunlu** — metin işleminden önce font yükle. Hangi fontu kullanacağını belirlemek için şu sırayı takip et:
|
|
64
|
+
|
|
65
|
+
**a)** Kayıtlı kütüphane varsa (`.claude/libraries/`) text style'lardan veya variable'lardan font ailesini oku. Örnek: kütüphanedeki text style `global/surface/body` → font family ve style bilgisini al.
|
|
66
|
+
|
|
67
|
+
**b)** Kütüphane yoksa veya font bilgisi bulunamazsa kullanıcıya sor: "Hangi fontu kullanmamı istersiniz?"
|
|
68
|
+
|
|
69
|
+
**c)** Kullanıcı "sen seç" derse `Inter` kullan.
|
|
70
|
+
|
|
71
|
+
```js
|
|
72
|
+
// Fontu belirledikten sonra yükle:
|
|
73
|
+
await figma.loadFontAsync({ family: "FONT_ADI", style: "Regular" });
|
|
74
|
+
// Gerekli diğer ağırlıklar:
|
|
75
|
+
await figma.loadFontAsync({ family: "FONT_ADI", style: "Bold" });
|
|
76
|
+
```
|
|
77
|
+
**Asla** hardcoded font varsayma — her zaman bu sırayı takip et. Bu kural font, renk, boyut, spacing dahil TÜM design token'lar için geçerlidir. Detay: `project-context.md` → "Design Token Kuralı".
|
|
78
|
+
|
|
79
|
+
**FigJam özel durumu:** `createShapeWithText()` varsayılan fontu **"Inter Medium"**'dir ("Inter Regular" DEĞİL). FigJam shape text'i düzenlemek için:
|
|
80
|
+
```js
|
|
81
|
+
await figma.loadFontAsync({ family: "Inter", style: "Medium" });
|
|
82
|
+
const shape = figma.createShapeWithText();
|
|
83
|
+
shape.text.characters = "Metin"; // Medium yüklenmeden hata verir
|
|
84
|
+
```
|
|
85
|
+
Genel kural: metin düzenlemeden önce **mevcut fontu kontrol et** ve o fontu yükle:
|
|
86
|
+
```js
|
|
87
|
+
await figma.loadFontAsync(shape.text.fontName); // dinamik font algılama
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
9. **Sayfa konteksti her çağrıda sıfırlanır** — `figma.currentPage` her `figma_execute` çağrısında ilk sayfaya döner. Farklı sayfada çalışacaksan:
|
|
91
|
+
```js
|
|
92
|
+
const page = figma.root.children.find(p => p.name === "Hedef Sayfa");
|
|
93
|
+
await figma.setCurrentPageAsync(page);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
10. **Tüm tasarım değerleri DS variable'larına BAĞLANMALI (ZORUNLU).** Renk, spacing, padding, radius gibi hiçbir değer hardcoded yazılmaz. Akış:
|
|
97
|
+
|
|
98
|
+
**a) Kütüphaneden variable key'lerini oku:** `.claude/libraries/` dosyasını kontrol et. Key yoksa SUI/DS dosyasında `figma_execute` ile çek:
|
|
99
|
+
```js
|
|
100
|
+
// DS dosyasında çalıştır (fileKey = DS dosyasının key'i)
|
|
101
|
+
const v = await figma.variables.getVariableByIdAsync("VariableID:...");
|
|
102
|
+
return { name: v.name, key: v.key };
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**b) Hedef dosyada variable'ı import et:**
|
|
106
|
+
```js
|
|
107
|
+
const variable = await figma.variables.importVariableByKeyAsync("VARIABLE_KEY");
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**c) Renk bağlama (fill/stroke):** `setBoundVariableForPaint` kullan — DİKKAT: yeni paint döner, yakala ve geri ata:
|
|
111
|
+
```js
|
|
112
|
+
const fills = [...node.fills];
|
|
113
|
+
const boundPaint = figma.variables.setBoundVariableForPaint(fills[0], "color", variable);
|
|
114
|
+
node.fills = [boundPaint];
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**d) Spacing/padding/radius bağlama:** `setBoundVariable` kullan:
|
|
118
|
+
```js
|
|
119
|
+
node.setBoundVariable("paddingLeft", variable);
|
|
120
|
+
node.setBoundVariable("paddingRight", variable);
|
|
121
|
+
node.setBoundVariable("itemSpacing", variable);
|
|
122
|
+
node.setBoundVariable("topLeftRadius", variable);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**e) Text style bağlama:** Doğrudan text style ID'si ile uygula:
|
|
126
|
+
```js
|
|
127
|
+
const textStyles = await figma.getLocalTextStylesAsync();
|
|
128
|
+
const bodyStyle = textStyles.find(s => s.name === "global/surface/body");
|
|
129
|
+
await textNode.setTextStyleIdAsync(bodyStyle.id);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**f) Text rengi bağlama (text node fill):**
|
|
133
|
+
```js
|
|
134
|
+
const textFills = [...textNode.fills];
|
|
135
|
+
const boundTextPaint = figma.variables.setBoundVariableForPaint(textFills[0], "color", textColorVar);
|
|
136
|
+
textNode.fills = [boundTextPaint];
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Asla** `node.fills = [{ type: "SOLID", color: { r: X, g: Y, b: Z } }]` gibi hardcoded renk yazma. Her zaman variable import et ve bağla.
|
|
140
|
+
|
|
141
|
+
11. **`layoutSizingHorizontal/Vertical = 'FILL'` appendChild'DAN SONRA** ayarlanmalı — öncesinde hata verir.
|
|
142
|
+
|
|
143
|
+
12. **Yeni üst-düzey node'ları (0,0)'dan uzağa konumlandır.** `figma.currentPage.children` tarayarak boş alan bul.
|
|
144
|
+
|
|
145
|
+
13. **Hata durumunda DUR.** Hemen tekrar deneme. Hata mesajını oku, scripti düzelt, sonra tekrar çalıştır. Başarısız scriptler atomiktir — hata olursa hiçbir değişiklik uygulanmaz.
|
|
146
|
+
|
|
147
|
+
14. **Tüm oluşturulan/değiştirilen node ID'lerini RETURN ET:**
|
|
148
|
+
```js
|
|
149
|
+
return { createdNodeIds: [...], mutatedNodeIds: [...] };
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
15. **Variable scope'larını açıkça ayarla.** Varsayılan `ALL_SCOPES` her property picker'ı kirletir. Spesifik scope kullan:
|
|
153
|
+
- Arka plan: `["FRAME_FILL", "SHAPE_FILL"]`
|
|
154
|
+
- Metin rengi: `["TEXT_FILL"]`
|
|
155
|
+
- Boşluk: `["GAP"]`
|
|
156
|
+
|
|
157
|
+
16. **Her Promise'i `await` et.** `await` olmadan async çağrılar sessizce başarısız olur.
|
|
158
|
+
|
|
159
|
+
## 2. Sayfa Kuralları
|
|
160
|
+
|
|
161
|
+
### Sayfalar arası geçiş
|
|
162
|
+
|
|
163
|
+
```js
|
|
164
|
+
const targetPage = figma.root.children.find(p => p.name === "Sayfa Adı");
|
|
165
|
+
await figma.setCurrentPageAsync(targetPage);
|
|
166
|
+
// targetPage.children artık yüklü
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Sync setter `figma.currentPage = page` hata verir** — her zaman `await figma.setCurrentPageAsync(page)` kullan.
|
|
170
|
+
|
|
171
|
+
### Çağrılar arası
|
|
172
|
+
|
|
173
|
+
Her `figma_execute` çağrısında `figma.currentPage` ilk sayfaya sıfırlanır. Çoklu çağrı gerektiren iş akışlarında her çağrının başında `setCurrentPageAsync` çağır.
|
|
174
|
+
|
|
175
|
+
## 3. Auto-Layout Kalıpları
|
|
176
|
+
|
|
177
|
+
### Frame oluşturma
|
|
178
|
+
|
|
179
|
+
```js
|
|
180
|
+
const frame = figma.createFrame();
|
|
181
|
+
frame.layoutMode = "VERTICAL";
|
|
182
|
+
frame.primaryAxisSizingMode = "AUTO";
|
|
183
|
+
frame.counterAxisSizingMode = "AUTO";
|
|
184
|
+
frame.itemSpacing = 16;
|
|
185
|
+
frame.paddingTop = frame.paddingBottom = 24;
|
|
186
|
+
frame.paddingLeft = frame.paddingRight = 24;
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### FILL boyutlandırma (sıralama kritik)
|
|
190
|
+
|
|
191
|
+
```js
|
|
192
|
+
const parent = figma.createFrame();
|
|
193
|
+
parent.layoutMode = "VERTICAL";
|
|
194
|
+
const child = figma.createFrame();
|
|
195
|
+
parent.appendChild(child); // ÖNCE ekle
|
|
196
|
+
child.layoutSizingHorizontal = "FILL"; // SONRA FILL ayarla
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## 4. Bileşen ve Instance Kalıpları
|
|
200
|
+
|
|
201
|
+
### Mevcut bileşen ile instance oluşturma
|
|
202
|
+
|
|
203
|
+
Tercihen `figma_instantiate_component` aracını kullan. `figma_execute` içinde:
|
|
204
|
+
|
|
205
|
+
```js
|
|
206
|
+
const component = figma.root.findOne(
|
|
207
|
+
n => n.type === "COMPONENT" && n.name === "Button"
|
|
208
|
+
);
|
|
209
|
+
if (!component) return { error: "Bileşen bulunamadı" };
|
|
210
|
+
const instance = component.createInstance();
|
|
211
|
+
return { instanceId: instance.id, componentName: component.name };
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Variant seçimi
|
|
215
|
+
|
|
216
|
+
```js
|
|
217
|
+
const componentSet = figma.root.findOne(
|
|
218
|
+
n => n.type === "COMPONENT_SET" && n.name === "Button"
|
|
219
|
+
);
|
|
220
|
+
const variant = componentSet.children.find(
|
|
221
|
+
c => c.name === "Size=Large, Type=Primary"
|
|
222
|
+
);
|
|
223
|
+
const instance = variant.createInstance();
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## 5. Variable Bağlama Kalıpları
|
|
227
|
+
|
|
228
|
+
```js
|
|
229
|
+
const collections = await figma.variables.getLocalVariableCollectionsAsync();
|
|
230
|
+
const colorCollection = collections.find(c => c.name === "Colors");
|
|
231
|
+
const variables = await Promise.all(
|
|
232
|
+
colorCollection.variableIds.map(id =>
|
|
233
|
+
figma.variables.getVariableByIdAsync(id)
|
|
234
|
+
)
|
|
235
|
+
);
|
|
236
|
+
const primaryColor = variables.find(v => v.name === "primary/500");
|
|
237
|
+
|
|
238
|
+
// Fill'e bağla
|
|
239
|
+
const fills = [...node.fills];
|
|
240
|
+
const boundPaint = figma.variables.setBoundVariableForPaint(
|
|
241
|
+
fills[0], "color", primaryColor
|
|
242
|
+
);
|
|
243
|
+
node.fills = [boundPaint]; // YENİ paint'i geri ata
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## 6. Ek API Gotcha'lar (Canlı Testte Keşfedilen)
|
|
247
|
+
|
|
248
|
+
17. **`import` keyword yasağı.** Plugin sandbox'ta `eval()` ile kod çalıştırılır. `import` JavaScript reserved word olduğundan function/variable adında kullanılamaz:
|
|
249
|
+
```js
|
|
250
|
+
// YANLIŞ — syntax error verir
|
|
251
|
+
const iv = async (k) => await figma.variables.importVariableByKeyAsync(k);
|
|
252
|
+
|
|
253
|
+
// DOĞRU
|
|
254
|
+
async function getVar(k) { return await figma.variables.importVariableByKeyAsync(k); }
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
18. **`setEffectStyleIdAsync` zorunlu.** Sync setter `node.effectStyleId = style.id` dynamic-page mode'da hata verir:
|
|
258
|
+
```js
|
|
259
|
+
// YANLIŞ
|
|
260
|
+
card.effectStyleId = esCard.id;
|
|
261
|
+
|
|
262
|
+
// DOĞRU
|
|
263
|
+
await card.setEffectStyleIdAsync(esCard.id);
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
19. **`setTextStyleIdAsync` kullan, fontSize variable binding YASAK.** Text style atamak font, size, line-height, letter-spacing'i tek seferde bağlar:
|
|
267
|
+
```js
|
|
268
|
+
// YANLIŞ — sadece font size bağlar, style bağlamaz
|
|
269
|
+
textNode.setBoundVariable("fontSize", fontSizeVar);
|
|
270
|
+
|
|
271
|
+
// DOĞRU — tüm tipografi token'larını tek seferde uygular
|
|
272
|
+
const style = await figma.importStyleByKeyAsync("TEXT_STYLE_KEY");
|
|
273
|
+
await textNode.setTextStyleIdAsync(style.id);
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
20. **`setExplicitVariableModeForCollection` — string ID çalışmaz.** Library API chain ile collection OBJECT alınmalı:
|
|
277
|
+
```js
|
|
278
|
+
// YANLIŞ — hata verir
|
|
279
|
+
frame.setExplicitVariableModeForCollection("VariableCollectionId:3015:5729", "3019:3");
|
|
280
|
+
|
|
281
|
+
// DOĞRU — library API chain
|
|
282
|
+
var colls = await figma.teamLibrary.getAvailableLibraryVariableCollectionsAsync();
|
|
283
|
+
var sem = colls.find(function(c){ return c.name.indexOf("Semantic Colors") !== -1; });
|
|
284
|
+
var vars = await figma.teamLibrary.getVariablesInLibraryCollectionAsync(sem.key);
|
|
285
|
+
var first = await figma.variables.importVariableByKeyAsync(vars[0].key);
|
|
286
|
+
var coll = await figma.variables.getVariableCollectionByIdAsync(first.variableCollectionId);
|
|
287
|
+
var darkMode = coll.modes.find(function(m){ return m.name === "Dark"; });
|
|
288
|
+
frame.setExplicitVariableModeForCollection(coll, darkMode.modeId);
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
21. **Escaped quote dikkat.** `figma_execute` code parametresinde `\"` yerine düz `"` kullan. Template literal içinde kaçış karakteri syntax error verir.
|
|
292
|
+
|
|
293
|
+
## 7. Hata Kurtarma
|
|
294
|
+
|
|
295
|
+
1. `figma_execute` hata dönerse **hemen tekrar deneme**
|
|
296
|
+
2. Hata mesajını oku ve analiz et
|
|
297
|
+
3. Yaygın hatalar:
|
|
298
|
+
- `Cannot read property of undefined` → Node ID geçersiz veya sayfa yüklenmemiş
|
|
299
|
+
- `Font not loaded` → `loadFontAsync` eksik
|
|
300
|
+
- `Cannot set FILL before appendChild` → Sıralama hatası
|
|
301
|
+
- `Maximum call stack` → Sonsuz döngü; daha küçük parçalara böl
|
|
302
|
+
4. Scripti düzelt ve yeni çağrı yap
|
|
303
|
+
|
|
304
|
+
## 7. Doğrulama Adımları
|
|
305
|
+
|
|
306
|
+
Her yazma işleminden sonra:
|
|
307
|
+
|
|
308
|
+
1. `figma_capture_screenshot` ile görsel doğrulama
|
|
309
|
+
2. Gerekirse `figma_get_file_data` ile yapı kontrolü
|
|
310
|
+
3. Oluşturulan node ID'lerini sonraki çağrılarda referans olarak kullan
|
|
311
|
+
|
|
312
|
+
## F-MCP skill koordinasyonu
|
|
313
|
+
|
|
314
|
+
Bu skill şu skill'lerle birlikte kullanılır:
|
|
315
|
+
- **generate-figma-screen** — Ekran oluşturma iş akışı
|
|
316
|
+
- **generate-figma-library** — DS kütüphanesi inşa
|
|
317
|
+
- **apply-figma-design-system** — DS hizalama
|
|
318
|
+
- **fix-figma-design-system-finding** — Tek bulgu düzeltme
|
|
319
|
+
- **figjam-diagram-builder** — FigJam diyagram oluşturma
|
|
320
|
+
|
|
321
|
+
## Evolution Triggers
|
|
322
|
+
|
|
323
|
+
- Bridge'e yeni `figma_*` yazma aracı eklendiğinde ilgili kalıp bölümü güncellenmeli
|
|
324
|
+
- `figma_execute` parametrelerinde değişiklik olursa Kural 1–2 güncellenmeli
|
|
325
|
+
- Yeni Plugin API yetenekleri bridge'e eklendiğinde ilgili örnekler eklenmeli
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: figma-screen-analyzer
|
|
3
|
+
description: Figma ekranını teknik olmayan dilde analiz eder. Bileşen envanteri, DS uyum oranı, görsel hiyerarşi, kullanıcı akışı özeti ve design token kapsamı raporlar. PO, PM ve SEM'lerin tasarım durumunu anlamaları için tasarlanmıştır. "ekranı analiz et", "tasarım raporu", "screen analysis", "UI raporu çıkar", "ne var bu ekranda", "bileşen sayısı", "DS uyum oranı" ifadeleriyle tetiklenir. F-MCP Bridge plugin bağlantısı gerektirir.
|
|
4
|
+
metadata:
|
|
5
|
+
mcp-server: user-figma-mcp-bridge
|
|
6
|
+
personas:
|
|
7
|
+
- po
|
|
8
|
+
- designer
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Figma Screen Analyzer — UI Analiz Raporu
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
Bu skill, Figma ekranını **teknik olmayan** dilde analiz ederek PO, PM ve SEM'ler için anlaşılır bir rapor üretir. DS uyum oranı, bileşen envanteri, görsel hiyerarşi değerlendirmesi ve aksiyon önerileri içerir.
|
|
16
|
+
|
|
17
|
+
**Salt okunur** — Figma tuvalinde değişiklik yapmaz.
|
|
18
|
+
|
|
19
|
+
## Prerequisites
|
|
20
|
+
|
|
21
|
+
- F-MCP Bridge plugin bağlı olmalı
|
|
22
|
+
- Hedef ekranın node ID'si veya URL'i bilinmeli
|
|
23
|
+
|
|
24
|
+
## F-MCP skill koordinasyonu
|
|
25
|
+
|
|
26
|
+
- **İlişkili:** `audit-figma-design-system` (teknik DS denetimi — bu skill'in PO/PM versiyonu)
|
|
27
|
+
- **Sonra:** Bulgulara göre `apply-figma-design-system` veya `ai-handoff-export` önerilir
|
|
28
|
+
- **Karşılaştırma:** İki ekran karşılaştırması için her ikisine de ayrı analiz yapılır
|
|
29
|
+
|
|
30
|
+
## Required Workflow
|
|
31
|
+
|
|
32
|
+
### Step 1: Plugin Bağlantısını Doğrula
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
figma_get_status()
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Step 2: Ekran Verisi Topla
|
|
39
|
+
|
|
40
|
+
> **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.
|
|
41
|
+
|
|
42
|
+
> **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.
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
figma_get_design_context(
|
|
46
|
+
nodeId="<NODE_ID>",
|
|
47
|
+
depth=3,
|
|
48
|
+
verbosity="full",
|
|
49
|
+
includeLayout=true,
|
|
50
|
+
includeVisual=true,
|
|
51
|
+
includeTypography=true
|
|
52
|
+
)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
figma_capture_screenshot(nodeId="<NODE_ID>")
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Step 3: İlk İzlenim Analizi (2 Saniye Testi)
|
|
60
|
+
|
|
61
|
+
Screenshot'a bakarak hızlı sezgisel değerlendirme yap (DS metriklerinden ÖNCE):
|
|
62
|
+
|
|
63
|
+
1. **Göz çekimi:** İlk bakışta göz nereye gidiyor? Bu doğru öğe mi? (CTA, başlık, hero görsel?)
|
|
64
|
+
2. **Duygusal tepki:** Ekran güven mi, kafa karışıklığı mı, heyecan mı uyandırıyor?
|
|
65
|
+
3. **Amaç netliği:** Ekranın ne için olduğu 2 saniyede anlaşılıyor mu?
|
|
66
|
+
4. **Görsel yoğunluk:** Sıkışık mı, dengeli mi, çok boş mu?
|
|
67
|
+
|
|
68
|
+
> Bu bölüm **sezgisel** — metrik değil, izlenim. Raporda "İlk İzlenim" başlığı altında 2-3 cümle.
|
|
69
|
+
|
|
70
|
+
### Step 4: DS Uyum Analizi
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
figma_get_design_system_summary()
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`figma_execute` ile instance ve token sayımı:
|
|
77
|
+
|
|
78
|
+
```js
|
|
79
|
+
const page = figma.currentPage;
|
|
80
|
+
const target = page.findOne(n => n.id === "<NODE_ID>");
|
|
81
|
+
if (!target) return { error: "Node bulunamadı" };
|
|
82
|
+
|
|
83
|
+
const allNodes = target.findAll(() => true);
|
|
84
|
+
const instances = target.findAll(n => n.type === "INSTANCE");
|
|
85
|
+
const textNodes = target.findAll(n => n.type === "TEXT");
|
|
86
|
+
const frames = target.findAll(n => n.type === "FRAME");
|
|
87
|
+
|
|
88
|
+
let boundVariableCount = 0;
|
|
89
|
+
let unboundCount = 0;
|
|
90
|
+
allNodes.forEach(n => {
|
|
91
|
+
if (n.boundVariables && Object.keys(n.boundVariables).length > 0) {
|
|
92
|
+
boundVariableCount++;
|
|
93
|
+
}
|
|
94
|
+
if (n.fills && n.fills.length > 0 && n.type !== "INSTANCE") {
|
|
95
|
+
const hasBound = n.boundVariables && n.boundVariables.fills;
|
|
96
|
+
if (!hasBound) unboundCount++;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const uniqueComponents = new Map();
|
|
101
|
+
instances.forEach(inst => {
|
|
102
|
+
const mc = inst.mainComponent;
|
|
103
|
+
const key = mc?.key || mc?.id;
|
|
104
|
+
const name = mc?.name || "Bilinmeyen";
|
|
105
|
+
if (key) {
|
|
106
|
+
if (!uniqueComponents.has(key)) uniqueComponents.set(key, { name, count: 0 });
|
|
107
|
+
uniqueComponents.get(key).count++;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
totalNodes: allNodes.length,
|
|
113
|
+
instanceCount: instances.length,
|
|
114
|
+
textNodeCount: textNodes.length,
|
|
115
|
+
frameCount: frames.length,
|
|
116
|
+
boundVariableCount,
|
|
117
|
+
unboundFillCount: unboundCount,
|
|
118
|
+
uniqueComponents: [...uniqueComponents.values()],
|
|
119
|
+
dsComplianceRate: Math.round(((instances.length + boundVariableCount) / Math.max(allNodes.length, 1)) * 100)
|
|
120
|
+
};
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Step 5: Görsel Hiyerarşi Değerlendirmesi
|
|
124
|
+
|
|
125
|
+
AI analizi ile:
|
|
126
|
+
|
|
127
|
+
1. **Ana bölümler:** Ekranın kaç ana bölümü var (header, content, footer, sidebar vb.)
|
|
128
|
+
2. **Görsel akış:** Kullanıcı gözünün doğal akışı (F-pattern, Z-pattern, üstten alta)
|
|
129
|
+
3. **Öne çıkan öğeler:** CTA butonları, başlıklar, görsel odak noktaları
|
|
130
|
+
4. **Boşluk dengesi:** Sıkışık mı, dengeli mi, çok boş mu
|
|
131
|
+
5. **Okuma sırası doğru mu?** Başlık → alt başlık → içerik → CTA sırası mantıklı mı?
|
|
132
|
+
6. **Vurgu doğru elemanda mı?** CTA görsel olarak en dikkat çekici mi, yoksa dekoratif bir öğe mi öne çıkıyor?
|
|
133
|
+
7. **Tipografi hiyerarşisi net mi?** Kaç farklı boyut var? 3-4 kademe yeterli, 7+ sorun işareti
|
|
134
|
+
8. **Beyaz alan etkili mi?** Kasıtlı dramatik boşluk mu, dengesiz dağılım mı, sıkışıklık mı?
|
|
135
|
+
|
|
136
|
+
### Step 6: Geri Bildirim Prensipleri
|
|
137
|
+
|
|
138
|
+
Rapor üretilirken aşağıdaki prensiplere uyulmalı:
|
|
139
|
+
|
|
140
|
+
1. **Spesifik ol** — "CTA navigasyonla yarışıyor" yaz, "layout kafa karıştırıcı" yazma
|
|
141
|
+
2. **Neden'i açıkla** — Geri bildirimi tasarım prensibine veya kullanıcı ihtiyacına bağla
|
|
142
|
+
3. **Alternatif öner** — Sadece sorun tespit etme, çözüm de sun
|
|
143
|
+
4. **İyi olanı kabul et** — Yalnızca eleştiri değil, iyi yapılan şeyleri de raporla
|
|
144
|
+
5. **Aşamaya göre ayarla** — Erken keşif farklı feedback alır, son düzeltme farklı
|
|
145
|
+
|
|
146
|
+
### Step 7: Rapor Üret
|
|
147
|
+
|
|
148
|
+
> **Marka Profili Entegrasyonu:** `.fmcp-brand-profile.json` varsa `aestheticDirection` ve `typography` bilgisiyle değerlendir — ekranın marka estetiğiyle uyumu raporla.
|
|
149
|
+
|
|
150
|
+
## Çıktı Formatı
|
|
151
|
+
|
|
152
|
+
### Executive Summary (Varsayılan)
|
|
153
|
+
|
|
154
|
+
```markdown
|
|
155
|
+
# Ekran Analiz Raporu — [Ekran Adı]
|
|
156
|
+
|
|
157
|
+
## Özet Tablo
|
|
158
|
+
|
|
159
|
+
| Metrik | Değer | Durum |
|
|
160
|
+
|---|---|---|
|
|
161
|
+
| Toplam öğe | 127 | — |
|
|
162
|
+
| DS bileşeni (instance) | 23 | ✓ İyi |
|
|
163
|
+
| Benzersiz bileşen türü | 8 | — |
|
|
164
|
+
| Token'a bağlı öğe | 45 | ✓ İyi |
|
|
165
|
+
| Bağsız renk (hardcode) | 5 | ⚠ Düzeltilmeli |
|
|
166
|
+
| DS Uyum Oranı | %85 | ✓ Kabul edilebilir |
|
|
167
|
+
|
|
168
|
+
## Bileşen Envanteri
|
|
169
|
+
|
|
170
|
+
| Bileşen | Kullanım Sayısı |
|
|
171
|
+
|---|---|
|
|
172
|
+
| Button | 5 |
|
|
173
|
+
| Input | 3 |
|
|
174
|
+
| Card | 4 |
|
|
175
|
+
| NavBar | 1 |
|
|
176
|
+
| Avatar | 2 |
|
|
177
|
+
| Badge | 3 |
|
|
178
|
+
| Icon | 5 |
|
|
179
|
+
|
|
180
|
+
## Görsel Hiyerarşi
|
|
181
|
+
|
|
182
|
+
- **Ana akış:** Üstten alta, F-pattern
|
|
183
|
+
- **Bölümler:** Header → Arama → Filtreler → Kart Listesi → Footer
|
|
184
|
+
- **CTA:** "Yeni Ekle" butonu sağ üstte — dikkat çekici konumda ✓
|
|
185
|
+
- **Boşluk:** Dengeli — bölümler arası tutarlı spacing
|
|
186
|
+
|
|
187
|
+
## Öneriler
|
|
188
|
+
|
|
189
|
+
1. 5 hardcode renk token'a bağlanmalı (tema değişikliğinde kırılır)
|
|
190
|
+
2. Alt bölümdeki 2 custom card DS Card bileşenine çevrilebilir
|
|
191
|
+
3. Genel DS uyumu iyi — üretime hazır
|
|
192
|
+
|
|
193
|
+
## Sonraki Adımlar
|
|
194
|
+
→ `audit-figma-design-system` ile detaylı teknik denetim
|
|
195
|
+
→ `ai-handoff-export` ile implementasyon paketi
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Karşılaştırmalı Rapor (İki Ekran)
|
|
199
|
+
|
|
200
|
+
İki ekran ID'si verildiğinde yan yana karşılaştırma:
|
|
201
|
+
|
|
202
|
+
```markdown
|
|
203
|
+
## Karşılaştırma — Ekran A vs Ekran B
|
|
204
|
+
|
|
205
|
+
| Metrik | Ekran A | Ekran B | Fark |
|
|
206
|
+
|---|---|---|---|
|
|
207
|
+
| DS Uyum | %85 | %72 | Ekran B %13 düşük |
|
|
208
|
+
| Instance sayısı | 23 | 15 | Ekran B'de daha az DS kullanımı |
|
|
209
|
+
| Hardcode renk | 5 | 12 | Ekran B'de 2.4x daha fazla |
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### JSON Çıktı (`--json`)
|
|
213
|
+
|
|
214
|
+
Yapılandırılmış JSON — dashboard veya CI entegrasyonu için.
|
|
215
|
+
|
|
216
|
+
## Türkçe Karakter Kuralı (ZORUNLU)
|
|
217
|
+
|
|
218
|
+
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:
|
|
219
|
+
|
|
220
|
+
| Doğru | Yanlış | Doğru | Yanlış |
|
|
221
|
+
|-------|--------|-------|--------|
|
|
222
|
+
| ş | s | Ş | S |
|
|
223
|
+
| ı | i | İ | I |
|
|
224
|
+
| ö | o | Ö | O |
|
|
225
|
+
| ü | u | Ü | U |
|
|
226
|
+
| ç | c | Ç | C |
|
|
227
|
+
| ğ | g | Ğ | G |
|
|
228
|
+
|
|
229
|
+
Son adım: Üretilen tüm Türkçe metinleri karakter kontrolünden geçir.
|
|
230
|
+
|
|
231
|
+
## Evolution Triggers
|
|
232
|
+
|
|
233
|
+
- PO/PM geri bildirimine göre rapor metrikleri genişletilmeli
|
|
234
|
+
- Yeni DS analiz araçları bridge'e eklenirse daha detaylı metrikler çıkarılmalı
|
|
235
|
+
- Sprint/milestone bazlı trend izleme desteği eklenebilir
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fix-figma-design-system-finding
|
|
3
|
+
description: audit-figma-design-system ile tespit edilen tek bir design system bulgusunu Figma tuvalinde dar kapsamda düzeltir (swap, token bağlama, variant hizalama). F-MCP Bridge ve figma_execute gerektirir. "tek bulguyu düzelt", "ds finding fix", "şu node'u kütüphaneye bağla", "bileşeni değiştir", "token bağla" ifadeleriyle tetiklenir.
|
|
4
|
+
metadata:
|
|
5
|
+
mcp-server: user-figma-mcp-bridge
|
|
6
|
+
personas:
|
|
7
|
+
- designer
|
|
8
|
+
- designops
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Fix Figma Design System Finding (dar yazma)
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
**Tek bulgu**, **tek sorunlu node veya minimal küme**, **minimal okuma/yazma**. `audit-figma-design-system` çıktısı veya eşdeğer net görev tanımı olmadan kapsamı sessizce genişletme.
|
|
16
|
+
|
|
17
|
+
Ekran geneli veya çoklu bölüm için **apply-figma-design-system** kullan.
|
|
18
|
+
|
|
19
|
+
## F-MCP araç eşlemesi
|
|
20
|
+
|
|
21
|
+
| Niyet | F-MCP Bridge |
|
|
22
|
+
|--------|----------------|
|
|
23
|
+
| Okuma | `figma_get_design_context`, `figma_capture_screenshot`, `figma_get_file_data` (gerekirse düşük `depth`), `figma_get_component`, `figma_get_variables`, `figma_get_styles` |
|
|
24
|
+
| Kütüphane adayı | `figma_search_components`, `figma_get_component` |
|
|
25
|
+
| Tuval yazma / Plugin API | `figma_execute` (Figma plugin JS; swap, import, yedek kopya) |
|
|
26
|
+
| Bağlantı | `figma_get_status()` |
|
|
27
|
+
|
|
28
|
+
`figma_execute` içinde büyük JSON döndürme; **figjam-diagram-builder** skill’indeki kısa dönüş disiplinine benzer şekilde özet sonuç tercih et.
|
|
29
|
+
|
|
30
|
+
## F-MCP skill koordinasyonu
|
|
31
|
+
|
|
32
|
+
| Durum | Sonraki skill |
|
|
33
|
+
|--------|----------------|
|
|
34
|
+
| Audit’ten önce tek düzeltme istendi | İsteğe bağlı kısa `audit-figma-design-system` ile doğrula; sonra bu skill |
|
|
35
|
+
| Birden fazla bulgu, koordineli reconcile | **apply-figma-design-system** |
|
|
36
|
+
| Sadece kod token dosyası güncellemesi | **design-token-pipeline** (tuval + kod ayrı) |
|
|
37
|
+
| Düzeltme sonrası kod parity | **design-drift-detector** |
|
|
38
|
+
| Mapping güncellemesi | **code-design-mapper** |
|
|
39
|
+
| İsteğe bağlı regresyon (tuval) | **audit-figma-design-system** ile aynı node’u yeniden denetle |
|
|
40
|
+
|
|
41
|
+
## Beklenen girdi
|
|
42
|
+
|
|
43
|
+
Bu skill üç farklı girdi formatını otomatik algılar:
|
|
44
|
+
|
|
45
|
+
1. **Tek finding JSON** — `audit-figma-design-system` çıktısından tek `finding` objesi. `code_location` alanı varsa bu format algılanır.
|
|
46
|
+
2. **Tam audit JSON + indeks** — Tüm audit çıktısı + hangi bulgunun düzeltileceği (indeks veya `ruleId`). `findings` dizisi varsa bu format algılanır.
|
|
47
|
+
3. **Serbest metin + URL** — Sorun özeti + Figma URL / `fileKey` + `nodeId`. Yapılandırılmış JSON yoksa bu format algılanır.
|
|
48
|
+
|
|
49
|
+
**Format algılama sırası:** `code_location` → `findings[]` → serbest metin fallback.
|
|
50
|
+
|
|
51
|
+
Audit JSON kullanılıyorsa `code_location.absolute_file_path` içinden `fileKey` ve `nodeId` çıkar: `/figma/<fileKey>/nodes/<nodeId>`.
|
|
52
|
+
|
|
53
|
+
## Kapsam kuralı
|
|
54
|
+
|
|
55
|
+
Seçilen bulgu çözülene, **blocked** veya **needs-follow-up** raporlanana kadar başka cleanup yapma. Birden fazla bulgu kullanıcıda varsa birini seç veya en yüksek öncelikli tekini uygula; geri kalanı için audit/apply yönlendir.
|
|
56
|
+
|
|
57
|
+
## Required Workflow
|
|
58
|
+
|
|
59
|
+
1. **Plugin bağlantısını doğrula:** `figma_get_status()` — bağlantı yoksa devam etme.
|
|
60
|
+
3. **Normalize:** `fileKey`, `nodeId`, bulgu başlığı ve gerekçe.
|
|
61
|
+
3. **Uyumluluk (belirsiz replacement’ta):** Yazmadan önce hangi component/variant, override’lar, layout sözleşmesi — sonuç `safe-to-apply` \| `blocked` \| `needs-human-choice`. `blocked` / `needs-human-choice` ise yazma; durumu bildir.
|
|
62
|
+
4. **Minimal kanıt:** `figma_capture_screenshot`; yapı için `figma_get_design_context` veya `figma_get_file_data` (dar kapsam); token bulgusuysa `figma_get_variables` / `figma_get_styles`; gerekirse `figma_search_components`.
|
|
63
|
+
5. **Remediasyon modu (tek seç):** `swap-instance` \| `compose-from-primitives` \| `bind-tokens` \| `align-variant` \| `blocked`. En küçük yeterli değişiklik.
|
|
64
|
+
6. **Yedek:** Yıkıcı düzenlemeden önce yalnızca etkilenen alt ağacı veya minimal üst section’ı çoğalt; net isimlendir (`Backup - Fix finding …`). Mümkünse ayrı `figma_execute` çağrısı; dönen node id’yi not et.
|
|
65
|
+
7. **Uygula:** `figma_execute` ile adım adım. Remediasyon modu örnekleri:
|
|
66
|
+
|
|
67
|
+
**swap-instance** (mevcut node'u kütüphane bileşeniyle değiştir):
|
|
68
|
+
```js
|
|
69
|
+
const node = await figma.getNodeByIdAsync("<NODE_ID>");
|
|
70
|
+
const comp = await figma.importComponentByKeyAsync("<COMPONENT_KEY>");
|
|
71
|
+
// veya local: figma.root.findOne(n => n.type === "COMPONENT" && n.name === "<NAME>");
|
|
72
|
+
const instance = comp.createInstance();
|
|
73
|
+
instance.x = node.x; instance.y = node.y;
|
|
74
|
+
instance.resize(node.width, node.height);
|
|
75
|
+
if (node.parent) node.parent.insertChild(node.parent.children.indexOf(node), instance);
|
|
76
|
+
node.remove();
|
|
77
|
+
return { swapped: instance.id, replacedName: node.name };
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**bind-tokens** (hard-coded değeri variable'a bağla):
|
|
81
|
+
```js
|
|
82
|
+
const node = await figma.getNodeByIdAsync("<NODE_ID>");
|
|
83
|
+
const variable = await figma.variables.getVariableByIdAsync("<VAR_ID>");
|
|
84
|
+
const fills = [...node.fills];
|
|
85
|
+
const boundPaint = figma.variables.setBoundVariableForPaint(fills[0], "color", variable);
|
|
86
|
+
node.fills = [boundPaint];
|
|
87
|
+
return { bound: node.name, variable: variable.name };
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**align-variant** (yanlış variant'ı doğrusuyla değiştir):
|
|
91
|
+
```js
|
|
92
|
+
const instance = await figma.getNodeByIdAsync("<INSTANCE_ID>");
|
|
93
|
+
instance.setProperties({ "Variant": "Primary" });
|
|
94
|
+
return { aligned: instance.id, newVariant: "Primary" };
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
8. **Doğrula:** Bulgunun özellikle çözüldüğünü screenshot ve yapı ile kanıtla; global pattern dokunduysa genişlet.
|
|
98
|
+
9. **İsteğe bağlı:** Regresyon için **audit-figma-design-system** ile aynı kapsamı yeniden çalıştır (özellikle çok adımlı fix sonrası).
|
|
99
|
+
|
|
100
|
+
## Yazma kuralları
|
|
101
|
+
|
|
102
|
+
- Belirsiz replacement’ta `safe-to-apply` yoksa yazma.
|
|
103
|
+
- Tek bulgu düzeltildi diye tüm ekranı “sistemde” ilan etme.
|
|
104
|
+
- Component key ve variable id’leri isimden önce tercih et.
|
|
105
|
+
- Import timeout / erişilemeyen kütüphane → `blocked`, zorla devam etme.
|
|
106
|
+
|
|
107
|
+
## Kapanış raporu
|
|
108
|
+
|
|
109
|
+
- **Finding fixed:** Ne değişti, hangi node.
|
|
110
|
+
- **Validation:** Orijinal şikayetin giderildiği kanıtı.
|
|
111
|
+
- **Blocked / Follow-up:** Varsa kısa.
|
|
112
|
+
|
|
113
|
+
## Evolution Triggers
|
|
114
|
+
|
|
115
|
+
- Bridge'e yeni `figma_execute` kalıpları eklendiğinde remediasyon modları güncellenmeli
|
|
116
|
+
- Audit bulgu formatı değişirse girdi normalize adımı uyarlanmalı
|
|
117
|
+
- Batch düzeltme desteği eklenirse tek/toplu mod ayrımı yapılmalı
|