/** * 会话启动时把 pi-figma-remote-auth 的 token 同步进 pi-mcp-adapter 存储, * 避免 login 后仍看到 figma「needs auth」。 * * 斜杠:/figma-oauth-sync */ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; import { spawnSync } from "node:child_process"; import { existsSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; const packageRoot = join(dirname(fileURLToPath(import.meta.url)), ".."); function importScriptPath(): string { const fromEnv = process.env.PI_KB_ROOT?.trim(); if (fromEnv) { const p = join(fromEnv, "scripts", "import-figma-mcp-oauth.mjs"); if (existsSync(p)) return p; } return join(packageRoot, "scripts", "import-figma-mcp-oauth.mjs"); } function runImport(): { ok: boolean; output: string } { const script = importScriptPath(); if (!existsSync(script)) { return { ok: false, output: `缺少脚本:${script}` }; } const result = spawnSync(process.execPath, [script, "--server", "figma"], { cwd: process.cwd(), encoding: "utf8", env: process.env, }); const output = [result.stdout, result.stderr].filter(Boolean).join("\n").trim(); return { ok: result.status === 0, output: output || `exit ${result.status}` }; } export default function (pi: ExtensionAPI) { pi.registerCommand("figma-oauth-sync", { description: "将 Figma OAuth token 导入 pi-mcp-adapter(修复 needs auth)", handler: async (_args, ctx) => { const { ok, output } = runImport(); ctx.ui.notify(output || (ok ? "同步完成" : "同步失败"), ok ? "info" : "error"); if (ok) { ctx.ui.notify("若 /mcp 仍显示 needs auth,请执行:/mcp reconnect figma", "info"); } }, }); pi.on("session_start", async (_event, ctx) => { const oauthBase = process.env.MCP_OAUTH_DIR?.trim() || join( process.env.PI_CODING_AGENT_DIR?.trim() || join(process.env.HOME || "", ".pi", "agent"), "mcp-oauth", ); const src = join(oauthBase, "figma", "tokens.json"); if (!existsSync(src)) { return; } const { ok, output } = runImport(); if (!ok) { if (ctx.hasUI) ctx.ui.notify(`Figma OAuth 自动同步失败:\n${output}`, "warning"); else console.warn(`[figma-mcp-oauth-sync] ${output}`); return; } console.log(`[figma-mcp-oauth-sync] ${output}`); }); }