@fml-inc/fml 0.1.3 → 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/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/doctor.ts","../src/commands/install.ts","../src/banner.ts","../src/sync/client.ts","../src/commands/uninstall.ts","../src/commands/update.ts","../src/commands/login.ts","../src/auth/oauth.ts","../src/auth/device-flow.ts","../src/commands/logout.ts","../src/commands/org.ts","../src/commands/open.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/sync-token.ts","../src/commands/env.ts","../src/commands/data.ts","../src/commands/query.ts","../src/commands/automation.ts","../src/commands/memory.ts","../src/commands/analysis.ts","../src/commands/integrations.ts","../src/commands/slack.ts","../src/commands/messages.ts","../src/commands/skills.ts","../src/commands/config-snapshots.ts"],"sourcesContent":["#!/usr/bin/env node\n\ndeclare const __FML_PLUGIN_VERSION__: string;\n\nimport { ensureNativeModules } from \"./native-check.js\";\nensureNativeModules();\n\nimport { Command } from \"commander\";\nimport { initSentry, Sentry } from \"./sentry.js\";\n\nimport { handleDoctor } from \"./commands/doctor.js\";\nimport { handleInstall } from \"./commands/install.js\";\nimport { handleUninstall } from \"./commands/uninstall.js\";\nimport { handleUpdate } from \"./commands/update.js\";\nimport { handleLogin } from \"./commands/login.js\";\nimport { handleLogout } from \"./commands/logout.js\";\nimport { handleOrg } from \"./commands/org.js\";\nimport { handleOpen } from \"./commands/open.js\";\nimport { handleStatus } from \"./commands/status.js\";\nimport { handleStart, handleStop } from \"./commands/daemon.js\";\nimport {\n handleSyncAdd,\n handleSyncEdit,\n handleSyncList,\n handleSyncRemove,\n handleSyncReset,\n handleSyncSetup,\n handleSyncStatus,\n} from \"./commands/sync.js\";\nimport { handleSyncToken } from \"./commands/sync-token.js\";\nimport { handleEnvShow, handleEnvSwitch } from \"./commands/env.js\";\nimport {\n handleActivity,\n handleSearch,\n handleSessions,\n handleSpending,\n handleTimeline,\n} from \"./commands/data.js\";\nimport { handleQuery } from \"./commands/query.js\";\nimport {\n handleAutomationList,\n handleAutomationCreate,\n handleAutomationCreatePattern,\n handleAutomationUpdate,\n handleAutomationDelete,\n handleAutomationTest,\n} from \"./commands/automation.js\";\nimport {\n handleMemoryList,\n handleMemoryRead,\n handleMemoryWrite,\n handleMemoryDelete,\n} from \"./commands/memory.js\";\nimport {\n handleSearchAnalysis,\n handleRunAnalysis,\n handleRunTeamAnalysis,\n} from \"./commands/analysis.js\";\nimport {\n handleIntegrations,\n handleEvents,\n handleResolveIdentity,\n} from \"./commands/integrations.js\";\nimport { handleSlackHistory, handleSlackMessage } from \"./commands/slack.js\";\nimport {\n handleMessagesList,\n handleMessagesContext,\n} from \"./commands/messages.js\";\nimport { handleSkillsList, handleSkillsLoad } from \"./commands/skills.js\";\nimport {\n handleConfigList,\n handleConfigDetail,\n} from \"./commands/config-snapshots.js\";\nimport { printBanner } from \"./banner.js\";\n\nawait initSentry();\n\n// Show the logo when running `fml` with no args or `fml --help`\nif (\n process.argv.length <= 2 ||\n process.argv.includes(\"--help\") ||\n process.argv.includes(\"-h\")\n) {\n printBanner();\n}\n\nconst program = new Command()\n .name(\"fml\")\n .description(\"FML agent tools for Claude Code\")\n .version(\n typeof __FML_PLUGIN_VERSION__ !== \"undefined\"\n ? __FML_PLUGIN_VERSION__\n : \"dev\",\n );\n\nprogram\n .command(\"tools\", { hidden: true })\n .description(\"List all available CLI commands (including hidden agent tools)\")\n .action(() => {\n function formatCmd(cmd: typeof program, prefix = \"\") {\n const name = prefix ? `${prefix} ${cmd.name()}` : cmd.name();\n const args = cmd.registeredArguments\n .map((a) => (a.required ? `<${a.name()}>` : `[${a.name()}]`))\n .join(\" \");\n const opts = cmd.options\n .filter(\n (o) => !o.hidden && o.long !== \"--help\" && o.long !== \"--version\",\n )\n .map((o) => (o.mandatory ? o.flags : `[${o.flags}]`))\n .join(\" \");\n const usage = [name, args, opts].filter(Boolean).join(\" \");\n return `${usage}\\n ${cmd.description()}`;\n }\n\n const lines = program.commands\n .filter((c) => c.name() !== \"tools\" && c.name() !== \"help\")\n .flatMap((c) => {\n if (c.commands.length > 0) {\n return c.commands.map((s) => formatCmd(s, c.name()));\n }\n return [formatCmd(c)];\n });\n console.log(lines.join(\"\\n\\n\"));\n });\n\nprogram\n .command(\"install\")\n .description(\"Register plugin, hooks, and daemons\")\n .action(() => handleInstall());\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove fml plugin, hooks, and optionally all data\")\n .option(\n \"--target <target>\",\n \"Target CLI: claude, gemini, codex, claude-desktop, all\",\n )\n .option(\"--purge\", \"Also remove all data, logs, and auth tokens\")\n .action((opts) => handleUninstall(opts));\n\nprogram\n .command(\"update\")\n .description(\"Update fml to the latest version\")\n .action(() => handleUpdate());\n\nprogram\n .command(\"login\")\n .description(\"Sign in to your FML account\")\n .option(\"--device\", \"Use device authorization flow (no browser needed)\")\n .action((opts: { device?: boolean }) => handleLogin(opts));\n\nprogram\n .command(\"logout\")\n .description(\"Sign out and clear stored credentials\")\n .action(() => handleLogout());\n\nprogram\n .command(\"org\")\n .description(\"Show or select organization\")\n .argument(\"[slug]\", \"Org slug to select\")\n .action((slug) => handleOrg(slug));\n\nprogram\n .command(\"status\")\n .description(\"Show current auth and daemon status\")\n .action(() => handleStatus());\n\nprogram\n .command(\"doctor\")\n .description(\"Check FML and panopticon configuration and connectivity\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts) => handleDoctor(opts));\n\nprogram\n .command(\"open\")\n .description(\"Open FML dashboard in browser\")\n .option(\"--json\", \"Output URL as JSON instead of opening browser\")\n .action((opts) => handleOpen(opts));\n\nprogram\n .command(\"env\")\n .description(\"Show or switch environment (dev/prod)\")\n .argument(\"[target]\", 'Environment name (\"dev\", \"prod\") or custom Convex URL')\n .action((target?: string) => {\n if (target) handleEnvSwitch(target);\n else handleEnvShow();\n });\n\nprogram\n .command(\"start\")\n .description(\"Start panopticon server and sync\")\n .action(() => handleStart());\n\nprogram\n .command(\"stop\")\n .description(\"Stop panopticon server and sync\")\n .action(() => handleStop());\n\n// ── Sync subcommand ───────────────────────────────────────────────────────\n\nconst sync = program.command(\"sync\").description(\"Manage sync configuration\");\n\nsync\n .command(\"setup\")\n .description(\"Configure sync targets (convenience shortcut)\")\n .action(() => handleSyncSetup());\n\nsync\n .command(\"list\")\n .description(\"List all sync targets\")\n .action(() => handleSyncList());\n\nsync\n .command(\"add\")\n .description(\"Add a sync target\")\n .argument(\"<name>\", \"Unique target name\")\n .argument(\"<url>\", \"OTLP HTTP endpoint URL\")\n .option(\"--token-cmd <cmd>\", \"Shell command that returns a bearer token\")\n .option(\"--token <token>\", \"Static bearer token\")\n .action(\n (name: string, url: string, opts: { tokenCmd?: string; token?: string }) =>\n handleSyncAdd(name, url, opts),\n );\n\nsync\n .command(\"remove\")\n .description(\"Remove a sync target\")\n .argument(\"<name>\", \"Target name to remove\")\n .action((name: string) => handleSyncRemove(name));\n\nsync\n .command(\"edit\")\n .description(\"Edit a sync target\")\n .argument(\"<name>\", \"Target name to edit\")\n .option(\"--url <url>\", \"New OTLP HTTP endpoint URL\")\n .option(\"--token-cmd <cmd>\", \"New shell command for bearer token\")\n .option(\"--token <token>\", \"New static bearer token\")\n .action(\n (name: string, opts: { url?: string; tokenCmd?: string; token?: string }) =>\n handleSyncEdit(name, opts),\n );\n\nsync\n .command(\"status\")\n .description(\"Show sync config and watermarks\")\n .action(() => handleSyncStatus());\n\nsync\n .command(\"reset\")\n .description(\"Reset sync watermarks\")\n .argument(\"[name]\", \"Target name (resets all if omitted)\")\n .action((name?: string) => handleSyncReset(name));\n\nprogram\n .command(\"sync-token\", { hidden: true })\n .description(\n \"Print a refreshed FML access token (for panopticon tokenCommand)\",\n )\n .option(\n \"--env <name>\",\n \"Read auth for a specific env (defaults to active env)\",\n )\n .action((opts: { env?: string }) => handleSyncToken(opts));\n\n// ── Data commands ───────────────────────────────────────────────────────────\n\nprogram\n .command(\"activity\")\n .description(\"Activity summary — sessions, prompts, tools, costs\")\n .option(\"--since <duration>\", 'Time window, e.g. \"24h\", \"7d\"')\n .action((opts) => handleActivity(opts));\n\nprogram\n .command(\"sessions\")\n .description(\"List recent sessions\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--limit <n>\", \"Max sessions to return\")\n .action((opts) => handleSessions(opts));\n\nprogram\n .command(\"timeline\")\n .description(\"Get events for a session\")\n .argument(\"<session-id>\", \"Session ID\")\n .option(\"--limit <n>\", \"Max events to return\")\n .option(\"--offset <n>\", \"Events to skip\")\n .action((sessionId, opts) => handleTimeline(sessionId, opts));\n\nprogram\n .command(\"spending\")\n .description(\"AI token usage and cost breakdown\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--group-by <key>\", \"Group by: session, model, or day\")\n .action((opts) => handleSpending(opts));\n\nprogram\n .command(\"search\")\n .description(\"Search across all sessions\")\n .argument(\"<query>\", \"Text to search for\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--limit <n>\", \"Max results\")\n .action((query, opts) => handleSearch(query, opts));\n\n// ── Query command (unified integration queries) ────────────────────────────\n\nprogram\n .command(\"query\", { hidden: true })\n .description(\"Query a connected integration\")\n .argument(\n \"<provider>\",\n \"Provider name (sentry, slack, github, linear, notion, freshdesk, stripe, posthog, amplitude, meta-ads)\",\n )\n .argument(\"<endpoint>\", \"API endpoint or subcommand\")\n .option(\"--method <method>\", \"HTTP method\", \"GET\")\n .option(\"--body <json>\", \"Request body as JSON string\")\n .option(\"--project-id <id>\", \"Project ID override\")\n .action((provider, endpoint, opts) => handleQuery(provider, endpoint, opts));\n\n// ── Automation subcommand ──────────────────────────────────────────────────\n\nconst automation = program\n .command(\"automation\", { hidden: true })\n .description(\"Manage automations\");\n\nautomation\n .command(\"list\")\n .description(\"List all automations\")\n .action(() => handleAutomationList());\n\nautomation\n .command(\"create-scheduled\")\n .description(\"Create a scheduled automation\")\n .requiredOption(\"--name <name>\", \"Automation name\")\n .requiredOption(\"--prompt <prompt>\", \"What to run\")\n .requiredOption(\"--frequency <freq>\", \"hourly, daily, weekly, or monthly\")\n .requiredOption(\"--hour <hour>\", \"Hour (0-23)\")\n .requiredOption(\"--minute <minute>\", \"Minute (0-59)\")\n .requiredOption(\"--timezone <tz>\", \"IANA timezone, e.g. America/Chicago\")\n .option(\"--day-of-week <day>\", \"Day of week (0=Sun..6=Sat) for weekly\")\n .option(\"--day-of-month <day>\", \"Day of month (1-31) for monthly\")\n .option(\"--max-runs <n>\", \"Max runs (1 for one-time)\")\n .action((opts) => handleAutomationCreate(opts));\n\nautomation\n .command(\"create-pattern\")\n .description(\"Create an event-triggered automation\")\n .requiredOption(\"--name <name>\", \"Automation name\")\n .requiredOption(\"--prompt <prompt>\", \"What to watch for and do\")\n .action((opts) => handleAutomationCreatePattern(opts));\n\nautomation\n .command(\"update\")\n .description(\"Update an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .option(\"--name <name>\", \"New name\")\n .option(\"--prompt <prompt>\", \"New prompt\")\n .option(\"--enabled <bool>\", \"Enable or disable (true/false)\")\n .option(\"--frequency <freq>\", \"New frequency\")\n .option(\"--hour <hour>\", \"New hour\")\n .option(\"--minute <minute>\", \"New minute\")\n .option(\"--timezone <tz>\", \"New timezone\")\n .option(\"--day-of-week <day>\", \"New day of week\")\n .option(\"--day-of-month <day>\", \"New day of month\")\n .action((id, opts) => handleAutomationUpdate(id, opts));\n\nautomation\n .command(\"delete\")\n .description(\"Delete an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .action((id) => handleAutomationDelete(id));\n\nautomation\n .command(\"test\")\n .description(\"Preview/test an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .action((id) => handleAutomationTest(id));\n\n// ── Memory subcommand ──────────────────────────────────────────────────────\n\nconst memory = program\n .command(\"memory\", { hidden: true })\n .description(\"Manage memory files\");\n\nmemory\n .command(\"list\")\n .description(\"List memory files\")\n .option(\"--scope <scope>\", \"Scope: project, org, or user\")\n .action((opts) => handleMemoryList(opts));\n\nmemory\n .command(\"read\")\n .description(\"Read a memory file\")\n .argument(\"<file-id>\", \"Memory file ID\")\n .action((fileId) => handleMemoryRead(fileId));\n\nmemory\n .command(\"write\")\n .description(\"Create or update a memory file\")\n .requiredOption(\"--title <title>\", \"File title\")\n .requiredOption(\"--content <content>\", \"File content\")\n .option(\"--scope <scope>\", \"Scope: project, org, or user\")\n .action((opts) => handleMemoryWrite(opts));\n\nmemory\n .command(\"delete\")\n .description(\"Delete a memory file\")\n .argument(\"<file-id>\", \"Memory file ID\")\n .action((fileId) => handleMemoryDelete(fileId));\n\n// ── Analysis commands ──────────────────────────────────────────────────────\n\nprogram\n .command(\"search-analysis\", { hidden: true })\n .description(\"Search codebase analysis results across one or all repos\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--status <status>\", \"Filter by status (complete, running, failed)\")\n .option(\"--prompt-key <key>\", \"Exact analysis type to filter by\")\n .option(\"--limit <n>\", \"Max results total across matched repos (default 20)\")\n .option(\n \"--repo-id <id>\",\n \"Limit search to one repository. Omit to search every repo in the org.\",\n )\n .action((query, opts) => handleSearchAnalysis(query, opts));\n\nprogram\n .command(\"run-analysis\", { hidden: true })\n .description(\"Run deep codebase analysis workflows on a repository\")\n .option(\n \"--prompts <list>\",\n \"Comma-separated: security,architecture,code-quality,performance,ux,dependencies,cost,ai-architecture,ai-security\",\n )\n .option(\n \"--repo-id <id>\",\n \"Target repository ID. Omit for single-repo orgs (auto-pick).\",\n )\n .action((opts) => handleRunAnalysis(opts));\n\nprogram\n .command(\"run-team-analysis\", { hidden: true })\n .description(\"Run a team-wide AI coding practice analysis for the org\")\n .option(\n \"--window-days <n>\",\n \"Size of the analysis window in days (default 30, min 1, max 90)\",\n )\n .action((opts) => handleRunTeamAnalysis(opts));\n\n// ── Integration commands ───────────────────────────────────────────────────\n\nprogram\n .command(\"integrations\", { hidden: true })\n .description(\"List connected integrations\")\n .action(() => handleIntegrations());\n\nprogram\n .command(\"events\", { hidden: true })\n .description(\"Recent integration events (deploys, releases, errors)\")\n .option(\n \"--source <source>\",\n \"Filter: github, sentry, linear, amplitude, stripe\",\n )\n .option(\"--event-type <type>\", \"Filter by event type\")\n .option(\"--project-id <id>\", \"Filter by project\")\n .option(\"--since <duration>\", \"Time range: 1h, 6h, 24h, 7d, 30d\")\n .action((opts) => handleEvents(opts));\n\nprogram\n .command(\"resolve-identity\", { hidden: true })\n .description(\"Resolve external identity to FML user\")\n .argument(\"[username]\", \"External username (shorthand for --username)\")\n .option(\"--provider <p>\", \"Provider: github, linear, slack\")\n .option(\"--username <u>\", \"External username\")\n .option(\"--email <e>\", \"Email address\")\n .option(\"--external-id <id>\", \"External ID\")\n .option(\"--external-user-id <id>\", \"External user ID\")\n .action((username, opts) =>\n handleResolveIdentity(username ? { ...opts, username } : opts),\n );\n\n// ── Slack subcommand ───────────────────────────────────────────────────────\n\nconst slack = program\n .command(\"slack\", { hidden: true })\n .description(\"Slack shortcuts\");\n\nslack\n .command(\"history\")\n .description(\"Recent messages from a channel\")\n .option(\"--channel <id>\", \"Channel ID\")\n .option(\"--limit <n>\", \"Max messages\")\n .action((opts) => handleSlackHistory(opts));\n\nslack\n .command(\"message\")\n .description(\"Fetch a specific message\")\n .option(\"--permalink <url>\", \"Message permalink\")\n .option(\"--channel <id>\", \"Channel ID\")\n .option(\"--ts <timestamp>\", \"Message timestamp\")\n .option(\"--include-thread\", \"Include thread context\")\n .action((opts) => handleSlackMessage(opts));\n\n// ── Messages subcommand ────────────────────────────────────────────────────\n\nconst messages = program\n .command(\"messages\", { hidden: true })\n .description(\"Conversation messages\");\n\nmessages\n .command(\"list\")\n .description(\"List messages from a conversation\")\n .option(\"--start <timestamp>\", \"Start time (ms epoch)\")\n .option(\"--end <timestamp>\", \"End time (ms epoch)\")\n .option(\"--limit <n>\", \"Max messages\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .action((opts) => handleMessagesList(opts));\n\nmessages\n .command(\"context\")\n .description(\"Get messages around a specific message\")\n .argument(\"<message-id>\", \"Message ID\")\n .option(\"--before <n>\", \"Messages before\")\n .option(\"--after <n>\", \"Messages after\")\n .action((messageId, opts) => handleMessagesContext(messageId, opts));\n\n// ── Skills subcommand ──────────────────────────────────────────────────────\n\nconst skills = program\n .command(\"skills\", { hidden: true })\n .description(\"Browse and load skills\");\n\nskills\n .command(\"list\")\n .description(\"List available skills\")\n .action(() => handleSkillsList());\n\nskills\n .command(\"load\")\n .description(\"Load a skill by ID\")\n .argument(\"<skill-id>\", \"Skill ID\")\n .action((skillId) => handleSkillsLoad(skillId));\n\n// ── Config subcommand ──────────────────────────────────────────────────────\n\nconst config = program\n .command(\"config\", { hidden: true })\n .description(\"View team config snapshots\");\n\nconfig\n .command(\"list\")\n .description(\"List config snapshots for an org\")\n .requiredOption(\"--org <slug>\", \"Organization slug\")\n .option(\"--repo <full-name>\", \"Filter by repo (owner/name)\")\n .action((opts) => handleConfigList(opts));\n\nconfig\n .command(\"detail\")\n .description(\"Get config snapshot detail\")\n .requiredOption(\"--org <slug>\", \"Organization slug\")\n .option(\"--user <username>\", \"GitHub username\")\n .option(\"--repo <full-name>\", \"Repository (owner/name)\")\n .action((opts) => handleConfigDetail(opts));\n\n// ────────────────────────────────────────────────────────────────────────────\n\nprogram.parseAsync(process.argv).catch((err) => {\n Sentry.captureException(err);\n console.error(err);\n process.exit(1);\n});\n","import ora from \"ora\";\nimport pc from \"picocolors\";\nimport { getValidToken, readTokens } from \"../auth/token-store.js\";\nimport { createApiClient } from \"../convex-client.js\";\nimport { CONVEX_URL } from \"../config.js\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { parsePanopticonRunning } from \"./daemon.js\";\nimport { loadSyncConfig } from \"@fml-inc/panopticon/sync\";\nimport { syncPending } from \"@fml-inc/panopticon/api\";\n\ninterface CheckResult {\n label: string;\n status: \"ok\" | \"warn\" | \"fail\";\n detail: string;\n}\n\nfunction reportResult(\n result: CheckResult,\n spinner: ReturnType<typeof ora> | null,\n): void {\n const text = `${result.label} — ${result.detail}`;\n if (spinner) {\n switch (result.status) {\n case \"ok\":\n spinner.succeed(text);\n break;\n case \"warn\":\n spinner.warn(text);\n break;\n case \"fail\":\n spinner.fail(text);\n break;\n }\n } else {\n const icon =\n result.status === \"ok\"\n ? pc.green(\"✓\")\n : result.status === \"warn\"\n ? pc.yellow(\"!\")\n : pc.red(\"✗\");\n console.log(` ${icon} ${result.label} — ${result.detail}`);\n }\n}\n\nexport async function handleDoctor(opts: { json?: boolean }): Promise<void> {\n const isTTY = !opts.json && process.stdout.isTTY === true;\n const checks: CheckResult[] = [];\n\n function startSpinner(label: string): ReturnType<typeof ora> | null {\n if (!isTTY) return null;\n return ora({ text: `Checking ${label}...`, indent: 2 }).start();\n }\n\n function pushAndReport(\n result: CheckResult,\n spinner: ReturnType<typeof ora> | null,\n ): void {\n checks.push(result);\n if (!opts.json) {\n reportResult(result, spinner);\n }\n }\n\n if (!opts.json && !isTTY) {\n console.log(\"\");\n }\n\n // 1. Auth check\n let token: string | null = null;\n {\n const spinner = startSpinner(\"auth\");\n token = await getValidToken();\n if (token) {\n const stored = readTokens();\n const detail = stored?.user?.email\n ? `Logged in as ${stored.user.email}`\n : \"Token present\";\n pushAndReport({ label: \"Auth\", status: \"ok\", detail }, spinner);\n } else {\n pushAndReport(\n {\n label: \"Auth\",\n status: \"fail\",\n detail: \"No token. Run `fml login`\",\n },\n spinner,\n );\n }\n }\n\n // 2. Panopticon checks (imported dynamically to avoid hard dep on published version)\n {\n const spinner = startSpinner(\"panopticon\");\n try {\n const { doctor } = await import(\"@fml-inc/panopticon/doctor\");\n const result = await doctor();\n // Close the spinner before reporting individual checks\n if (spinner) spinner.stop();\n for (const check of result.checks) {\n pushAndReport(check, null);\n }\n } catch {\n // Panopticon doctor not available — check via CLI\n const result = panopticonExec(\"status\");\n if (result.ok) {\n pushAndReport(\n { label: \"Panopticon\", status: \"ok\", detail: \"Available\" },\n spinner,\n );\n } else {\n pushAndReport(\n {\n label: \"Panopticon\",\n status: \"fail\",\n detail: \"Not found. Run `fml install`\",\n },\n spinner,\n );\n }\n }\n }\n\n // 3. Sync status (only if authenticated)\n if (token) {\n const spinner = startSpinner(\"sync\");\n try {\n const syncConfig = loadSyncConfig();\n const targets = syncConfig.targets;\n if (targets.length === 0) {\n pushAndReport(\n {\n label: \"Sync\",\n status: \"warn\",\n detail: \"No sync targets configured\",\n },\n spinner,\n );\n } else {\n // Close the spinner before reporting per-target\n if (spinner) spinner.stop();\n\n for (const target of targets) {\n try {\n const result = await syncPending(target.name);\n if (result.totalPending === 0) {\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: \"ok\",\n detail: \"Up to date\",\n },\n null,\n );\n } else {\n const parts = Object.entries(result.tables)\n .sort(([, a], [, b]) => b.pending - a.pending)\n .slice(0, 3)\n .map(([t, v]) => `${v.pending} ${t}`);\n const detail =\n parts.length < Object.keys(result.tables).length\n ? `${result.totalPending} pending (${parts.join(\", \")}, ...)`\n : `${result.totalPending} pending (${parts.join(\", \")})`;\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: result.totalPending > 1000 ? \"warn\" : \"ok\",\n detail,\n },\n null,\n );\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: \"warn\",\n detail: `Could not query watermarks (${msg})`,\n },\n null,\n );\n }\n }\n }\n } catch (err) {\n pushAndReport(\n {\n label: \"Sync\",\n status: \"warn\",\n detail: err instanceof Error ? err.message : \"Check failed\",\n },\n spinner,\n );\n }\n }\n\n // 4. Daemon checks\n {\n const spinner = startSpinner(\"panopticon daemon\");\n const isRunning = parsePanopticonRunning();\n if (isRunning) {\n pushAndReport(\n {\n label: \"Panopticon daemon\",\n status: \"ok\",\n detail: \"running\",\n },\n spinner,\n );\n } else {\n pushAndReport(\n {\n label: \"Panopticon daemon\",\n status: \"warn\",\n detail: \"Not running. Run `fml start`\",\n },\n spinner,\n );\n }\n }\n\n // 5. API reachability\n {\n const spinner = startSpinner(\"API\");\n if (token) {\n try {\n const result = await createApiClient(token).callBackend(\"ping\", {});\n if (result.ok) {\n pushAndReport(\n {\n label: \"API\",\n status: \"ok\",\n detail: `Reachable at ${CONVEX_URL}`,\n },\n spinner,\n );\n } else {\n // Backend responded but tool failed — still reachable\n pushAndReport(\n {\n label: \"API\",\n status: \"ok\",\n detail: `Reachable at ${CONVEX_URL}`,\n },\n spinner,\n );\n }\n } catch (err) {\n pushAndReport(\n {\n label: \"API\",\n status: \"fail\",\n detail: err instanceof Error ? err.message : \"Unreachable\",\n },\n spinner,\n );\n }\n } else {\n pushAndReport(\n { label: \"API\", status: \"fail\", detail: \"Auth required\" },\n spinner,\n );\n }\n }\n\n // JSON output\n if (opts.json) {\n console.log(JSON.stringify(checks, null, 2));\n return;\n }\n\n // Summary\n console.log(\"\");\n const passed = checks.filter((c) => c.status === \"ok\").length;\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warned = checks.filter((c) => c.status === \"warn\").length;\n\n const parts: string[] = [];\n if (passed > 0) parts.push(pc.green(`${passed} passed`));\n if (warned > 0)\n parts.push(pc.yellow(`${warned} warning${warned > 1 ? \"s\" : \"\"}`));\n if (failed > 0) parts.push(pc.red(`${failed} failed`));\n\n console.log(` ${parts.join(\", \")}`);\n console.log(\"\");\n}\n","import { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { addTarget, listTargets } from \"@fml-inc/panopticon/sync\";\nimport { printBanner } from \"../banner.js\";\nimport {\n DEFAULT_SYNC_URL,\n DEFAULT_TARGET_NAME,\n writeEnvConfig,\n} from \"../config.js\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { FML_DATA_DIR, FML_LOG_DIR } from \"../dirs.js\";\nimport { resolveSyncTokenCommand } from \"../sync/client.js\";\n\nconst CLAUDE_DIR = path.join(os.homedir(), \".claude\");\nconst CLAUDE_SETTINGS_PATH = path.join(CLAUDE_DIR, \"settings.json\");\nconst MARKETPLACE_DIR = path.join(\n os.homedir(),\n \".local\",\n \"share\",\n \"claude-plugins\",\n);\n\nfunction getPluginRoot(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n // At runtime we're in dist/ (tsup bundles into entry point), go up one level\n dir = path.resolve(dir, \"..\");\n return dir;\n}\n\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nexport async function handleInstall(): Promise<void> {\n const pluginRoot = getPluginRoot();\n console.log(\"Installing fml...\\n\");\n\n // 1. Ensure panopticon is installed globally and up to date\n console.log(\"[1/5] Setting up panopticon...\");\n const { resolvePanopticonBin } = await import(\"../daemon-utils.js\");\n let freshInstall = false;\n const bin = resolvePanopticonBin();\n let needsInstall = !bin;\n if (bin) {\n // Check version — upgrade if below the minimum required by this build\n const MIN_PANOPTICON = \"0.2.2\";\n const vResult = panopticonExec(\"--version\", { timeout: 5_000 });\n const installed = vResult.ok ? vResult.stdout.trim().split(\"+\")[0] : \"0.0.0\";\n if (installed < MIN_PANOPTICON) {\n console.log(` Found panopticon ${installed}, need >=${MIN_PANOPTICON}`);\n needsInstall = true;\n }\n }\n if (needsInstall) {\n console.log(\n bin\n ? \" Upgrading @fml-inc/panopticon...\"\n : \" Installing @fml-inc/panopticon globally...\",\n );\n try {\n execFileSync(\"npm\", [\"install\", \"-g\", \"@fml-inc/panopticon@latest\"], {\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: \"pipe\",\n });\n freshInstall = true;\n console.log(\" Installed @fml-inc/panopticon\");\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(` Failed to install panopticon: ${msg}`);\n console.error(\" Install manually: npm install -g @fml-inc/panopticon@latest\");\n }\n }\n // npm postinstall already ran panopticon install for fresh installs;\n // only re-run for existing installs to pick up config changes.\n if (!freshInstall) {\n const result = panopticonExec(\"install\", { timeout: 60_000 });\n if (result.ok) {\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n } else {\n console.error(\" panopticon install failed:\");\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.error(` ${line}`);\n }\n }\n }\n console.log();\n\n // 2. Ensure fml-specific directories exist\n console.log(\"[2/5] Creating fml directories...\");\n for (const dir of [FML_DATA_DIR, FML_LOG_DIR]) {\n fs.mkdirSync(dir, { recursive: true });\n }\n console.log(` ${FML_DATA_DIR}`);\n console.log(` ${FML_LOG_DIR}\\n`);\n\n // 3. Ensure plugin manifest has the current version\n console.log(\"[3/5] Writing plugin manifest...\");\n const pkgJson = readJsonFile(path.join(pluginRoot, \"package.json\"));\n const version = (pkgJson?.version as string) ?? \"0.0.0-dev\";\n const pluginManifestDir = path.join(pluginRoot, \".claude-plugin\");\n fs.mkdirSync(pluginManifestDir, { recursive: true });\n writeJsonFile(path.join(pluginManifestDir, \"plugin.json\"), {\n name: \"fml\",\n version,\n description: \"FML agent tools for Claude Code\",\n mcpServers: {\n fml: {\n command: \"node\",\n args: [\"${CLAUDE_PLUGIN_ROOT}/bin/mcp-server\"],\n },\n },\n });\n console.log(` Version: ${version}\\n`);\n\n // 4. Register fml plugin in local marketplace + Claude Code settings\n console.log(\"[4/5] Setting up fml plugin...\");\n fs.mkdirSync(path.join(MARKETPLACE_DIR, \".claude-plugin\"), {\n recursive: true,\n });\n\n const manifestPath = path.join(\n MARKETPLACE_DIR,\n \".claude-plugin\",\n \"marketplace.json\",\n );\n const manifest = readJsonFile(manifestPath) ?? {\n name: \"local-plugins\",\n owner: { name: os.userInfo().username },\n plugins: [],\n };\n\n const plugins = (manifest.plugins as Array<Record<string, unknown>>) ?? [];\n if (!plugins.some((p) => p.name === \"fml\")) {\n plugins.push({\n name: \"fml\",\n source: \"./fml\",\n description: \"FML agent tools for Claude Code\",\n });\n manifest.plugins = plugins;\n }\n writeJsonFile(manifestPath, manifest);\n\n // Symlink plugin source into marketplace\n const marketplaceLink = path.join(MARKETPLACE_DIR, \"fml\");\n try {\n fs.unlinkSync(marketplaceLink);\n } catch {}\n fs.rmSync(marketplaceLink, { recursive: true, force: true });\n fs.symlinkSync(pluginRoot, marketplaceLink, \"dir\");\n console.log(` Marketplace: ${MARKETPLACE_DIR}`);\n console.log(` Plugin: ${pluginRoot}`);\n\n // Layer fml-specific settings on top for Claude Code\n const settings = (readJsonFile(CLAUDE_SETTINGS_PATH) ?? {}) as Record<\n string,\n Record<string, unknown>\n >;\n settings.extraKnownMarketplaces = settings.extraKnownMarketplaces ?? {};\n settings.extraKnownMarketplaces[\"local-plugins\"] = {\n source: { source: \"directory\", path: MARKETPLACE_DIR },\n };\n settings.enabledPlugins = settings.enabledPlugins ?? {};\n settings.enabledPlugins[\"fml@local-plugins\"] = true;\n writeJsonFile(CLAUDE_SETTINGS_PATH, settings);\n console.log(` Claude settings: ${CLAUDE_SETTINGS_PATH}`);\n\n // Register plugin with Claude Code (install if new, update if existing)\n try {\n try {\n execFileSync(\"claude\", [\"plugin\", \"install\", \"fml@local-plugins\"], {\n stdio: \"pipe\",\n timeout: 15_000,\n });\n } catch {\n execFileSync(\"claude\", [\"plugin\", \"update\", \"fml@local-plugins\"], {\n stdio: \"pipe\",\n timeout: 15_000,\n });\n }\n console.log(\" Plugin registered via Claude Code CLI\");\n } catch {\n console.log(\" warn: claude CLI not found, run 'claude plugin install fml@local-plugins' manually\");\n }\n console.log();\n\n // 5. Auto-configure sync target (best-effort)\n console.log(\"[5/5] Configuring sync target...\");\n const existingTargets = listTargets();\n const existingProd = existingTargets.find((t) => t.url === DEFAULT_SYNC_URL);\n if (existingProd) {\n console.log(` Production target already configured`);\n } else {\n const tokenCommand = resolveSyncTokenCommand();\n addTarget({\n name: DEFAULT_TARGET_NAME,\n url: DEFAULT_SYNC_URL,\n tokenCommand,\n });\n console.log(` Target \"${DEFAULT_TARGET_NAME}\": ${DEFAULT_SYNC_URL}`);\n if (tokenCommand) {\n console.log(` Auth: ${tokenCommand}`);\n } else {\n // No gh and no fml login yet — target is URL-only. `fml login` will\n // back-patch it to `fml sync-token` once the user signs in.\n console.log(\n \" Auth: not configured — run `fml login` to enable sync.\",\n );\n }\n }\n\n // Set active env to the default sync target\n writeEnvConfig({ active: DEFAULT_TARGET_NAME });\n\n console.log(\"\");\n printBanner();\n console.log(\"Done! Start a new coding session to activate.\\n\");\n console.log(\"\\nNext steps:\");\n console.log(\" fml login Sign in to your FML account\");\n console.log(\" fml org Select organization\");\n console.log(\" fml sync status Check sync status\");\n console.log(\" fml status Verify setup\");\n}\n","import pc from \"picocolors\";\n\nconst LOGO_LINES = [\n \" ▄██▀ ██▄██▄██ ██\",\n \" ██ ██ ██ ██ ██\",\n \"█████ ██ ██ ██\",\n \" ██ ██ ██ ████\",\n \" ▀▀ ▀▀ ▀▀ ▀▀▀▀\",\n];\n\nexport function printBanner(): void {\n console.log(\"\");\n for (let i = 0; i < LOGO_LINES.length; i++) {\n const color = i < 3 ? pc.blue : pc.cyan;\n console.log(\" \" + color(LOGO_LINES[i]));\n }\n console.log(\"\");\n}\n","import { execSync } from \"node:child_process\";\nimport { readTokens } from \"../auth/token-store.js\";\nimport { getActiveEnv, isValidEnvName } from \"../config.js\";\n\nconst TOKEN_TTL_MS = 5 * 60 * 1000;\n\nlet cachedGitHubToken: { value: string; expiresAt: number } | null = null;\n\nexport function resolveGitHubToken(): string | null {\n if (cachedGitHubToken && Date.now() < cachedGitHubToken.expiresAt) {\n return cachedGitHubToken.value;\n }\n\n const envToken = process.env.PANOPTICON_GITHUB_TOKEN;\n if (envToken) {\n cachedGitHubToken = {\n value: envToken,\n expiresAt: Date.now() + TOKEN_TTL_MS,\n };\n return envToken;\n }\n\n try {\n const token = execSync(\"gh auth token\", {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n if (token) {\n cachedGitHubToken = {\n value: token,\n expiresAt: Date.now() + TOKEN_TTL_MS,\n };\n }\n return token || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Pick the best `tokenCommand` to write onto a sync target, given what's\n * currently available on this machine:\n *\n * 1. `gh auth token` — preferred on dev laptops. Keeps telemetry\n * attributed to the GitHub identity, which is how work is rolled up\n * for individual contributors.\n * 2. `fml sync-token --env <active>` — fallback for sandboxes / CI /\n * containers that don't have `gh` but have (or will have) an\n * `fml login` session. Pinned to the active env so panopticon reads\n * the right auth file even when the user later switches envs. The\n * FML session token carries `actAsExternalId` so attribution still\n * lands on a specific user — via FML identity instead of GH.\n * 3. `undefined` — nothing usable yet. Install writes a URL-only target\n * and `fml login` will back-patch it after the user signs in.\n */\nexport function resolveSyncTokenCommand(): string | undefined {\n if (resolveGitHubToken()) return \"gh auth token\";\n if (readTokens()) {\n const { name } = getActiveEnv();\n if (isValidEnvName(name)) return `fml sync-token --env ${name}`;\n }\n return undefined;\n}\n","import { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { FML_DATA_DIR, FML_LOG_DIR } from \"../dirs.js\";\n\nconst CLAUDE_DIR = path.join(os.homedir(), \".claude\");\nconst CLAUDE_SETTINGS_PATH = path.join(CLAUDE_DIR, \"settings.json\");\nconst MARKETPLACE_DIR = path.join(\n os.homedir(),\n \".local\",\n \"share\",\n \"claude-plugins\",\n);\nconst PLUGIN_CACHE_DIR = path.join(\n CLAUDE_DIR,\n \"plugins\",\n \"cache\",\n \"local-plugins\",\n \"fml\",\n);\n\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nexport function handleUninstall(opts: {\n purge?: boolean;\n target?: string;\n}): void {\n const targetSpecific = opts.target && opts.target !== \"all\";\n\n console.log(\"Uninstalling fml...\\n\");\n\n // 1. Tell Claude Code to uninstall the plugin (kills MCP server, evicts cache)\n if (targetSpecific) {\n console.log(\"[1/5] Skipping plugin uninstall (target-specific uninstall)\");\n } else {\n console.log(\"[1/5] Uninstalling MCP plugin...\");\n // Uninstall from user scope via CLI\n try {\n execFileSync(\n \"claude\",\n [\"plugin\", \"uninstall\", \"fml@local-plugins\", \"--scope\", \"user\"],\n { stdio: \"pipe\", timeout: 10_000 },\n );\n console.log(\" Uninstalled (user scope)\");\n } catch {\n // Not installed at this scope, or claude CLI not found\n }\n\n // Clean all scopes from installed_plugins.json directly — the CLI\n // can only remove project-scoped entries from within that project dir,\n // so we handle it ourselves.\n // Clean all scopes from installed_plugins.json directly — the CLI\n // can only remove project-scoped entries from within that project dir,\n // so we handle it ourselves.\n const installedPluginsPath = path.join(\n CLAUDE_DIR,\n \"plugins\",\n \"installed_plugins.json\",\n );\n const installedPlugins = readJsonFile(installedPluginsPath) as {\n version?: number;\n plugins?: Record<string, unknown[]>;\n } | null;\n const plugins = installedPlugins?.plugins;\n const fmlEntries = plugins?.[\"fml@local-plugins\"];\n if (plugins && fmlEntries) {\n // Clean project-level settings that reference fml\n for (const entry of fmlEntries) {\n const e = entry as { scope?: string; projectPath?: string };\n if (e.scope === \"project\" && e.projectPath) {\n const projSettings = path.join(e.projectPath, \".claude\", \"settings.json\");\n const proj = readJsonFile(projSettings) as Record<string, Record<string, unknown>> | null;\n if (proj?.enabledPlugins?.[\"fml@local-plugins\"] != null) {\n delete proj.enabledPlugins[\"fml@local-plugins\"];\n writeJsonFile(projSettings, proj);\n console.log(` Cleaned ${projSettings}`);\n }\n }\n }\n delete plugins[\"fml@local-plugins\"];\n writeJsonFile(installedPluginsPath, installedPlugins as Record<string, unknown>);\n console.log(\" Cleaned installed_plugins.json\");\n }\n }\n\n // 2. Remove fml plugin from Claude Code settings\n if (targetSpecific) {\n console.log(\"[2/5] Skipping plugin settings (target-specific uninstall)\");\n } else {\n console.log(\"[2/5] Removing plugin from Claude Code settings...\");\n const settings = readJsonFile(CLAUDE_SETTINGS_PATH) as Record<\n string,\n Record<string, unknown>\n > | null;\n if (settings) {\n if (settings.enabledPlugins) {\n delete settings.enabledPlugins[\"fml@local-plugins\"];\n }\n if (settings.extraKnownMarketplaces) {\n delete settings.extraKnownMarketplaces[\"local-plugins\"];\n }\n writeJsonFile(CLAUDE_SETTINGS_PATH, settings);\n console.log(` Updated ${CLAUDE_SETTINGS_PATH}`);\n } else {\n console.log(\" No settings file found, skipping\");\n }\n }\n\n // 3. Remove marketplace symlink and manifest entry\n if (targetSpecific) {\n console.log(\"[3/5] Skipping marketplace (target-specific uninstall)\");\n } else {\n console.log(\"[3/5] Removing marketplace registration...\");\n const marketplaceLink = path.join(MARKETPLACE_DIR, \"fml\");\n try {\n fs.rmSync(marketplaceLink, { recursive: true, force: true });\n console.log(` Removed ${marketplaceLink}`);\n } catch {\n console.log(\" No marketplace link found, skipping\");\n }\n\n const manifestPath = path.join(\n MARKETPLACE_DIR,\n \".claude-plugin\",\n \"marketplace.json\",\n );\n const manifest = readJsonFile(manifestPath);\n if (manifest && Array.isArray(manifest.plugins)) {\n manifest.plugins = (\n manifest.plugins as Array<Record<string, unknown>>\n ).filter((p) => p.name !== \"fml\");\n writeJsonFile(manifestPath, manifest);\n console.log(` Updated ${manifestPath}`);\n }\n }\n\n // 4. Run panopticon uninstall\n console.log(\"[4/5] Running panopticon uninstall...\");\n const panoArgs = [\"uninstall\"];\n if (opts.target) panoArgs.push(\"--target\", opts.target);\n if (opts.purge) panoArgs.push(\"--purge\");\n const result = panopticonExec(...panoArgs, { timeout: 30_000 });\n if (result.ok) {\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n } else {\n console.error(\" panopticon uninstall failed:\");\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.error(` ${line}`);\n }\n }\n\n // 5. Remove fml data, logs, and plugin cache\n if (targetSpecific) {\n console.log(\"[5/5] Skipping data removal (target-specific uninstall)\");\n } else {\n console.log(\"[5/5] Removing plugin cache...\");\n try {\n fs.rmSync(PLUGIN_CACHE_DIR, { recursive: true, force: true });\n console.log(` Removed ${PLUGIN_CACHE_DIR}`);\n } catch {\n console.log(\" No plugin cache found\");\n }\n }\n\n if (opts.purge) {\n console.log(\"Removing fml data and logs...\");\n for (const dir of [FML_DATA_DIR, FML_LOG_DIR]) {\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n console.log(` Removed ${dir}`);\n } catch {\n console.log(` Could not remove ${dir}`);\n }\n }\n } else {\n console.log(\"Keeping fml data (use --purge to remove)\");\n }\n\n console.log(\"\\nDone! FML has been uninstalled.\");\n}\n","import { execSync } from \"node:child_process\";\nimport { Sentry } from \"../sentry.js\";\n\ndeclare const __FML_PLUGIN_VERSION__: string;\n\nexport async function handleUpdate(): Promise<void> {\n const currentVersion =\n typeof __FML_PLUGIN_VERSION__ !== \"undefined\"\n ? __FML_PLUGIN_VERSION__\n : \"unknown\";\n\n console.log(`Current: ${currentVersion}`);\n console.log(\"Updating via npm...\\n\");\n\n try {\n const env = { ...process.env };\n delete env.npm_config_registry;\n\n execSync(\"npm install -g @fml-inc/fml@latest\", {\n stdio: \"inherit\",\n timeout: 120_000,\n env,\n });\n\n console.log(\"\\nUpdated. Run `fml install --skip-build` to reconfigure.\");\n } catch (err: unknown) {\n Sentry.captureException(err);\n const msg =\n err instanceof Error\n ? ((err as Error & { stderr?: Buffer }).stderr?.toString() ??\n err.message)\n : String(err);\n console.error(\"Update failed:\", msg);\n process.exit(1);\n }\n}\n","import type { FunctionReference } from \"convex/server\";\nimport {\n addTarget,\n loadSyncConfig,\n saveSyncConfig,\n} from \"@fml-inc/panopticon/sync\";\nimport { login, canOpenBrowser } from \"../auth/oauth.js\";\nimport { deviceLogin } from \"../auth/device-flow.js\";\nimport { getValidToken, setSelectedOrg } from \"../auth/token-store.js\";\nimport { createApiClient } from \"../convex-client.js\";\nimport { resolveGitHubToken } from \"../sync/client.js\";\nimport {\n CONVEX_URL,\n DEFAULT_SYNC_URL,\n getActiveEnv,\n isValidEnvName,\n} from \"../config.js\";\nimport { Sentry } from \"../sentry.js\";\n\n/**\n * After login, link the user's GitHub identity to their FML account\n * so that sync data (authenticated via GitHub token) can be attributed.\n */\nasync function linkGitHubIdentity(): Promise<void> {\n const token = resolveGitHubToken();\n if (!token) {\n console.warn(\"[fml] No GitHub token available — skipping identity link\");\n return;\n }\n\n try {\n const response = await fetch(\"https://api.github.com/user\", {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: \"application/vnd.github+json\",\n },\n });\n if (!response.ok) {\n console.warn(\n `[fml] GitHub API returned ${response.status} — skipping identity link`,\n );\n return;\n }\n\n const user = (await response.json()) as {\n login: string;\n id: number;\n email: string | null;\n };\n\n const fmlToken = await getValidToken();\n if (!fmlToken) {\n console.warn(\"[fml] No FML token available — skipping identity link\");\n return;\n }\n\n // Service tokens (device flow) can't call JWT-authenticated Convex mutations.\n // Identity is already attributed server-side via actAsExternalId on the token.\n if (fmlToken.startsWith(\"fml_st_\")) {\n return;\n }\n\n const { ConvexHttpClient } = await import(\"convex/browser\");\n const client = new ConvexHttpClient(CONVEX_URL);\n client.setAuth(fmlToken);\n\n const ref =\n \"user/panopticon:linkGitHubIdentity\" as unknown as FunctionReference<\"mutation\">;\n await client.mutation(ref, {\n githubUsername: user.login,\n githubId: user.id,\n githubEmail: user.email ?? undefined,\n });\n\n console.log(`Linked GitHub account: ${user.login}`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[fml] Failed to link GitHub identity: ${msg}`);\n }\n}\n\n// Config snapshots are now synced automatically via panopticon sync —\n// no manual upload needed after login.\n\n/**\n * After a successful login, pin the active env's sync target to\n * `fml sync-token --env <activeEnv>` so panopticon always reads the auth\n * file for that env (even when the user later switches active envs).\n *\n * - Target missing entirely → add one pointing at prod with the pinned cmd.\n * - Target is URL-only or uses the legacy `fml sync-token` (no --env) →\n * upgrade to the pinned form.\n * - Target has an unrelated tokenCommand (gh auth token, custom) or a\n * static token → leave it alone; the user made an explicit choice.\n */\n// Exported for unit testing; called from within handleLogin otherwise.\nexport function upgradeSyncTargetAfterLogin(): void {\n try {\n const { name: envName } = getActiveEnv();\n // envName is interpolated into tokenCommand, which panopticon shells out.\n // Guard against metacharacters in a corrupted env.json.\n if (!isValidEnvName(envName)) {\n console.warn(\n `[fml] Skipping sync-target upgrade: env name \"${envName}\" contains unsafe characters.`,\n );\n return;\n }\n const pinnedCmd = `fml sync-token --env ${envName}`;\n const config = loadSyncConfig();\n const existing = config.targets.find((t) => t.name === envName);\n if (!existing) {\n addTarget({\n name: envName,\n url: DEFAULT_SYNC_URL,\n tokenCommand: pinnedCmd,\n });\n console.log(`Sync target \"${envName}\" configured with ${pinnedCmd}.`);\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n return;\n }\n if (existing.token) return;\n if (existing.tokenCommand === pinnedCmd) return;\n if (existing.tokenCommand && existing.tokenCommand !== \"fml sync-token\") {\n // Preserve explicit choices (e.g. `gh auth token`, custom commands).\n return;\n }\n existing.tokenCommand = pinnedCmd;\n saveSyncConfig(config);\n console.log(`Sync target \"${envName}\" now using ${pinnedCmd}.`);\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n } catch (err: unknown) {\n // Non-fatal — login itself succeeded, worst case sync stays URL-only\n // and the user can run `fml sync setup` manually.\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[fml] Could not update sync target: ${msg}`);\n }\n}\n\n/**\n * After login, select and persist the user's org.\n * Single-org users get auto-selected; multi-org users get the first org\n * (can be changed later via `fml org`).\n */\nasync function selectOrg(): Promise<void> {\n try {\n const token = await getValidToken();\n if (!token) return;\n\n const api = createApiClient(token);\n const orgs = await api.queryOrgs();\n if (orgs.length === 0) return;\n\n const org = orgs[0];\n const slug = org.slug ?? org.name;\n setSelectedOrg(slug);\n console.log(`Selected org: ${org.name} (${slug})`);\n } catch {\n // Non-fatal — org selection can happen later via `fml org`\n }\n}\n\nexport async function handleLogin(opts?: { device?: boolean }): Promise<void> {\n const { name: envName } = getActiveEnv();\n\n // Skip OAuth if already authenticated — still run post-login tasks\n const existingToken = await getValidToken();\n if (existingToken) {\n const { readTokens } = await import(\"../auth/token-store.js\");\n const stored = readTokens();\n console.log(\n `Already logged in as ${stored?.user.name} (${stored?.user.email}) on ${envName}.`,\n );\n\n await linkGitHubIdentity();\n await selectOrg();\n upgradeSyncTargetAfterLogin();\n\n console.log(\"You're all set! Restart Claude Code to use FML tools.\");\n process.exit(0);\n }\n\n console.log(`Signing in to FML (${envName})...`);\n try {\n const useDeviceFlow = opts?.device || !(await canOpenBrowser());\n let result: { email: string; name: string };\n\n if (useDeviceFlow) {\n result = await deviceLogin();\n } else {\n result = await login();\n }\n\n console.log(`\\nLogged in as ${result.name} (${result.email})`);\n\n await linkGitHubIdentity();\n await selectOrg();\n upgradeSyncTargetAfterLogin();\n\n console.log(\"You're all set! Restart Claude Code to use FML tools.\");\n process.exit(0);\n } catch (err: unknown) {\n Sentry.captureException(err);\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Login failed: ${msg}`);\n process.exit(1);\n }\n}\n","import crypto from \"node:crypto\";\nimport http from \"node:http\";\nimport { CONVEX_URL, WORKOS_API_URL, WORKOS_AUTH_URL } from \"../config.js\";\nimport { writeTokens } from \"./token-store.js\";\n\n/**\n * Fetch the WorkOS client ID from the active Convex deployment.\n * This allows each environment to use its own WorkOS configuration.\n */\nasync function fetchWorkosClientId(): Promise<string> {\n const { ConvexHttpClient } = await import(\"convex/browser\");\n const client = new ConvexHttpClient(CONVEX_URL);\n const ref =\n \"public_config:getAuthConfig\" as unknown as import(\"convex/server\").FunctionReference<\"query\">;\n const result = (await client.query(ref, {})) as {\n workosClientId: string;\n };\n return result.workosClientId;\n}\n\n/**\n * Detect if a browser can be opened on this machine.\n * Returns false for headless environments (containers, SSH, no display).\n */\nexport async function canOpenBrowser(): Promise<boolean> {\n // Explicit overrides\n if (process.env.FML_DEVICE_FLOW === \"1\") return false;\n if (process.env.FML_NO_BROWSER === \"1\") return false;\n\n // Linux without a display server\n if (\n process.platform === \"linux\" &&\n !process.env.DISPLAY &&\n !process.env.WAYLAND_DISPLAY\n ) {\n return false;\n }\n\n // Remote/container environments\n if (process.env.SSH_CONNECTION) return false;\n if (process.env.CODESPACES) return false;\n if (process.env.REMOTE_CONTAINERS) return false;\n\n // Container detection\n try {\n const fs = await import(\"node:fs\");\n if (fs.existsSync(\"/.dockerenv\")) return false;\n } catch {\n // ignore\n }\n\n return true;\n}\n\n/**\n * Run the WorkOS PKCE OAuth flow:\n * 1. Generate code_verifier + code_challenge\n * 2. Start local HTTP server for callback\n * 3. Open browser to WorkOS authorization URL\n * 4. Receive callback with authorization code\n * 5. Exchange code for tokens\n * 6. Store tokens\n */\nexport async function login(): Promise<{\n email: string;\n name: string;\n}> {\n // Fetch the WorkOS client ID from the active Convex deployment\n const clientId = await fetchWorkosClientId();\n\n // Generate PKCE code verifier and challenge\n const codeVerifier = crypto.randomBytes(32).toString(\"base64url\");\n const codeChallenge = crypto\n .createHash(\"sha256\")\n .update(codeVerifier)\n .digest(\"base64url\");\n\n // Generate state for CSRF protection (defense-in-depth alongside PKCE)\n const state = crypto.randomBytes(16).toString(\"hex\");\n\n // Find a free port and start callback server (pass state for CSRF verification)\n const { port, waitForCode, close } = await startCallbackServer(state);\n\n const redirectUri = `http://localhost:${port}/callback`;\n const authUrl = new URL(`${WORKOS_AUTH_URL}/user_management/authorize`);\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"code_challenge\", codeChallenge);\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authUrl.searchParams.set(\"provider\", \"authkit\");\n authUrl.searchParams.set(\"state\", state);\n\n // Open browser\n const open = (await import(\"open\")).default;\n await open(authUrl.toString());\n\n console.log(\"\\nOpening browser for login...\");\n console.log(`If it doesn't open, visit: ${authUrl.toString()}\\n`);\n\n // Wait for the callback\n const code = await waitForCode();\n close();\n\n // Exchange code for tokens\n const tokenResponse = await fetch(\n `${WORKOS_API_URL}/user_management/authenticate`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n }),\n },\n );\n\n if (!tokenResponse.ok) {\n const error = await tokenResponse.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const data = (await tokenResponse.json()) as {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n user: {\n id: string;\n email: string;\n first_name?: string;\n last_name?: string;\n };\n };\n\n const userName = [data.user.first_name, data.user.last_name]\n .filter(Boolean)\n .join(\" \");\n\n writeTokens({\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresAt: Date.now() + (data.expires_in ?? 300) * 1000,\n user: {\n id: data.user.id,\n email: data.user.email,\n name: userName,\n },\n workosClientId: clientId,\n });\n\n return { email: data.user.email, name: userName };\n}\n\nfunction startCallbackServer(expectedState: string): Promise<{\n port: number;\n waitForCode: () => Promise<string>;\n close: () => void;\n}> {\n return new Promise((resolve, reject) => {\n let resolveCode: (code: string) => void;\n let rejectCode: (err: Error) => void;\n\n const codePromise = new Promise<string>((res, rej) => {\n resolveCode = res;\n rejectCode = rej;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const error = url.searchParams.get(\"error\");\n const returnedState = url.searchParams.get(\"state\");\n\n // Verify state parameter to prevent CSRF\n if (returnedState !== expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login failed</h1><p>Invalid state parameter. You can close this tab.</p></body></html>\",\n );\n rejectCode(new Error(\"OAuth state mismatch — possible CSRF attack\"));\n return;\n }\n\n if (error) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login failed</h1><p>You can close this tab.</p></body></html>\",\n );\n rejectCode(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (code) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login successful!</h1><p>You can close this tab and return to the terminal.</p></body></html>\",\n );\n resolveCode(code);\n return;\n }\n\n res.writeHead(400);\n res.end(\"Missing code parameter\");\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n // Listen on a random available port\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n reject(new Error(\"Failed to start callback server\"));\n return;\n }\n\n resolve({\n port: addr.port,\n waitForCode: () => codePromise,\n close: () => server.close(),\n });\n });\n\n server.on(\"error\", reject);\n\n // Timeout after 5 minutes\n setTimeout(\n () => {\n rejectCode(new Error(\"Login timed out (5 minutes)\"));\n server.close();\n },\n 5 * 60 * 1000,\n );\n });\n}\n","/**\n * Device Authorization Flow — Double Handshake\n *\n * 1. CLI gets a unique URL + deviceCode from backend\n * 2. User pastes URL in browser → page shows confirmation code\n * 3. User types confirmation code back into CLI\n * 4. CLI polls with deviceCode + confirmationCode → gets tokens\n */\n\nimport { createInterface } from \"node:readline\";\nimport { getSiteUrl } from \"../config.js\";\nimport { writeTokens } from \"./token-store.js\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr, // Use stderr so stdout stays clean for MCP\n });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\ninterface DeviceCodeResponse {\n deviceCode: string;\n verificationUri: string;\n expiresAt: number;\n interval: number;\n}\n\ninterface PollResponse {\n status:\n | \"pending\"\n | \"authorized\"\n | \"expired\"\n | \"rate_limited\"\n | \"invalid_code\";\n refreshToken?: string;\n accessToken?: string;\n expiresAt?: number;\n user?: { id: string; email: string; name: string };\n orgSlug?: string;\n interval?: number;\n}\n\n/**\n * Run the double-handshake device authorization flow.\n */\nexport async function deviceLogin(): Promise<{\n email: string;\n name: string;\n}> {\n const siteUrl = getSiteUrl();\n\n // 1. Request device code + session URL\n const codeRes = await fetch(`${siteUrl}/api/auth/device/code`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n if (!codeRes.ok) {\n const body = await codeRes.text();\n throw new Error(`Failed to start device flow: ${body}`);\n }\n\n const codeData = (await codeRes.json()) as DeviceCodeResponse;\n\n // 2. Show URL for user to paste in browser\n console.log(\"\");\n console.log(\" Paste this URL in your browser to sign in:\");\n console.log(\"\");\n console.log(` ${codeData.verificationUri}`);\n console.log(\"\");\n\n // 3. Wait for user to enter the confirmation code from the browser\n const confirmationCode = await prompt(\" Enter the code from your browser: \");\n\n if (!confirmationCode) {\n throw new Error(\"No confirmation code entered.\");\n }\n\n // Normalize: uppercase, strip dashes/spaces\n const normalizedCode = confirmationCode\n .toUpperCase()\n .replace(/[\\s-]/g, \"\")\n .replace(/^(.{4})/, \"$1-\");\n\n console.log(\" Verifying...\");\n\n // 4. Poll with deviceCode + confirmationCode\n let pollInterval = codeData.interval * 1000;\n\n while (Date.now() < codeData.expiresAt) {\n const pollRes = await fetch(`${siteUrl}/api/auth/device/poll`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n deviceCode: codeData.deviceCode,\n confirmationCode: normalizedCode,\n }),\n });\n\n if (pollRes.status === 429) {\n const data = (await pollRes.json()) as PollResponse;\n pollInterval = (data.interval ?? codeData.interval * 2) * 1000;\n await sleep(pollInterval);\n continue;\n }\n\n const data = (await pollRes.json()) as PollResponse;\n\n if (data.status === \"pending\") {\n // User hasn't clicked Authorize yet — wait and retry\n await sleep(pollInterval);\n continue;\n }\n\n if (data.status === \"authorized\") {\n writeTokens({\n accessToken: data.accessToken!,\n refreshToken: data.refreshToken!,\n expiresAt: data.expiresAt!,\n user: data.user!,\n orgSlug: data.orgSlug ?? undefined,\n tokenType: \"service\",\n });\n\n return { email: data.user!.email, name: data.user!.name };\n }\n\n if (data.status === \"invalid_code\") {\n throw new Error(\n \"Invalid confirmation code. Make sure you copied the code from the browser correctly.\",\n );\n }\n\n if (data.status === \"expired\") {\n throw new Error(\"Device authorization expired. Run `fml login` again.\");\n }\n\n throw new Error(`Device authorization failed: ${data.status}`);\n }\n\n throw new Error(\n \"Device authorization timed out (15 minutes). Run `fml login` again.\",\n );\n}\n","import fs from \"node:fs\";\nimport { authStorePath } from \"../config.js\";\n\nexport function handleLogout(): void {\n try {\n fs.unlinkSync(authStorePath());\n } catch {\n // File doesn't exist, that's fine\n }\n console.log(\"Logged out. Stored credentials cleared.\");\n}\n","import { createApiClient } from \"../convex-client.js\";\nimport {\n getSelectedOrg,\n getValidToken,\n setSelectedOrg,\n} from \"../auth/token-store.js\";\n\nexport async function handleOrg(slug?: string): Promise<void> {\n const token = await getValidToken();\n if (!token) {\n console.error(\"Not logged in. Run `fml login` first.\");\n process.exit(1);\n }\n\n const api = createApiClient(token);\n const orgs = await api.queryOrgs();\n\n if (orgs.length === 0) {\n console.error(\"No organizations found.\");\n process.exit(1);\n }\n\n const current = getSelectedOrg();\n\n // No slug provided — show current selection and available orgs\n if (!slug) {\n console.log(\"Organizations:\\n\");\n for (const org of orgs) {\n const orgSlug = org.slug ?? org.name;\n const marker = orgSlug === current ? \" (selected)\" : \"\";\n console.log(` ${orgSlug}${marker}`);\n }\n if (!current) {\n console.log(\"\\nNo org selected. Run `fml org <slug>` to select one.\");\n }\n return;\n }\n\n // Slug provided — select it\n const match = orgs.find(\n (o) => (o.slug ?? o.name) === slug || o.name === slug,\n );\n if (!match) {\n console.error(\n `Organization \"${slug}\" not found. Available: ${orgs.map((o) => o.slug ?? o.name).join(\", \")}`,\n );\n process.exit(1);\n }\n\n const matchSlug = match.slug ?? match.name;\n setSelectedOrg(matchSlug);\n console.log(`Selected org: ${match.name} (${matchSlug})`);\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nconst APP_BASE_URL = \"https://app.fml.app\";\n\nexport async function handleOpen(opts: { json?: boolean }): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login` first.\");\n process.exit(1);\n }\n\n let slug: string;\n try {\n const orgs = await api.queryOrgs();\n if (orgs.length === 0) {\n console.error(\"No organizations found.\");\n process.exit(1);\n }\n slug = orgs[0].slug ?? orgs[0].name;\n } catch {\n console.error(\"Could not fetch organizations. Opening base URL.\");\n slug = \"\";\n }\n\n const url = slug ? `${APP_BASE_URL}/${slug}` : APP_BASE_URL;\n\n if (opts.json) {\n console.log(JSON.stringify({ url }));\n } else {\n const openBrowser = (await import(\"open\")).default;\n await openBrowser(url);\n }\n}\n","import { getValidToken, readTokens } from \"../auth/token-store.js\";\nimport { getActiveEnv } from \"../config.js\";\n\nexport async function handleStatus(): Promise<void> {\n const { name, convexUrl } = getActiveEnv();\n console.log(`Environment: ${name}`);\n console.log(` Convex: ${convexUrl}\\n`);\n\n const tokens = readTokens();\n\n if (!tokens) {\n console.log(\"Not authenticated. Run `fml login` to sign in.\");\n return;\n }\n\n const tokenValid = await getValidToken();\n\n console.log(\"Authentication:\");\n console.log(` User: ${tokens.user.name} (${tokens.user.email})`);\n console.log(\n ` Token: ${tokenValid ? \"valid\" : \"expired (needs refresh/re-login)\"}`,\n );\n console.log(` Org: ${tokens.orgSlug ?? \"(none — run `fml org <slug>`)\"}`);\n}\n","import { DEFAULT_SYNC_URL, DEFAULT_TARGET_NAME } from \"../config.js\";\nimport { resolveSyncTokenCommand } from \"../sync/client.js\";\nimport {\n addTarget,\n removeTarget,\n listTargets,\n loadSyncConfig,\n saveSyncConfig,\n} from \"@fml-inc/panopticon/sync\";\nimport { syncPending, syncReset } from \"@fml-inc/panopticon/api\";\n\n// ── Setup (convenience shortcut) ────────────────────────────────────────────\n\nexport async function handleSyncSetup(): Promise<void> {\n console.log(\"FML Sync Setup\\n\");\n\n const tokenCommand = resolveSyncTokenCommand();\n if (!tokenCommand) {\n console.error(\n \"No credential available. Run `fml login` first, or set PANOPTICON_GITHUB_TOKEN / install gh CLI.\",\n );\n process.exit(1);\n }\n\n // Replace any existing entry so re-running setup upgrades the target in\n // place (e.g. URL-only → fml sync-token after first login).\n removeTarget(DEFAULT_TARGET_NAME);\n addTarget({\n name: DEFAULT_TARGET_NAME,\n url: DEFAULT_SYNC_URL,\n tokenCommand,\n });\n\n console.log(`Sync target \"${DEFAULT_TARGET_NAME}\" configured:`);\n console.log(` URL: ${DEFAULT_SYNC_URL}`);\n console.log(` Auth: ${tokenCommand}`);\n console.log(`\\nRestart panopticon to activate: fml stop && fml start`);\n}\n\n// ── List ─────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncList(): Promise<void> {\n const targets = listTargets();\n\n if (targets.length === 0) {\n console.log(\n \"No sync targets configured. Run `fml sync setup` or `fml sync add`.\",\n );\n return;\n }\n\n console.log(\"Sync targets:\\n\");\n for (const t of targets) {\n const auth = t.token\n ? \"static token\"\n : t.tokenCommand\n ? `command: ${t.tokenCommand}`\n : \"none\";\n console.log(` ${t.name}`);\n console.log(` URL: ${t.url}`);\n console.log(` Auth: ${auth}`);\n }\n}\n\n// ── Add ──────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncAdd(\n name: string,\n url: string,\n opts: { tokenCmd?: string; token?: string },\n): Promise<void> {\n const existing = listTargets();\n if (existing.some((t) => t.name === name)) {\n console.error(\n `Target \"${name}\" already exists. Use \\`fml sync edit\\` to modify it.`,\n );\n process.exit(1);\n }\n\n addTarget({\n name,\n url,\n tokenCommand: opts.tokenCmd,\n token: opts.token,\n });\n\n console.log(`Sync target \"${name}\" added:`);\n console.log(` URL: ${url}`);\n if (opts.tokenCmd) console.log(` Auth: command: ${opts.tokenCmd}`);\n else if (opts.token) console.log(\" Auth: static token\");\n else console.log(\" Auth: none\");\n console.log(\"\\nRestart panopticon to activate: fml stop && fml start\");\n}\n\n// ── Remove ───────────────────────────────────────────────────────────────────\n\nexport async function handleSyncRemove(name: string): Promise<void> {\n const removed = removeTarget(name);\n if (removed) {\n console.log(`Sync target \"${name}\" removed.`);\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n } else {\n console.error(`Target \"${name}\" not found.`);\n process.exit(1);\n }\n}\n\n// ── Edit ─────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncEdit(\n name: string,\n opts: { url?: string; tokenCmd?: string; token?: string },\n): Promise<void> {\n const config = loadSyncConfig();\n const target = config.targets.find((t) => t.name === name);\n if (!target) {\n console.error(`Target \"${name}\" not found.`);\n process.exit(1);\n }\n\n if (opts.url) target.url = opts.url;\n if (opts.tokenCmd) {\n target.tokenCommand = opts.tokenCmd;\n delete target.token;\n }\n if (opts.token) {\n target.token = opts.token;\n delete target.tokenCommand;\n }\n\n saveSyncConfig(config);\n console.log(`Sync target \"${name}\" updated:`);\n console.log(` URL: ${target.url}`);\n const auth = target.token\n ? \"static token\"\n : target.tokenCommand\n ? `command: ${target.tokenCommand}`\n : \"none\";\n console.log(` Auth: ${auth}`);\n console.log(\"\\nRestart panopticon to apply: fml stop && fml start\");\n}\n\n// ── Status ───────────────────────────────────────────────────────────────────\n\nexport async function handleSyncStatus(): Promise<void> {\n const targets = listTargets();\n\n if (targets.length === 0) {\n console.log(\"No sync targets configured. Run `fml sync setup` first.\");\n return;\n }\n\n for (const target of targets) {\n const auth = target.token\n ? \"static token\"\n : target.tokenCommand\n ? `command: ${target.tokenCommand}`\n : \"none\";\n console.log(`${target.name}:`);\n console.log(` URL: ${target.url}`);\n console.log(` Auth: ${auth}`);\n\n try {\n const result = await syncPending(target.name);\n if (result.totalPending === 0) {\n console.log(\" Status: up to date\");\n } else {\n console.log(` Pending: ${result.totalPending} total`);\n for (const [table, info] of Object.entries(result.tables)) {\n console.log(\n ` ${table}: ${info.pending} pending (${info.synced} / ${info.total})`,\n );\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.log(` Status: unavailable (${msg})`);\n }\n console.log();\n }\n}\n\n// ── Reset ────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncReset(targetName?: string): Promise<void> {\n await syncReset(targetName ?? DEFAULT_TARGET_NAME);\n console.log(\n `Sync watermarks for \"${targetName ?? DEFAULT_TARGET_NAME}\" reset to 0.`,\n );\n}\n","import { once } from \"node:events\";\nimport { getValidToken } from \"../auth/token-store.js\";\n\n/**\n * Print the current FML access token to stdout.\n *\n * Wired into panopticon sync targets as `tokenCommand: \"fml sync-token\"`.\n * Resolves and refreshes the stored FML session token, the same credential\n * `fml login` produces. Used on sandboxes / CI / containers where there's\n * no `gh auth token` to attribute sync telemetry to a GitHub identity.\n *\n * Output: token on stdout, nothing else. Non-zero exit on any failure so\n * panopticon's token helper treats it as a missed refresh rather than\n * caching an empty string as the bearer.\n */\nexport async function handleSyncToken(opts?: {\n env?: string;\n}): Promise<void> {\n const token = await getValidToken({ env: opts?.env });\n if (!token) {\n const suffix = opts?.env ? ` for env \"${opts.env}\"` : \"\";\n console.error(\n `fml: not logged in${suffix}. Run \\`fml login\\` to enable sync.`,\n );\n process.exit(1);\n }\n // Wait for drain before exiting — small writes on a pipe are usually\n // synchronous up to PIPE_BUF, but on slow/full pipes (or non-Linux\n // platforms) `process.exit` can cut off the write mid-flight and\n // hand panopticon a truncated token.\n if (!process.stdout.write(token)) {\n await once(process.stdout, \"drain\");\n }\n process.exit(0);\n}\n","import { listTargets } from \"@fml-inc/panopticon/sync\";\nimport { getActiveEnv, writeEnvConfig } from \"../config.js\";\nimport { handleStop, handleStart } from \"./daemon.js\";\n\n/**\n * Show the active environment.\n */\nexport function handleEnvShow(): void {\n const { name, convexUrl } = getActiveEnv();\n console.log(`Environment: ${name}`);\n console.log(` Convex URL: ${convexUrl}`);\n}\n\n/**\n * Switch to a sync target as the active environment.\n * Automatically restarts daemons so the new URL takes effect.\n */\nexport async function handleEnvSwitch(target: string): Promise<void> {\n const targets = listTargets();\n const match = targets.find((t) => t.name === target);\n if (!match) {\n console.error(`Sync target \"${target}\" not found. Available targets:`);\n for (const t of targets) {\n console.error(` ${t.name} ${t.url}`);\n }\n console.error(\"\\nAdd a target with `fml sync add`.\");\n process.exit(1);\n }\n\n writeEnvConfig({ active: target });\n const convexUrl = match.url.replace(\".convex.site\", \".convex.cloud\");\n console.log(`Switched to ${target}: ${convexUrl}`);\n\n console.log(\"\\nRestarting daemons...\");\n handleStop();\n await handleStart();\n console.log(\n \"MCP server will pick up the change on next Claude Code session.\",\n );\n}\n","/**\n * CLI wrappers for remote FML backend data queries.\n * Each command queries the FML Convex backend via the authenticated API client.\n */\n\nimport { getAuthenticatedClient } from \"../convex-client.js\";\n\nasync function queryBackend(\n toolName: string,\n args: Record<string, unknown>,\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login` to sign in.\");\n process.exit(1);\n }\n const result = await api.callBackend(toolName, args);\n if (!result.ok) {\n console.error(result.error ?? \"Unknown error\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleActivity(opts: { since?: string }): Promise<void> {\n await queryBackend(\"get-engineering-activity\", {\n timeRange: opts.since ?? \"24h\",\n });\n}\n\nexport async function handleSessions(opts: {\n since?: string;\n limit?: string;\n}): Promise<void> {\n await queryBackend(\"list-engineering-sessions\", {\n timeRange: opts.since ?? \"24h\",\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n}\n\nexport async function handleTimeline(\n sessionId: string,\n opts: { limit?: string; offset?: string },\n): Promise<void> {\n await queryBackend(\"get-session-timeline\", {\n sessionId,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n offset: opts.offset ? parseInt(opts.offset, 10) : undefined,\n });\n}\n\nexport async function handleSpending(opts: {\n since?: string;\n groupBy?: string;\n}): Promise<void> {\n await queryBackend(\"get-ai-spending\", {\n timeRange: opts.since ?? \"7d\",\n groupBy: opts.groupBy,\n });\n}\n\nexport async function handleSearch(\n query: string,\n opts: { since?: string; limit?: string },\n): Promise<void> {\n await queryBackend(\"search-engineering-sessions\", {\n query,\n timeRange: opts.since ?? \"7d\",\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n}\n","/**\n * Unified provider query command.\n * Routes requests to the appropriate backend tool based on provider and endpoint.\n */\n\nimport { getAuthenticatedClient } from \"../convex-client.js\";\n\nconst GENERIC_PROVIDERS = [\n \"sentry\",\n \"slack\",\n \"github\",\n \"linear\",\n \"notion\",\n \"freshdesk\",\n \"stripe\",\n];\n\nconst POSTHOG_ENDPOINTS: Record<string, string> = {\n insights: \"query-posthog-insights\",\n events: \"query-posthog-events\",\n recordings: \"query-posthog-recordings\",\n \"feature-flags\": \"query-posthog-feature-flags\",\n experiments: \"query-posthog-experiments\",\n surveys: \"query-posthog-surveys\",\n hogql: \"run-posthog-hogql\",\n cohorts: \"query-posthog-cohorts\",\n};\n\nconst AMPLITUDE_ENDPOINTS: Record<string, string> = {\n events: \"query-amplitude-events\",\n funnel: \"query-amplitude-funnel\",\n retention: \"query-amplitude-retention\",\n chart: \"get-amplitude-chart\",\n \"list-events\": \"list-amplitude-events\",\n};\n\nconst META_ADS_ENDPOINTS: Record<string, string> = {\n accounts: \"list-meta-ad-accounts\",\n campaigns: \"list-meta-campaigns\",\n insights: \"get-meta-ad-insights\",\n \"ad-sets\": \"list-meta-ad-sets\",\n};\n\nfunction parseBody(body?: string): Record<string, unknown> {\n if (!body) return {};\n try {\n return JSON.parse(body) as Record<string, unknown>;\n } catch {\n console.error(\"Invalid JSON in --body argument.\");\n process.exit(1);\n }\n}\n\nexport async function handleQuery(\n provider: string,\n endpoint: string,\n opts: { method?: string; body?: string; projectId?: string },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n\n const parsedBody = parseBody(opts.body);\n let toolName: string;\n let args: Record<string, unknown>;\n\n if (GENERIC_PROVIDERS.includes(provider)) {\n toolName = `integration-${provider}`;\n args = {\n endpoint,\n method: opts.method || \"GET\",\n body: parsedBody,\n projectId: opts.projectId,\n };\n } else if (provider === \"posthog\") {\n toolName = POSTHOG_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown posthog endpoint: ${endpoint}. Valid: ${Object.keys(POSTHOG_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n args = { ...parsedBody };\n } else if (provider === \"amplitude\") {\n toolName = AMPLITUDE_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown amplitude endpoint: ${endpoint}. Valid: ${Object.keys(AMPLITUDE_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n // list-events takes no args — --body is ignored for this endpoint\n args = endpoint === \"list-events\" ? {} : { ...parsedBody };\n } else if (provider === \"meta-ads\") {\n toolName = META_ADS_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown meta-ads endpoint: ${endpoint}. Valid: ${Object.keys(META_ADS_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n // accounts takes no args — --body is ignored for this endpoint\n args = endpoint === \"accounts\" ? {} : { ...parsedBody };\n } else {\n console.error(\n `Unknown provider: ${provider}. Valid: ${[...GENERIC_PROVIDERS, \"posthog\", \"amplitude\", \"meta-ads\"].join(\", \")}`,\n );\n process.exit(1);\n }\n\n const result = await api.callBackend(toolName, args);\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleAutomationList(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-automations\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationCreate(opts: {\n name: string;\n prompt: string;\n frequency: string;\n hour: string;\n minute: string;\n timezone: string;\n dayOfWeek?: string;\n dayOfMonth?: string;\n maxRuns?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"create-automation\", {\n name: opts.name,\n prompt: opts.prompt,\n frequency: opts.frequency,\n hour: parseInt(opts.hour, 10),\n minute: parseInt(opts.minute, 10),\n timezone: opts.timezone,\n dayOfWeek: opts.dayOfWeek ? parseInt(opts.dayOfWeek, 10) : undefined,\n dayOfMonth: opts.dayOfMonth ? parseInt(opts.dayOfMonth, 10) : undefined,\n maxRuns: opts.maxRuns ? parseInt(opts.maxRuns, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationCreatePattern(opts: {\n name: string;\n prompt: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"create-pattern-automation\", {\n name: opts.name,\n prompt: opts.prompt,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationUpdate(\n id: string,\n opts: {\n name?: string;\n prompt?: string;\n enabled?: string;\n frequency?: string;\n hour?: string;\n minute?: string;\n timezone?: string;\n dayOfWeek?: string;\n dayOfMonth?: string;\n },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"update-automation\", {\n automationId: id,\n name: opts.name,\n prompt: opts.prompt,\n enabled:\n opts.enabled !== undefined\n ? (() => {\n if (opts.enabled !== \"true\" && opts.enabled !== \"false\") {\n console.error(\n `Invalid --enabled value: \"${opts.enabled}\". Use \"true\" or \"false\".`,\n );\n process.exit(1);\n }\n return opts.enabled === \"true\";\n })()\n : undefined,\n frequency: opts.frequency,\n hour: opts.hour ? parseInt(opts.hour, 10) : undefined,\n minute: opts.minute ? parseInt(opts.minute, 10) : undefined,\n timezone: opts.timezone,\n dayOfWeek: opts.dayOfWeek ? parseInt(opts.dayOfWeek, 10) : undefined,\n dayOfMonth: opts.dayOfMonth ? parseInt(opts.dayOfMonth, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationDelete(id: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"delete-automation\", {\n automationId: id,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationTest(id: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"test-automation\", {\n automationId: id,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleMemoryList(opts: {\n scope?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-memory-files\", {\n scope: opts.scope,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryRead(fileId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"read-memory-file\", { fileId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryWrite(opts: {\n title: string;\n content: string;\n scope?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"write-memory-file\", {\n title: opts.title,\n content: opts.content,\n scope: opts.scope,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryDelete(fileId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"delete-memory-file\", { fileId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSearchAnalysis(\n query: string,\n opts: {\n status?: string;\n limit?: string;\n repoId?: string;\n promptKey?: string;\n },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"search-analysis\", {\n query,\n status: opts.status,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n promptKey: opts.promptKey,\n ...(opts.repoId ? { repositoryId: opts.repoId } : {}),\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleRunAnalysis(opts: {\n prompts?: string;\n repoId?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"run-analysis-workflow\", {\n selectedPromptKeys: opts.prompts?.split(\",\"),\n // Only include repositoryId when the user actually passed --repo-id,\n // so the payload matches the MCP-side schema shape (undefined key is\n // technically equivalent but makes log diffs noisier).\n ...(opts.repoId ? { repositoryId: opts.repoId } : {}),\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleRunTeamAnalysis(opts: {\n windowDays?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"run-team-analysis\", {\n windowDays: opts.windowDays ? parseInt(opts.windowDays, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleIntegrations(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-integrations\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleEvents(opts: {\n source?: string;\n eventType?: string;\n projectId?: string;\n since?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-integration-events\", {\n source: opts.source,\n eventType: opts.eventType,\n projectId: opts.projectId,\n timeRange: opts.since,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleResolveIdentity(opts: {\n provider?: string;\n username?: string;\n email?: string;\n externalId?: string;\n externalUserId?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"resolve-identities\", {\n provider: opts.provider,\n externalUsername: opts.username,\n normalizedEmail: opts.email,\n externalId: opts.externalId,\n externalUserId: opts.externalUserId,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSlackHistory(opts: {\n channel?: string;\n limit?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-slack-channel-history\", {\n channelId: opts.channel,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleSlackMessage(opts: {\n permalink?: string;\n channel?: string;\n ts?: string;\n includeThread?: boolean;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-slack-message\", {\n permalink: opts.permalink,\n channelId: opts.channel,\n messageTs: opts.ts,\n includeThreadContext: opts.includeThread,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleMessagesList(opts: {\n start?: string;\n end?: string;\n limit?: string;\n cursor?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-messages\", {\n startTime: opts.start ? parseInt(opts.start, 10) : undefined,\n endTime: opts.end ? parseInt(opts.end, 10) : undefined,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n cursor: opts.cursor,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMessagesContext(\n messageId: string,\n opts: { before?: string; after?: string },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-messages-with-context\", {\n messageId,\n before: opts.before ? parseInt(opts.before, 10) : undefined,\n after: opts.after ? parseInt(opts.after, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSkillsList(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-skills\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleSkillsLoad(skillId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"load-skill\", { skillId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleConfigList(opts: {\n org: string;\n repo?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n try {\n const result = opts.repo\n ? await api.listRepoConfigSnapshots(opts.org, opts.repo)\n : await api.listUserConfigSnapshots(opts.org);\n console.log(JSON.stringify(result, null, 2));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\nexport async function handleConfigDetail(opts: {\n org: string;\n user?: string;\n repo?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n try {\n const result = opts.repo\n ? await api.getRepoConfigDetail(opts.org, opts.repo)\n : opts.user\n ? await api.getUserConfigDetail(opts.org, opts.user)\n : null;\n if (!result) {\n console.error(\"Provide --user or --repo\");\n process.exit(1);\n }\n console.log(JSON.stringify(result, null, 2));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["parts","pc","execFileSync","fs","os","path","CLAUDE_DIR","path","os","CLAUDE_SETTINGS_PATH","MARKETPLACE_DIR","readJsonFile","fs","writeJsonFile","execFileSync","execSync","execSync","addTarget","loadSyncConfig","fs","data","config","loadSyncConfig","addTarget","readTokens","fs","fs","addTarget","listTargets","loadSyncConfig","saveSyncConfig","syncPending","config","listTargets","listTargets"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/doctor.ts","../src/commands/install.ts","../src/banner.ts","../src/sync/client.ts","../src/commands/uninstall.ts","../src/commands/update.ts","../src/commands/login.ts","../src/auth/oauth.ts","../src/auth/device-flow.ts","../src/commands/logout.ts","../src/commands/org.ts","../src/commands/open.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/sync-token.ts","../src/commands/env.ts","../src/commands/data.ts","../src/commands/query.ts","../src/commands/automation.ts","../src/commands/memory.ts","../src/commands/analysis.ts","../src/commands/integrations.ts","../src/commands/slack.ts","../src/commands/messages.ts","../src/commands/skills.ts","../src/commands/config-snapshots.ts","../src/commands/tools.ts"],"sourcesContent":["#!/usr/bin/env node\n\ndeclare const __FML_PLUGIN_VERSION__: string;\n\nimport { ensureNativeModules } from \"./native-check.js\";\nensureNativeModules();\n\nimport { Command } from \"commander\";\nimport { initSentry, Sentry } from \"./sentry.js\";\n\nimport { handleDoctor } from \"./commands/doctor.js\";\nimport { handleInstall } from \"./commands/install.js\";\nimport { handleUninstall } from \"./commands/uninstall.js\";\nimport { handleUpdate } from \"./commands/update.js\";\nimport { handleLogin } from \"./commands/login.js\";\nimport { handleLogout } from \"./commands/logout.js\";\nimport { handleOrg } from \"./commands/org.js\";\nimport { handleOpen } from \"./commands/open.js\";\nimport { handleStatus } from \"./commands/status.js\";\nimport { handleStart, handleStop } from \"./commands/daemon.js\";\nimport {\n handleSyncAdd,\n handleSyncEdit,\n handleSyncList,\n handleSyncRemove,\n handleSyncReset,\n handleSyncSetup,\n handleSyncStatus,\n} from \"./commands/sync.js\";\nimport { handleSyncToken } from \"./commands/sync-token.js\";\nimport { handleEnvShow, handleEnvSwitch } from \"./commands/env.js\";\nimport {\n handleActivity,\n handleSearch,\n handleSessions,\n handleSpending,\n handleTimeline,\n} from \"./commands/data.js\";\nimport { handleQuery } from \"./commands/query.js\";\nimport {\n handleAutomationList,\n handleAutomationCreate,\n handleAutomationCreatePattern,\n handleAutomationUpdate,\n handleAutomationDelete,\n handleAutomationTest,\n} from \"./commands/automation.js\";\nimport {\n handleMemoryList,\n handleMemoryRead,\n handleMemoryWrite,\n handleMemoryDelete,\n} from \"./commands/memory.js\";\nimport {\n handleSearchAnalysis,\n handleRunAnalysis,\n handleRunTeamAnalysis,\n} from \"./commands/analysis.js\";\nimport {\n handleIntegrations,\n handleEvents,\n handleResolveIdentity,\n} from \"./commands/integrations.js\";\nimport { handleSlackHistory, handleSlackMessage } from \"./commands/slack.js\";\nimport {\n handleMessagesList,\n handleMessagesContext,\n} from \"./commands/messages.js\";\nimport { handleSkillsList, handleSkillsLoad } from \"./commands/skills.js\";\nimport {\n handleConfigList,\n handleConfigDetail,\n} from \"./commands/config-snapshots.js\";\nimport {\n handleToolsList,\n handleToolsDescribe,\n handleToolsCall,\n} from \"./commands/tools.js\";\nimport { printBanner } from \"./banner.js\";\n\nawait initSentry();\n\n// Show the logo when running `fml` with no args or `fml --help`\nif (\n process.argv.length <= 2 ||\n process.argv.includes(\"--help\") ||\n process.argv.includes(\"-h\")\n) {\n printBanner();\n}\n\nconst program = new Command()\n .name(\"fml\")\n .description(\"FML agent tools for Claude Code\")\n .version(\n typeof __FML_PLUGIN_VERSION__ !== \"undefined\"\n ? __FML_PLUGIN_VERSION__\n : \"dev\",\n );\n\nconst tools = program\n .command(\"tools\", { hidden: true })\n .description(\"List all available CLI commands (including hidden agent tools)\")\n .action(() => {\n function formatCmd(cmd: typeof program, prefix = \"\") {\n const name = prefix ? `${prefix} ${cmd.name()}` : cmd.name();\n const args = cmd.registeredArguments\n .map((a) => (a.required ? `<${a.name()}>` : `[${a.name()}]`))\n .join(\" \");\n const opts = cmd.options\n .filter(\n (o) => !o.hidden && o.long !== \"--help\" && o.long !== \"--version\",\n )\n .map((o) => (o.mandatory ? o.flags : `[${o.flags}]`))\n .join(\" \");\n const usage = [name, args, opts].filter(Boolean).join(\" \");\n return `${usage}\\n ${cmd.description()}`;\n }\n\n const lines = program.commands\n .filter((c) => c.name() !== \"tools\" && c.name() !== \"help\")\n .flatMap((c) => {\n if (c.commands.length > 0) {\n return c.commands.map((s) => formatCmd(s, c.name()));\n }\n return [formatCmd(c)];\n });\n console.log(lines.join(\"\\n\\n\"));\n });\n\ntools\n .command(\"list\")\n .description(\"List backend tools available via the dynamic catalog\")\n .option(\"--category <category>\", \"Filter by category\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts) => handleToolsList(opts));\n\ntools\n .command(\"describe\")\n .description(\"Show description and input schema for a backend tool\")\n .argument(\"<name>\", \"Tool name (e.g. integration-github)\")\n .option(\"--json\", \"Output as JSON\")\n .action((name, opts) => handleToolsDescribe(name, opts));\n\ntools\n .command(\"call\")\n .description(\"Invoke a backend tool by name with JSON args\")\n .argument(\"<name>\", \"Tool name\")\n .option(\"--args <json>\", \"Args as a JSON string (defaults to {})\")\n .option(\"--file <path>\", \"Path to a JSON file containing args\")\n .action((name, opts) => handleToolsCall(name, opts));\n\nprogram\n .command(\"install\")\n .description(\"Register plugin, hooks, and daemons\")\n .action(() => handleInstall());\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove fml plugin, hooks, and optionally all data\")\n .option(\n \"--target <target>\",\n \"Target CLI: claude, gemini, codex, claude-desktop, all\",\n )\n .option(\"--purge\", \"Also remove all data, logs, and auth tokens\")\n .action((opts) => handleUninstall(opts));\n\nprogram\n .command(\"update\")\n .description(\"Update fml to the latest version\")\n .action(() => handleUpdate());\n\nprogram\n .command(\"login\")\n .description(\"Sign in to your FML account\")\n .option(\"--device\", \"Use device authorization flow (no browser needed)\")\n .action((opts: { device?: boolean }) => handleLogin(opts));\n\nprogram\n .command(\"logout\")\n .description(\"Sign out and clear stored credentials\")\n .action(() => handleLogout());\n\nprogram\n .command(\"org\")\n .description(\"Show or select organization\")\n .argument(\"[slug]\", \"Org slug to select\")\n .action((slug) => handleOrg(slug));\n\nprogram\n .command(\"status\")\n .description(\"Show current auth and daemon status\")\n .action(() => handleStatus());\n\nprogram\n .command(\"doctor\")\n .description(\"Check FML and panopticon configuration and connectivity\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts) => handleDoctor(opts));\n\nprogram\n .command(\"open\")\n .description(\"Open FML dashboard in browser\")\n .option(\"--json\", \"Output URL as JSON instead of opening browser\")\n .action((opts) => handleOpen(opts));\n\nprogram\n .command(\"env\")\n .description(\"Show or switch environment (dev/prod)\")\n .argument(\"[target]\", 'Environment name (\"dev\", \"prod\") or custom Convex URL')\n .action((target?: string) => {\n if (target) handleEnvSwitch(target);\n else handleEnvShow();\n });\n\nprogram\n .command(\"start\")\n .description(\"Start panopticon server and sync\")\n .action(() => handleStart());\n\nprogram\n .command(\"stop\")\n .description(\"Stop panopticon server and sync\")\n .action(() => handleStop());\n\n// ── Sync subcommand ───────────────────────────────────────────────────────\n\nconst sync = program.command(\"sync\").description(\"Manage sync configuration\");\n\nsync\n .command(\"setup\")\n .description(\"Configure sync targets (convenience shortcut)\")\n .action(() => handleSyncSetup());\n\nsync\n .command(\"list\")\n .description(\"List all sync targets\")\n .action(() => handleSyncList());\n\nsync\n .command(\"add\")\n .description(\"Add a sync target\")\n .argument(\"<name>\", \"Unique target name\")\n .argument(\"<url>\", \"OTLP HTTP endpoint URL\")\n .option(\"--token-cmd <cmd>\", \"Shell command that returns a bearer token\")\n .option(\"--token <token>\", \"Static bearer token\")\n .action(\n (name: string, url: string, opts: { tokenCmd?: string; token?: string }) =>\n handleSyncAdd(name, url, opts),\n );\n\nsync\n .command(\"remove\")\n .description(\"Remove a sync target\")\n .argument(\"<name>\", \"Target name to remove\")\n .action((name: string) => handleSyncRemove(name));\n\nsync\n .command(\"edit\")\n .description(\"Edit a sync target\")\n .argument(\"<name>\", \"Target name to edit\")\n .option(\"--url <url>\", \"New OTLP HTTP endpoint URL\")\n .option(\"--token-cmd <cmd>\", \"New shell command for bearer token\")\n .option(\"--token <token>\", \"New static bearer token\")\n .action(\n (name: string, opts: { url?: string; tokenCmd?: string; token?: string }) =>\n handleSyncEdit(name, opts),\n );\n\nsync\n .command(\"status\")\n .description(\"Show sync config and watermarks\")\n .action(() => handleSyncStatus());\n\nsync\n .command(\"reset\")\n .description(\"Reset sync watermarks\")\n .argument(\"[name]\", \"Target name (resets all if omitted)\")\n .action((name?: string) => handleSyncReset(name));\n\nprogram\n .command(\"sync-token\", { hidden: true })\n .description(\n \"Print a refreshed FML access token (for panopticon tokenCommand)\",\n )\n .option(\n \"--env <name>\",\n \"Read auth for a specific env (defaults to active env)\",\n )\n .action((opts: { env?: string }) => handleSyncToken(opts));\n\n// ── Data commands ───────────────────────────────────────────────────────────\n\nprogram\n .command(\"activity\")\n .description(\"Activity summary — sessions, prompts, tools, costs\")\n .option(\"--since <duration>\", 'Time window, e.g. \"24h\", \"7d\"')\n .action((opts) => handleActivity(opts));\n\nprogram\n .command(\"sessions\")\n .description(\"List recent sessions\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--limit <n>\", \"Max sessions to return\")\n .action((opts) => handleSessions(opts));\n\nprogram\n .command(\"timeline\")\n .description(\"Get events for a session\")\n .argument(\"<session-id>\", \"Session ID\")\n .option(\"--limit <n>\", \"Max events to return\")\n .option(\"--offset <n>\", \"Events to skip\")\n .action((sessionId, opts) => handleTimeline(sessionId, opts));\n\nprogram\n .command(\"spending\")\n .description(\"AI token usage and cost breakdown\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--group-by <key>\", \"Group by: session, model, or day\")\n .action((opts) => handleSpending(opts));\n\nprogram\n .command(\"search\")\n .description(\"Search across all sessions\")\n .argument(\"<query>\", \"Text to search for\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--limit <n>\", \"Max results\")\n .action((query, opts) => handleSearch(query, opts));\n\n// ── Query command (unified integration queries) ────────────────────────────\n\nprogram\n .command(\"query\", { hidden: true })\n .description(\"Query a connected integration\")\n .argument(\n \"<provider>\",\n \"Provider name (sentry, slack, github, linear, notion, freshdesk, stripe, posthog, amplitude, meta-ads)\",\n )\n .argument(\"<endpoint>\", \"API endpoint or subcommand\")\n .option(\"--method <method>\", \"HTTP method\", \"GET\")\n .option(\"--body <json>\", \"Request body as JSON string\")\n .option(\"--project-id <id>\", \"Project ID override\")\n .action((provider, endpoint, opts) => handleQuery(provider, endpoint, opts));\n\n// ── Automation subcommand ──────────────────────────────────────────────────\n\nconst automation = program\n .command(\"automation\", { hidden: true })\n .description(\"Manage automations\");\n\nautomation\n .command(\"list\")\n .description(\"List all automations\")\n .action(() => handleAutomationList());\n\nautomation\n .command(\"create-scheduled\")\n .description(\"Create a scheduled automation\")\n .requiredOption(\"--name <name>\", \"Automation name\")\n .requiredOption(\"--prompt <prompt>\", \"What to run\")\n .requiredOption(\"--frequency <freq>\", \"hourly, daily, weekly, or monthly\")\n .requiredOption(\"--hour <hour>\", \"Hour (0-23)\")\n .requiredOption(\"--minute <minute>\", \"Minute (0-59)\")\n .requiredOption(\"--timezone <tz>\", \"IANA timezone, e.g. America/Chicago\")\n .option(\"--day-of-week <day>\", \"Day of week (0=Sun..6=Sat) for weekly\")\n .option(\"--day-of-month <day>\", \"Day of month (1-31) for monthly\")\n .option(\"--max-runs <n>\", \"Max runs (1 for one-time)\")\n .action((opts) => handleAutomationCreate(opts));\n\nautomation\n .command(\"create-pattern\")\n .description(\"Create an event-triggered automation\")\n .requiredOption(\"--name <name>\", \"Automation name\")\n .requiredOption(\"--prompt <prompt>\", \"What to watch for and do\")\n .action((opts) => handleAutomationCreatePattern(opts));\n\nautomation\n .command(\"update\")\n .description(\"Update an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .option(\"--name <name>\", \"New name\")\n .option(\"--prompt <prompt>\", \"New prompt\")\n .option(\"--enabled <bool>\", \"Enable or disable (true/false)\")\n .option(\"--frequency <freq>\", \"New frequency\")\n .option(\"--hour <hour>\", \"New hour\")\n .option(\"--minute <minute>\", \"New minute\")\n .option(\"--timezone <tz>\", \"New timezone\")\n .option(\"--day-of-week <day>\", \"New day of week\")\n .option(\"--day-of-month <day>\", \"New day of month\")\n .action((id, opts) => handleAutomationUpdate(id, opts));\n\nautomation\n .command(\"delete\")\n .description(\"Delete an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .action((id) => handleAutomationDelete(id));\n\nautomation\n .command(\"test\")\n .description(\"Preview/test an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .action((id) => handleAutomationTest(id));\n\n// ── Memory subcommand ──────────────────────────────────────────────────────\n\nconst memory = program\n .command(\"memory\", { hidden: true })\n .description(\"Manage memory files\");\n\nmemory\n .command(\"list\")\n .description(\"List memory files\")\n .option(\"--scope <scope>\", \"Scope: project, org, or user\")\n .action((opts) => handleMemoryList(opts));\n\nmemory\n .command(\"read\")\n .description(\"Read a memory file\")\n .argument(\"<file-id>\", \"Memory file ID\")\n .action((fileId) => handleMemoryRead(fileId));\n\nmemory\n .command(\"write\")\n .description(\"Create or update a memory file\")\n .requiredOption(\"--title <title>\", \"File title\")\n .requiredOption(\"--content <content>\", \"File content\")\n .option(\"--scope <scope>\", \"Scope: project, org, or user\")\n .action((opts) => handleMemoryWrite(opts));\n\nmemory\n .command(\"delete\")\n .description(\"Delete a memory file\")\n .argument(\"<file-id>\", \"Memory file ID\")\n .action((fileId) => handleMemoryDelete(fileId));\n\n// ── Analysis commands ──────────────────────────────────────────────────────\n\nprogram\n .command(\"search-analysis\", { hidden: true })\n .description(\"Search codebase analysis results across one or all repos\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--status <status>\", \"Filter by status (complete, running, failed)\")\n .option(\"--prompt-key <key>\", \"Exact analysis type to filter by\")\n .option(\"--limit <n>\", \"Max results total across matched repos (default 20)\")\n .option(\n \"--repo-id <id>\",\n \"Limit search to one repository. Omit to search every repo in the org.\",\n )\n .action((query, opts) => handleSearchAnalysis(query, opts));\n\nprogram\n .command(\"run-analysis\", { hidden: true })\n .description(\"Run deep codebase analysis workflows on a repository\")\n .option(\n \"--prompts <list>\",\n \"Comma-separated: security,architecture,code-quality,performance,ux,dependencies,cost,ai-architecture,ai-security\",\n )\n .option(\n \"--repo-id <id>\",\n \"Target repository ID. Omit for single-repo orgs (auto-pick).\",\n )\n .action((opts) => handleRunAnalysis(opts));\n\nprogram\n .command(\"run-team-analysis\", { hidden: true })\n .description(\"Run a team-wide AI coding practice analysis for the org\")\n .option(\n \"--window-days <n>\",\n \"Size of the analysis window in days (default 30, min 1, max 90)\",\n )\n .action((opts) => handleRunTeamAnalysis(opts));\n\n// ── Integration commands ───────────────────────────────────────────────────\n\nprogram\n .command(\"integrations\", { hidden: true })\n .description(\"List connected integrations\")\n .action(() => handleIntegrations());\n\nprogram\n .command(\"events\", { hidden: true })\n .description(\"Recent integration events (deploys, releases, errors)\")\n .option(\n \"--source <source>\",\n \"Filter: github, sentry, linear, amplitude, stripe\",\n )\n .option(\"--event-type <type>\", \"Filter by event type\")\n .option(\"--project-id <id>\", \"Filter by project\")\n .option(\"--since <duration>\", \"Time range: 1h, 6h, 24h, 7d, 30d\")\n .action((opts) => handleEvents(opts));\n\nprogram\n .command(\"resolve-identity\", { hidden: true })\n .description(\"Resolve external identity to FML user\")\n .argument(\"[username]\", \"External username (shorthand for --username)\")\n .option(\"--provider <p>\", \"Provider: github, linear, slack\")\n .option(\"--username <u>\", \"External username\")\n .option(\"--email <e>\", \"Email address\")\n .option(\"--external-id <id>\", \"External ID\")\n .option(\"--external-user-id <id>\", \"External user ID\")\n .action((username, opts) =>\n handleResolveIdentity(username ? { ...opts, username } : opts),\n );\n\n// ── Slack subcommand ───────────────────────────────────────────────────────\n\nconst slack = program\n .command(\"slack\", { hidden: true })\n .description(\"Slack shortcuts\");\n\nslack\n .command(\"history\")\n .description(\"Recent messages from a channel\")\n .option(\"--channel <id>\", \"Channel ID\")\n .option(\"--limit <n>\", \"Max messages\")\n .action((opts) => handleSlackHistory(opts));\n\nslack\n .command(\"message\")\n .description(\"Fetch a specific message\")\n .option(\"--permalink <url>\", \"Message permalink\")\n .option(\"--channel <id>\", \"Channel ID\")\n .option(\"--ts <timestamp>\", \"Message timestamp\")\n .option(\"--include-thread\", \"Include thread context\")\n .action((opts) => handleSlackMessage(opts));\n\n// ── Messages subcommand ────────────────────────────────────────────────────\n\nconst messages = program\n .command(\"messages\", { hidden: true })\n .description(\"Conversation messages\");\n\nmessages\n .command(\"list\")\n .description(\"List messages from a conversation\")\n .option(\"--start <timestamp>\", \"Start time (ms epoch)\")\n .option(\"--end <timestamp>\", \"End time (ms epoch)\")\n .option(\"--limit <n>\", \"Max messages\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .action((opts) => handleMessagesList(opts));\n\nmessages\n .command(\"context\")\n .description(\"Get messages around a specific message\")\n .argument(\"<message-id>\", \"Message ID\")\n .option(\"--before <n>\", \"Messages before\")\n .option(\"--after <n>\", \"Messages after\")\n .action((messageId, opts) => handleMessagesContext(messageId, opts));\n\n// ── Skills subcommand ──────────────────────────────────────────────────────\n\nconst skills = program\n .command(\"skills\", { hidden: true })\n .description(\"Browse and load skills\");\n\nskills\n .command(\"list\")\n .description(\"List available skills\")\n .action(() => handleSkillsList());\n\nskills\n .command(\"load\")\n .description(\"Load a skill by ID\")\n .argument(\"<skill-id>\", \"Skill ID\")\n .action((skillId) => handleSkillsLoad(skillId));\n\n// ── Config subcommand ──────────────────────────────────────────────────────\n\nconst config = program\n .command(\"config\", { hidden: true })\n .description(\"View team config snapshots\");\n\nconfig\n .command(\"list\")\n .description(\"List config snapshots for an org\")\n .requiredOption(\"--org <slug>\", \"Organization slug\")\n .option(\"--repo <full-name>\", \"Filter by repo (owner/name)\")\n .action((opts) => handleConfigList(opts));\n\nconfig\n .command(\"detail\")\n .description(\"Get config snapshot detail\")\n .requiredOption(\"--org <slug>\", \"Organization slug\")\n .option(\"--user <username>\", \"GitHub username\")\n .option(\"--repo <full-name>\", \"Repository (owner/name)\")\n .action((opts) => handleConfigDetail(opts));\n\n// ────────────────────────────────────────────────────────────────────────────\n\nprogram.parseAsync(process.argv).catch((err) => {\n Sentry.captureException(err);\n console.error(err);\n process.exit(1);\n});\n","import ora from \"ora\";\nimport pc from \"picocolors\";\nimport { getValidToken, readTokens } from \"../auth/token-store.js\";\nimport { createApiClient } from \"../convex-client.js\";\nimport { CONVEX_URL } from \"../config.js\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { parsePanopticonRunning } from \"./daemon.js\";\nimport { loadSyncConfig } from \"@fml-inc/panopticon/sync\";\nimport { syncPending } from \"@fml-inc/panopticon/api\";\n\ninterface CheckResult {\n label: string;\n status: \"ok\" | \"warn\" | \"fail\";\n detail: string;\n}\n\nfunction reportResult(\n result: CheckResult,\n spinner: ReturnType<typeof ora> | null,\n): void {\n const text = `${result.label} — ${result.detail}`;\n if (spinner) {\n switch (result.status) {\n case \"ok\":\n spinner.succeed(text);\n break;\n case \"warn\":\n spinner.warn(text);\n break;\n case \"fail\":\n spinner.fail(text);\n break;\n }\n } else {\n const icon =\n result.status === \"ok\"\n ? pc.green(\"✓\")\n : result.status === \"warn\"\n ? pc.yellow(\"!\")\n : pc.red(\"✗\");\n console.log(` ${icon} ${result.label} — ${result.detail}`);\n }\n}\n\nexport async function handleDoctor(opts: { json?: boolean }): Promise<void> {\n const isTTY = !opts.json && process.stdout.isTTY === true;\n const checks: CheckResult[] = [];\n\n function startSpinner(label: string): ReturnType<typeof ora> | null {\n if (!isTTY) return null;\n return ora({ text: `Checking ${label}...`, indent: 2 }).start();\n }\n\n function pushAndReport(\n result: CheckResult,\n spinner: ReturnType<typeof ora> | null,\n ): void {\n checks.push(result);\n if (!opts.json) {\n reportResult(result, spinner);\n }\n }\n\n if (!opts.json && !isTTY) {\n console.log(\"\");\n }\n\n // 1. Auth check\n let token: string | null = null;\n {\n const spinner = startSpinner(\"auth\");\n token = await getValidToken();\n if (token) {\n const stored = readTokens();\n const detail = stored?.user?.email\n ? `Logged in as ${stored.user.email}`\n : \"Token present\";\n pushAndReport({ label: \"Auth\", status: \"ok\", detail }, spinner);\n } else {\n pushAndReport(\n {\n label: \"Auth\",\n status: \"fail\",\n detail: \"No token. Run `fml login`\",\n },\n spinner,\n );\n }\n }\n\n // 2. Panopticon checks (imported dynamically to avoid hard dep on published version)\n {\n const spinner = startSpinner(\"panopticon\");\n try {\n const { doctor } = await import(\"@fml-inc/panopticon/doctor\");\n const result = await doctor();\n // Close the spinner before reporting individual checks\n if (spinner) spinner.stop();\n for (const check of result.checks) {\n pushAndReport(check, null);\n }\n } catch {\n // Panopticon doctor not available — check via CLI\n const result = panopticonExec(\"status\");\n if (result.ok) {\n pushAndReport(\n { label: \"Panopticon\", status: \"ok\", detail: \"Available\" },\n spinner,\n );\n } else {\n pushAndReport(\n {\n label: \"Panopticon\",\n status: \"fail\",\n detail: \"Not found. Run `fml install`\",\n },\n spinner,\n );\n }\n }\n }\n\n // 3. Sync status (only if authenticated)\n if (token) {\n const spinner = startSpinner(\"sync\");\n try {\n const syncConfig = loadSyncConfig();\n const targets = syncConfig.targets;\n if (targets.length === 0) {\n pushAndReport(\n {\n label: \"Sync\",\n status: \"warn\",\n detail: \"No sync targets configured\",\n },\n spinner,\n );\n } else {\n // Close the spinner before reporting per-target\n if (spinner) spinner.stop();\n\n for (const target of targets) {\n try {\n const result = await syncPending(target.name);\n if (result.totalPending === 0) {\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: \"ok\",\n detail: \"Up to date\",\n },\n null,\n );\n } else {\n const parts = Object.entries(result.tables)\n .sort(([, a], [, b]) => b.pending - a.pending)\n .slice(0, 3)\n .map(([t, v]) => `${v.pending} ${t}`);\n const detail =\n parts.length < Object.keys(result.tables).length\n ? `${result.totalPending} pending (${parts.join(\", \")}, ...)`\n : `${result.totalPending} pending (${parts.join(\", \")})`;\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: result.totalPending > 1000 ? \"warn\" : \"ok\",\n detail,\n },\n null,\n );\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: \"warn\",\n detail: `Could not query watermarks (${msg})`,\n },\n null,\n );\n }\n }\n }\n } catch (err) {\n pushAndReport(\n {\n label: \"Sync\",\n status: \"warn\",\n detail: err instanceof Error ? err.message : \"Check failed\",\n },\n spinner,\n );\n }\n }\n\n // 4. Daemon checks\n {\n const spinner = startSpinner(\"panopticon daemon\");\n const isRunning = parsePanopticonRunning();\n if (isRunning) {\n pushAndReport(\n {\n label: \"Panopticon daemon\",\n status: \"ok\",\n detail: \"running\",\n },\n spinner,\n );\n } else {\n pushAndReport(\n {\n label: \"Panopticon daemon\",\n status: \"warn\",\n detail: \"Not running. Run `fml start`\",\n },\n spinner,\n );\n }\n }\n\n // 5. API reachability\n {\n const spinner = startSpinner(\"API\");\n if (token) {\n try {\n const result = await createApiClient(token).callBackend(\"ping\", {});\n if (result.ok) {\n pushAndReport(\n {\n label: \"API\",\n status: \"ok\",\n detail: `Reachable at ${CONVEX_URL}`,\n },\n spinner,\n );\n } else {\n // Backend responded but tool failed — still reachable\n pushAndReport(\n {\n label: \"API\",\n status: \"ok\",\n detail: `Reachable at ${CONVEX_URL}`,\n },\n spinner,\n );\n }\n } catch (err) {\n pushAndReport(\n {\n label: \"API\",\n status: \"fail\",\n detail: err instanceof Error ? err.message : \"Unreachable\",\n },\n spinner,\n );\n }\n } else {\n pushAndReport(\n { label: \"API\", status: \"fail\", detail: \"Auth required\" },\n spinner,\n );\n }\n }\n\n // JSON output\n if (opts.json) {\n console.log(JSON.stringify(checks, null, 2));\n return;\n }\n\n // Summary\n console.log(\"\");\n const passed = checks.filter((c) => c.status === \"ok\").length;\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warned = checks.filter((c) => c.status === \"warn\").length;\n\n const parts: string[] = [];\n if (passed > 0) parts.push(pc.green(`${passed} passed`));\n if (warned > 0)\n parts.push(pc.yellow(`${warned} warning${warned > 1 ? \"s\" : \"\"}`));\n if (failed > 0) parts.push(pc.red(`${failed} failed`));\n\n console.log(` ${parts.join(\", \")}`);\n console.log(\"\");\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { addTarget, listTargets } from \"@fml-inc/panopticon/sync\";\nimport { printBanner } from \"../banner.js\";\nimport { execBinSync, resolveBin } from \"../bin-utils.js\";\nimport {\n DEFAULT_SYNC_URL,\n DEFAULT_TARGET_NAME,\n writeEnvConfig,\n} from \"../config.js\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { FML_DATA_DIR, FML_LOG_DIR } from \"../dirs.js\";\nimport { resolveSyncTokenCommand } from \"../sync/client.js\";\n\nconst CLAUDE_DIR = path.join(os.homedir(), \".claude\");\nconst CLAUDE_SETTINGS_PATH = path.join(CLAUDE_DIR, \"settings.json\");\nconst MARKETPLACE_DIR = path.join(\n os.homedir(),\n \".local\",\n \"share\",\n \"claude-plugins\",\n);\n\nfunction getPluginRoot(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n // At runtime we're in dist/ (tsup bundles into entry point), go up one level\n dir = path.resolve(dir, \"..\");\n return dir;\n}\n\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nexport async function handleInstall(): Promise<void> {\n const pluginRoot = getPluginRoot();\n console.log(\"Installing fml...\\n\");\n\n // 1. Ensure panopticon is installed globally and up to date\n console.log(\"[1/5] Setting up panopticon...\");\n const { resolvePanopticonBin } = await import(\"../daemon-utils.js\");\n let freshInstall = false;\n const bin = resolvePanopticonBin();\n let needsInstall = !bin;\n if (bin) {\n // Check version — upgrade if below the minimum required by this build\n const MIN_PANOPTICON = \"0.2.2\";\n const vResult = panopticonExec(\"--version\", { timeout: 5_000 });\n const installed = vResult.ok ? vResult.stdout.trim().split(\"+\")[0] : \"0.0.0\";\n if (installed < MIN_PANOPTICON) {\n console.log(` Found panopticon ${installed}, need >=${MIN_PANOPTICON}`);\n needsInstall = true;\n }\n }\n if (needsInstall) {\n console.log(\n bin\n ? \" Upgrading @fml-inc/panopticon...\"\n : \" Installing @fml-inc/panopticon globally...\",\n );\n const npmBin = resolveBin(\"npm\");\n if (!npmBin) {\n console.error(\" Failed to install panopticon: npm not found on PATH\");\n console.error(\" Install manually: npm install -g @fml-inc/panopticon@latest\");\n } else {\n try {\n execBinSync(npmBin, [\"install\", \"-g\", \"@fml-inc/panopticon@latest\"], {\n timeout: 120_000,\n });\n freshInstall = true;\n console.log(\" Installed @fml-inc/panopticon\");\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(` Failed to install panopticon: ${msg}`);\n console.error(\" Install manually: npm install -g @fml-inc/panopticon@latest\");\n }\n }\n }\n // npm postinstall already ran panopticon install for fresh installs;\n // only re-run for existing installs to pick up config changes.\n if (!freshInstall) {\n const result = panopticonExec(\"install\", { timeout: 60_000 });\n if (result.ok) {\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n } else {\n console.error(\" panopticon install failed:\");\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.error(` ${line}`);\n }\n }\n }\n console.log();\n\n // 2. Ensure fml-specific directories exist\n console.log(\"[2/5] Creating fml directories...\");\n for (const dir of [FML_DATA_DIR, FML_LOG_DIR]) {\n fs.mkdirSync(dir, { recursive: true });\n }\n console.log(` ${FML_DATA_DIR}`);\n console.log(` ${FML_LOG_DIR}\\n`);\n\n // 3. Ensure plugin manifest has the current version\n console.log(\"[3/5] Writing plugin manifest...\");\n const pkgJson = readJsonFile(path.join(pluginRoot, \"package.json\"));\n const version = (pkgJson?.version as string) ?? \"0.0.0-dev\";\n const pluginManifestDir = path.join(pluginRoot, \".claude-plugin\");\n fs.mkdirSync(pluginManifestDir, { recursive: true });\n writeJsonFile(path.join(pluginManifestDir, \"plugin.json\"), {\n name: \"fml\",\n version,\n description: \"FML agent tools for Claude Code\",\n mcpServers: {\n fml: {\n command: \"node\",\n args: [\"${CLAUDE_PLUGIN_ROOT}/bin/mcp-server\"],\n },\n },\n });\n console.log(` Version: ${version}\\n`);\n\n // 4. Register fml plugin in local marketplace + Claude Code settings\n console.log(\"[4/5] Setting up fml plugin...\");\n fs.mkdirSync(path.join(MARKETPLACE_DIR, \".claude-plugin\"), {\n recursive: true,\n });\n\n const manifestPath = path.join(\n MARKETPLACE_DIR,\n \".claude-plugin\",\n \"marketplace.json\",\n );\n const manifest = readJsonFile(manifestPath) ?? {\n name: \"local-plugins\",\n owner: { name: os.userInfo().username },\n plugins: [],\n };\n\n const plugins = (manifest.plugins as Array<Record<string, unknown>>) ?? [];\n if (!plugins.some((p) => p.name === \"fml\")) {\n plugins.push({\n name: \"fml\",\n source: \"./fml\",\n description: \"FML agent tools for Claude Code\",\n });\n manifest.plugins = plugins;\n }\n writeJsonFile(manifestPath, manifest);\n\n // Symlink plugin source into marketplace\n const marketplaceLink = path.join(MARKETPLACE_DIR, \"fml\");\n try {\n fs.unlinkSync(marketplaceLink);\n } catch {}\n fs.rmSync(marketplaceLink, { recursive: true, force: true });\n fs.symlinkSync(pluginRoot, marketplaceLink, \"dir\");\n console.log(` Marketplace: ${MARKETPLACE_DIR}`);\n console.log(` Plugin: ${pluginRoot}`);\n\n // Layer fml-specific settings on top for Claude Code\n const settings = (readJsonFile(CLAUDE_SETTINGS_PATH) ?? {}) as Record<\n string,\n Record<string, unknown>\n >;\n settings.extraKnownMarketplaces = settings.extraKnownMarketplaces ?? {};\n settings.extraKnownMarketplaces[\"local-plugins\"] = {\n source: { source: \"directory\", path: MARKETPLACE_DIR },\n };\n settings.enabledPlugins = settings.enabledPlugins ?? {};\n settings.enabledPlugins[\"fml@local-plugins\"] = true;\n writeJsonFile(CLAUDE_SETTINGS_PATH, settings);\n console.log(` Claude settings: ${CLAUDE_SETTINGS_PATH}`);\n\n // Register plugin with Claude Code (install if new, update if existing)\n const claudeBin = resolveBin(\"claude\");\n if (!claudeBin) {\n console.log(\" warn: claude CLI not found, run 'claude plugin install fml@local-plugins' manually\");\n } else {\n try {\n try {\n execBinSync(claudeBin, [\"plugin\", \"install\", \"fml@local-plugins\"], {\n timeout: 15_000,\n });\n } catch {\n execBinSync(claudeBin, [\"plugin\", \"update\", \"fml@local-plugins\"], {\n timeout: 15_000,\n });\n }\n console.log(\" Plugin registered via Claude Code CLI\");\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.log(` warn: claude plugin install/update failed: ${msg}`);\n console.log(\" Run 'claude plugin install fml@local-plugins' manually\");\n }\n }\n console.log();\n\n // 5. Auto-configure sync target (best-effort)\n console.log(\"[5/5] Configuring sync target...\");\n const existingTargets = listTargets();\n const existingProd = existingTargets.find((t) => t.url === DEFAULT_SYNC_URL);\n if (existingProd) {\n console.log(` Production target already configured`);\n } else {\n const tokenCommand = resolveSyncTokenCommand();\n addTarget({\n name: DEFAULT_TARGET_NAME,\n url: DEFAULT_SYNC_URL,\n tokenCommand,\n });\n console.log(` Target \"${DEFAULT_TARGET_NAME}\": ${DEFAULT_SYNC_URL}`);\n if (tokenCommand) {\n console.log(` Auth: ${tokenCommand}`);\n } else {\n // No gh and no fml login yet — target is URL-only. `fml login` will\n // back-patch it to `fml sync-token` once the user signs in.\n console.log(\n \" Auth: not configured — run `fml login` to enable sync.\",\n );\n }\n }\n\n // Set active env to the default sync target\n writeEnvConfig({ active: DEFAULT_TARGET_NAME });\n\n console.log(\"\");\n printBanner();\n console.log(\"Done! Start a new coding session to activate.\\n\");\n console.log(\"\\nNext steps:\");\n console.log(\" fml login Sign in to your FML account\");\n console.log(\" fml org Select organization\");\n console.log(\" fml sync status Check sync status\");\n console.log(\" fml status Verify setup\");\n}\n","import pc from \"picocolors\";\n\nconst LOGO_LINES = [\n \" ▄██▀ ██▄██▄██ ██\",\n \" ██ ██ ██ ██ ██\",\n \"█████ ██ ██ ██\",\n \" ██ ██ ██ ████\",\n \" ▀▀ ▀▀ ▀▀ ▀▀▀▀\",\n];\n\nexport function printBanner(): void {\n console.log(\"\");\n for (let i = 0; i < LOGO_LINES.length; i++) {\n const color = i < 3 ? pc.blue : pc.cyan;\n console.log(\" \" + color(LOGO_LINES[i]));\n }\n console.log(\"\");\n}\n","import { execSync } from \"node:child_process\";\nimport { readTokens } from \"../auth/token-store.js\";\nimport { getActiveEnv, isValidEnvName } from \"../config.js\";\n\nconst TOKEN_TTL_MS = 5 * 60 * 1000;\n\nlet cachedGitHubToken: { value: string; expiresAt: number } | null = null;\n\nexport function resolveGitHubToken(): string | null {\n if (cachedGitHubToken && Date.now() < cachedGitHubToken.expiresAt) {\n return cachedGitHubToken.value;\n }\n\n const envToken = process.env.PANOPTICON_GITHUB_TOKEN;\n if (envToken) {\n cachedGitHubToken = {\n value: envToken,\n expiresAt: Date.now() + TOKEN_TTL_MS,\n };\n return envToken;\n }\n\n try {\n const token = execSync(\"gh auth token\", {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n if (token) {\n cachedGitHubToken = {\n value: token,\n expiresAt: Date.now() + TOKEN_TTL_MS,\n };\n }\n return token || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Pick the best `tokenCommand` to write onto a sync target, given what's\n * currently available on this machine:\n *\n * 1. `gh auth token` — preferred on dev laptops. Keeps telemetry\n * attributed to the GitHub identity, which is how work is rolled up\n * for individual contributors.\n * 2. `fml sync-token --env <active>` — fallback for sandboxes / CI /\n * containers that don't have `gh` but have (or will have) an\n * `fml login` session. Pinned to the active env so panopticon reads\n * the right auth file even when the user later switches envs. The\n * FML session token carries `actAsExternalId` so attribution still\n * lands on a specific user — via FML identity instead of GH.\n * 3. `undefined` — nothing usable yet. Install writes a URL-only target\n * and `fml login` will back-patch it after the user signs in.\n */\nexport function resolveSyncTokenCommand(): string | undefined {\n if (resolveGitHubToken()) return \"gh auth token\";\n if (readTokens()) {\n const { name } = getActiveEnv();\n if (isValidEnvName(name)) return `fml sync-token --env ${name}`;\n }\n return undefined;\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { execBinSync, resolveBin } from \"../bin-utils.js\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { FML_DATA_DIR, FML_LOG_DIR } from \"../dirs.js\";\n\nconst CLAUDE_DIR = path.join(os.homedir(), \".claude\");\nconst CLAUDE_SETTINGS_PATH = path.join(CLAUDE_DIR, \"settings.json\");\nconst MARKETPLACE_DIR = path.join(\n os.homedir(),\n \".local\",\n \"share\",\n \"claude-plugins\",\n);\nconst PLUGIN_CACHE_DIR = path.join(\n CLAUDE_DIR,\n \"plugins\",\n \"cache\",\n \"local-plugins\",\n \"fml\",\n);\n\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nexport function handleUninstall(opts: {\n purge?: boolean;\n target?: string;\n}): void {\n const targetSpecific = opts.target && opts.target !== \"all\";\n\n console.log(\"Uninstalling fml...\\n\");\n\n // 1. Tell Claude Code to uninstall the plugin (kills MCP server, evicts cache)\n if (targetSpecific) {\n console.log(\"[1/5] Skipping plugin uninstall (target-specific uninstall)\");\n } else {\n console.log(\"[1/5] Uninstalling MCP plugin...\");\n // Uninstall from user scope via CLI\n const claudeBin = resolveBin(\"claude\");\n if (claudeBin) {\n try {\n execBinSync(\n claudeBin,\n [\"plugin\", \"uninstall\", \"fml@local-plugins\", \"--scope\", \"user\"],\n { timeout: 10_000 },\n );\n console.log(\" Uninstalled (user scope)\");\n } catch {\n // Not installed at this scope\n }\n }\n\n // Clean all scopes from installed_plugins.json directly — the CLI\n // can only remove project-scoped entries from within that project dir,\n // so we handle it ourselves.\n const installedPluginsPath = path.join(\n CLAUDE_DIR,\n \"plugins\",\n \"installed_plugins.json\",\n );\n const installedPlugins = readJsonFile(installedPluginsPath) as {\n version?: number;\n plugins?: Record<string, unknown[]>;\n } | null;\n const plugins = installedPlugins?.plugins;\n const fmlEntries = plugins?.[\"fml@local-plugins\"];\n if (plugins && fmlEntries) {\n // Clean project-level settings that reference fml\n for (const entry of fmlEntries) {\n const e = entry as { scope?: string; projectPath?: string };\n if (e.scope === \"project\" && e.projectPath) {\n const projSettings = path.join(e.projectPath, \".claude\", \"settings.json\");\n const proj = readJsonFile(projSettings) as Record<string, Record<string, unknown>> | null;\n if (proj?.enabledPlugins?.[\"fml@local-plugins\"] != null) {\n delete proj.enabledPlugins[\"fml@local-plugins\"];\n writeJsonFile(projSettings, proj);\n console.log(` Cleaned ${projSettings}`);\n }\n }\n }\n delete plugins[\"fml@local-plugins\"];\n writeJsonFile(installedPluginsPath, installedPlugins as Record<string, unknown>);\n console.log(\" Cleaned installed_plugins.json\");\n }\n }\n\n // 2. Remove fml plugin from Claude Code settings\n if (targetSpecific) {\n console.log(\"[2/5] Skipping plugin settings (target-specific uninstall)\");\n } else {\n console.log(\"[2/5] Removing plugin from Claude Code settings...\");\n const settings = readJsonFile(CLAUDE_SETTINGS_PATH) as Record<\n string,\n Record<string, unknown>\n > | null;\n if (settings) {\n if (settings.enabledPlugins) {\n delete settings.enabledPlugins[\"fml@local-plugins\"];\n }\n if (settings.extraKnownMarketplaces) {\n delete settings.extraKnownMarketplaces[\"local-plugins\"];\n }\n writeJsonFile(CLAUDE_SETTINGS_PATH, settings);\n console.log(` Updated ${CLAUDE_SETTINGS_PATH}`);\n } else {\n console.log(\" No settings file found, skipping\");\n }\n }\n\n // 3. Remove marketplace symlink and manifest entry\n if (targetSpecific) {\n console.log(\"[3/5] Skipping marketplace (target-specific uninstall)\");\n } else {\n console.log(\"[3/5] Removing marketplace registration...\");\n const marketplaceLink = path.join(MARKETPLACE_DIR, \"fml\");\n try {\n fs.rmSync(marketplaceLink, { recursive: true, force: true });\n console.log(` Removed ${marketplaceLink}`);\n } catch {\n console.log(\" No marketplace link found, skipping\");\n }\n\n const manifestPath = path.join(\n MARKETPLACE_DIR,\n \".claude-plugin\",\n \"marketplace.json\",\n );\n const manifest = readJsonFile(manifestPath);\n if (manifest && Array.isArray(manifest.plugins)) {\n manifest.plugins = (\n manifest.plugins as Array<Record<string, unknown>>\n ).filter((p) => p.name !== \"fml\");\n writeJsonFile(manifestPath, manifest);\n console.log(` Updated ${manifestPath}`);\n }\n }\n\n // 4. Run panopticon uninstall\n console.log(\"[4/5] Running panopticon uninstall...\");\n const panoArgs = [\"uninstall\"];\n if (opts.target) panoArgs.push(\"--target\", opts.target);\n if (opts.purge) panoArgs.push(\"--purge\");\n const result = panopticonExec(...panoArgs, { timeout: 30_000 });\n if (result.ok) {\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n } else {\n console.error(\" panopticon uninstall failed:\");\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.error(` ${line}`);\n }\n }\n\n // 5. Remove fml data, logs, and plugin cache\n if (targetSpecific) {\n console.log(\"[5/5] Skipping data removal (target-specific uninstall)\");\n } else {\n console.log(\"[5/5] Removing plugin cache...\");\n try {\n fs.rmSync(PLUGIN_CACHE_DIR, { recursive: true, force: true });\n console.log(` Removed ${PLUGIN_CACHE_DIR}`);\n } catch {\n console.log(\" No plugin cache found\");\n }\n }\n\n if (opts.purge) {\n console.log(\"Removing fml data and logs...\");\n for (const dir of [FML_DATA_DIR, FML_LOG_DIR]) {\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n console.log(` Removed ${dir}`);\n } catch {\n console.log(` Could not remove ${dir}`);\n }\n }\n } else {\n console.log(\"Keeping fml data (use --purge to remove)\");\n }\n\n console.log(\"\\nDone! FML has been uninstalled.\");\n}\n","import { execSync } from \"node:child_process\";\nimport { Sentry } from \"../sentry.js\";\n\ndeclare const __FML_PLUGIN_VERSION__: string;\n\nexport async function handleUpdate(): Promise<void> {\n const currentVersion =\n typeof __FML_PLUGIN_VERSION__ !== \"undefined\"\n ? __FML_PLUGIN_VERSION__\n : \"unknown\";\n\n console.log(`Current: ${currentVersion}`);\n console.log(\"Updating via npm...\\n\");\n\n try {\n const env = { ...process.env };\n delete env.npm_config_registry;\n\n execSync(\"npm install -g @fml-inc/fml@latest\", {\n stdio: \"inherit\",\n timeout: 120_000,\n env,\n });\n\n console.log(\"\\nUpdated. Run `fml install --skip-build` to reconfigure.\");\n } catch (err: unknown) {\n Sentry.captureException(err);\n const msg =\n err instanceof Error\n ? ((err as Error & { stderr?: Buffer }).stderr?.toString() ??\n err.message)\n : String(err);\n console.error(\"Update failed:\", msg);\n process.exit(1);\n }\n}\n","import type { FunctionReference } from \"convex/server\";\nimport {\n addTarget,\n loadSyncConfig,\n saveSyncConfig,\n} from \"@fml-inc/panopticon/sync\";\nimport { login, canOpenBrowser } from \"../auth/oauth.js\";\nimport { deviceLogin } from \"../auth/device-flow.js\";\nimport { getValidToken, setSelectedOrg } from \"../auth/token-store.js\";\nimport { createApiClient } from \"../convex-client.js\";\nimport { resolveGitHubToken } from \"../sync/client.js\";\nimport {\n CONVEX_URL,\n DEFAULT_SYNC_URL,\n getActiveEnv,\n isValidEnvName,\n} from \"../config.js\";\nimport { Sentry } from \"../sentry.js\";\n\n/**\n * After login, link the user's GitHub identity to their FML account\n * so that sync data (authenticated via GitHub token) can be attributed.\n */\nasync function linkGitHubIdentity(): Promise<void> {\n const token = resolveGitHubToken();\n if (!token) {\n console.warn(\"[fml] No GitHub token available — skipping identity link\");\n return;\n }\n\n try {\n const response = await fetch(\"https://api.github.com/user\", {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: \"application/vnd.github+json\",\n },\n });\n if (!response.ok) {\n console.warn(\n `[fml] GitHub API returned ${response.status} — skipping identity link`,\n );\n return;\n }\n\n const user = (await response.json()) as {\n login: string;\n id: number;\n email: string | null;\n };\n\n const fmlToken = await getValidToken();\n if (!fmlToken) {\n console.warn(\"[fml] No FML token available — skipping identity link\");\n return;\n }\n\n // Service tokens (device flow) can't call JWT-authenticated Convex mutations.\n // Identity is already attributed server-side via actAsExternalId on the token.\n if (fmlToken.startsWith(\"fml_st_\")) {\n return;\n }\n\n const { ConvexHttpClient } = await import(\"convex/browser\");\n const client = new ConvexHttpClient(CONVEX_URL);\n client.setAuth(fmlToken);\n\n const ref =\n \"user/panopticon:linkGitHubIdentity\" as unknown as FunctionReference<\"mutation\">;\n await client.mutation(ref, {\n githubUsername: user.login,\n githubId: user.id,\n githubEmail: user.email ?? undefined,\n });\n\n console.log(`Linked GitHub account: ${user.login}`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[fml] Failed to link GitHub identity: ${msg}`);\n }\n}\n\n// Config snapshots are now synced automatically via panopticon sync —\n// no manual upload needed after login.\n\n/**\n * After a successful login, pin the active env's sync target to\n * `fml sync-token --env <activeEnv>` so panopticon always reads the auth\n * file for that env (even when the user later switches active envs).\n *\n * - Target missing entirely → add one pointing at prod with the pinned cmd.\n * - Target is URL-only or uses the legacy `fml sync-token` (no --env) →\n * upgrade to the pinned form.\n * - Target has an unrelated tokenCommand (gh auth token, custom) or a\n * static token → leave it alone; the user made an explicit choice.\n */\n// Exported for unit testing; called from within handleLogin otherwise.\nexport function upgradeSyncTargetAfterLogin(): void {\n try {\n const { name: envName } = getActiveEnv();\n // envName is interpolated into tokenCommand, which panopticon shells out.\n // Guard against metacharacters in a corrupted env.json.\n if (!isValidEnvName(envName)) {\n console.warn(\n `[fml] Skipping sync-target upgrade: env name \"${envName}\" contains unsafe characters.`,\n );\n return;\n }\n const pinnedCmd = `fml sync-token --env ${envName}`;\n const config = loadSyncConfig();\n const existing = config.targets.find((t) => t.name === envName);\n if (!existing) {\n addTarget({\n name: envName,\n url: DEFAULT_SYNC_URL,\n tokenCommand: pinnedCmd,\n });\n console.log(`Sync target \"${envName}\" configured with ${pinnedCmd}.`);\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n return;\n }\n if (existing.token) return;\n if (existing.tokenCommand === pinnedCmd) return;\n if (existing.tokenCommand && existing.tokenCommand !== \"fml sync-token\") {\n // Preserve explicit choices (e.g. `gh auth token`, custom commands).\n return;\n }\n existing.tokenCommand = pinnedCmd;\n saveSyncConfig(config);\n console.log(`Sync target \"${envName}\" now using ${pinnedCmd}.`);\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n } catch (err: unknown) {\n // Non-fatal — login itself succeeded, worst case sync stays URL-only\n // and the user can run `fml sync setup` manually.\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[fml] Could not update sync target: ${msg}`);\n }\n}\n\n/**\n * After login, select and persist the user's org.\n * Single-org users get auto-selected; multi-org users get the first org\n * (can be changed later via `fml org`).\n */\nasync function selectOrg(): Promise<void> {\n try {\n const token = await getValidToken();\n if (!token) return;\n\n const api = createApiClient(token);\n const orgs = await api.queryOrgs();\n if (orgs.length === 0) return;\n\n const org = orgs[0];\n const slug = org.slug ?? org.name;\n setSelectedOrg(slug);\n console.log(`Selected org: ${org.name} (${slug})`);\n } catch {\n // Non-fatal — org selection can happen later via `fml org`\n }\n}\n\nexport async function handleLogin(opts?: { device?: boolean }): Promise<void> {\n const { name: envName } = getActiveEnv();\n\n // Skip OAuth if already authenticated — still run post-login tasks\n const existingToken = await getValidToken();\n if (existingToken) {\n const { readTokens } = await import(\"../auth/token-store.js\");\n const stored = readTokens();\n console.log(\n `Already logged in as ${stored?.user.name} (${stored?.user.email}) on ${envName}.`,\n );\n\n await linkGitHubIdentity();\n await selectOrg();\n upgradeSyncTargetAfterLogin();\n\n console.log(\"You're all set! Restart Claude Code to use FML tools.\");\n process.exit(0);\n }\n\n console.log(`Signing in to FML (${envName})...`);\n try {\n const useDeviceFlow = opts?.device || !(await canOpenBrowser());\n let result: { email: string; name: string };\n\n if (useDeviceFlow) {\n result = await deviceLogin();\n } else {\n result = await login();\n }\n\n console.log(`\\nLogged in as ${result.name} (${result.email})`);\n\n await linkGitHubIdentity();\n await selectOrg();\n upgradeSyncTargetAfterLogin();\n\n console.log(\"You're all set! Restart Claude Code to use FML tools.\");\n process.exit(0);\n } catch (err: unknown) {\n Sentry.captureException(err);\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Login failed: ${msg}`);\n process.exit(1);\n }\n}\n","import crypto from \"node:crypto\";\nimport http from \"node:http\";\nimport { CONVEX_URL, WORKOS_API_URL, WORKOS_AUTH_URL } from \"../config.js\";\nimport { writeTokens } from \"./token-store.js\";\n\n/**\n * Fetch the WorkOS client ID from the active Convex deployment.\n * This allows each environment to use its own WorkOS configuration.\n */\nasync function fetchWorkosClientId(): Promise<string> {\n const { ConvexHttpClient } = await import(\"convex/browser\");\n const client = new ConvexHttpClient(CONVEX_URL);\n const ref =\n \"public_config:getAuthConfig\" as unknown as import(\"convex/server\").FunctionReference<\"query\">;\n const result = (await client.query(ref, {})) as {\n workosClientId: string;\n };\n return result.workosClientId;\n}\n\n/**\n * Detect if a browser can be opened on this machine.\n * Returns false for headless environments (containers, SSH, no display).\n */\nexport async function canOpenBrowser(): Promise<boolean> {\n // Explicit overrides\n if (process.env.FML_DEVICE_FLOW === \"1\") return false;\n if (process.env.FML_NO_BROWSER === \"1\") return false;\n\n // Linux without a display server\n if (\n process.platform === \"linux\" &&\n !process.env.DISPLAY &&\n !process.env.WAYLAND_DISPLAY\n ) {\n return false;\n }\n\n // Remote/container environments\n if (process.env.SSH_CONNECTION) return false;\n if (process.env.CODESPACES) return false;\n if (process.env.REMOTE_CONTAINERS) return false;\n\n // Container detection\n try {\n const fs = await import(\"node:fs\");\n if (fs.existsSync(\"/.dockerenv\")) return false;\n } catch {\n // ignore\n }\n\n return true;\n}\n\n/**\n * Run the WorkOS PKCE OAuth flow:\n * 1. Generate code_verifier + code_challenge\n * 2. Start local HTTP server for callback\n * 3. Open browser to WorkOS authorization URL\n * 4. Receive callback with authorization code\n * 5. Exchange code for tokens\n * 6. Store tokens\n */\nexport async function login(): Promise<{\n email: string;\n name: string;\n}> {\n // Fetch the WorkOS client ID from the active Convex deployment\n const clientId = await fetchWorkosClientId();\n\n // Generate PKCE code verifier and challenge\n const codeVerifier = crypto.randomBytes(32).toString(\"base64url\");\n const codeChallenge = crypto\n .createHash(\"sha256\")\n .update(codeVerifier)\n .digest(\"base64url\");\n\n // Generate state for CSRF protection (defense-in-depth alongside PKCE)\n const state = crypto.randomBytes(16).toString(\"hex\");\n\n // Find a free port and start callback server (pass state for CSRF verification)\n const { port, waitForCode, close } = await startCallbackServer(state);\n\n const redirectUri = `http://localhost:${port}/callback`;\n const authUrl = new URL(`${WORKOS_AUTH_URL}/user_management/authorize`);\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"code_challenge\", codeChallenge);\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authUrl.searchParams.set(\"provider\", \"authkit\");\n authUrl.searchParams.set(\"state\", state);\n\n // Open browser\n const open = (await import(\"open\")).default;\n await open(authUrl.toString());\n\n console.log(\"\\nOpening browser for login...\");\n console.log(`If it doesn't open, visit: ${authUrl.toString()}\\n`);\n\n // Wait for the callback\n const code = await waitForCode();\n close();\n\n // Exchange code for tokens\n const tokenResponse = await fetch(\n `${WORKOS_API_URL}/user_management/authenticate`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n }),\n },\n );\n\n if (!tokenResponse.ok) {\n const error = await tokenResponse.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const data = (await tokenResponse.json()) as {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n user: {\n id: string;\n email: string;\n first_name?: string;\n last_name?: string;\n };\n };\n\n const userName = [data.user.first_name, data.user.last_name]\n .filter(Boolean)\n .join(\" \");\n\n writeTokens({\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresAt: Date.now() + (data.expires_in ?? 300) * 1000,\n user: {\n id: data.user.id,\n email: data.user.email,\n name: userName,\n },\n workosClientId: clientId,\n });\n\n return { email: data.user.email, name: userName };\n}\n\nfunction startCallbackServer(expectedState: string): Promise<{\n port: number;\n waitForCode: () => Promise<string>;\n close: () => void;\n}> {\n return new Promise((resolve, reject) => {\n let resolveCode: (code: string) => void;\n let rejectCode: (err: Error) => void;\n\n const codePromise = new Promise<string>((res, rej) => {\n resolveCode = res;\n rejectCode = rej;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const error = url.searchParams.get(\"error\");\n const returnedState = url.searchParams.get(\"state\");\n\n // Verify state parameter to prevent CSRF\n if (returnedState !== expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login failed</h1><p>Invalid state parameter. You can close this tab.</p></body></html>\",\n );\n rejectCode(new Error(\"OAuth state mismatch — possible CSRF attack\"));\n return;\n }\n\n if (error) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login failed</h1><p>You can close this tab.</p></body></html>\",\n );\n rejectCode(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (code) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login successful!</h1><p>You can close this tab and return to the terminal.</p></body></html>\",\n );\n resolveCode(code);\n return;\n }\n\n res.writeHead(400);\n res.end(\"Missing code parameter\");\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n // Listen on a random available port\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n reject(new Error(\"Failed to start callback server\"));\n return;\n }\n\n resolve({\n port: addr.port,\n waitForCode: () => codePromise,\n close: () => server.close(),\n });\n });\n\n server.on(\"error\", reject);\n\n // Timeout after 5 minutes\n setTimeout(\n () => {\n rejectCode(new Error(\"Login timed out (5 minutes)\"));\n server.close();\n },\n 5 * 60 * 1000,\n );\n });\n}\n","/**\n * Device Authorization Flow — Double Handshake\n *\n * 1. CLI gets a unique URL + deviceCode from backend\n * 2. User pastes URL in browser → page shows confirmation code\n * 3. User types confirmation code back into CLI\n * 4. CLI polls with deviceCode + confirmationCode → gets tokens\n */\n\nimport { createInterface } from \"node:readline\";\nimport { getSiteUrl } from \"../config.js\";\nimport { writeTokens } from \"./token-store.js\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr, // Use stderr so stdout stays clean for MCP\n });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\ninterface DeviceCodeResponse {\n deviceCode: string;\n verificationUri: string;\n expiresAt: number;\n interval: number;\n}\n\ninterface PollResponse {\n status:\n | \"pending\"\n | \"authorized\"\n | \"expired\"\n | \"rate_limited\"\n | \"invalid_code\";\n refreshToken?: string;\n accessToken?: string;\n expiresAt?: number;\n user?: { id: string; email: string; name: string };\n orgSlug?: string;\n interval?: number;\n}\n\n/**\n * Run the double-handshake device authorization flow.\n */\nexport async function deviceLogin(): Promise<{\n email: string;\n name: string;\n}> {\n const siteUrl = getSiteUrl();\n\n // 1. Request device code + session URL\n const codeRes = await fetch(`${siteUrl}/api/auth/device/code`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n if (!codeRes.ok) {\n const body = await codeRes.text();\n throw new Error(`Failed to start device flow: ${body}`);\n }\n\n const codeData = (await codeRes.json()) as DeviceCodeResponse;\n\n // 2. Show URL for user to paste in browser\n console.log(\"\");\n console.log(\" Paste this URL in your browser to sign in:\");\n console.log(\"\");\n console.log(` ${codeData.verificationUri}`);\n console.log(\"\");\n\n // 3. Wait for user to enter the confirmation code from the browser\n const confirmationCode = await prompt(\" Enter the code from your browser: \");\n\n if (!confirmationCode) {\n throw new Error(\"No confirmation code entered.\");\n }\n\n // Normalize: uppercase, strip dashes/spaces\n const normalizedCode = confirmationCode\n .toUpperCase()\n .replace(/[\\s-]/g, \"\")\n .replace(/^(.{4})/, \"$1-\");\n\n console.log(\" Verifying...\");\n\n // 4. Poll with deviceCode + confirmationCode\n let pollInterval = codeData.interval * 1000;\n\n while (Date.now() < codeData.expiresAt) {\n const pollRes = await fetch(`${siteUrl}/api/auth/device/poll`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n deviceCode: codeData.deviceCode,\n confirmationCode: normalizedCode,\n }),\n });\n\n if (pollRes.status === 429) {\n const data = (await pollRes.json()) as PollResponse;\n pollInterval = (data.interval ?? codeData.interval * 2) * 1000;\n await sleep(pollInterval);\n continue;\n }\n\n const data = (await pollRes.json()) as PollResponse;\n\n if (data.status === \"pending\") {\n // User hasn't clicked Authorize yet — wait and retry\n await sleep(pollInterval);\n continue;\n }\n\n if (data.status === \"authorized\") {\n writeTokens({\n accessToken: data.accessToken!,\n refreshToken: data.refreshToken!,\n expiresAt: data.expiresAt!,\n user: data.user!,\n orgSlug: data.orgSlug ?? undefined,\n tokenType: \"service\",\n });\n\n return { email: data.user!.email, name: data.user!.name };\n }\n\n if (data.status === \"invalid_code\") {\n throw new Error(\n \"Invalid confirmation code. Make sure you copied the code from the browser correctly.\",\n );\n }\n\n if (data.status === \"expired\") {\n throw new Error(\"Device authorization expired. Run `fml login` again.\");\n }\n\n throw new Error(`Device authorization failed: ${data.status}`);\n }\n\n throw new Error(\n \"Device authorization timed out (15 minutes). Run `fml login` again.\",\n );\n}\n","import fs from \"node:fs\";\nimport { authStorePath } from \"../config.js\";\n\nexport function handleLogout(): void {\n try {\n fs.unlinkSync(authStorePath());\n } catch {\n // File doesn't exist, that's fine\n }\n console.log(\"Logged out. Stored credentials cleared.\");\n}\n","import { createApiClient } from \"../convex-client.js\";\nimport {\n getSelectedOrg,\n getValidToken,\n setSelectedOrg,\n} from \"../auth/token-store.js\";\n\nexport async function handleOrg(slug?: string): Promise<void> {\n const token = await getValidToken();\n if (!token) {\n console.error(\"Not logged in. Run `fml login` first.\");\n process.exit(1);\n }\n\n const api = createApiClient(token);\n const orgs = await api.queryOrgs();\n\n if (orgs.length === 0) {\n console.error(\"No organizations found.\");\n process.exit(1);\n }\n\n const current = getSelectedOrg();\n\n // No slug provided — show current selection and available orgs\n if (!slug) {\n console.log(\"Organizations:\\n\");\n for (const org of orgs) {\n const orgSlug = org.slug ?? org.name;\n const marker = orgSlug === current ? \" (selected)\" : \"\";\n console.log(` ${orgSlug}${marker}`);\n }\n if (!current) {\n console.log(\"\\nNo org selected. Run `fml org <slug>` to select one.\");\n }\n return;\n }\n\n // Slug provided — select it\n const match = orgs.find(\n (o) => (o.slug ?? o.name) === slug || o.name === slug,\n );\n if (!match) {\n console.error(\n `Organization \"${slug}\" not found. Available: ${orgs.map((o) => o.slug ?? o.name).join(\", \")}`,\n );\n process.exit(1);\n }\n\n const matchSlug = match.slug ?? match.name;\n setSelectedOrg(matchSlug);\n console.log(`Selected org: ${match.name} (${matchSlug})`);\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nconst APP_BASE_URL = \"https://app.fml.app\";\n\nexport async function handleOpen(opts: { json?: boolean }): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login` first.\");\n process.exit(1);\n }\n\n let slug: string;\n try {\n const orgs = await api.queryOrgs();\n if (orgs.length === 0) {\n console.error(\"No organizations found.\");\n process.exit(1);\n }\n slug = orgs[0].slug ?? orgs[0].name;\n } catch {\n console.error(\"Could not fetch organizations. Opening base URL.\");\n slug = \"\";\n }\n\n const url = slug ? `${APP_BASE_URL}/${slug}` : APP_BASE_URL;\n\n if (opts.json) {\n console.log(JSON.stringify({ url }));\n } else {\n const openBrowser = (await import(\"open\")).default;\n await openBrowser(url);\n }\n}\n","import { getValidToken, readTokens } from \"../auth/token-store.js\";\nimport { getActiveEnv } from \"../config.js\";\n\nexport async function handleStatus(): Promise<void> {\n const { name, convexUrl } = getActiveEnv();\n console.log(`Environment: ${name}`);\n console.log(` Convex: ${convexUrl}\\n`);\n\n const tokens = readTokens();\n\n if (!tokens) {\n console.log(\"Not authenticated. Run `fml login` to sign in.\");\n return;\n }\n\n const tokenValid = await getValidToken();\n\n console.log(\"Authentication:\");\n console.log(` User: ${tokens.user.name} (${tokens.user.email})`);\n console.log(\n ` Token: ${tokenValid ? \"valid\" : \"expired (needs refresh/re-login)\"}`,\n );\n console.log(` Org: ${tokens.orgSlug ?? \"(none — run `fml org <slug>`)\"}`);\n}\n","import { DEFAULT_SYNC_URL, DEFAULT_TARGET_NAME } from \"../config.js\";\nimport { resolveSyncTokenCommand } from \"../sync/client.js\";\nimport {\n addTarget,\n removeTarget,\n listTargets,\n loadSyncConfig,\n saveSyncConfig,\n} from \"@fml-inc/panopticon/sync\";\nimport { syncPending, syncReset } from \"@fml-inc/panopticon/api\";\n\n// ── Setup (convenience shortcut) ────────────────────────────────────────────\n\nexport async function handleSyncSetup(): Promise<void> {\n console.log(\"FML Sync Setup\\n\");\n\n const tokenCommand = resolveSyncTokenCommand();\n if (!tokenCommand) {\n console.error(\n \"No credential available. Run `fml login` first, or set PANOPTICON_GITHUB_TOKEN / install gh CLI.\",\n );\n process.exit(1);\n }\n\n // Replace any existing entry so re-running setup upgrades the target in\n // place (e.g. URL-only → fml sync-token after first login).\n removeTarget(DEFAULT_TARGET_NAME);\n addTarget({\n name: DEFAULT_TARGET_NAME,\n url: DEFAULT_SYNC_URL,\n tokenCommand,\n });\n\n console.log(`Sync target \"${DEFAULT_TARGET_NAME}\" configured:`);\n console.log(` URL: ${DEFAULT_SYNC_URL}`);\n console.log(` Auth: ${tokenCommand}`);\n console.log(`\\nRestart panopticon to activate: fml stop && fml start`);\n}\n\n// ── List ─────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncList(): Promise<void> {\n const targets = listTargets();\n\n if (targets.length === 0) {\n console.log(\n \"No sync targets configured. Run `fml sync setup` or `fml sync add`.\",\n );\n return;\n }\n\n console.log(\"Sync targets:\\n\");\n for (const t of targets) {\n const auth = t.token\n ? \"static token\"\n : t.tokenCommand\n ? `command: ${t.tokenCommand}`\n : \"none\";\n console.log(` ${t.name}`);\n console.log(` URL: ${t.url}`);\n console.log(` Auth: ${auth}`);\n }\n}\n\n// ── Add ──────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncAdd(\n name: string,\n url: string,\n opts: { tokenCmd?: string; token?: string },\n): Promise<void> {\n const existing = listTargets();\n if (existing.some((t) => t.name === name)) {\n console.error(\n `Target \"${name}\" already exists. Use \\`fml sync edit\\` to modify it.`,\n );\n process.exit(1);\n }\n\n addTarget({\n name,\n url,\n tokenCommand: opts.tokenCmd,\n token: opts.token,\n });\n\n console.log(`Sync target \"${name}\" added:`);\n console.log(` URL: ${url}`);\n if (opts.tokenCmd) console.log(` Auth: command: ${opts.tokenCmd}`);\n else if (opts.token) console.log(\" Auth: static token\");\n else console.log(\" Auth: none\");\n console.log(\"\\nRestart panopticon to activate: fml stop && fml start\");\n}\n\n// ── Remove ───────────────────────────────────────────────────────────────────\n\nexport async function handleSyncRemove(name: string): Promise<void> {\n const removed = removeTarget(name);\n if (removed) {\n console.log(`Sync target \"${name}\" removed.`);\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n } else {\n console.error(`Target \"${name}\" not found.`);\n process.exit(1);\n }\n}\n\n// ── Edit ─────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncEdit(\n name: string,\n opts: { url?: string; tokenCmd?: string; token?: string },\n): Promise<void> {\n const config = loadSyncConfig();\n const target = config.targets.find((t) => t.name === name);\n if (!target) {\n console.error(`Target \"${name}\" not found.`);\n process.exit(1);\n }\n\n if (opts.url) target.url = opts.url;\n if (opts.tokenCmd) {\n target.tokenCommand = opts.tokenCmd;\n delete target.token;\n }\n if (opts.token) {\n target.token = opts.token;\n delete target.tokenCommand;\n }\n\n saveSyncConfig(config);\n console.log(`Sync target \"${name}\" updated:`);\n console.log(` URL: ${target.url}`);\n const auth = target.token\n ? \"static token\"\n : target.tokenCommand\n ? `command: ${target.tokenCommand}`\n : \"none\";\n console.log(` Auth: ${auth}`);\n console.log(\"\\nRestart panopticon to apply: fml stop && fml start\");\n}\n\n// ── Status ───────────────────────────────────────────────────────────────────\n\nexport async function handleSyncStatus(): Promise<void> {\n const targets = listTargets();\n\n if (targets.length === 0) {\n console.log(\"No sync targets configured. Run `fml sync setup` first.\");\n return;\n }\n\n for (const target of targets) {\n const auth = target.token\n ? \"static token\"\n : target.tokenCommand\n ? `command: ${target.tokenCommand}`\n : \"none\";\n console.log(`${target.name}:`);\n console.log(` URL: ${target.url}`);\n console.log(` Auth: ${auth}`);\n\n try {\n const result = await syncPending(target.name);\n if (result.totalPending === 0) {\n console.log(\" Status: up to date\");\n } else {\n console.log(` Pending: ${result.totalPending} total`);\n for (const [table, info] of Object.entries(result.tables)) {\n console.log(\n ` ${table}: ${info.pending} pending (${info.synced} / ${info.total})`,\n );\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.log(` Status: unavailable (${msg})`);\n }\n console.log();\n }\n}\n\n// ── Reset ────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncReset(targetName?: string): Promise<void> {\n await syncReset(targetName ?? DEFAULT_TARGET_NAME);\n console.log(\n `Sync watermarks for \"${targetName ?? DEFAULT_TARGET_NAME}\" reset to 0.`,\n );\n}\n","import { once } from \"node:events\";\nimport { getValidToken } from \"../auth/token-store.js\";\n\n/**\n * Print the current FML access token to stdout.\n *\n * Wired into panopticon sync targets as `tokenCommand: \"fml sync-token\"`.\n * Resolves and refreshes the stored FML session token, the same credential\n * `fml login` produces. Used on sandboxes / CI / containers where there's\n * no `gh auth token` to attribute sync telemetry to a GitHub identity.\n *\n * Output: token on stdout, nothing else. Non-zero exit on any failure so\n * panopticon's token helper treats it as a missed refresh rather than\n * caching an empty string as the bearer.\n */\nexport async function handleSyncToken(opts?: {\n env?: string;\n}): Promise<void> {\n const token = await getValidToken({ env: opts?.env });\n if (!token) {\n const suffix = opts?.env ? ` for env \"${opts.env}\"` : \"\";\n console.error(\n `fml: not logged in${suffix}. Run \\`fml login\\` to enable sync.`,\n );\n process.exit(1);\n }\n // Wait for drain before exiting — small writes on a pipe are usually\n // synchronous up to PIPE_BUF, but on slow/full pipes (or non-Linux\n // platforms) `process.exit` can cut off the write mid-flight and\n // hand panopticon a truncated token.\n if (!process.stdout.write(token)) {\n await once(process.stdout, \"drain\");\n }\n process.exit(0);\n}\n","import { listTargets } from \"@fml-inc/panopticon/sync\";\nimport { getActiveEnv, writeEnvConfig } from \"../config.js\";\nimport { handleStop, handleStart } from \"./daemon.js\";\n\n/**\n * Show the active environment.\n */\nexport function handleEnvShow(): void {\n const { name, convexUrl } = getActiveEnv();\n console.log(`Environment: ${name}`);\n console.log(` Convex URL: ${convexUrl}`);\n}\n\n/**\n * Switch to a sync target as the active environment.\n * Automatically restarts daemons so the new URL takes effect.\n */\nexport async function handleEnvSwitch(target: string): Promise<void> {\n const targets = listTargets();\n const match = targets.find((t) => t.name === target);\n if (!match) {\n console.error(`Sync target \"${target}\" not found. Available targets:`);\n for (const t of targets) {\n console.error(` ${t.name} ${t.url}`);\n }\n console.error(\"\\nAdd a target with `fml sync add`.\");\n process.exit(1);\n }\n\n writeEnvConfig({ active: target });\n const convexUrl = match.url.replace(\".convex.site\", \".convex.cloud\");\n console.log(`Switched to ${target}: ${convexUrl}`);\n\n console.log(\"\\nRestarting daemons...\");\n handleStop();\n await handleStart();\n console.log(\n \"MCP server will pick up the change on next Claude Code session.\",\n );\n}\n","/**\n * CLI wrappers for remote FML backend data queries.\n * Each command queries the FML Convex backend via the authenticated API client.\n */\n\nimport { getAuthenticatedClient } from \"../convex-client.js\";\n\nasync function queryBackend(\n toolName: string,\n args: Record<string, unknown>,\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login` to sign in.\");\n process.exit(1);\n }\n const result = await api.callBackend(toolName, args);\n if (!result.ok) {\n console.error(result.error ?? \"Unknown error\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleActivity(opts: { since?: string }): Promise<void> {\n await queryBackend(\"get-engineering-activity\", {\n timeRange: opts.since ?? \"24h\",\n });\n}\n\nexport async function handleSessions(opts: {\n since?: string;\n limit?: string;\n}): Promise<void> {\n await queryBackend(\"list-engineering-sessions\", {\n timeRange: opts.since ?? \"24h\",\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n}\n\nexport async function handleTimeline(\n sessionId: string,\n opts: { limit?: string; offset?: string },\n): Promise<void> {\n await queryBackend(\"get-session-timeline\", {\n sessionId,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n offset: opts.offset ? parseInt(opts.offset, 10) : undefined,\n });\n}\n\nexport async function handleSpending(opts: {\n since?: string;\n groupBy?: string;\n}): Promise<void> {\n await queryBackend(\"get-ai-spending\", {\n timeRange: opts.since ?? \"7d\",\n groupBy: opts.groupBy,\n });\n}\n\nexport async function handleSearch(\n query: string,\n opts: { since?: string; limit?: string },\n): Promise<void> {\n await queryBackend(\"search-engineering-sessions\", {\n query,\n timeRange: opts.since ?? \"7d\",\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n}\n","/**\n * Unified provider query command.\n * Routes requests to the appropriate backend tool based on provider and endpoint.\n */\n\nimport { getAuthenticatedClient } from \"../convex-client.js\";\n\nconst GENERIC_PROVIDERS = [\n \"sentry\",\n \"slack\",\n \"github\",\n \"linear\",\n \"notion\",\n \"freshdesk\",\n \"stripe\",\n];\n\nconst POSTHOG_ENDPOINTS: Record<string, string> = {\n insights: \"query-posthog-insights\",\n events: \"query-posthog-events\",\n recordings: \"query-posthog-recordings\",\n \"feature-flags\": \"query-posthog-feature-flags\",\n experiments: \"query-posthog-experiments\",\n surveys: \"query-posthog-surveys\",\n hogql: \"run-posthog-hogql\",\n cohorts: \"query-posthog-cohorts\",\n};\n\nconst AMPLITUDE_ENDPOINTS: Record<string, string> = {\n events: \"query-amplitude-events\",\n funnel: \"query-amplitude-funnel\",\n retention: \"query-amplitude-retention\",\n chart: \"get-amplitude-chart\",\n \"list-events\": \"list-amplitude-events\",\n};\n\nconst META_ADS_ENDPOINTS: Record<string, string> = {\n accounts: \"list-meta-ad-accounts\",\n campaigns: \"list-meta-campaigns\",\n insights: \"get-meta-ad-insights\",\n \"ad-sets\": \"list-meta-ad-sets\",\n};\n\nfunction parseBody(body?: string): Record<string, unknown> {\n if (!body) return {};\n try {\n return JSON.parse(body) as Record<string, unknown>;\n } catch {\n console.error(\"Invalid JSON in --body argument.\");\n process.exit(1);\n }\n}\n\nexport async function handleQuery(\n provider: string,\n endpoint: string,\n opts: { method?: string; body?: string; projectId?: string },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n\n const parsedBody = parseBody(opts.body);\n let toolName: string;\n let args: Record<string, unknown>;\n\n if (GENERIC_PROVIDERS.includes(provider)) {\n toolName = `integration-${provider}`;\n args = {\n endpoint,\n method: opts.method || \"GET\",\n body: parsedBody,\n projectId: opts.projectId,\n };\n } else if (provider === \"posthog\") {\n toolName = POSTHOG_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown posthog endpoint: ${endpoint}. Valid: ${Object.keys(POSTHOG_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n args = { ...parsedBody };\n } else if (provider === \"amplitude\") {\n toolName = AMPLITUDE_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown amplitude endpoint: ${endpoint}. Valid: ${Object.keys(AMPLITUDE_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n // list-events takes no args — --body is ignored for this endpoint\n args = endpoint === \"list-events\" ? {} : { ...parsedBody };\n } else if (provider === \"meta-ads\") {\n toolName = META_ADS_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown meta-ads endpoint: ${endpoint}. Valid: ${Object.keys(META_ADS_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n // accounts takes no args — --body is ignored for this endpoint\n args = endpoint === \"accounts\" ? {} : { ...parsedBody };\n } else {\n console.error(\n `Unknown provider: ${provider}. Valid: ${[...GENERIC_PROVIDERS, \"posthog\", \"amplitude\", \"meta-ads\"].join(\", \")}`,\n );\n process.exit(1);\n }\n\n const result = await api.callBackend(toolName, args);\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleAutomationList(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-automations\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationCreate(opts: {\n name: string;\n prompt: string;\n frequency: string;\n hour: string;\n minute: string;\n timezone: string;\n dayOfWeek?: string;\n dayOfMonth?: string;\n maxRuns?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"create-automation\", {\n name: opts.name,\n prompt: opts.prompt,\n frequency: opts.frequency,\n hour: parseInt(opts.hour, 10),\n minute: parseInt(opts.minute, 10),\n timezone: opts.timezone,\n dayOfWeek: opts.dayOfWeek ? parseInt(opts.dayOfWeek, 10) : undefined,\n dayOfMonth: opts.dayOfMonth ? parseInt(opts.dayOfMonth, 10) : undefined,\n maxRuns: opts.maxRuns ? parseInt(opts.maxRuns, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationCreatePattern(opts: {\n name: string;\n prompt: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"create-pattern-automation\", {\n name: opts.name,\n prompt: opts.prompt,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationUpdate(\n id: string,\n opts: {\n name?: string;\n prompt?: string;\n enabled?: string;\n frequency?: string;\n hour?: string;\n minute?: string;\n timezone?: string;\n dayOfWeek?: string;\n dayOfMonth?: string;\n },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"update-automation\", {\n automationId: id,\n name: opts.name,\n prompt: opts.prompt,\n enabled:\n opts.enabled !== undefined\n ? (() => {\n if (opts.enabled !== \"true\" && opts.enabled !== \"false\") {\n console.error(\n `Invalid --enabled value: \"${opts.enabled}\". Use \"true\" or \"false\".`,\n );\n process.exit(1);\n }\n return opts.enabled === \"true\";\n })()\n : undefined,\n frequency: opts.frequency,\n hour: opts.hour ? parseInt(opts.hour, 10) : undefined,\n minute: opts.minute ? parseInt(opts.minute, 10) : undefined,\n timezone: opts.timezone,\n dayOfWeek: opts.dayOfWeek ? parseInt(opts.dayOfWeek, 10) : undefined,\n dayOfMonth: opts.dayOfMonth ? parseInt(opts.dayOfMonth, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationDelete(id: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"delete-automation\", {\n automationId: id,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationTest(id: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"test-automation\", {\n automationId: id,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleMemoryList(opts: {\n scope?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-memory-files\", {\n scope: opts.scope,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryRead(fileId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"read-memory-file\", { fileId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryWrite(opts: {\n title: string;\n content: string;\n scope?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"write-memory-file\", {\n title: opts.title,\n content: opts.content,\n scope: opts.scope,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryDelete(fileId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"delete-memory-file\", { fileId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSearchAnalysis(\n query: string,\n opts: {\n status?: string;\n limit?: string;\n repoId?: string;\n promptKey?: string;\n },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"search-analysis\", {\n query,\n status: opts.status,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n promptKey: opts.promptKey,\n ...(opts.repoId ? { repositoryId: opts.repoId } : {}),\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleRunAnalysis(opts: {\n prompts?: string;\n repoId?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"run-analysis-workflow\", {\n selectedPromptKeys: opts.prompts?.split(\",\"),\n // Only include repositoryId when the user actually passed --repo-id,\n // so the payload matches the MCP-side schema shape (undefined key is\n // technically equivalent but makes log diffs noisier).\n ...(opts.repoId ? { repositoryId: opts.repoId } : {}),\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleRunTeamAnalysis(opts: {\n windowDays?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"run-team-analysis\", {\n windowDays: opts.windowDays ? parseInt(opts.windowDays, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleIntegrations(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-integrations\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleEvents(opts: {\n source?: string;\n eventType?: string;\n projectId?: string;\n since?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-integration-events\", {\n source: opts.source,\n eventType: opts.eventType,\n projectId: opts.projectId,\n timeRange: opts.since,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleResolveIdentity(opts: {\n provider?: string;\n username?: string;\n email?: string;\n externalId?: string;\n externalUserId?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"resolve-identities\", {\n provider: opts.provider,\n externalUsername: opts.username,\n normalizedEmail: opts.email,\n externalId: opts.externalId,\n externalUserId: opts.externalUserId,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSlackHistory(opts: {\n channel?: string;\n limit?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-slack-channel-history\", {\n channelId: opts.channel,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleSlackMessage(opts: {\n permalink?: string;\n channel?: string;\n ts?: string;\n includeThread?: boolean;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-slack-message\", {\n permalink: opts.permalink,\n channelId: opts.channel,\n messageTs: opts.ts,\n includeThreadContext: opts.includeThread,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleMessagesList(opts: {\n start?: string;\n end?: string;\n limit?: string;\n cursor?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-messages\", {\n startTime: opts.start ? parseInt(opts.start, 10) : undefined,\n endTime: opts.end ? parseInt(opts.end, 10) : undefined,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n cursor: opts.cursor,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMessagesContext(\n messageId: string,\n opts: { before?: string; after?: string },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-messages-with-context\", {\n messageId,\n before: opts.before ? parseInt(opts.before, 10) : undefined,\n after: opts.after ? parseInt(opts.after, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSkillsList(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-skills\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleSkillsLoad(skillId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"load-skill\", { skillId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleConfigList(opts: {\n org: string;\n repo?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n try {\n const result = opts.repo\n ? await api.listRepoConfigSnapshots(opts.org, opts.repo)\n : await api.listUserConfigSnapshots(opts.org);\n console.log(JSON.stringify(result, null, 2));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\nexport async function handleConfigDetail(opts: {\n org: string;\n user?: string;\n repo?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n try {\n const result = opts.repo\n ? await api.getRepoConfigDetail(opts.org, opts.repo)\n : opts.user\n ? await api.getUserConfigDetail(opts.org, opts.user)\n : null;\n if (!result) {\n console.error(\"Provide --user or --repo\");\n process.exit(1);\n }\n console.log(JSON.stringify(result, null, 2));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { getAuthenticatedClient, type PublicToolDescriptor } from \"../convex-client.js\";\n\ndeclare const __FML_PLUGIN_VERSION__: string;\nconst pluginVersion =\n typeof __FML_PLUGIN_VERSION__ !== \"undefined\" ? __FML_PLUGIN_VERSION__ : undefined;\n\nasync function getApi() {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n return api;\n}\n\nfunction levenshtein(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n let prev = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 0; i < a.length; i++) {\n const curr = [i + 1];\n for (let j = 0; j < b.length; j++) {\n const cost = a[i] === b[j] ? 0 : 1;\n curr.push(Math.min(curr[j]! + 1, prev[j + 1]! + 1, prev[j]! + cost));\n }\n prev = curr;\n }\n return prev[b.length]!;\n}\n\nfunction closestMatches(name: string, descriptors: PublicToolDescriptor[]): string[] {\n const threshold = Math.max(2, Math.ceil(name.length * 0.4));\n return descriptors\n .map((d) => ({\n name: d.name,\n // Substring match always beats fuzzy match.\n score: d.name.includes(name) ? 0 : levenshtein(name, d.name),\n }))\n .filter((m) => m.score <= threshold)\n .sort((a, b) => a.score - b.score)\n .slice(0, 3)\n .map((m) => m.name);\n}\n\nfunction findOrSuggestExit(\n name: string,\n descriptors: PublicToolDescriptor[],\n): PublicToolDescriptor {\n const descriptor = descriptors.find((d) => d.name === name);\n if (descriptor) return descriptor;\n console.error(`Unknown tool: ${name}`);\n const suggestions = closestMatches(name, descriptors);\n if (suggestions.length > 0) {\n console.error(`Did you mean: ${suggestions.join(\", \")}?`);\n }\n process.exit(1);\n}\n\nexport async function handleToolsList(opts: {\n category?: string;\n json?: boolean;\n}): Promise<void> {\n const api = await getApi();\n let descriptors = await api.listTools(pluginVersion);\n\n if (opts.category) {\n descriptors = descriptors.filter((d) => d.category === opts.category);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(descriptors, null, 2));\n return;\n }\n\n if (descriptors.length === 0) {\n console.log(\"No tools found.\");\n return;\n }\n\n const nameW = Math.min(\n 40,\n Math.max(...descriptors.map((d) => d.name.length), 4),\n );\n const catW = 14;\n const header =\n \"name\".padEnd(nameW) + \" \" + \"category\".padEnd(catW) + \" \" + \"description\";\n const divider = \"-\".repeat(header.length);\n console.log(header);\n console.log(divider);\n for (const d of descriptors) {\n const cat = d.category ?? \"\";\n const suffix = d.experimental ? \" (experimental)\" : \"\";\n const desc = (d.description + suffix).slice(0, 80);\n console.log(d.name.padEnd(nameW) + \" \" + cat.padEnd(catW) + \" \" + desc);\n }\n}\n\nexport async function handleToolsDescribe(\n name: string,\n opts: { json?: boolean },\n): Promise<void> {\n const api = await getApi();\n const descriptors = await api.listTools(pluginVersion);\n const descriptor = findOrSuggestExit(name, descriptors);\n\n if (opts.json) {\n console.log(JSON.stringify(descriptor, null, 2));\n return;\n }\n\n console.log(`Name: ${descriptor.name}`);\n if (descriptor.category) console.log(`Category: ${descriptor.category}`);\n if (descriptor.experimental) console.log(`Experimental: true`);\n console.log(`\\nDescription:\\n ${descriptor.description}`);\n console.log(`\\nInput schema:\\n${JSON.stringify(descriptor.inputSchema, null, 2)}`);\n}\n\nexport async function handleToolsCall(\n name: string,\n opts: { args?: string; file?: string },\n): Promise<void> {\n if (opts.args !== undefined && opts.file !== undefined) {\n console.error(\"Error: --args and --file are mutually exclusive.\");\n process.exit(1);\n }\n\n const raw = opts.file\n ? (() => {\n try {\n return readFileSync(path.resolve(opts.file), \"utf8\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Could not read args file: ${msg}`);\n process.exit(1);\n }\n })()\n : (opts.args ?? \"{}\");\n\n let parsedArgs: Record<string, unknown>;\n try {\n parsedArgs = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(\n `Invalid JSON in ${opts.file ? \"--file\" : \"--args\"}: ${msg}`,\n );\n process.exit(1);\n }\n\n const api = await getApi();\n const descriptors = await api.listTools(pluginVersion);\n // Resolve the tool exists locally so the user gets a \"did you mean\" hint\n // before we round-trip to the backend. The backend is the authoritative\n // validator for argument shape (we deliberately don't duplicate that here).\n findOrSuggestExit(name, descriptors);\n\n const result = await api.callBackend(name, parsedArgs);\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n\n console.log(JSON.stringify(result.result, null, 2));\n}\n"],"mappings":"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","names":["parts","pc","fs","os","path","CLAUDE_DIR","path","os","CLAUDE_SETTINGS_PATH","MARKETPLACE_DIR","readJsonFile","fs","writeJsonFile","execSync","execSync","addTarget","loadSyncConfig","fs","data","config","loadSyncConfig","addTarget","readTokens","fs","fs","addTarget","listTargets","loadSyncConfig","saveSyncConfig","syncPending","config","listTargets","listTargets","path","path"]}