@atezer/figma-mcp-bridge 1.9.5 → 1.9.7
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 +114 -0
- package/dist/core/blocking-tracker.d.ts +68 -0
- package/dist/core/blocking-tracker.d.ts.map +1 -0
- package/dist/core/blocking-tracker.js +152 -0
- package/dist/core/blocking-tracker.js.map +1 -0
- package/dist/core/bootstrap-injector.d.ts +50 -0
- package/dist/core/bootstrap-injector.d.ts.map +1 -0
- package/dist/core/bootstrap-injector.js +134 -0
- package/dist/core/bootstrap-injector.js.map +1 -0
- package/dist/core/embedded-skills.d.ts +17 -0
- package/dist/core/embedded-skills.d.ts.map +1 -0
- package/dist/core/embedded-skills.js +817 -0
- package/dist/core/embedded-skills.js.map +1 -0
- package/dist/core/plugin-bridge-connector.d.ts +10 -0
- package/dist/core/plugin-bridge-connector.d.ts.map +1 -1
- package/dist/core/plugin-bridge-connector.js +7 -0
- package/dist/core/plugin-bridge-connector.js.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 +98 -3
- package/dist/local-plugin-only.js.map +1 -1
- package/f-mcp-plugin/code.js +307 -2
- package/f-mcp-plugin/ui.html +19 -1
- package/package.json +3 -2
- package/skills/fmcp-intent-router/SKILL.md +56 -9
- package/skills/fmcp-screen-orchestrator/SKILL.md +26 -0
package/CHANGELOG.md
CHANGED
|
@@ -12,6 +12,120 @@ Bu dosya [Keep a Changelog](https://keepachangelog.com/tr/1.1.0/) biçimine uygu
|
|
|
12
12
|
|
|
13
13
|
Bu changelog'a ekleme öncesi sürümlerin tam ayrıntıları için `git log` kullanılabilir.
|
|
14
14
|
|
|
15
|
+
## [1.9.7] - 2026-04-17
|
|
16
|
+
|
|
17
|
+
### Zero-Click Enforcement — Blank File DS Gate + Mini DS + BLOCKING Suppression Prevention + Response Bootstrap
|
|
18
|
+
|
|
19
|
+
**Hedef:** Kullanıcı Claude Desktop'ta hiç setup yapmadan (Project Knowledge boş, başlangıç prompt'u kopyalamadan) sadece "figma linki + ödeme ekranı tasarla" diyince tüm agent + skill chain'in otomatik devreye girmesi. Başarı oranı: Claude Desktop %90-95, Claude Code %98-99.
|
|
20
|
+
|
|
21
|
+
**Motivasyon:** Gerçek test raporunda (boş Figma dosyası `KsERiwGveHKi0nTNh6oLIZ`, 17 Nisan) Claude:
|
|
22
|
+
- İlk soru olarak DS değil stil sordu (yanlış sıra)
|
|
23
|
+
- 0 component/0 variable tespit edince "sıfırdan çizeceğim" deyip ham createFrame + hardcoded değerlerle ekran kurdu
|
|
24
|
+
- FMCP linter BLOCKING döndürünce "dosyada DS yok, geçerli değil" deyip **bastırdı**. v1.9.6 flag'leri dil seviyesinde skip edildi.
|
|
25
|
+
|
|
26
|
+
**7 katmanlı çözüm:**
|
|
27
|
+
|
|
28
|
+
**Katman 1 — Skill: Blank File Detection (fmcp-intent-router Adım 0 genişletme)**
|
|
29
|
+
DS GATE artık dosya boşsa 4 seçenekli dialog sunuyor: (a) team library import, (b) mini DS auto-create, (c) template kopyala, (d) linter-off mode.
|
|
30
|
+
|
|
31
|
+
**Katman 2 — Yeni tool `figma_create_mini_ds`**
|
|
32
|
+
Tek tool çağrısı ile minimal DS: 12 color variable + 8 sizing variable + 3 text style + Button/Input/Card component. 2-phase batched (variables önce, components sonra). 45s timeout.
|
|
33
|
+
|
|
34
|
+
**Katman 3 — Server BLOCKING Suppression Prevention (src/core/blocking-tracker.ts YENİ)**
|
|
35
|
+
Session-level state tracker. figma_execute sonrası BLOCKING flag'li nodeId'leri kaydet. Sonraki execute aynı nodeId'ye mutation yaparsa server **HARD_ERROR** döndürür. Override için kod başına `// FORCE_OVERRIDE` comment gerekli. 5dk TTL. Dil seviyesinde skip imkansız.
|
|
36
|
+
|
|
37
|
+
**Katman 4 — Skill Anti-Suppression (fmcp-screen-orchestrator)**
|
|
38
|
+
Yasaklı dil kalıpları: "bu projede geçerli değil", "şimdilik skip edelim", "yine de devam". Claude pattern match ile kendi cevabını denetler.
|
|
39
|
+
|
|
40
|
+
**Katman 5 — Response Bootstrap (src/core/bootstrap-injector.ts YENİ)**
|
|
41
|
+
`figma_get_status` ilk call'da response'a `_bootstrap.critical_rules` (8 direktif) + `_bootstrap.anti_patterns` + `_nextStep` hints inject edilir. Claude her tool response'undan kuralları hatırlatılmış olarak alır.
|
|
42
|
+
|
|
43
|
+
**Katman 6 — Embedded Skills (src/core/embedded-skills.ts YENİ, auto-generated)**
|
|
44
|
+
Build-time script (`scripts/generate-embedded-skills.mjs`) 5 kritik skill'i (intent-router, orchestrator, canvas-ops, screen-recipes, project-rules) minify edip `EMBEDDED_SKILLS_SUMMARY` constant'ı üretir (~9K token). `figma_get_status` bootstrap'a gömülür. Kullanıcı Project Knowledge upload yapmasa bile Claude skill'i bilir. `prepublishOnly` hook'una eklendi.
|
|
45
|
+
|
|
46
|
+
**Katman 7 (NOT IMPLEMENTED IN 1.9.7) — MCP Resources/Prompts capability** v1.9.8'e bırakıldı (platform bağımlılığı çok yüksek).
|
|
47
|
+
|
|
48
|
+
**Version sync fix:** `src/core/version.ts` HARDCODED "1.9.2" → "1.9.7" (package.json ile senkron).
|
|
49
|
+
|
|
50
|
+
**Skill güncellemeleri:**
|
|
51
|
+
- `skills/fmcp-intent-router/SKILL.md` Adım 0 genişletildi (Blank File sub-check + 4-option dialog)
|
|
52
|
+
- `skills/fmcp-screen-orchestrator/SKILL.md` Anti-Suppression Kuralı eklendi (server HARD_ERROR referansı)
|
|
53
|
+
|
|
54
|
+
**Doc güncellemeleri:**
|
|
55
|
+
- `install/claude-desktop/HOW-TO-ENFORCE.md` Zero-Click Workflow bölümü eklendi + sürüm matrisi güncellendi
|
|
56
|
+
- Version bump: `package.json`, `f-mcp-plugin/code.js`, `f-mcp-plugin/ui.html` → 1.9.7
|
|
57
|
+
- `package.json` prepublishOnly hook'a `generate:embedded-skills` eklendi
|
|
58
|
+
|
|
59
|
+
**Plugin tarafı (f-mcp-plugin):**
|
|
60
|
+
- `code.js` CREATE_MINI_DS handler (214 satır) — Phase 1 (variables + text styles) + Phase 2 (Button/Input/Card components)
|
|
61
|
+
- `ui.html` `window.createMiniDs` dispatcher + method router (`createMiniDs` → CREATE_MINI_DS)
|
|
62
|
+
- `ui.html` `window.captureScreenshot` v1.9.5 params (returnMode/regionStrategy/maxRegions/sliceHeight/requestedSlices) eklendi — önceden eksik olan v1.9.5 bug fix bonus
|
|
63
|
+
|
|
64
|
+
**Regresyon:** Sıfır. Backwards compatible:
|
|
65
|
+
- `figma_get_status` response'una yeni `_bootstrap` field eklendi, eski alanlar korunur
|
|
66
|
+
- `figma_execute` suppression check BLOCKING flag olmadığı durumda skip edilir (temiz kod normal çalışır)
|
|
67
|
+
- Eski `figma_create_mini_ds` çağrısı olmayan kullanıcılar etkilenmez (yeni opsiyonel tool)
|
|
68
|
+
|
|
69
|
+
**Test matrisi:**
|
|
70
|
+
- TypeScript type-check: PASS
|
|
71
|
+
- Build: PASS
|
|
72
|
+
- `generate-embedded-skills.mjs`: 9176 token üretti (plan'da 6K hedefi %53 aşıldı — plugin size threshold 250KB'den uzak, kabul edilebilir)
|
|
73
|
+
- Embedded skills include: fmcp-intent-router (2399), screen-orchestrator (887), canvas-ops (2369), screen-recipes (2092), project-rules (1370)
|
|
74
|
+
|
|
75
|
+
**Kullanıcı için upgrade:**
|
|
76
|
+
```bash
|
|
77
|
+
npm install -g @atezer/figma-mcp-bridge@1.9.7
|
|
78
|
+
bash scripts/cleanup-ports.sh # zombie temizle
|
|
79
|
+
```
|
|
80
|
+
Claude Desktop + Figma plugin yeniden aç. Console'da `[F-MCP v1.9.7]` gör.
|
|
81
|
+
|
|
82
|
+
## [1.9.6] - 2026-04-17
|
|
83
|
+
|
|
84
|
+
### Post-Execute Scan + Negative Intent Detection
|
|
85
|
+
|
|
86
|
+
Gerçek test raporunda (chat `eedf8ec8`, 14:39 Claude Desktop) gözlemlenen iki kritik regression'ı kapatır:
|
|
87
|
+
|
|
88
|
+
1. **"SUI olmayan renkler kullandı, tasarım sistemi dışına çıktı"** — `figma_execute` statik kod analizi unbound fill'i yakalıyor ama sadece kod'da `.fills = [{type:"SOLID"}]` literal yazılınca. Değişkenle gelen unbound fill atlanıyordu. **v1.9.6 runtime post-execute scan** execute sonrası oluşturulan node'ları tarar.
|
|
89
|
+
|
|
90
|
+
2. **"SUI Alt 3'ü atla dediği halde referans aldı"** — Skill'ler user intent parse etmiyordu, özellikle negative instruction'ları ("atla", "bakma", "dışında"). **v1.9.6 Negative Intent Detection** intent-router'da tanımlı pattern seti.
|
|
91
|
+
|
|
92
|
+
**Plugin tarafı (f-mcp-plugin/code.js):**
|
|
93
|
+
|
|
94
|
+
- **YENİ `postExecuteScan()` fonksiyonu**: `figma_execute` result'ı `createdNodeIds`, `nodeIds`, `ids`, `frameId`, `rootId` veya `nodeId` içeriyorsa subtree'yi tarar. Subtree başına 500 node limit, 10 violation cap. Kategori: `UNBOUND_FILL`, `UNBOUND_PADDING`, `UNBOUND_RADIUS`, `UNBOUND_ITEMSPACING`, `UNBOUND_TEXTSTYLE`. Instance node'lar fill check'ten muaf (binding main component'ten gelir).
|
|
95
|
+
- **EXECUTE_CODE_RESULT response'a `_postExecuteScan` field**: `{ scanned, rootsScanned, totalChecked, violationCount, violations, passed, hint }`.
|
|
96
|
+
- Plugin version sync: `code.js`, `ui.html` → `1.9.6`.
|
|
97
|
+
|
|
98
|
+
**Server tarafı (src/local-plugin-only.ts):**
|
|
99
|
+
|
|
100
|
+
- `figma_execute` response'u `_postExecuteScan`'i yakalayıp `violationCount > 0` olduğunda response'un üstüne **`_POST_EXECUTE_SCAN_BLOCKING: true`** top-level flag ekler.
|
|
101
|
+
- `_postExecuteViolations` detaylı obje: severity="BLOCKING", action metni, retry_required: true, violation listesi.
|
|
102
|
+
- `figma_execute` tool description v1.9.6 post-scan pattern açıklamasıyla güncellendi (skill'in `return { createdNodeIds: [...] }` yapması için hatırlatma).
|
|
103
|
+
|
|
104
|
+
**Skill güncellemesi (skills/fmcp-intent-router/SKILL.md):**
|
|
105
|
+
|
|
106
|
+
- **v1.9.6 Negative Intent Detection** bölümü — 5 patern: "atla", "bakma", "benzetme", "dışında/hariç", "sıfırdan/baştan".
|
|
107
|
+
- Parse sonucu `exclude_references: [...]` ve `anti_pattern_refs: [...]` state field'ları.
|
|
108
|
+
- Kullanıcı "X atla" dediyse Claude X'e referans vermez, screenshot almaz. Explicit anti-pattern.
|
|
109
|
+
- `last-intent.md` persist — aynı oturum boyunca geçerli.
|
|
110
|
+
|
|
111
|
+
**Kullanıcı için ne değişir:**
|
|
112
|
+
|
|
113
|
+
1. **Runtime enforcement**: `figma_execute` ile kod çalışırsa ve oluşan node'larda unbound fill/padding/radius/text-style varsa response üstünde `_POST_EXECUTE_SCAN_BLOCKING: true` görürsün — Claude retry yapmak zorunda. Statik kod analizi eksik kalan runtime bugs artık yakalanır.
|
|
114
|
+
2. **Intent parsing**: "SUI Alt 3 atla" gibi negative instruction Claude tarafından doğru parse edilir, referans alınmaz.
|
|
115
|
+
3. Plugin reload gerekir: yeni `postExecuteScan` handler v1.9.6 plugin'de.
|
|
116
|
+
|
|
117
|
+
**Regresyon:** Sıfır. Backwards compatible:
|
|
118
|
+
- Eski kod `createdNodeIds` döndürmüyorsa post-scan skip edilir (null return) — eski davranış korunur.
|
|
119
|
+
- `_POST_EXECUTE_SCAN_BLOCKING` flag sadece violation varsa eklenir; temiz kodlarda response aynen v1.9.5.
|
|
120
|
+
- Negative intent parser skill direktifi; opt-in.
|
|
121
|
+
|
|
122
|
+
**Test matrisi:**
|
|
123
|
+
|
|
124
|
+
- TypeScript type-check: PASS
|
|
125
|
+
- Build: PASS
|
|
126
|
+
- postExecuteScan() subtree walk: stack-safe 500 node cap
|
|
127
|
+
- Server injection priority: postScanBlocking → budgetBlocking → dsViolations → result
|
|
128
|
+
|
|
15
129
|
## [1.9.5] - 2026-04-17
|
|
16
130
|
|
|
17
131
|
### Chat Context Korumaları — Screenshot Method Selection + Discovery Budget
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.9.7: BLOCKING Suppression Prevention — session-level state.
|
|
3
|
+
*
|
|
4
|
+
* Plan'daki Katman 3 implementasyonu. Amaç: Claude BLOCKING flag'i gördükten
|
|
5
|
+
* sonra aynı nodeId üzerinde ikinci bir mutation execute'ı denerse, server
|
|
6
|
+
* tarafında HARD_ERROR dönerek rasyonalize ederek skip'i engelle.
|
|
7
|
+
*
|
|
8
|
+
* Tespit mekanizması:
|
|
9
|
+
* - Her figma_execute sonrasında _designSystemViolations veya _postExecuteScan
|
|
10
|
+
* döndüyse, response'dan nodeId'leri ayıkla ve `recordBlocking()` çağır.
|
|
11
|
+
* - Sonraki figma_execute öncesi `checkSuppression(code)` çağırılır.
|
|
12
|
+
* - Kod aynı nodeId'yi içeriyorsa ve explicit `// FORCE_OVERRIDE` comment yoksa
|
|
13
|
+
* error döndürülür — tool fail olur, Claude skip edemez.
|
|
14
|
+
*
|
|
15
|
+
* Override escape hatch:
|
|
16
|
+
* - Kod başına `// FORCE_OVERRIDE` comment (`/^\s*\/\/\s*FORCE_OVERRIDE\b/m`)
|
|
17
|
+
* eklendiğinde suppression check bypass edilir. Kullanıcı explicit onay ile
|
|
18
|
+
* override edebilir, Claude sessizce atlayamaz.
|
|
19
|
+
*
|
|
20
|
+
* TTL: 5 dakika. Aynı oturumda yeni intent geldiğinde BLOCKING state zamanla
|
|
21
|
+
* temizlenir (false positive engellenir).
|
|
22
|
+
*/
|
|
23
|
+
export type SuppressionCheckResult = {
|
|
24
|
+
/** If set, tool should return error (Claude suppression attempt detected) */
|
|
25
|
+
error?: string;
|
|
26
|
+
/** Convenience flag — true when explicit override comment found */
|
|
27
|
+
forceOverride?: boolean;
|
|
28
|
+
/** Node IDs in code that matched tracked blocking state */
|
|
29
|
+
matchedNodeIds?: string[];
|
|
30
|
+
};
|
|
31
|
+
export declare class BlockingTracker {
|
|
32
|
+
private lastBlockingTimestamp;
|
|
33
|
+
private lastBlockingNodeIds;
|
|
34
|
+
private lastBlockingCategories;
|
|
35
|
+
/**
|
|
36
|
+
* Record a BLOCKING event from a figma_execute response.
|
|
37
|
+
* Call this after figma_execute if _designSystemViolations or _postExecuteScan had violations.
|
|
38
|
+
*/
|
|
39
|
+
recordBlocking(nodeIds: string[], categories?: string[]): void;
|
|
40
|
+
/**
|
|
41
|
+
* Check if an incoming figma_execute code is attempting to suppress a prior BLOCKING.
|
|
42
|
+
* Returns error if suppression detected, empty object if clean.
|
|
43
|
+
*/
|
|
44
|
+
checkSuppression(executeCode: string): SuppressionCheckResult;
|
|
45
|
+
/**
|
|
46
|
+
* Manual reset (e.g. new intent, explicit clear).
|
|
47
|
+
*/
|
|
48
|
+
reset(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Introspection (for _nextStep hint generation, debugging).
|
|
51
|
+
*/
|
|
52
|
+
getState(): {
|
|
53
|
+
nodeCount: number;
|
|
54
|
+
categories: string[];
|
|
55
|
+
timestamp: number;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Extract nodeIds from figma_execute response (for recordBlocking).
|
|
60
|
+
* Checks _postExecuteScan.violations and _designSystemViolations.
|
|
61
|
+
*/
|
|
62
|
+
export declare function extractBlockingNodeIds(response: unknown): {
|
|
63
|
+
nodeIds: string[];
|
|
64
|
+
categories: string[];
|
|
65
|
+
};
|
|
66
|
+
/** Singleton for server process lifetime */
|
|
67
|
+
export declare const blockingTracker: BlockingTracker;
|
|
68
|
+
//# sourceMappingURL=blocking-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocking-tracker.d.ts","sourceRoot":"","sources":["../../src/core/blocking-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAQH,MAAM,MAAM,sBAAsB,GAAG;IACpC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,qBAAa,eAAe;IAC3B,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,mBAAmB,CAA0B;IACrD,OAAO,CAAC,sBAAsB,CAAgB;IAE9C;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,IAAI;IAQlE;;;OAGG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB;IAyC7D;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,QAAQ,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAO1E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAsCrG;AAED,4CAA4C;AAC5C,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.9.7: BLOCKING Suppression Prevention — session-level state.
|
|
3
|
+
*
|
|
4
|
+
* Plan'daki Katman 3 implementasyonu. Amaç: Claude BLOCKING flag'i gördükten
|
|
5
|
+
* sonra aynı nodeId üzerinde ikinci bir mutation execute'ı denerse, server
|
|
6
|
+
* tarafında HARD_ERROR dönerek rasyonalize ederek skip'i engelle.
|
|
7
|
+
*
|
|
8
|
+
* Tespit mekanizması:
|
|
9
|
+
* - Her figma_execute sonrasında _designSystemViolations veya _postExecuteScan
|
|
10
|
+
* döndüyse, response'dan nodeId'leri ayıkla ve `recordBlocking()` çağır.
|
|
11
|
+
* - Sonraki figma_execute öncesi `checkSuppression(code)` çağırılır.
|
|
12
|
+
* - Kod aynı nodeId'yi içeriyorsa ve explicit `// FORCE_OVERRIDE` comment yoksa
|
|
13
|
+
* error döndürülür — tool fail olur, Claude skip edemez.
|
|
14
|
+
*
|
|
15
|
+
* Override escape hatch:
|
|
16
|
+
* - Kod başına `// FORCE_OVERRIDE` comment (`/^\s*\/\/\s*FORCE_OVERRIDE\b/m`)
|
|
17
|
+
* eklendiğinde suppression check bypass edilir. Kullanıcı explicit onay ile
|
|
18
|
+
* override edebilir, Claude sessizce atlayamaz.
|
|
19
|
+
*
|
|
20
|
+
* TTL: 5 dakika. Aynı oturumda yeni intent geldiğinde BLOCKING state zamanla
|
|
21
|
+
* temizlenir (false positive engellenir).
|
|
22
|
+
*/
|
|
23
|
+
/** Explicit override regex — multiline, start-of-line // FORCE_OVERRIDE comment */
|
|
24
|
+
const FORCE_OVERRIDE_REGEX = /^\s*\/\/\s*FORCE_OVERRIDE\b/m;
|
|
25
|
+
/** 5 dakika TTL — aynı oturumda state expiration */
|
|
26
|
+
const BLOCKING_TTL_MS = 5 * 60 * 1000;
|
|
27
|
+
export class BlockingTracker {
|
|
28
|
+
constructor() {
|
|
29
|
+
this.lastBlockingTimestamp = 0;
|
|
30
|
+
this.lastBlockingNodeIds = new Set();
|
|
31
|
+
this.lastBlockingCategories = [];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Record a BLOCKING event from a figma_execute response.
|
|
35
|
+
* Call this after figma_execute if _designSystemViolations or _postExecuteScan had violations.
|
|
36
|
+
*/
|
|
37
|
+
recordBlocking(nodeIds, categories = []) {
|
|
38
|
+
this.lastBlockingTimestamp = Date.now();
|
|
39
|
+
for (const id of nodeIds) {
|
|
40
|
+
if (id && typeof id === "string")
|
|
41
|
+
this.lastBlockingNodeIds.add(id);
|
|
42
|
+
}
|
|
43
|
+
this.lastBlockingCategories = categories;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if an incoming figma_execute code is attempting to suppress a prior BLOCKING.
|
|
47
|
+
* Returns error if suppression detected, empty object if clean.
|
|
48
|
+
*/
|
|
49
|
+
checkSuppression(executeCode) {
|
|
50
|
+
// TTL expiration
|
|
51
|
+
const timeSince = Date.now() - this.lastBlockingTimestamp;
|
|
52
|
+
if (timeSince > BLOCKING_TTL_MS) {
|
|
53
|
+
this.reset();
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
56
|
+
// No recorded blocking — clean pass
|
|
57
|
+
if (this.lastBlockingNodeIds.size === 0)
|
|
58
|
+
return {};
|
|
59
|
+
// Explicit override — user/Claude asked to force
|
|
60
|
+
if (FORCE_OVERRIDE_REGEX.test(executeCode)) {
|
|
61
|
+
return { forceOverride: true };
|
|
62
|
+
}
|
|
63
|
+
// Scan code for tracked nodeIds
|
|
64
|
+
const matched = [];
|
|
65
|
+
for (const id of this.lastBlockingNodeIds) {
|
|
66
|
+
if (executeCode.includes(id))
|
|
67
|
+
matched.push(id);
|
|
68
|
+
}
|
|
69
|
+
if (matched.length === 0)
|
|
70
|
+
return {};
|
|
71
|
+
const preview = matched.slice(0, 3).join(", ");
|
|
72
|
+
const categoryHint = this.lastBlockingCategories.length > 0
|
|
73
|
+
? ` Onceki BLOCKING kategorileri: ${this.lastBlockingCategories.slice(0, 3).join(", ")}.`
|
|
74
|
+
: "";
|
|
75
|
+
return {
|
|
76
|
+
matchedNodeIds: matched,
|
|
77
|
+
error: `❌ BLOCKING_SUPPRESSION_DETECTED: Node${matched.length > 1 ? "'lar" : ""} ${preview} icin son figma_execute'ta BLOCKING flag donmustu.${categoryHint} ` +
|
|
78
|
+
`Ayni nodeId'ye yeni mutation denendi — rasyonalize ederek skip ediyor olabilirsin. ` +
|
|
79
|
+
`Kok nedeni cozmeden devam edilemez:\n` +
|
|
80
|
+
` 1. BLOCKING sebebini duzelt (unbound fill/padding/radius/textStyle bind et).\n` +
|
|
81
|
+
` 2. Eger gercekten bypass gerekli ise kullaniciya acikca sor: "BLOCKING'i override etmek istiyor musun?"\n` +
|
|
82
|
+
` 3. Kullanici onayi ile kod basina "// FORCE_OVERRIDE" comment ekleyerek tekrar calistir.`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Manual reset (e.g. new intent, explicit clear).
|
|
87
|
+
*/
|
|
88
|
+
reset() {
|
|
89
|
+
this.lastBlockingNodeIds.clear();
|
|
90
|
+
this.lastBlockingCategories = [];
|
|
91
|
+
this.lastBlockingTimestamp = 0;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Introspection (for _nextStep hint generation, debugging).
|
|
95
|
+
*/
|
|
96
|
+
getState() {
|
|
97
|
+
return {
|
|
98
|
+
nodeCount: this.lastBlockingNodeIds.size,
|
|
99
|
+
categories: [...this.lastBlockingCategories],
|
|
100
|
+
timestamp: this.lastBlockingTimestamp,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Extract nodeIds from figma_execute response (for recordBlocking).
|
|
106
|
+
* Checks _postExecuteScan.violations and _designSystemViolations.
|
|
107
|
+
*/
|
|
108
|
+
export function extractBlockingNodeIds(response) {
|
|
109
|
+
const nodeIds = [];
|
|
110
|
+
const categories = [];
|
|
111
|
+
if (!response || typeof response !== "object")
|
|
112
|
+
return { nodeIds, categories };
|
|
113
|
+
const r = response;
|
|
114
|
+
// v1.9.6 _postExecuteScan.violations
|
|
115
|
+
const scan = r._postExecuteScan;
|
|
116
|
+
if (scan?.violations) {
|
|
117
|
+
for (const v of scan.violations) {
|
|
118
|
+
if (v.nodeId)
|
|
119
|
+
nodeIds.push(v.nodeId);
|
|
120
|
+
if (v.category)
|
|
121
|
+
categories.push(v.category);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Also _postExecuteViolations (server-side wrapper, v1.9.6)
|
|
125
|
+
const postViol = r._postExecuteViolations;
|
|
126
|
+
if (postViol?.violations) {
|
|
127
|
+
for (const v of postViol.violations) {
|
|
128
|
+
if (v.nodeId)
|
|
129
|
+
nodeIds.push(v.nodeId);
|
|
130
|
+
if (v.category)
|
|
131
|
+
categories.push(v.category);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// v1.8.1 _designSystemViolations (static code analysis; node IDs usually embedded in messages)
|
|
135
|
+
const dsViol = r._designSystemViolations;
|
|
136
|
+
if (dsViol?.violations) {
|
|
137
|
+
for (const v of dsViol.violations) {
|
|
138
|
+
if (v.category)
|
|
139
|
+
categories.push(v.category);
|
|
140
|
+
// Regex: extract node IDs like "241:11896" from message text
|
|
141
|
+
if (v.message) {
|
|
142
|
+
const matches = v.message.match(/\d+:\d+/g);
|
|
143
|
+
if (matches)
|
|
144
|
+
nodeIds.push(...matches);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { nodeIds: Array.from(new Set(nodeIds)), categories: Array.from(new Set(categories)) };
|
|
149
|
+
}
|
|
150
|
+
/** Singleton for server process lifetime */
|
|
151
|
+
export const blockingTracker = new BlockingTracker();
|
|
152
|
+
//# sourceMappingURL=blocking-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocking-tracker.js","sourceRoot":"","sources":["../../src/core/blocking-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.9.7: Bootstrap Injector — response-level zero-click enforcement.
|
|
3
|
+
*
|
|
4
|
+
* Plan'daki Katman 5 implementasyonu.
|
|
5
|
+
*
|
|
6
|
+
* Amaç: Claude Desktop'ta kullanıcı hiç setup yapmadan ("figma linki + ödeme
|
|
7
|
+
* ekranı tasarla" gibi genel prompt ile) tüm agent/skill chain'in otomatik
|
|
8
|
+
* devreye girmesi için plugin MCP response'larında gömülü directive göndermek.
|
|
9
|
+
*
|
|
10
|
+
* Strateji:
|
|
11
|
+
* - İlk `figma_get_status` çağrısında FULL bootstrap (critical_rules + embedded
|
|
12
|
+
* skills) ~6K token gönderilir. Claude okur, oturum boyunca bellekte tutar.
|
|
13
|
+
* - Sonraki çağrılarda sadece kısa reminder (~100 token).
|
|
14
|
+
* - Her tool response'a `_nextStep` hint eklenir — Claude'u bir sonraki doğru
|
|
15
|
+
* adıma yönlendirir.
|
|
16
|
+
*/
|
|
17
|
+
export type BootstrapPayload = {
|
|
18
|
+
version: string;
|
|
19
|
+
self_instruction: string;
|
|
20
|
+
critical_rules?: string[];
|
|
21
|
+
anti_patterns?: string[];
|
|
22
|
+
embedded_skills?: string;
|
|
23
|
+
embedded_instructions_token_estimate?: number;
|
|
24
|
+
skill_cache_hint?: string;
|
|
25
|
+
reference_docs?: string;
|
|
26
|
+
reminder?: string;
|
|
27
|
+
session_tool_count?: number;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Bootstrap injector — session-level state.
|
|
31
|
+
*/
|
|
32
|
+
export declare class BootstrapInjector {
|
|
33
|
+
private firstCallMade;
|
|
34
|
+
private toolCallCount;
|
|
35
|
+
/**
|
|
36
|
+
* Get bootstrap payload for a figma_get_status call.
|
|
37
|
+
* First call: full directives + embedded skills.
|
|
38
|
+
* Subsequent: short reminder.
|
|
39
|
+
*/
|
|
40
|
+
getBootstrap(): BootstrapPayload;
|
|
41
|
+
/**
|
|
42
|
+
* Generate _nextStep hint for a given tool + result.
|
|
43
|
+
* Claude-facing string directing the next logical action.
|
|
44
|
+
*/
|
|
45
|
+
injectNextStep(toolName: string, result: unknown): string | undefined;
|
|
46
|
+
reset(): void;
|
|
47
|
+
}
|
|
48
|
+
/** Singleton for server process lifetime */
|
|
49
|
+
export declare const bootstrapInjector: BootstrapInjector;
|
|
50
|
+
//# sourceMappingURL=bootstrap-injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-injector.d.ts","sourceRoot":"","sources":["../../src/core/bootstrap-injector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAwBH,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oCAAoC,CAAC,EAAE,MAAM,CAAC;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAK;IAE1B;;;;OAIG;IACH,YAAY,IAAI,gBAAgB;IA2BhC;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS;IAoDrE,KAAK,IAAI,IAAI;CAIb;AAED,4CAA4C;AAC5C,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1.9.7: Bootstrap Injector — response-level zero-click enforcement.
|
|
3
|
+
*
|
|
4
|
+
* Plan'daki Katman 5 implementasyonu.
|
|
5
|
+
*
|
|
6
|
+
* Amaç: Claude Desktop'ta kullanıcı hiç setup yapmadan ("figma linki + ödeme
|
|
7
|
+
* ekranı tasarla" gibi genel prompt ile) tüm agent/skill chain'in otomatik
|
|
8
|
+
* devreye girmesi için plugin MCP response'larında gömülü directive göndermek.
|
|
9
|
+
*
|
|
10
|
+
* Strateji:
|
|
11
|
+
* - İlk `figma_get_status` çağrısında FULL bootstrap (critical_rules + embedded
|
|
12
|
+
* skills) ~6K token gönderilir. Claude okur, oturum boyunca bellekte tutar.
|
|
13
|
+
* - Sonraki çağrılarda sadece kısa reminder (~100 token).
|
|
14
|
+
* - Her tool response'a `_nextStep` hint eklenir — Claude'u bir sonraki doğru
|
|
15
|
+
* adıma yönlendirir.
|
|
16
|
+
*/
|
|
17
|
+
import { EMBEDDED_SKILLS_SUMMARY, EMBEDDED_SKILLS_TOKEN_ESTIMATE } from "./embedded-skills.js";
|
|
18
|
+
/** Critical rules (Katman 5 — 8 direktif) */
|
|
19
|
+
const CRITICAL_RULES = [
|
|
20
|
+
"1. FIRST: figma_get_design_system_summary cagir, DS state kontrol et",
|
|
21
|
+
"2. BLANK FILE: 0 component/0 variable tespit edilirse 4 secenek sun: (a) team library import, (b) figma_create_mini_ds, (c) template kopyala, (d) linter-off — secim yapilmadan createFrame YASAK",
|
|
22
|
+
"3. POST-EXECUTE: Her figma_execute sonrasi _POST_EXECUTE_SCAN_BLOCKING flag'i kontrol, varsa kodu duzelt ve retry — 'dosyada DS yok, gecerli degil' diye SKIP ETME",
|
|
23
|
+
"4. SCREENSHOT: returnMode 'file'/'summary'/'regions' kullan, 'base64' sadece kullanici explicit isterse",
|
|
24
|
+
"5. DISCOVERY: maks 12 figma_get_* cagrisi sonra plan sun",
|
|
25
|
+
"6. SCAN: Ekran tamamlandiginda figma_scan_ds_compliance(threshold=85) ZORUNLU, skor <85 ise duzelt",
|
|
26
|
+
"7. NEGATIVE INTENT: Kullanici 'X atla', 'X'e bakma', 'X disinda' dediyse exclude_references state'e yaz",
|
|
27
|
+
"8. SUPPRESSION: BLOCKING flag'i 'bu projede gecerli degil', 'simdilik skip' gibi rasyonellestirme YASAK — kok nedeni duzelt. Aksi halde server HARD_ERROR doner.",
|
|
28
|
+
];
|
|
29
|
+
const ANTI_PATTERNS = [
|
|
30
|
+
"Ham createFrame + hardcoded fill/padding/fontSize — DS'siz uretim denemesi",
|
|
31
|
+
"BLOCKING flag'i 'bu projede yok' diye skip etme",
|
|
32
|
+
"base64 screenshot default kullanma (~30K token context)",
|
|
33
|
+
"Discovery 12+ call (plan sunmadan)",
|
|
34
|
+
"ask_user_input_v0 3+ soru ust uste",
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* Bootstrap injector — session-level state.
|
|
38
|
+
*/
|
|
39
|
+
export class BootstrapInjector {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.firstCallMade = false;
|
|
42
|
+
this.toolCallCount = 0;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get bootstrap payload for a figma_get_status call.
|
|
46
|
+
* First call: full directives + embedded skills.
|
|
47
|
+
* Subsequent: short reminder.
|
|
48
|
+
*/
|
|
49
|
+
getBootstrap() {
|
|
50
|
+
this.toolCallCount++;
|
|
51
|
+
if (!this.firstCallMade) {
|
|
52
|
+
this.firstCallMade = true;
|
|
53
|
+
return {
|
|
54
|
+
version: "1.9.7",
|
|
55
|
+
self_instruction: "Bu directives'i bir kere oku ve oturum boyunca uygula. Kullanici explicit aksini soylemedikce sapma.",
|
|
56
|
+
critical_rules: CRITICAL_RULES,
|
|
57
|
+
anti_patterns: ANTI_PATTERNS,
|
|
58
|
+
embedded_skills: EMBEDDED_SKILLS_SUMMARY,
|
|
59
|
+
embedded_instructions_token_estimate: EMBEDDED_SKILLS_TOKEN_ESTIMATE,
|
|
60
|
+
skill_cache_hint: "Bu embedded_skills oturum boyunca etkili. Sadece ilk figma_get_status'ta gelir, sonraki call'larda _bootstrap.reminder doner (~100 token). LLM prompt cache ile 5 dk icinde yeniden enjeksiyon bedavadir.",
|
|
61
|
+
reference_docs: "MCP resources: fmcp://skills/master-instructions, fmcp://skills/blank-file-workflow. MCP prompts: fmcp-start-session, fmcp-design-screen, fmcp-audit-screen.",
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
version: "1.9.7",
|
|
66
|
+
self_instruction: CRITICAL_RULES.slice(0, 3).join(" | "),
|
|
67
|
+
reminder: "Rules from first figma_get_status call still in effect. See critical_rules in initial _bootstrap response.",
|
|
68
|
+
session_tool_count: this.toolCallCount,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generate _nextStep hint for a given tool + result.
|
|
73
|
+
* Claude-facing string directing the next logical action.
|
|
74
|
+
*/
|
|
75
|
+
injectNextStep(toolName, result) {
|
|
76
|
+
if (!result || typeof result !== "object")
|
|
77
|
+
return undefined;
|
|
78
|
+
const r = result;
|
|
79
|
+
switch (toolName) {
|
|
80
|
+
case "figma_get_status": {
|
|
81
|
+
if (r.pluginConnected)
|
|
82
|
+
return "verify_ds_state_with_figma_get_design_system_summary";
|
|
83
|
+
return "plugin_not_connected_ask_user_to_open_figma_plugin";
|
|
84
|
+
}
|
|
85
|
+
case "figma_get_design_system_summary": {
|
|
86
|
+
const comps = r.components ?? 0;
|
|
87
|
+
const sets = r.componentSets ?? 0;
|
|
88
|
+
const vars = r.variableCollections?.length ?? 0;
|
|
89
|
+
if (comps === 0 && sets === 0 && vars === 0) {
|
|
90
|
+
return "BLANK_FILE_DIALOG_REQUIRED: 4 secenek sun (a) library import (b) figma_create_mini_ds (c) template (d) linter-off — secim yapmadan createFrame YASAK";
|
|
91
|
+
}
|
|
92
|
+
return "load_components_and_variables_via_team_library_api";
|
|
93
|
+
}
|
|
94
|
+
case "figma_execute": {
|
|
95
|
+
if (r._POST_EXECUTE_SCAN_BLOCKING || r._DESIGN_SYSTEM_VIOLATIONS_BLOCKING) {
|
|
96
|
+
return "BLOCKING_detected — fix_unbound_nodes_and_retry — DO NOT rationalize or skip";
|
|
97
|
+
}
|
|
98
|
+
if (r._DISCOVERY_BUDGET_EXCEEDED_BLOCKING) {
|
|
99
|
+
return "discovery_budget_exceeded — plan_sun_to_user_and_await_approval";
|
|
100
|
+
}
|
|
101
|
+
return "continue_with_next_section_or_call_figma_scan_ds_compliance_when_done";
|
|
102
|
+
}
|
|
103
|
+
case "figma_scan_ds_compliance":
|
|
104
|
+
case "figma_validate_screen": {
|
|
105
|
+
if (r.passed === false) {
|
|
106
|
+
return "bind_violations_listed_in_samples_then_rescan";
|
|
107
|
+
}
|
|
108
|
+
return "ready_to_report_to_user_with_coverage_summary";
|
|
109
|
+
}
|
|
110
|
+
case "figma_capture_screenshot": {
|
|
111
|
+
const mode = r.mode ?? "unknown";
|
|
112
|
+
if (mode === "base64") {
|
|
113
|
+
return "next_time_prefer_returnMode_file_or_summary_to_save_context";
|
|
114
|
+
}
|
|
115
|
+
return "continue_with_design_or_validation_flow";
|
|
116
|
+
}
|
|
117
|
+
case "figma_create_mini_ds": {
|
|
118
|
+
if (r.success) {
|
|
119
|
+
return "mini_ds_ready — call_figma_execute_to_build_screen_using_new_components_and_variables";
|
|
120
|
+
}
|
|
121
|
+
return "mini_ds_failed — report_error_to_user";
|
|
122
|
+
}
|
|
123
|
+
default:
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
reset() {
|
|
128
|
+
this.firstCallMade = false;
|
|
129
|
+
this.toolCallCount = 0;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Singleton for server process lifetime */
|
|
133
|
+
export const bootstrapInjector = new BootstrapInjector();
|
|
134
|
+
//# sourceMappingURL=bootstrap-injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-injector.js","sourceRoot":"","sources":["../../src/core/bootstrap-injector.ts"],"names":[],"mappings":"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"}
|