@atezer/figma-mcp-bridge 1.7.30 → 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 +366 -0
- package/README.md +3 -2
- 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 +2 -0
- package/dist/core/plugin-bridge-server.d.ts.map +1 -1
- package/dist/core/plugin-bridge-server.js +5 -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 +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 -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
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fmcp-token-sync-orchestrator
|
|
3
|
+
description: Figma design token'larını kod dosyalarıyla (CSS/Tailwind/Swift/Compose) platform-agnostic senkronize eder. Diff preview + onay + write akışı zorunlu. Her platformda çalışır. Condensed-first: Essentials bölümü %80 case'i kapsar, Advanced sadece edge case'lerde.
|
|
4
|
+
metadata:
|
|
5
|
+
mcp-server: user-figma-mcp-bridge
|
|
6
|
+
version: 1.9.0
|
|
7
|
+
priority: 95
|
|
8
|
+
phase: orchestrator
|
|
9
|
+
personas:
|
|
10
|
+
- designops
|
|
11
|
+
- uidev
|
|
12
|
+
token_budget: condensed-first
|
|
13
|
+
required_inputs:
|
|
14
|
+
- name: target_platform
|
|
15
|
+
type: "enum: css | tailwind | swift | compose | sass | auto"
|
|
16
|
+
description: "Hedef platform. 'auto' → hedef dosya uzantısından tespit, belirsizse sor"
|
|
17
|
+
- name: target_file
|
|
18
|
+
type: "string | null"
|
|
19
|
+
description: "Hedef dosya yolu. null → platform defaultuna göre öner"
|
|
20
|
+
- name: direction
|
|
21
|
+
type: "enum: figma-to-code | code-to-figma"
|
|
22
|
+
description: "Senkronizasyon yönü. Default: figma-to-code (export)"
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# FMCP Token Sync Orchestrator
|
|
26
|
+
|
|
27
|
+
## Essentials (Üst Bölüm — %80 Case İçin Yeterli)
|
|
28
|
+
|
|
29
|
+
### Ortak Protokol (Condensed — full: `agents/_orchestrator-protocol.md`)
|
|
30
|
+
|
|
31
|
+
1. **Skill Registry** açık — tahmin yasak
|
|
32
|
+
2. **Intent Routing** — platform belirsiz → kullanıcıya sor (AskUserQuestion / düz metin)
|
|
33
|
+
3. **Cheap-First** — `figma_get_variables(verbosity="summary")` yeterli, full sadece eksik binding keşfinde
|
|
34
|
+
4. **Cache-First** — tokens için cache yok (hızlı değişir), opsiyonel `.claude/token-sync-log.md`
|
|
35
|
+
5. **User Onay** — **diff preview olmadan WRITE YOK** (mutlak kural)
|
|
36
|
+
6. **Self-Audit** — write sonrası binding coverage raporu (hardcoded kalan node sayısı)
|
|
37
|
+
7. **Skill Evolution** — yeni platform için iki aşamalı onay
|
|
38
|
+
8. **Türkçe rapor** — metrik bloğu sonunda
|
|
39
|
+
|
|
40
|
+
### Skill Registry (Ref Only)
|
|
41
|
+
|
|
42
|
+
| Skill | Dosya yolu | Trigger | Common case lazım mı? |
|
|
43
|
+
|---|---|---|---|
|
|
44
|
+
| `design-token-pipeline` | `skills/design-token-pipeline/SKILL.md` | Token export/import | **HER ZAMAN** (ana motor) |
|
|
45
|
+
| `code-design-mapper` | `skills/code-design-mapper/SKILL.md` | Component ↔ Figma mapping | Sadece component mapping istenirse |
|
|
46
|
+
| `design-system-rules` | `skills/design-system-rules/SKILL.md` | Platform-specific rule generation | Sadece rule generation istenirse |
|
|
47
|
+
|
|
48
|
+
### Platform Routing
|
|
49
|
+
|
|
50
|
+
| Sinyal | Platform | Standard hedef path |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `.css`, `:root`, `var(--...)`, `tokens.css` | CSS | `src/styles/tokens.css` |
|
|
53
|
+
| `tailwind.config.*`, `theme.extend` | Tailwind | `tailwind.config.js` → `theme.extend` |
|
|
54
|
+
| `.swift`, `UIKit`, `SwiftUI`, `Color(...)` | Swift | `Sources/DesignTokens/Tokens.swift` |
|
|
55
|
+
| `.kt`, `Compose`, `@Composable`, `MaterialTheme` | Compose | `app/src/main/java/.../DesignTokens.kt` |
|
|
56
|
+
| `.scss`, `$token-...` | Sass | `src/styles/_tokens.scss` |
|
|
57
|
+
| Hiçbiri net değil | — | AskUserQuestion (4 platform seçeneği) |
|
|
58
|
+
|
|
59
|
+
### Diff Preview Before Write (Zorunlu Akış)
|
|
60
|
+
|
|
61
|
+
1. **Dry-run:** `Read("skills/design-token-pipeline/SKILL.md")` + workflow'u çalıştır ama dosyaya yazma → çıktıyı buffer'a al
|
|
62
|
+
2. **Mevcut dosya varsa:** mevcut içerikle yeni içerik arası **unified diff** üret
|
|
63
|
+
3. **Diff'i sohbete yaz:**
|
|
64
|
+
```diff
|
|
65
|
+
--- current tokens.css
|
|
66
|
+
+++ new tokens.css
|
|
67
|
+
@@ -12,3 +12,5 @@
|
|
68
|
+
--color-primary: #0066cc;
|
|
69
|
+
- --color-secondary: #666;
|
|
70
|
+
+ --color-secondary: #4a4a4a;
|
|
71
|
+
+ --color-success: #10b981;
|
|
72
|
+
```
|
|
73
|
+
4. **Onay al:** AskUserQuestion / düz metin: "Bu değişiklikleri uygulayayım mı? (Evet / Hayır / Sadece bazıları)"
|
|
74
|
+
5. **Onay sonrası** `Write` veya `Edit` ile dosyaya yaz
|
|
75
|
+
6. **Mevcut dosya yoksa:** sadece yeni içeriği göster, onay al, sonra `Write`
|
|
76
|
+
|
|
77
|
+
### Self-Audit (Write Sonrası)
|
|
78
|
+
|
|
79
|
+
Binding coverage raporu:
|
|
80
|
+
- **Toplam token:** `figma_get_variables` ile sayım
|
|
81
|
+
- **Binding oranı:** senkronlanan / toplam (yüzde)
|
|
82
|
+
- **Upgraded:** hardcoded değerden variable binding'e dönüşen sayı
|
|
83
|
+
- **Leftover:** hâlâ hardcoded kalan node sayısı (ds-auditor'a yönlendir)
|
|
84
|
+
|
|
85
|
+
### Rapor Formatı
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
## 🔄 Token Sync — <platform>
|
|
89
|
+
|
|
90
|
+
**Yön:** Figma → Kod | Kod → Figma
|
|
91
|
+
**Hedef dosya:** <path>
|
|
92
|
+
**Mod:** export | import
|
|
93
|
+
|
|
94
|
+
### Diff Özeti
|
|
95
|
+
- Eklenen: <n>
|
|
96
|
+
- Güncellenen: <m>
|
|
97
|
+
- Kaldırılan: <k>
|
|
98
|
+
|
|
99
|
+
### Binding Coverage
|
|
100
|
+
- Toplam token: <n>
|
|
101
|
+
- Binding oranı: <%>
|
|
102
|
+
- Hardcoded kalanlar: <k> node (ds-auditor ile detaylandır)
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
📊 Metrikler
|
|
106
|
+
- Kullanılan skill'ler: <liste>
|
|
107
|
+
- API çağrı sayısı: <n>
|
|
108
|
+
- Dry-run + write: tamamlandı
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Advanced — Only Load If Needed
|
|
114
|
+
|
|
115
|
+
**Bu bölümü Claude aşağıdaki koşullarda tarar:**
|
|
116
|
+
- ⚠️ Multi-platform sync (aynı token'ları hem CSS hem Swift'e)
|
|
117
|
+
- ⚠️ Custom component mapping (code-design-mapper gerektiren)
|
|
118
|
+
- ⚠️ Platform default path kullanıcı için uygun değil (custom path gerekir)
|
|
119
|
+
- ⚠️ Kod → Figma yönünde sync (import mode, daha nadir)
|
|
120
|
+
- ⚠️ Yeni platform desteği (Flutter, Jetpack Multiplatform vb.)
|
|
121
|
+
|
|
122
|
+
### Detay 1 — Multi-Platform Sync
|
|
123
|
+
|
|
124
|
+
Kullanıcı "hem CSS hem Tailwind hem Swift'e aynı token'ları export et" derse:
|
|
125
|
+
1. Her platform için ayrı dry-run
|
|
126
|
+
2. 3 ayrı diff preview sohbette (tek mesajda üç diff bloğu)
|
|
127
|
+
3. Kullanıcı "hepsini onayla" veya "sadece X ve Y" diyebilmeli (AskUserQuestion çoklu seçim)
|
|
128
|
+
4. Onaylananları yaz
|
|
129
|
+
5. Binding coverage raporu 3 platforma göre ayrı
|
|
130
|
+
|
|
131
|
+
### Detay 2 — Custom Component Mapping
|
|
132
|
+
|
|
133
|
+
Sadece token değil, component → component eşleştirme isteniyorsa:
|
|
134
|
+
1. `Read("skills/code-design-mapper/SKILL.md")`
|
|
135
|
+
2. Figma component isim/key → kod dosyası path eşleştirmesi
|
|
136
|
+
3. Çıktı: `.codeconnect.ts` veya benzeri mapping dosyası
|
|
137
|
+
4. Token'lardan bağımsız ama tamamlayıcı iş
|
|
138
|
+
|
|
139
|
+
### Detay 3 — Kod → Figma Import Mode
|
|
140
|
+
|
|
141
|
+
Kod tarafında değişen bir token (örn. Git PR'da renk güncellemesi) Figma'ya geri yansıtılacaksa:
|
|
142
|
+
1. Kod dosyasını parse et
|
|
143
|
+
2. `figma_get_variables` ile mevcut Figma değerlerini al
|
|
144
|
+
3. Diff: kod tarafı vs Figma tarafı
|
|
145
|
+
4. Kullanıcıya göster: "Kod tarafında şu token'lar değişmiş, Figma'ya yansıtayım mı?"
|
|
146
|
+
5. Onay → `figma_update_variable` / `figma_setup_design_tokens` ile yaz
|
|
147
|
+
6. **Destructive mutation** → ortak protokol madde 5 gate (kullanıcı onayı)
|
|
148
|
+
|
|
149
|
+
### Detay 4 — Platform Default Path Override
|
|
150
|
+
|
|
151
|
+
Plan'daki defaultlar:
|
|
152
|
+
```
|
|
153
|
+
CSS → src/styles/tokens.css
|
|
154
|
+
Tailwind → tailwind.config.js
|
|
155
|
+
Swift → Sources/DesignTokens/Tokens.swift
|
|
156
|
+
Compose → app/src/main/java/.../DesignTokens.kt
|
|
157
|
+
Sass → src/styles/_tokens.scss
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Kullanıcı'nın proje yapısı farklı olabilir. İlk sync'te:
|
|
161
|
+
1. Default path'i sor: "Bu platform için token dosyası `<default>` yoluna yazılsın mı?"
|
|
162
|
+
2. Kullanıcı alternatif verirse onu kullan
|
|
163
|
+
3. İlk başarılı sync sonrası path `.claude/token-sync-log.md`'ye kaydedilir (opsiyonel cache)
|
|
164
|
+
|
|
165
|
+
### Detay 5 — Error Recovery
|
|
166
|
+
|
|
167
|
+
| Hata | Aksiyon |
|
|
168
|
+
|---|---|
|
|
169
|
+
| Dosya yazma permission | Kullanıcıya bildir, farklı path öner |
|
|
170
|
+
| Mevcut kod formatı tanınmıyor | Örnek satır göster, formatı doğrulat |
|
|
171
|
+
| `figma_get_variables` timeout | `verbosity="summary"` zaten default, retry |
|
|
172
|
+
| Diff çok büyük (100+ değişiklik) | Özetle: "X color, Y spacing, Z typography token değişti, detay görmek ister misin?" |
|
|
173
|
+
|
|
174
|
+
### Detay 6 — Platform-Specific Notes
|
|
175
|
+
|
|
176
|
+
**Claude Code:**
|
|
177
|
+
- `Write` / `Edit` tool'ları mevcut, doğrudan kod dosyasına yazılır
|
|
178
|
+
- Cache: `.claude/token-sync-log.md` opsiyonel
|
|
179
|
+
|
|
180
|
+
**Cursor:**
|
|
181
|
+
- Aynı tool'lar mevcut, main context'te çalışır
|
|
182
|
+
- `.cursor/rules/fmcp-orchestration.md` bu orchestrator'ı referans eder
|
|
183
|
+
|
|
184
|
+
**Claude Desktop:**
|
|
185
|
+
- **KRİTİK:** Filesystem MCP eklenmediyse `Write` tool'u yok → sadece diff gösterebilir, kullanıcı manuel kopyalar
|
|
186
|
+
- İlk prompt'ta manuel skill referansı zorunlu
|
|
187
|
+
|
|
188
|
+
**Claude Web:**
|
|
189
|
+
- Filesystem yok → tamamen plan-only mod
|
|
190
|
+
- "Bu diff'i kopyala, tokens.css'e yapıştır" talimatı ver
|
|
191
|
+
|
|
192
|
+
### Detay 7 — Yeni Platform Desteği (Skill Evolution)
|
|
193
|
+
|
|
194
|
+
Kullanıcı "Flutter için export" isterse (mevcut 5 platformda yok):
|
|
195
|
+
1. **Aşama 1:** Gap'i açıkla, "Flutter desteği eklemek istiyor musun?" sor
|
|
196
|
+
2. **Aşama 2:** `design-token-pipeline` skill'ine Flutter eklentisi yap (edit) veya yeni bir skill (`fmcp-token-flutter-pipeline`) oluştur (create)
|
|
197
|
+
3. Create → DRAFT banner + ikinci onay
|
|
198
|
+
4. Edit → diff preview + onay
|
|
@@ -6,6 +6,44 @@ metadata:
|
|
|
6
6
|
personas:
|
|
7
7
|
- designops
|
|
8
8
|
- designer
|
|
9
|
+
required_inputs:
|
|
10
|
+
- name: source_type
|
|
11
|
+
type: enum
|
|
12
|
+
options:
|
|
13
|
+
- "Kod tabanı (path ver)"
|
|
14
|
+
- "Token JSON dosyası"
|
|
15
|
+
- "Mevcut tasarım sisteminden clone"
|
|
16
|
+
- "Sıfırdan (boş kütüphane)"
|
|
17
|
+
question: "Kütüphaneyi nereden inşa edelim?"
|
|
18
|
+
required: true
|
|
19
|
+
- name: source_path
|
|
20
|
+
type: string
|
|
21
|
+
question: "Kaynak path nedir? (örn: ./src/design-tokens veya ./tokens.json)"
|
|
22
|
+
required: false
|
|
23
|
+
skip_if: "source_type == 'Sıfırdan (boş kütüphane)'"
|
|
24
|
+
- name: library_name
|
|
25
|
+
type: string
|
|
26
|
+
question: "Kütüphane adı nedir? (örn: '❖ My DS')"
|
|
27
|
+
required: true
|
|
28
|
+
- name: components_to_generate
|
|
29
|
+
type: string_list
|
|
30
|
+
question: "Hangi bileşenleri üretelim? (örn: Button, Input, Card, Modal — 'all' veya virgülle ayır)"
|
|
31
|
+
required: false
|
|
32
|
+
default: "all"
|
|
33
|
+
- name: token_categories
|
|
34
|
+
type: string_list
|
|
35
|
+
question: "Hangi token kategorileri? (colors, spacing, typography, radius, shadow — 'all' veya seçili)"
|
|
36
|
+
required: false
|
|
37
|
+
default: "all"
|
|
38
|
+
- name: theme_support
|
|
39
|
+
type: enum
|
|
40
|
+
options:
|
|
41
|
+
- "Single theme (default)"
|
|
42
|
+
- "Light + Dark"
|
|
43
|
+
- "Multi-brand (3+ themes)"
|
|
44
|
+
question: "Tema desteği?"
|
|
45
|
+
required: false
|
|
46
|
+
default: "Single theme (default)"
|
|
9
47
|
---
|
|
10
48
|
|
|
11
49
|
# Generate Figma Library — Koddan DS Kütüphanesi İnşa
|
|
@@ -6,6 +6,61 @@ metadata:
|
|
|
6
6
|
personas:
|
|
7
7
|
- designer
|
|
8
8
|
- uidev
|
|
9
|
+
required_inputs:
|
|
10
|
+
- name: device
|
|
11
|
+
type: enum
|
|
12
|
+
options:
|
|
13
|
+
- "iPhone 17 (402×874)"
|
|
14
|
+
- "iPhone 16 Pro Max (440×956)"
|
|
15
|
+
- "iPhone 16 (393×852)"
|
|
16
|
+
- "iPhone 13/14 (390×844)"
|
|
17
|
+
- "Android Compact (412×917)"
|
|
18
|
+
- "Android Medium (700×840)"
|
|
19
|
+
- "iPad Pro 11 (834×1194)"
|
|
20
|
+
- "iPad Pro 13 (1024×1366)"
|
|
21
|
+
- "Desktop (1440×1024)"
|
|
22
|
+
- "Custom (width×height ver)"
|
|
23
|
+
question: "Hangi device boyutunda olsun?"
|
|
24
|
+
required: true
|
|
25
|
+
default_source: ".claude/design-systems/last-intent.md#device"
|
|
26
|
+
- name: design_system
|
|
27
|
+
type: from_state
|
|
28
|
+
source: ".claude/design-systems/active-ds.md#Library Name"
|
|
29
|
+
fallback_question: "Hangi tasarım sistemi kullanılsın? (❖ SUI / Material / Apple HIG / Custom)"
|
|
30
|
+
required: true
|
|
31
|
+
- name: reference_benchmark
|
|
32
|
+
type: node_id_or_none
|
|
33
|
+
question: "Referans alınacak benchmark ekranı var mı? (Node ID veya Figma URL, yoksa 'yok')"
|
|
34
|
+
required: false
|
|
35
|
+
affects: ["screen_type", "sections"]
|
|
36
|
+
- name: screen_type
|
|
37
|
+
type: enum
|
|
38
|
+
options:
|
|
39
|
+
- "Dashboard / özet"
|
|
40
|
+
- "Liste / arama sonuçları"
|
|
41
|
+
- "Detay / profil"
|
|
42
|
+
- "Form / veri girişi"
|
|
43
|
+
- "Login / onboarding"
|
|
44
|
+
- "Confirmation / success"
|
|
45
|
+
- "Empty state"
|
|
46
|
+
- "Error / 404"
|
|
47
|
+
question: "Ne tür bir ekran?"
|
|
48
|
+
required: true
|
|
49
|
+
skip_if: "reference_benchmark != none"
|
|
50
|
+
- name: sections
|
|
51
|
+
type: string_list
|
|
52
|
+
question: "Hangi ana içerik bölümlerini istiyorsun? (örn: header, balance card, quick actions, transactions, bottom nav)"
|
|
53
|
+
required: true
|
|
54
|
+
skip_if: "reference_benchmark != none"
|
|
55
|
+
- name: variants
|
|
56
|
+
type: enum
|
|
57
|
+
options:
|
|
58
|
+
- "Tek varyant"
|
|
59
|
+
- "Light + Dark mode"
|
|
60
|
+
- "2-3 layout alternatifi"
|
|
61
|
+
question: "Kaç varyant istiyorsun?"
|
|
62
|
+
required: false
|
|
63
|
+
default: "Tek varyant"
|
|
9
64
|
---
|
|
10
65
|
|
|
11
66
|
# Generate Figma Screen — Kod/Açıklamadan Figma Ekranı
|
|
@@ -43,6 +98,33 @@ Topluluk `figma-generate-design` skill'inden uyarlanmış, F-MCP Bridge araçlar
|
|
|
43
98
|
|
|
44
99
|
**Bu adımları sırayla uygula. Adım atlama.**
|
|
45
100
|
|
|
101
|
+
### Step 0: Aktif Tasarım Sistemi Kontrolü (ZORUNLU - v1.8.0+)
|
|
102
|
+
|
|
103
|
+
**Ekran yapmaya başlamadan önce DS context'inin belirli olduğundan emin ol.**
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
1. Read .claude/design-systems/active-ds.md
|
|
107
|
+
2. Status alanı:
|
|
108
|
+
✅ Aktif → Library Name'i not al, Step 1'e geç
|
|
109
|
+
❌ Henüz seçilmedi → Kullanıcıya sor:
|
|
110
|
+
"Hangi tasarım sistemi ile ilerleyelim?
|
|
111
|
+
- ❖ SUI (varsa)
|
|
112
|
+
- Material Design
|
|
113
|
+
- Apple HIG
|
|
114
|
+
- Kendi DS'iniz (Figma library URL verin)
|
|
115
|
+
- Hiçbiri (ham Figma)"
|
|
116
|
+
3. Kullanıcı yanıtladıktan sonra active-ds.md'yi update et:
|
|
117
|
+
- Status: ✅ Aktif
|
|
118
|
+
- Library Name: <seçim>
|
|
119
|
+
- Selected At: <bugün>
|
|
120
|
+
4. Sonraki turlarda bu soruyu TEKRAR SORMA — active-ds.md zaten dolu.
|
|
121
|
+
Kullanıcı açıkça "DS değiştir" demediği sürece aynı DS'i kullan.
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Bypass:** Kullanıcı "DS'siz devam et" derse `Status: DS bypass mode` olarak işaretle. Token binding kuralı esnetilir ama yine de kullanıcıya hardcoded değer kullandığını bildir.
|
|
125
|
+
|
|
126
|
+
Detay: [figma-canvas-ops SKILL Section 0 — Design System Context](../figma-canvas-ops/SKILL.md#0-design-system-context-zorunlu--v180).
|
|
127
|
+
|
|
46
128
|
### Step 1: Plugin Bağlantısını Doğrula
|
|
47
129
|
|
|
48
130
|
```
|
|
@@ -109,13 +191,31 @@ Proje kökünde `.fmcp-brand-profile.json` varsa:
|
|
|
109
191
|
|
|
110
192
|
Üç şey gerekiyor: **bileşenler**, **variable'lar**, **stiller**.
|
|
111
193
|
|
|
112
|
-
|
|
113
|
-
-
|
|
114
|
-
-
|
|
115
|
-
-
|
|
116
|
-
|
|
194
|
+
**⚠️ MCP TOOL SEÇİMİ (v1.8.0+):**
|
|
195
|
+
- F-MCP plugin bağlıysa **`figma_search_assets`** veya **`figma_get_library_variables`** kullan
|
|
196
|
+
- Resmi Figma MCP'nin **`search_design_system`** tool'unu **ÇAĞIRMA** — "Resource links not supported" / "file could not be accessed" hatası verir
|
|
197
|
+
- Detay: FMCP_INSTRUCTIONS → "TOOL SELECTION" bölümü
|
|
198
|
+
|
|
199
|
+
**CACHE-FIRST KURALI (MUTLAK ZORUNLU - PRE-FLIGHT BLOCKER):**
|
|
200
|
+
|
|
201
|
+
Figma API'ye gitmeden önce `.claude/design-systems/<library-id>/` cache'ini kontrol et:
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
1. Read .claude/design-systems/<library-id>/_meta.md
|
|
205
|
+
↓
|
|
206
|
+
✅ Var, sync güncel (24h içinde) → cache'leri kullan, devam et
|
|
207
|
+
❌ Yok / sync eski / yarım kalmış → Step 3a-3d'yi ÇALIŞTIR ve cache'i doldur,
|
|
208
|
+
ANCAK O ZAMAN ekran üretimine başla
|
|
209
|
+
```
|
|
117
210
|
|
|
118
|
-
Cache
|
|
211
|
+
**Cache eksik veya stale ise ekran üretimi BAŞLAYAMAZ** — önce keşif/cache, sonra üretim. Bu, hardcoded fallback'leri ve tekrar tekrar API çağrılarını engeller.
|
|
212
|
+
|
|
213
|
+
- Text style key'leri → `.claude/design-systems/<library-id>/tokens.md` (text style key cache)
|
|
214
|
+
- Variable key'leri → `.claude/design-systems/<library-id>/tokens.md`
|
|
215
|
+
- Component key'leri + override notları → `.claude/design-systems/<library-id>/components.md`
|
|
216
|
+
- Font ailesi + available weights → `.claude/design-systems/<library-id>/tokens.md` (Font Weights bölümü)
|
|
217
|
+
|
|
218
|
+
Cache doldurulduktan sonra her oturumda 24 saat boyunca tekrar API'ye gitmeden okunabilir. **Bu, sonraki oturumlarda token tüketimini %60-70 düşürür.**
|
|
119
219
|
|
|
120
220
|
**Cache Invalidation:** Cache dosyasının başına `lastUpdated: YYYY-MM-DD HH:mm` ekle. 24 saatten eski cache'ler otomatik yenilenmelidir. Kütüphane güncellendiğinde key'ler değişebilir.
|
|
121
221
|
|
|
@@ -231,6 +331,55 @@ Ekran oluşturmadan önce kullanılacak tüm DS token'larının **variable key'l
|
|
|
231
331
|
|
|
232
332
|
Bu adımda toplanan key'ler, sonraki adımlarda `importVariableByKeyAsync` ile hedef dosyaya import edilecek.
|
|
233
333
|
|
|
334
|
+
### Step 3.5: Clone Tool'u Tuzağı — Ne Zaman Clone, Ne Zaman Sıfırdan İnşa (v1.8.2+ ZORUNLU)
|
|
335
|
+
|
|
336
|
+
`figma_clone_screen_to_device` tool'u v1.8.1'de eklendi ama **sadece dar bir use-case için** kullanılmalıdır. Yanlış kullanım, benchmark'ın mevcut yanlışlıklarını (hardcoded rectangle, eksik token binding, non-responsive layout) kopyalayarak disiplin ihlaline yol açar.
|
|
337
|
+
|
|
338
|
+
#### Karar Matrisi
|
|
339
|
+
|
|
340
|
+
| Kullanıcı isteği | Doğru yaklaşım | Tool |
|
|
341
|
+
|---|---|---|
|
|
342
|
+
| "Aynı ekranı iPhone 17'ye migrate et" (sadece boyut değişir) | Clone | `figma_clone_screen_to_device` |
|
|
343
|
+
| "Aynı DS ile benzer ekran" (tek varyant) | Clone + validate | `figma_clone_screen_to_device` + Step 6.5 |
|
|
344
|
+
| **"3 farklı alternatif tasarım"** | **Build from scratch** ⭐ | `figma_execute` + Step 4-5 |
|
|
345
|
+
| **"Hero Card varyasyonu yap"** | **Build from scratch** | `figma_execute` + Step 4-5 |
|
|
346
|
+
| **"Yeni ekran sıfırdan"** | **Build from scratch** | `figma_execute` + Step 4-5 |
|
|
347
|
+
| **"Benchmark'tan ilham al, daha iyisini yap"** | **Build from scratch** (benchmark = inspiration only) | `figma_execute` + Step 4-5 |
|
|
348
|
+
| "Mevcut ekranda DS uyumunu düzelt" | Apply-DS workflow | `apply-figma-design-system` SKILL |
|
|
349
|
+
|
|
350
|
+
#### Kullanıcının Gerçek İstediği Nedir?
|
|
351
|
+
|
|
352
|
+
Kullanıcı "3 alternatif tasarım" dediğinde **neredeyse her zaman** istediği:
|
|
353
|
+
- Farklı layout/renk/tipografi yaklaşımları
|
|
354
|
+
- Her biri gerçekten **AYRI** (sadece isim değil, içerik de)
|
|
355
|
+
- Hepsinde DS uyumu (instance + token binding)
|
|
356
|
+
- Hepsi responsive (auto-layout + FILL sizing)
|
|
357
|
+
|
|
358
|
+
Bu **clone'un kapsamında DEĞİL**. Clone sadece "kopyala, isim değiştir" yapar. Sonuçta **3 identik kopya** + farklı isimler olur. Bu kullanıcının istediği **GERÇEK varyasyon değildir**.
|
|
359
|
+
|
|
360
|
+
#### Doğru Akış: Build-from-Scratch (Step 4-5)
|
|
361
|
+
|
|
362
|
+
Benchmark varsa:
|
|
363
|
+
1. **Step 3.x'te benchmark'ı `figma_get_design_context` ile OKU** — yapısal anlayış için
|
|
364
|
+
2. Benchmark'ta kullanılan SUI instance'ları not al (NavigationTopBar, PillTabs, vb.)
|
|
365
|
+
3. Benchmark'ta **yanlış olan şeyleri kopyalama**:
|
|
366
|
+
- Hardcoded rectangle separator'lar → DS Divider component kullan
|
|
367
|
+
- Non-responsive iç frame'ler → auto-layout FILL'e çevir
|
|
368
|
+
- Missing token bindings → her yerde `setBoundVariable*` kullan
|
|
369
|
+
4. **Step 4 + Step 5 akışını takip et** — sıfırdan, SUI kurallarıyla
|
|
370
|
+
5. Her alternatif için benzersiz layout çözümü:
|
|
371
|
+
- Hero Card: bakiye kartı büyütülmüş, quick actions altta sade
|
|
372
|
+
- Liste Odaklı: hesap listesi dominant, özet sağ-altta
|
|
373
|
+
- Dark Header: root fill `Global/primary/default`, text'ler `on-primary` token
|
|
374
|
+
6. Step 6.5 validate → skor ≥ 80
|
|
375
|
+
|
|
376
|
+
#### Kısıtlama Kuralı
|
|
377
|
+
|
|
378
|
+
**Kullanıcı şu kelimelerden birini kullandıysa → `figma_clone_screen_to_device` KULLANMA:**
|
|
379
|
+
- "alternatif", "varyasyon", "farklı", "yeni", "tasarla", "iyileştir", "redesign"
|
|
380
|
+
|
|
381
|
+
Intent Router bu kelimeleri algıladığında `approach = build-from-scratch` otomatik set eder ve Claude'u Step 4-5 rotasına yönlendirir.
|
|
382
|
+
|
|
234
383
|
### Step 4: Boş Alan Bul ve Wrapper Frame Oluştur
|
|
235
384
|
|
|
236
385
|
```js
|
|
@@ -418,6 +567,44 @@ Screen: VERTICAL, counterAxis=CENTER, layoutSizingVertical=HUG
|
|
|
418
567
|
|
|
419
568
|
**Mode adı eşleşmesi DİKKAT:** `indexOf("Web")` "Mobil & Web Mobil"i de yakalar. `indexOf("Desktop")` kullan.
|
|
420
569
|
|
|
570
|
+
### Step 5.17: Quality Gate — Her Bölüm Yazıldıktan Sonra (ZORUNLU — v1.8.2+)
|
|
571
|
+
|
|
572
|
+
Her bölüm (`figma.createFrame()` sonrası) için **aşağıdaki checklist ZORUNLU**. Herhangi biri ❌ ise → bölümü **yeniden yaz**. Claude bu checklist'i kendi kendine uygulamakla yükümlüdür.
|
|
573
|
+
|
|
574
|
+
```
|
|
575
|
+
[ ] Frame'in layoutMode'u atandı mı? (ASLA "NONE" olmamalı — HORIZONTAL veya VERTICAL)
|
|
576
|
+
[ ] primaryAxisSizingMode doğru mu? (Hug: AUTO, Fixed width: FIXED)
|
|
577
|
+
[ ] counterAxisSizingMode doğru mu?
|
|
578
|
+
[ ] Tüm fills setBoundVariableForPaint ile DS token'a bağlı mı? (hardcoded SOLID YASAK)
|
|
579
|
+
[ ] Tüm padding (top/bottom/left/right) setBoundVariable ile DS spacing token'a bağlı mı?
|
|
580
|
+
[ ] itemSpacing setBoundVariable ile DS spacing token'a bağlı mı?
|
|
581
|
+
[ ] cornerRadius (varsa) setBoundVariable ile DS radius token'a bağlı mı?
|
|
582
|
+
[ ] Her text node setTextStyleIdAsync ile DS text style'a bağlı mı? (ASLA sadece fontSize hardcoded)
|
|
583
|
+
[ ] Text fills setBoundVariableForPaint ile DS text color token'a bağlı mı?
|
|
584
|
+
[ ] Bölüm içinde en az 1 DS INSTANCE var mı? (importComponentByKeyAsync ile).
|
|
585
|
+
İstisna: Sadece text + frame olan bölümler (ör. başlık row) — bu durumda yine spacing/padding/renk token'ları zorunlu.
|
|
586
|
+
[ ] Tüm child'lar appendChild sonrası layoutSizingHorizontal = "FILL" mi? (text istisna: HUG)
|
|
587
|
+
[ ] Hiçbir node'un fills'i raw hex literal ile atandı mı? (grep: `{r:`, `color:` literal)
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
**Otomatik kontrol örneği:**
|
|
591
|
+
|
|
592
|
+
```js
|
|
593
|
+
// Her createFrame sonrası Claude bu kontrolü yapar:
|
|
594
|
+
if (frame.layoutMode === "NONE") throw new Error("Quality Gate FAIL: NO_AUTO_LAYOUT");
|
|
595
|
+
if (!frame.boundVariables || !frame.boundVariables.paddingLeft) {
|
|
596
|
+
console.warn("Quality Gate WARN: padding token binding eksik");
|
|
597
|
+
}
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
**Quality Gate FAIL olursa ne yap?**
|
|
601
|
+
1. Bölümü sil: `frame.remove()`
|
|
602
|
+
2. Eksik token/instance'ı `figma_search_assets` + `figma_get_library_variables` ile ara
|
|
603
|
+
3. Bölümü **yeniden yaz** — bu sefer tüm kuralları uyarak
|
|
604
|
+
4. Tekrar kontrol et
|
|
605
|
+
|
|
606
|
+
**Skor hedef:** `figma_validate_screen` sonrası ≥ 80 (Step 6.5). Quality Gate çalışırsa validate zaten geçer.
|
|
607
|
+
|
|
421
608
|
### Step 5.2: Instance Override Rehberi (ZORUNLU)
|
|
422
609
|
|
|
423
610
|
**Component PROPERTY (TEXT/BOOLEAN/VARIANT tipi) → `setProperties`:**
|
|
@@ -478,6 +665,56 @@ Estetik yön belirlendiyse (Step 2.5), bölüm inşa sırasında şu detaylar ek
|
|
|
478
665
|
|
|
479
666
|
> **NOT:** Bu öneriler DS bileşen kütüphanesi varsa DS'nin izin verdiği ölçüde uygulanır. DS token'ları dışında hardcoded değer eklenmez.
|
|
480
667
|
|
|
668
|
+
### Step 5.6: Dark Mode / Theme Variants Workflow (ZORUNLU — v1.9.0+)
|
|
669
|
+
|
|
670
|
+
Intent router `variants` input'unda "Light + Dark mode" seçildiyse (veya kullanıcı açıkça dark+light istiyorsa), Step 6'ya geçmeden önce bu alt adımı uygula.
|
|
671
|
+
|
|
672
|
+
**Ön koşul:** DS'de theme modlar tanımlı bir variable collection var. SUI için tipik: `Colors` collection + `Light` mode + `Dark` mode.
|
|
673
|
+
|
|
674
|
+
**Akış (4 adım):**
|
|
675
|
+
|
|
676
|
+
1. **Light ekranı doğrula (Step 5 sonu):** Wrapper frame ID'sini al. Tüm fill/stroke/background'lar `setBoundVariableForPaint` ile bağlı olmalı (Step 5.17 Quality Gate zaten sağladı). Eğer hardcoded değer varsa Step 5'e dön, düzelt.
|
|
677
|
+
|
|
678
|
+
2. **Klon oluştur:**
|
|
679
|
+
```javascript
|
|
680
|
+
// figma_execute
|
|
681
|
+
const lightFrame = await figma.getNodeByIdAsync("<wrapper_id>");
|
|
682
|
+
const darkFrame = lightFrame.clone();
|
|
683
|
+
figma.currentPage.appendChild(darkFrame);
|
|
684
|
+
darkFrame.x = lightFrame.x + lightFrame.width + 80; // sağda, 80px boşluk
|
|
685
|
+
darkFrame.name = lightFrame.name + " — Dark";
|
|
686
|
+
return { darkFrameId: darkFrame.id };
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
3. **Dark mode'u klon frame'e uygula:**
|
|
690
|
+
```javascript
|
|
691
|
+
// figma_execute (ayrı çağrı)
|
|
692
|
+
const collections = await figma.variables.getLocalVariableCollectionsAsync();
|
|
693
|
+
const colorCol = collections.find(c => c.name === "Colors" || c.name.toLowerCase().includes("color"));
|
|
694
|
+
if (!colorCol) throw new Error("Theme collection bulunamadı — DS'de mode tanımlı değil");
|
|
695
|
+
const darkMode = colorCol.modes.find(m => m.name.toLowerCase().includes("dark"));
|
|
696
|
+
if (!darkMode) throw new Error("Dark mode bulunamadı — DS tek modlu");
|
|
697
|
+
|
|
698
|
+
const darkFrame = await figma.getNodeByIdAsync("<darkFrameId>");
|
|
699
|
+
darkFrame.setExplicitVariableModeForCollection(colorCol, darkMode.modeId);
|
|
700
|
+
return { status: "dark mode applied", mode: darkMode.name };
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
**Sihir burada:** `setExplicitVariableModeForCollection` ile tüm bound variable'lar otomatik olarak dark mode değerleri kullanır. Manuel swap gerekmez — tek bir API çağrısı tüm renkleri günceller. **Bu yüzden Step 5.17'de her fill/stroke mutlaka variable'a bağlı olmalı** — hardcoded kalanlar dark mode'da güncellenmez, light rengini taşır.
|
|
704
|
+
|
|
705
|
+
4. **Her iki frame'i ayrı validate et:**
|
|
706
|
+
```javascript
|
|
707
|
+
figma_validate_screen(nodeId: <lightFrameId>, minScore: 80)
|
|
708
|
+
figma_validate_screen(nodeId: <darkFrameId>, minScore: 80)
|
|
709
|
+
```
|
|
710
|
+
İkisi de ≥80 olmalı. Biri fail ederse hardcoded değerler kaldı demektir — Step 5.17 Quality Gate'e dön.
|
|
711
|
+
|
|
712
|
+
**Edge case:** DS'de dark mode yoksa (sadece light), `variants: "Light + Dark"` seçimi kullanıcıya hata raporla: "Aktif DS'de dark mode tanımlı değil, sadece light üretildi. Dark mode için DS'nin `Colors` collection'ında `Dark` modu eklenmelidir."
|
|
713
|
+
|
|
714
|
+
**Responsive + theme kombinasyonu:** `variants: ["Light + Dark", "Mobile + Web"]` seçilirse matris oluşur (Light+Mobile / Light+Web / Dark+Mobile / Dark+Web = 4 frame). Her biri için ayrı wrapper, ayrı mode/device binding, ayrı validate. Turn budget'e dikkat — 4 frame için 4 turn harca (inter-screen checkpoint gate Step 6.6).
|
|
715
|
+
|
|
716
|
+
**Known limitation:** `figma_validate_screen` skorlama algoritması **dark mode variable binding coverage'ını ayrıca ölçmez** (plugin-side: f-mcp-plugin/code.js). Dark frame'de hardcoded renk kalmış olsa bile skor ≥80 alabilir. Bu yüzden Step 5.17 Quality Gate ve Step 5.6 adım 4'teki manuel binding kontrolü zorunludur — scora tek başına güvenme.
|
|
717
|
+
|
|
481
718
|
### Step 6: Görsel Doğrulama
|
|
482
719
|
|
|
483
720
|
```
|
|
@@ -498,6 +735,123 @@ Screenshot'ı incele:
|
|
|
498
735
|
|
|
499
736
|
Sorun varsa hedefli `figma_execute` ile düzelt.
|
|
500
737
|
|
|
738
|
+
### Step 6.5: Self-Audit Mandate (ZORUNLU — v1.8.1+)
|
|
739
|
+
|
|
740
|
+
**Ekranı kullanıcıya sunmadan ÖNCE kendi kendini denetle.** Bu adım **atlanamaz** — screenshot yeterli değil çünkü Claude görsel olarak "güzel" görünen ama token/bileşen disiplininden uzak ekranları fark edemez.
|
|
741
|
+
|
|
742
|
+
#### Adım 1 — `figma_validate_screen` çağır
|
|
743
|
+
|
|
744
|
+
```
|
|
745
|
+
figma_validate_screen(nodeId="wrapper-frame-id", expectedDs="❖ SUI", minScore=80)
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
Tool şunu döner:
|
|
749
|
+
```json
|
|
750
|
+
{
|
|
751
|
+
"score": 92,
|
|
752
|
+
"passed": true,
|
|
753
|
+
"minScore": 80,
|
|
754
|
+
"breakdown": {
|
|
755
|
+
"instanceCoverage": 85,
|
|
756
|
+
"libraryInstanceCount": 7,
|
|
757
|
+
"autoLayoutCoverage": 100,
|
|
758
|
+
"tokenBindingCoverage": 90
|
|
759
|
+
},
|
|
760
|
+
"violations": [],
|
|
761
|
+
"recommendation": "Score 92/100 passed minimum 80. Screen is DS-compliant."
|
|
762
|
+
}
|
|
763
|
+
```
|
|
764
|
+
|
|
765
|
+
#### Adım 2 — Skor değerlendirmesi
|
|
766
|
+
|
|
767
|
+
| Skor | Karar | Davranış |
|
|
768
|
+
|---|---|---|
|
|
769
|
+
| **≥ 80** | ✅ Passed | Kullanıcıya sun, rapor et |
|
|
770
|
+
| **60-79** | ⚠️ Kısmi | Violations listesini oku, targeted fix'ler uygula, tekrar validate et |
|
|
771
|
+
| **< 60** | ❌ Failed | **Ekranı sil** (`figma_execute` → `node.remove()`), Step 3-5'e dön, DS bileşenleriyle yeniden inşa et |
|
|
772
|
+
|
|
773
|
+
#### Adım 3 — Retry Loop (max 3 deneme)
|
|
774
|
+
|
|
775
|
+
Eğer ilk denemede score < 80 ise:
|
|
776
|
+
1. Violations listesini oku (en kritik 5'i)
|
|
777
|
+
2. Her bir violation için `figma_execute` ile targeted fix uygula:
|
|
778
|
+
- `HARDCODED_FILL` → `figma_bind_variable` ile binding ekle
|
|
779
|
+
- `NO_AUTO_LAYOUT` → `layoutMode = "VERTICAL"` ekle
|
|
780
|
+
3. Tekrar `figma_validate_screen` çağır
|
|
781
|
+
4. **Max 3 deneme.** 3. denemede de fail ise:
|
|
782
|
+
- Ekranı sil
|
|
783
|
+
- Kullanıcıya rapor et: "3 denemede de minimum skoru yakalayamadım. Muhtemel sebepler: [list]. Elle düzeltmek mi, farklı yaklaşım mı denemek istersiniz?"
|
|
784
|
+
|
|
785
|
+
#### Adım 4 — Pass sonrası raporlama
|
|
786
|
+
|
|
787
|
+
Validation passed ise kullanıcıya özet çıkar:
|
|
788
|
+
```
|
|
789
|
+
✅ Ekran hazır: "Vadesiz TL - iPhone 17"
|
|
790
|
+
📊 DS Compliance Score: 92/100
|
|
791
|
+
🧩 Library Instances: 7
|
|
792
|
+
🎨 Token Bindings: 24
|
|
793
|
+
📐 Auto-Layout Coverage: 100%
|
|
794
|
+
⏱️ Süre: 18 saniye
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
#### Anti-patterns (Self-Audit atlamak)
|
|
798
|
+
|
|
799
|
+
❌ **YANLIŞ:** "Screenshot güzel görünüyor, validate'e gerek yok" → Bu bir **disiplin kaçırmasıdır**
|
|
800
|
+
✅ **DOĞRU:** Screenshot güzel olsa bile validate çalıştır. Token binding eksikliği gözle görülmez.
|
|
801
|
+
|
|
802
|
+
❌ **YANLIŞ:** Score 75 → "yeterince iyi, kullanıcıya sun"
|
|
803
|
+
✅ **DOĞRU:** Score < 80 → retry loop, ekranı düzelt
|
|
804
|
+
|
|
805
|
+
❌ **YANLIŞ:** Self-audit'i opsiyonel sayma
|
|
806
|
+
✅ **DOĞRU:** generate-figma-screen akışının **tamamlanma koşulu** bu adımdır. Validate çalıştırılmadan akış TAMAMLANMIŞ sayılmaz.
|
|
807
|
+
|
|
808
|
+
### Step 6.6: Inter-Screen Checkpoint Gate + Turn Budget (ZORUNLU — v1.8.2+)
|
|
809
|
+
|
|
810
|
+
Kullanıcı birden fazla alternatif istediğinde (N > 1), her alternatif **ayrı bir turn** olmalıdır. Tek turn'de 2+ alternatif yapmak **YASAK** — tool-use limit'e takılır, chat donar.
|
|
811
|
+
|
|
812
|
+
#### Turn Budget Kuralı
|
|
813
|
+
|
|
814
|
+
**Her turn'ün bütçesi:**
|
|
815
|
+
- Maksimum **90 saniye** toplam süre
|
|
816
|
+
- Maksimum **2 başarısız tool call** (timeout/error)
|
|
817
|
+
|
|
818
|
+
Eğer turn içinde:
|
|
819
|
+
- 2 başarısız tool call (timeout/error) olursa, **VEYA**
|
|
820
|
+
- 60+ saniye geçti ve sonuç gelmediyse
|
|
821
|
+
|
|
822
|
+
→ **Turn'ü "FAILED" olarak işaretle.** Orphan cleanup uygula (fmcp-intent-router Tool Failure Recovery Protocol). Kullanıcıya checkpoint sorusunu sor.
|
|
823
|
+
|
|
824
|
+
#### Checkpoint Gate (Her Turn Sonrası)
|
|
825
|
+
|
|
826
|
+
Alternatif N tamamlandığında (başarılı veya fail), kullanıcıya `AskUserQuestion` ile sor:
|
|
827
|
+
|
|
828
|
+
```
|
|
829
|
+
✅/⚠️ Alternatif N/M ({name}) tamamlandı
|
|
830
|
+
Node ID: 173:xxxxx
|
|
831
|
+
Skor: XX/100
|
|
832
|
+
Library instances: X
|
|
833
|
+
Token bindings: Y
|
|
834
|
+
Süre: Xs
|
|
835
|
+
|
|
836
|
+
Ne yapayım?
|
|
837
|
+
[✅ Beğendim, Alternatif N+1'e geç]
|
|
838
|
+
[✏️ Revize et (ne değişsin söyle)]
|
|
839
|
+
[🛑 Dur, bu yeter]
|
|
840
|
+
```
|
|
841
|
+
|
|
842
|
+
**Kullanıcı yanıtı gelmeden bir sonraki alternatife GEÇME.** Turn boundary kuralı budur.
|
|
843
|
+
|
|
844
|
+
#### Yasaklar
|
|
845
|
+
|
|
846
|
+
❌ **YANLIŞ:** Tek turn'de 3 alternatifi de yap, en sonda tek özet
|
|
847
|
+
✅ **DOĞRU:** Her alternatif ayrı turn, her biri sonunda checkpoint
|
|
848
|
+
|
|
849
|
+
❌ **YANLIŞ:** Turn içinde 3+ retry (sonsuz döngü)
|
|
850
|
+
✅ **DOĞRU:** 2 retry max, sonra Turn FAILED + kullanıcıya sor
|
|
851
|
+
|
|
852
|
+
❌ **YANLIŞ:** Alternatif N başarısız, sessizce N+1'e geç
|
|
853
|
+
✅ **DOĞRU:** N başarısız olunca orphan cleanup + rapor + checkpoint
|
|
854
|
+
|
|
501
855
|
### Step 7: Güncelleme Senaryosu
|
|
502
856
|
|
|
503
857
|
Mevcut bir ekranı güncellerken:
|