@fml-inc/fml 0.5.0 → 0.6.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fml",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "FML agent tools for Claude Code",
5
5
  "mcpServers": {
6
6
  "fml": {
package/dist/cli.js CHANGED
@@ -705,7 +705,7 @@ function handleUninstall(opts) {
705
705
  // src/commands/update.ts
706
706
  import { execSync as execSync2 } from "child_process";
707
707
  async function handleUpdate() {
708
- const currentVersion = true ? "0.5.0+738a81c" : "unknown";
708
+ const currentVersion = true ? "0.6.0+c1e84c1" : "unknown";
709
709
  console.log(`Current: ${currentVersion}`);
710
710
  console.log("Updating via npm...\n");
711
711
  try {
@@ -800,7 +800,7 @@ async function login() {
800
800
  throw new Error(`Token exchange failed: ${error}`);
801
801
  }
802
802
  const data = await tokenResponse.json();
803
- const userName = [data.user.first_name, data.user.last_name].filter(Boolean).join(" ");
803
+ const userName2 = [data.user.first_name, data.user.last_name].filter(Boolean).join(" ");
804
804
  writeTokens({
805
805
  accessToken: data.access_token,
806
806
  refreshToken: data.refresh_token,
@@ -808,11 +808,11 @@ async function login() {
808
808
  user: {
809
809
  id: data.user.id,
810
810
  email: data.user.email,
811
- name: userName
811
+ name: userName2
812
812
  },
813
813
  workosClientId: clientId
814
814
  });
815
- return { email: data.user.email, name: userName };
815
+ return { email: data.user.email, name: userName2 };
816
816
  }
817
817
  function startCallbackServer(expectedState) {
818
818
  return new Promise((resolve, reject) => {
@@ -883,90 +883,109 @@ function startCallbackServer(expectedState) {
883
883
  }
884
884
 
885
885
  // src/auth/device-flow.ts
886
- import { createInterface } from "readline";
887
886
  function sleep(ms) {
888
887
  return new Promise((resolve) => setTimeout(resolve, ms));
889
888
  }
890
- function prompt(question) {
891
- const rl = createInterface({
892
- input: process.stdin,
893
- output: process.stderr
894
- // Use stderr so stdout stays clean for MCP
895
- });
896
- return new Promise((resolve) => {
897
- rl.question(question, (answer) => {
898
- rl.close();
899
- resolve(answer.trim());
900
- });
901
- });
889
+ async function fetchWorkosClientId2() {
890
+ const response = await fetch(`${getSiteUrl()}/api/auth/config`);
891
+ const data = await response.json();
892
+ if (!response.ok || data.ok === false || !data.workosClientId) {
893
+ throw new Error(data.error ?? `HTTP ${response.status}`);
894
+ }
895
+ return data.workosClientId;
902
896
  }
903
- async function deviceLogin() {
904
- const siteUrl = getSiteUrl();
905
- const codeRes = await fetch(`${siteUrl}/api/auth/device/code`, {
906
- method: "POST",
907
- headers: { "Content-Type": "application/json" }
908
- });
909
- if (!codeRes.ok) {
910
- const body = await codeRes.text();
911
- throw new Error(`Failed to start device flow: ${body}`);
897
+ function userName(user) {
898
+ return [user.first_name, user.last_name].filter(Boolean).join(" ");
899
+ }
900
+ async function requestDeviceAuthorization(clientId) {
901
+ const response = await fetch(
902
+ `${WORKOS_API_URL}/user_management/authorize/device`,
903
+ {
904
+ method: "POST",
905
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
906
+ body: new URLSearchParams({ client_id: clientId })
907
+ }
908
+ );
909
+ const data = await response.json();
910
+ if (!response.ok || !data.device_code || !data.user_code || !data.verification_uri) {
911
+ throw new Error(
912
+ data.error_description ?? data.error ?? `HTTP ${response.status}`
913
+ );
912
914
  }
913
- const codeData = await codeRes.json();
914
- console.log("");
915
- console.log(" Paste this URL in your browser to sign in:");
916
- console.log("");
917
- console.log(` ${codeData.verificationUri}`);
918
- console.log("");
919
- const confirmationCode = await prompt(" Enter the code from your browser: ");
920
- if (!confirmationCode) {
921
- throw new Error("No confirmation code entered.");
922
- }
923
- const normalizedCode = confirmationCode.toUpperCase().replace(/[\s-]/g, "").replace(/^(.{4})/, "$1-");
924
- console.log(" Verifying...");
925
- let pollInterval = codeData.interval * 1e3;
926
- while (Date.now() < codeData.expiresAt) {
927
- const pollRes = await fetch(`${siteUrl}/api/auth/device/poll`, {
915
+ return data;
916
+ }
917
+ async function pollForTokens(clientId, authorization) {
918
+ let intervalMs = (authorization.interval ?? 5) * 1e3;
919
+ const deadline = Date.now() + (authorization.expires_in ?? 300) * 1e3;
920
+ while (Date.now() < deadline) {
921
+ const response = await fetch(`${WORKOS_API_URL}/user_management/authenticate`, {
928
922
  method: "POST",
929
- headers: { "Content-Type": "application/json" },
930
- body: JSON.stringify({
931
- deviceCode: codeData.deviceCode,
932
- confirmationCode: normalizedCode
923
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
924
+ body: new URLSearchParams({
925
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
926
+ device_code: authorization.device_code,
927
+ client_id: clientId
933
928
  })
934
929
  });
935
- if (pollRes.status === 429) {
936
- const data2 = await pollRes.json();
937
- pollInterval = (data2.interval ?? codeData.interval * 2) * 1e3;
938
- await sleep(pollInterval);
939
- continue;
930
+ const data = await response.json();
931
+ if (response.ok) {
932
+ const success = data;
933
+ if (!success.access_token || !success.refresh_token || !success.user) {
934
+ throw new Error("Device authorization returned an incomplete token response.");
935
+ }
936
+ return success;
940
937
  }
941
- const data = await pollRes.json();
942
- if (data.status === "pending") {
943
- await sleep(pollInterval);
938
+ const error = data.error;
939
+ if (error === "authorization_pending") {
940
+ await sleep(intervalMs);
944
941
  continue;
945
942
  }
946
- if (data.status === "authorized") {
947
- writeTokens({
948
- accessToken: data.accessToken,
949
- refreshToken: data.refreshToken,
950
- expiresAt: data.expiresAt,
951
- user: data.user,
952
- orgSlug: data.orgSlug ?? void 0,
953
- tokenType: "service"
954
- });
955
- return { email: data.user.email, name: data.user.name };
943
+ if (error === "slow_down") {
944
+ intervalMs += 5e3;
945
+ await sleep(intervalMs);
946
+ continue;
956
947
  }
957
- if (data.status === "invalid_code") {
958
- throw new Error(
959
- "Invalid confirmation code. Make sure you copied the code from the browser correctly."
960
- );
948
+ if (error === "access_denied") {
949
+ throw new Error("Device authorization was denied.");
961
950
  }
962
- if (data.status === "expired") {
951
+ if (error === "expired_token") {
963
952
  throw new Error("Device authorization expired. Run `fml login` again.");
964
953
  }
965
- throw new Error(`Device authorization failed: ${data.status}`);
954
+ throw new Error(
955
+ data.error_description ?? error ?? `HTTP ${response.status}`
956
+ );
966
957
  }
967
- throw new Error(
968
- "Device authorization timed out (15 minutes). Run `fml login` again."
958
+ throw new Error("Device authorization timed out. Run `fml login` again.");
959
+ }
960
+ async function deviceLogin() {
961
+ const clientId = await fetchWorkosClientId2();
962
+ const authorization = await requestDeviceAuthorization(clientId);
963
+ console.log("");
964
+ console.log(" Sign in with this code:");
965
+ console.log("");
966
+ console.log(` ${authorization.user_code}`);
967
+ console.log("");
968
+ console.log(" Open this URL in your browser:");
969
+ console.log("");
970
+ console.log(
971
+ ` ${authorization.verification_uri_complete ?? authorization.verification_uri}`
969
972
  );
973
+ console.log("");
974
+ console.log(" Waiting for authorization...");
975
+ const data = await pollForTokens(clientId, authorization);
976
+ const name = userName(data.user);
977
+ writeTokens({
978
+ accessToken: data.access_token,
979
+ refreshToken: data.refresh_token,
980
+ expiresAt: Date.now() + (data.expires_in ?? 300) * 1e3,
981
+ user: {
982
+ id: data.user.id,
983
+ email: data.user.email,
984
+ name
985
+ },
986
+ workosClientId: clientId
987
+ });
988
+ return { email: data.user.email, name };
970
989
  }
971
990
 
972
991
  // src/commands/login.ts
@@ -977,19 +996,6 @@ async function linkGitHubIdentity() {
977
996
  return;
978
997
  }
979
998
  try {
980
- const response = await fetch("https://api.github.com/user", {
981
- headers: {
982
- Authorization: `Bearer ${token}`,
983
- Accept: "application/vnd.github+json"
984
- }
985
- });
986
- if (!response.ok) {
987
- console.warn(
988
- `[fml] GitHub API returned ${response.status} \u2014 skipping identity link`
989
- );
990
- return;
991
- }
992
- const user = await response.json();
993
999
  const fmlToken = await getValidToken();
994
1000
  if (!fmlToken) {
995
1001
  console.warn("[fml] No FML token available \u2014 skipping identity link");
@@ -1004,17 +1010,13 @@ async function linkGitHubIdentity() {
1004
1010
  "Content-Type": "application/json",
1005
1011
  Authorization: `Bearer ${fmlToken}`
1006
1012
  },
1007
- body: JSON.stringify({
1008
- githubUsername: user.login,
1009
- githubId: user.id,
1010
- githubEmail: user.email ?? void 0
1011
- })
1013
+ body: JSON.stringify({ githubAccessToken: token })
1012
1014
  });
1013
1015
  const linkResult = await linkResponse.json();
1014
1016
  if (!linkResponse.ok || linkResult.ok === false) {
1015
1017
  throw new Error(linkResult.error ?? `HTTP ${linkResponse.status}`);
1016
1018
  }
1017
- console.log(`Linked GitHub account: ${user.login}`);
1019
+ console.log("Linked GitHub account");
1018
1020
  } catch (err) {
1019
1021
  const msg = err instanceof Error ? err.message : String(err);
1020
1022
  console.warn(`[fml] Failed to link GitHub identity: ${msg}`);
@@ -1959,7 +1961,7 @@ async function handleConfigDetail(opts) {
1959
1961
  // src/commands/tools.ts
1960
1962
  import { readFileSync } from "fs";
1961
1963
  import path3 from "path";
1962
- var pluginVersion = true ? "0.5.0+738a81c" : void 0;
1964
+ var pluginVersion = true ? "0.6.0+c1e84c1" : void 0;
1963
1965
  async function getApi() {
1964
1966
  const api = await getAuthenticatedClient();
1965
1967
  if (!api) {
@@ -2090,7 +2092,7 @@ if (process.argv.length <= 2 || process.argv.includes("--help") || process.argv.
2090
2092
  printBanner();
2091
2093
  }
2092
2094
  var program = new Command().name("fml").description("FML agent tools for Claude Code").version(
2093
- true ? "0.5.0+738a81c" : "dev"
2095
+ true ? "0.6.0+c1e84c1" : "dev"
2094
2096
  );
2095
2097
  var tools = program.command("tools", { hidden: true }).description("List all available CLI commands (including hidden agent tools)").action(() => {
2096
2098
  function formatCmd(cmd, prefix = "") {
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","../src/commands/tools.ts"],"sourcesContent":["#!/usr/bin/env node\n\ndeclare const __FML_PLUGIN_VERSION__: string;\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 {\n handleStart,\n handleStop,\n handleSyncStart,\n handleSyncStop,\n} 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 .option(\n \"--force\",\n \"Reinstall even if already set up (upgrades panopticon, re-registers plugin)\",\n )\n .action((opts) => handleInstall(opts));\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\n// ── Panopticon server lifecycle ─────────────────────────────────────────────\n\nconst panopticon = program\n .command(\"panopticon\")\n .description(\"Start or stop the panopticon server\");\n\npanopticon\n .command(\"start\")\n .description(\"Start the panopticon server\")\n .action(() => handleStart());\n\npanopticon\n .command(\"stop\")\n .description(\"Stop the panopticon server\")\n .action(() => handleStop());\n\n// ── Sync subcommand ───────────────────────────────────────────────────────\n\nconst sync = program.command(\"sync\").description(\"Manage sync configuration\");\n\nsync\n .command(\"start\")\n .description(\"Start syncing to configured targets (enable sync)\")\n .action(() => handleSyncStart());\n\nsync\n .command(\"stop\")\n .description(\"Stop syncing (disable sync; leaves targets configured)\")\n .action(() => handleSyncStop());\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 { createFmlClient } from \"../fml-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 createFmlClient(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 envConfigExists,\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(\n opts: { force?: boolean } = {},\n): Promise<void> {\n const force = opts.force ?? false;\n const pluginRoot = getPluginRoot();\n console.log(`Installing fml${force ? \" (--force)\" : \"\"}...\\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 // --force always reinstalls panopticon to pick up the latest build.\n let needsInstall = !bin || force;\n if (bin && !force) {\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 the active env to the default only on a fresh install. `fml install`\n // runs on every `npm install -g` (postinstall), so clobbering this on each\n // run would reset the env pointer and orphan the user's per-env login token\n // (tokens are stored per env at auth.<env>.json).\n if (!envConfigExists()) {\n writeEnvConfig({ active: DEFAULT_TARGET_NAME });\n }\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 --force` 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 {\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 {\n getSelectedOrg,\n getValidToken,\n setSelectedOrg,\n} from \"../auth/token-store.js\";\nimport { createFmlClient } from \"../fml-client.js\";\nimport { resolveGitHubToken } from \"../sync/client.js\";\nimport {\n DEFAULT_SYNC_URL,\n getActiveEnv,\n getSiteUrl,\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 linkResponse = await fetch(`${getSiteUrl()}/api/auth/link-github-identity`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${fmlToken}`,\n },\n body: JSON.stringify({\n githubUsername: user.login,\n githubId: user.id,\n githubEmail: user.email ?? undefined,\n }),\n });\n const linkResult = (await linkResponse.json()) as {\n ok?: boolean;\n error?: string;\n };\n if (!linkResponse.ok || linkResult.ok === false) {\n throw new Error(linkResult.error ?? `HTTP ${linkResponse.status}`);\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 = createFmlClient(token);\n const orgs = await api.queryOrgs();\n if (orgs.length === 0) return;\n\n // Preserve the user's existing selection if it's still a valid org —\n // only fall back to the first org when nothing valid is selected. Logging\n // in (or re-logging-in) should not silently reset a prior `fml org <slug>`.\n const current = getSelectedOrg();\n const org =\n (current && orgs.find((o) => (o.slug ?? o.name) === current)) || 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 { getSiteUrl, 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 backend deployment.\n * This allows each environment to use its own WorkOS configuration.\n */\nasync function fetchWorkosClientId(): Promise<string> {\n const response = await fetch(`${getSiteUrl()}/api/auth/config`);\n const data = (await response.json()) as {\n ok?: boolean;\n workosClientId?: string;\n error?: string;\n };\n\n if (!response.ok || data.ok === false || !data.workosClientId) {\n throw new Error(data.error ?? `HTTP ${response.status}`);\n }\n\n return data.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 { createFmlClient } from \"../fml-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 = createFmlClient(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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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"]}
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 { 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 {\n handleStart,\n handleStop,\n handleSyncStart,\n handleSyncStop,\n} 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 .option(\n \"--force\",\n \"Reinstall even if already set up (upgrades panopticon, re-registers plugin)\",\n )\n .action((opts) => handleInstall(opts));\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\n// ── Panopticon server lifecycle ─────────────────────────────────────────────\n\nconst panopticon = program\n .command(\"panopticon\")\n .description(\"Start or stop the panopticon server\");\n\npanopticon\n .command(\"start\")\n .description(\"Start the panopticon server\")\n .action(() => handleStart());\n\npanopticon\n .command(\"stop\")\n .description(\"Stop the panopticon server\")\n .action(() => handleStop());\n\n// ── Sync subcommand ───────────────────────────────────────────────────────\n\nconst sync = program.command(\"sync\").description(\"Manage sync configuration\");\n\nsync\n .command(\"start\")\n .description(\"Start syncing to configured targets (enable sync)\")\n .action(() => handleSyncStart());\n\nsync\n .command(\"stop\")\n .description(\"Stop syncing (disable sync; leaves targets configured)\")\n .action(() => handleSyncStop());\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 { createFmlClient } from \"../fml-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 createFmlClient(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 envConfigExists,\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(\n opts: { force?: boolean } = {},\n): Promise<void> {\n const force = opts.force ?? false;\n const pluginRoot = getPluginRoot();\n console.log(`Installing fml${force ? \" (--force)\" : \"\"}...\\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 // --force always reinstalls panopticon to pick up the latest build.\n let needsInstall = !bin || force;\n if (bin && !force) {\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 the active env to the default only on a fresh install. `fml install`\n // runs on every `npm install -g` (postinstall), so clobbering this on each\n // run would reset the env pointer and orphan the user's per-env login token\n // (tokens are stored per env at auth.<env>.json).\n if (!envConfigExists()) {\n writeEnvConfig({ active: DEFAULT_TARGET_NAME });\n }\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 --force` 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 {\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 {\n getSelectedOrg,\n getValidToken,\n setSelectedOrg,\n} from \"../auth/token-store.js\";\nimport { createFmlClient } from \"../fml-client.js\";\nimport { resolveGitHubToken } from \"../sync/client.js\";\nimport {\n DEFAULT_SYNC_URL,\n getActiveEnv,\n getSiteUrl,\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 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 linkResponse = await fetch(`${getSiteUrl()}/api/auth/link-github-identity`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${fmlToken}`,\n },\n body: JSON.stringify({ githubAccessToken: token }),\n });\n const linkResult = (await linkResponse.json()) as {\n ok?: boolean;\n error?: string;\n };\n if (!linkResponse.ok || linkResult.ok === false) {\n throw new Error(linkResult.error ?? `HTTP ${linkResponse.status}`);\n }\n\n console.log(\"Linked GitHub account\");\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 = createFmlClient(token);\n const orgs = await api.queryOrgs();\n if (orgs.length === 0) return;\n\n // Preserve the user's existing selection if it's still a valid org —\n // only fall back to the first org when nothing valid is selected. Logging\n // in (or re-logging-in) should not silently reset a prior `fml org <slug>`.\n const current = getSelectedOrg();\n const org =\n (current && orgs.find((o) => (o.slug ?? o.name) === current)) || 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 { getSiteUrl, 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 backend deployment.\n * This allows each environment to use its own WorkOS configuration.\n */\nasync function fetchWorkosClientId(): Promise<string> {\n const response = await fetch(`${getSiteUrl()}/api/auth/config`);\n const data = (await response.json()) as {\n ok?: boolean;\n workosClientId?: string;\n error?: string;\n };\n\n if (!response.ok || data.ok === false || !data.workosClientId) {\n throw new Error(data.error ?? `HTTP ${response.status}`);\n }\n\n return data.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 * WorkOS CLI Device Authorization Flow\n *\n * This uses WorkOS/AuthKit's OAuth 2.0 device authorization grant so device\n * login produces the same user credential family as browser OAuth login.\n */\n\nimport { WORKOS_API_URL, 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\nasync function fetchWorkosClientId(): Promise<string> {\n const response = await fetch(`${getSiteUrl()}/api/auth/config`);\n const data = (await response.json()) as {\n ok?: boolean;\n workosClientId?: string;\n error?: string;\n };\n\n if (!response.ok || data.ok === false || !data.workosClientId) {\n throw new Error(data.error ?? `HTTP ${response.status}`);\n }\n\n return data.workosClientId;\n}\n\ninterface DeviceAuthorizationResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in?: number;\n interval?: number;\n}\n\ninterface DeviceTokenSuccessResponse {\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\ninterface DeviceTokenErrorResponse {\n error?: string;\n error_description?: string;\n}\n\nfunction userName(user: DeviceTokenSuccessResponse[\"user\"]): string {\n return [user.first_name, user.last_name].filter(Boolean).join(\" \");\n}\n\nasync function requestDeviceAuthorization(\n clientId: string,\n): Promise<DeviceAuthorizationResponse> {\n const response = await fetch(\n `${WORKOS_API_URL}/user_management/authorize/device`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({ client_id: clientId }),\n },\n );\n const data = (await response.json()) as Partial<DeviceAuthorizationResponse> & {\n error?: string;\n error_description?: string;\n };\n\n if (\n !response.ok ||\n !data.device_code ||\n !data.user_code ||\n !data.verification_uri\n ) {\n throw new Error(\n data.error_description ?? data.error ?? `HTTP ${response.status}`,\n );\n }\n\n return data as DeviceAuthorizationResponse;\n}\n\nasync function pollForTokens(\n clientId: string,\n authorization: DeviceAuthorizationResponse,\n): Promise<DeviceTokenSuccessResponse> {\n let intervalMs = (authorization.interval ?? 5) * 1000;\n const deadline = Date.now() + (authorization.expires_in ?? 300) * 1000;\n\n while (Date.now() < deadline) {\n const response = await fetch(`${WORKOS_API_URL}/user_management/authenticate`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: authorization.device_code,\n client_id: clientId,\n }),\n });\n const data = (await response.json()) as\n | DeviceTokenSuccessResponse\n | DeviceTokenErrorResponse;\n\n if (response.ok) {\n const success = data as DeviceTokenSuccessResponse;\n if (!success.access_token || !success.refresh_token || !success.user) {\n throw new Error(\"Device authorization returned an incomplete token response.\");\n }\n return success;\n }\n\n const error = (data as DeviceTokenErrorResponse).error;\n if (error === \"authorization_pending\") {\n await sleep(intervalMs);\n continue;\n }\n if (error === \"slow_down\") {\n intervalMs += 5_000;\n await sleep(intervalMs);\n continue;\n }\n if (error === \"access_denied\") {\n throw new Error(\"Device authorization was denied.\");\n }\n if (error === \"expired_token\") {\n throw new Error(\"Device authorization expired. Run `fml login` again.\");\n }\n\n throw new Error(\n (data as DeviceTokenErrorResponse).error_description ??\n error ??\n `HTTP ${response.status}`,\n );\n }\n\n throw new Error(\"Device authorization timed out. Run `fml login` again.\");\n}\n\n/**\n * Run WorkOS/AuthKit CLI device authorization.\n */\nexport async function deviceLogin(): Promise<{\n email: string;\n name: string;\n}> {\n const clientId = await fetchWorkosClientId();\n const authorization = await requestDeviceAuthorization(clientId);\n\n console.log(\"\");\n console.log(\" Sign in with this code:\");\n console.log(\"\");\n console.log(` ${authorization.user_code}`);\n console.log(\"\");\n console.log(\" Open this URL in your browser:\");\n console.log(\"\");\n console.log(\n ` ${authorization.verification_uri_complete ?? authorization.verification_uri}`,\n );\n console.log(\"\");\n console.log(\" Waiting for authorization...\");\n\n const data = await pollForTokens(clientId, authorization);\n const name = userName(data.user);\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,\n },\n workosClientId: clientId,\n });\n\n return { email: data.user.email, name };\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 { createFmlClient } from \"../fml-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 = createFmlClient(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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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 \"../fml-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","userName","fetchWorkosClientId","config","loadSyncConfig","addTarget","readTokens","fs","fs","addTarget","listTargets","loadSyncConfig","saveSyncConfig","syncPending","config","listTargets","listTargets","path","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fml-inc/fml",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "FML agent tools for Claude Code",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",