figma-relai 0.2.8 → 0.3.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/README.md +2 -2
- package/dist/{chunk-RDSEEOKP.js → chunk-2MUSDWUC.js} +63 -10
- package/dist/chunk-2MUSDWUC.js.map +1 -0
- package/dist/chunk-SDINVROO.js +66 -0
- package/dist/chunk-SDINVROO.js.map +1 -0
- package/dist/{doctor-ZN2PKAPH.js → doctor-P36IPZHH.js} +20 -1
- package/dist/doctor-P36IPZHH.js.map +1 -0
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/{manifest-HMHQAF6T.js → manifest-DRLMH5YW.js} +5 -3
- package/dist/manifest-DRLMH5YW.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-RDSEEOKP.js.map +0 -1
- package/dist/doctor-ZN2PKAPH.js.map +0 -1
- package/dist/manifest-HMHQAF6T.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/doctor.ts"],"sourcesContent":["import WebSocket from \"ws\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { loadState } from \"../state.js\";\n\n// figma-relai doctor — environment triage in one command. Each check reports\n// ok/warn plus the one-line fix, so \"it doesn't work\" becomes actionable\n// without reading the troubleshooting docs.\n\ninterface CheckResult {\n check: string;\n status: \"ok\" | \"warn\";\n detail: string;\n fix?: string;\n}\n\nconst PORTS = [9055, 9056, 9057];\nconst PROBE_TIMEOUT_MS = 1500;\n\ninterface ProbeResult {\n port: number;\n state: \"relai\" | \"foreign\" | \"closed\";\n version?: string;\n rooms?: Array<{ room: string; hasPlugin: boolean; fileName?: string }>;\n}\n\nfunction probePort(port: number): Promise<ProbeResult> {\n return new Promise((resolve) => {\n const ws = new WebSocket(`ws://127.0.0.1:${port}`);\n let settled = false;\n const done = (result: ProbeResult) => {\n if (!settled) {\n settled = true;\n try {\n ws.close();\n } catch {\n // already closed\n }\n resolve(result);\n }\n };\n const timer = setTimeout(() => done({ port, state: \"foreign\" }), PROBE_TIMEOUT_MS);\n ws.on(\"open\", () => {\n ws.send(JSON.stringify({ type: \"hello\" }));\n ws.send(JSON.stringify({ type: \"list_rooms\", id: \"doctor\" }));\n });\n let version: string | undefined;\n ws.on(\"message\", (raw: Buffer) => {\n try {\n const msg = JSON.parse(raw.toString());\n if (msg.type === \"hello\" && msg.server === \"figma-relai\") {\n version = msg.version;\n }\n if (msg.type === \"list_rooms_result\") {\n clearTimeout(timer);\n done({ port, state: \"relai\", version, rooms: msg.rooms ?? [] });\n }\n } catch {\n // Non-JSON chatter = not our relay\n }\n });\n ws.on(\"error\", () => {\n clearTimeout(timer);\n done({ port, state: \"closed\" });\n });\n });\n}\n\nexport async function runDoctor(): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n const nodeMajor = Number(process.versions.node.split(\".\")[0]);\n results.push(\n nodeMajor >= 18\n ? { check: \"node\", status: \"ok\", detail: `Node ${process.versions.node}` }\n : {\n check: \"node\",\n status: \"warn\",\n detail: `Node ${process.versions.node} is below 18`,\n fix: \"Install Node 18+ (nvm install --lts)\",\n }\n );\n\n const probes = await Promise.all(PORTS.map(probePort));\n const relay = probes.find((p) => p.state === \"relai\");\n const foreign = probes.filter((p) => p.state === \"foreign\");\n if (relay) {\n results.push({\n check: \"relay\",\n status: \"ok\",\n detail: `Relai relay v${relay.version ?? \"?\"} on port ${relay.port}`,\n });\n const pluginRooms = (relay.rooms ?? []).filter((r) => r.hasPlugin);\n results.push(\n pluginRooms.length > 0\n ? {\n check: \"plugin\",\n status: \"ok\",\n detail: `Figma plugin online: ${pluginRooms\n .map((r) => `\"${r.fileName ?? r.room}\"`)\n .join(\", \")}`,\n }\n : {\n check: \"plugin\",\n status: \"warn\",\n detail: \"Relay is up but no Figma plugin is connected\",\n fix: \"Open the Relai plugin inside your Figma file (it auto-connects)\",\n }\n );\n } else {\n results.push({\n check: \"relay\",\n status: \"warn\",\n detail:\n foreign.length > 0\n ? `Ports ${foreign.map((p) => p.port).join(\", \")} are occupied by something that is not a Relai relay`\n : \"No relay on ports 9055–9057 — no MCP server is running\",\n fix:\n foreign.length > 0\n ? \"Free the port (lsof -i :9055) or let Relai fall back to 9056/9057\"\n : \"Start a conversation in your AI client with Relai registered (npx -y figma-relai)\",\n });\n results.push({\n check: \"plugin\",\n status: \"warn\",\n detail: \"Cannot see the plugin without a relay\",\n });\n }\n\n const statePath = join(homedir(), \".figma-relai\", \"state.json\");\n if (existsSync(statePath)) {\n const { room } = loadState();\n results.push({\n check: \"state\",\n status: \"ok\",\n detail: room ? `Saved room: ${room}` : \"State file present (no room saved yet)\",\n });\n } else {\n results.push({\n check: \"state\",\n status: \"ok\",\n detail: \"No state file yet — will be created on first pairing\",\n });\n }\n\n results.push(\n process.env.FIGMA_TOKEN\n ? { check: \"token\", status: \"ok\", detail: \"FIGMA_TOKEN set — comments unlocked\" }\n : {\n check: \"token\",\n status: \"ok\",\n detail: \"FIGMA_TOKEN not set — everything works except comments\",\n fix: \"Optional: add a personal access token to the MCP config env to unlock manage_comments\",\n }\n );\n\n return results;\n}\n\nexport function renderDoctor(results: CheckResult[]): string {\n const lines = [\"figma-relai doctor\", \"\"];\n for (const r of results) {\n lines.push(`${r.status === \"ok\" ? \"✓\" : \"!\"} ${r.check.padEnd(7)} ${r.detail}`);\n if (r.fix) lines.push(` → ${r.fix}`);\n }\n const warns = results.filter((r) => r.status === \"warn\").length;\n lines.push(\"\", warns === 0 ? \"All clear.\" : `${warns} thing(s) to look at.`);\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;AAAA,OAAO,eAAe;AACtB,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,YAAY;AAcrB,IAAM,QAAQ,CAAC,MAAM,MAAM,IAAI;AAC/B,IAAM,mBAAmB;AASzB,SAAS,UAAU,MAAoC;AACrD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,IAAI,UAAU,kBAAkB,IAAI,EAAE;AACjD,QAAI,UAAU;AACd,UAAM,OAAO,CAAC,WAAwB;AACpC,UAAI,CAAC,SAAS;AACZ,kBAAU;AACV,YAAI;AACF,aAAG,MAAM;AAAA,QACX,QAAQ;AAAA,QAER;AACA,gBAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AACA,UAAM,QAAQ,WAAW,MAAM,KAAK,EAAE,MAAM,OAAO,UAAU,CAAC,GAAG,gBAAgB;AACjF,OAAG,GAAG,QAAQ,MAAM;AAClB,SAAG,KAAK,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC,CAAC;AACzC,SAAG,KAAK,KAAK,UAAU,EAAE,MAAM,cAAc,IAAI,SAAS,CAAC,CAAC;AAAA,IAC9D,CAAC;AACD,QAAI;AACJ,OAAG,GAAG,WAAW,CAAC,QAAgB;AAChC,UAAI;AACF,cAAM,MAAM,KAAK,MAAM,IAAI,SAAS,CAAC;AACrC,YAAI,IAAI,SAAS,WAAW,IAAI,WAAW,eAAe;AACxD,oBAAU,IAAI;AAAA,QAChB;AACA,YAAI,IAAI,SAAS,qBAAqB;AACpC,uBAAa,KAAK;AAClB,eAAK,EAAE,MAAM,OAAO,SAAS,SAAS,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC;AAAA,QAChE;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AACD,OAAG,GAAG,SAAS,MAAM;AACnB,mBAAa,KAAK;AAClB,WAAK,EAAE,MAAM,OAAO,SAAS,CAAC;AAAA,IAChC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,YAAoC;AACxD,QAAM,UAAyB,CAAC;AAEhC,QAAM,YAAY,OAAO,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC;AAC5D,UAAQ;AAAA,IACN,aAAa,KACT,EAAE,OAAO,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,SAAS,IAAI,GAAG,IACvE;AAAA,MACE,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,QAAQ,QAAQ,SAAS,IAAI;AAAA,MACrC,KAAK;AAAA,IACP;AAAA,EACN;AAEA,QAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,IAAI,SAAS,CAAC;AACrD,QAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO;AACpD,QAAM,UAAU,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS;AAC1D,MAAI,OAAO;AACT,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,gBAAgB,MAAM,WAAW,GAAG,YAAY,MAAM,IAAI;AAAA,IACpE,CAAC;AACD,UAAM,eAAe,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS;AACjE,YAAQ;AAAA,MACN,YAAY,SAAS,IACjB;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ,wBAAwB,YAC7B,IAAI,CAAC,MAAM,IAAI,EAAE,YAAY,EAAE,IAAI,GAAG,EACtC,KAAK,IAAI,CAAC;AAAA,MACf,IACA;AAAA,QACE,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,KAAK;AAAA,MACP;AAAA,IACN;AAAA,EACF,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QACE,QAAQ,SAAS,IACb,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,yDAC9C;AAAA,MACN,KACE,QAAQ,SAAS,IACb,sEACA;AAAA,IACR,CAAC;AACD,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,KAAK,QAAQ,GAAG,gBAAgB,YAAY;AAC9D,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,EAAE,KAAK,IAAI,UAAU;AAC3B,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,OAAO,eAAe,IAAI,KAAK;AAAA,IACzC,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,UAAQ;AAAA,IACN,QAAQ,IAAI,cACR,EAAE,OAAO,SAAS,QAAQ,MAAM,QAAQ,2CAAsC,IAC9E;AAAA,MACE,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,KAAK;AAAA,IACP;AAAA,EACN;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,SAAgC;AAC3D,QAAM,QAAQ,CAAC,sBAAsB,EAAE;AACvC,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,GAAG,EAAE,WAAW,OAAO,WAAM,GAAG,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE;AAC9E,QAAI,EAAE,IAAK,OAAM,KAAK,oBAAe,EAAE,GAAG,EAAE;AAAA,EAC9C;AACA,QAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AACzD,QAAM,KAAK,IAAI,UAAU,IAAI,eAAe,GAAG,KAAK,uBAAuB;AAC3E,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/manifest.ts"],"sourcesContent":["import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { InMemoryTransport } from \"@modelcontextprotocol/sdk/inMemory.js\";\nimport { FIGMA_COMMANDS, PITFALLS } from \"@figma-relai/shared\";\nimport { createServer } from \"../server.js\";\nimport {\n registerAllTools,\n registerRoomTool,\n registerEventsTool,\n listToolCatalog,\n} from \"../tools/index.js\";\nimport { registerPrompts } from \"../prompts.js\";\n\n// The authoritative, machine-readable contract — in the Astryx sense.\n// Nothing here is hand-written: tools and their JSON schemas come from a real\n// in-process MCP handshake (exactly what agents receive from tools/list),\n// categories from the registration table, commands and pitfalls from their\n// runtime registries. It cannot drift from behavior by construction.\n\nexport interface Manifest {\n name: string;\n version: string;\n tools: Array<{\n name: string;\n category: string;\n description: string;\n inputSchema: unknown;\n }>;\n prompts: Array<{ name: string; description: string }>;\n pluginCommands: readonly string[];\n pitfalls: typeof PITFALLS;\n}\n\nexport async function buildManifest(version: string): Promise<Manifest> {\n const server = createServer();\n registerRoomTool(server, async () => {\n throw new Error(\"manifest introspection — no relay\");\n });\n registerEventsTool(server, () => [], () => []);\n registerPrompts(server);\n registerAllTools(server, async () => {\n throw new Error(\"manifest introspection — no plugin connection\");\n });\n\n const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();\n const client = new Client({ name: \"relai-manifest\", version });\n await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]);\n\n const categories = new Map(listToolCatalog().map((t) => [t.name, t.category]));\n const tools = (await client.listTools()).tools\n .map((t) => ({\n name: t.name,\n category: categories.get(t.name) ?? \"other\",\n description: t.description ?? \"\",\n inputSchema: t.inputSchema,\n }))\n .sort((a, b) => a.category.localeCompare(b.category) || a.name.localeCompare(b.name));\n const prompts = (await client.listPrompts()).prompts.map((p) => ({\n name: p.name,\n description: p.description ?? \"\",\n }));\n\n await client.close();\n await server.close();\n\n return {\n name: \"figma-relai\",\n version,\n tools,\n prompts,\n pluginCommands: FIGMA_COMMANDS,\n pitfalls: PITFALLS,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,yBAAyB;AA+BlC,eAAsB,cAAc,SAAoC;AACtE,QAAM,SAAS,aAAa;AAC5B,mBAAiB,QAAQ,YAAY;AACnC,UAAM,IAAI,MAAM,wCAAmC;AAAA,EACrD,CAAC;AACD,qBAAmB,QAAQ,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAC7C,kBAAgB,MAAM;AACtB,mBAAiB,QAAQ,YAAY;AACnC,UAAM,IAAI,MAAM,oDAA+C;AAAA,EACjE,CAAC;AAED,QAAM,CAAC,iBAAiB,eAAe,IAAI,kBAAkB,iBAAiB;AAC9E,QAAM,SAAS,IAAI,OAAO,EAAE,MAAM,kBAAkB,QAAQ,CAAC;AAC7D,QAAM,QAAQ,IAAI,CAAC,OAAO,QAAQ,eAAe,GAAG,OAAO,QAAQ,eAAe,CAAC,CAAC;AAEpF,QAAM,aAAa,IAAI,IAAI,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7E,QAAM,SAAS,MAAM,OAAO,UAAU,GAAG,MACtC,IAAI,CAAC,OAAO;AAAA,IACX,MAAM,EAAE;AAAA,IACR,UAAU,WAAW,IAAI,EAAE,IAAI,KAAK;AAAA,IACpC,aAAa,EAAE,eAAe;AAAA,IAC9B,aAAa,EAAE;AAAA,EACjB,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,QAAQ,KAAK,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACtF,QAAM,WAAW,MAAM,OAAO,YAAY,GAAG,QAAQ,IAAI,CAAC,OAAO;AAAA,IAC/D,MAAM,EAAE;AAAA,IACR,aAAa,EAAE,eAAe;AAAA,EAChC,EAAE;AAEF,QAAM,OAAO,MAAM;AACnB,QAAM,OAAO,MAAM;AAEnB,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,UAAU;AAAA,EACZ;AACF;","names":[]}
|