@forcefield/mcp-server 0.1.10 → 0.1.12

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,19 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runMcpCli
4
- } from "../chunk-K464TYAJ.js";
4
+ } from "../chunk-N46MYH57.js";
5
5
  import {
6
6
  runSetupCli
7
- } from "../chunk-LLRIGBUL.js";
7
+ } from "../chunk-GCWFF4C5.js";
8
8
  import {
9
9
  LOCAL_SUPABASE_URL,
10
10
  PRODUCTION_SUPABASE_PUBLISHABLE_KEY,
11
11
  PRODUCTION_SUPABASE_URL
12
12
  } from "../chunk-UOMOGP46.js";
13
13
 
14
- // cli/index.ts
15
- import { pathToFileURL } from "url";
16
-
17
14
  // cli/dashboard.ts
18
15
  import { spawn } from "child_process";
19
16
  import { existsSync } from "fs";
@@ -344,16 +341,7 @@ async function runForcefieldCli(argv = process.argv) {
344
341
  setupArgv.push(...rest);
345
342
  await runSetupCli(setupArgv);
346
343
  }
347
- function isExecutedDirectly(metaUrl) {
348
- const entryPath = process.argv[1];
349
- if (!entryPath) return false;
350
- return metaUrl === pathToFileURL(entryPath).href;
351
- }
352
- if (isExecutedDirectly(import.meta.url)) {
353
- void runForcefieldCli();
354
- }
355
- export {
356
- parseForcefieldCommand,
357
- runForcefieldCli
358
- };
344
+
345
+ // cli/entry.ts
346
+ void runForcefieldCli();
359
347
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../cli/index.ts","../../cli/dashboard.ts"],"sourcesContent":["/**\n * Unified Forcefield CLI entrypoint.\n *\n * Gives users a single command surface:\n * forcefield setup\n * forcefield doctor\n * forcefield status\n * forcefield dashboard start\n * forcefield mcp\n */\n\nimport { pathToFileURL } from 'node:url';\nimport { runSetupCli } from '../setup/index.js';\nimport { runMcpCli } from '../src/index.js';\nimport { runDashboardCli } from './dashboard.js';\n\ntype ForcefieldCommand = 'setup' | 'doctor' | 'status' | 'dashboard' | 'mcp' | 'help';\n\nexport function parseForcefieldCommand(argv: string[]): { command: ForcefieldCommand; rest: string[] } {\n const cmd = argv[2];\n const rest = argv.slice(3);\n\n if (!cmd || cmd === 'setup') return { command: 'setup', rest };\n if (cmd === 'doctor') return { command: 'doctor', rest };\n if (cmd === 'status') return { command: 'status', rest };\n if (cmd === 'dashboard') return { command: 'dashboard', rest };\n if (cmd === 'mcp') return { command: 'mcp', rest };\n if (cmd === 'help' || cmd === '--help' || cmd === '-h') return { command: 'help', rest };\n\n return { command: 'help', rest: [cmd, ...rest] };\n}\n\nfunction printUsage(): void {\n console.log(\n [\n 'Forcefield CLI',\n '',\n 'Usage:',\n ' forcefield setup Run interactive setup wizard',\n ' forcefield doctor Validate setup + MCP connectivity',\n ' forcefield status Show setup status in current project',\n ' forcefield dashboard start Scaffold + run local dashboard (hosted backend by default)',\n ' forcefield mcp Start MCP server process (stdio)',\n ' forcefield help Show this help',\n '',\n 'One-off without global install:',\n ' npx -y @forcefield/forcefield setup',\n ' npx -y @forcefield/forcefield dashboard start',\n '',\n 'Direct runtime package path (equivalent):',\n ' npx -y -p @forcefield/mcp-server forcefield setup',\n ].join('\\n'),\n );\n}\n\nexport async function runForcefieldCli(argv: string[] = process.argv): Promise<void> {\n const { command, rest } = parseForcefieldCommand(argv);\n\n if (command === 'help') {\n printUsage();\n if (rest.length > 0) {\n process.exitCode = 1;\n }\n return;\n }\n\n if (command === 'mcp') {\n await runMcpCli();\n return;\n }\n\n if (command === 'dashboard') {\n await runDashboardCli(rest);\n return;\n }\n\n const setupArgv = ['node', 'forcefield-setup'];\n if (command === 'doctor') setupArgv.push('--doctor');\n if (command === 'status') setupArgv.push('--status');\n setupArgv.push(...rest);\n await runSetupCli(setupArgv);\n}\n\nfunction isExecutedDirectly(metaUrl: string): boolean {\n const entryPath = process.argv[1];\n if (!entryPath) return false;\n return metaUrl === pathToFileURL(entryPath).href;\n}\n\nif (isExecutedDirectly(import.meta.url)) {\n void runForcefieldCli();\n}\n","import { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport pc from 'picocolors';\nimport {\n LOCAL_SUPABASE_URL,\n PRODUCTION_SUPABASE_PUBLISHABLE_KEY,\n PRODUCTION_SUPABASE_URL,\n} from '../src/supabase-defaults.js';\n\nconst DEFAULT_DIR = './forcefield-dashboard';\n\nexport interface DashboardStartOptions {\n dir: string;\n local: boolean;\n force: boolean;\n install: boolean;\n run: boolean;\n}\n\ninterface DashboardCommand {\n type: 'start' | 'help';\n options: DashboardStartOptions;\n invalidCommand?: string;\n parseError?: string;\n}\n\ninterface DashboardEnv {\n supabaseUrl: string;\n anonKey: string;\n}\n\ninterface DashboardOps {\n scaffoldDashboard(targetDir: string, force: boolean): Promise<void>;\n getLocalEnv(): Promise<DashboardEnv>;\n installDependencies(targetDir: string): Promise<void>;\n startDevServer(targetDir: string): Promise<void>;\n}\n\nfunction npmCmd(): string {\n return process.platform === 'win32' ? 'npm.cmd' : 'npm';\n}\n\nfunction printUsage(): void {\n console.log(\n [\n 'Forcefield Dashboard',\n '',\n 'Usage:',\n ' forcefield dashboard start [--dir <path>] [--local] [--force] [--no-install] [--no-run]',\n ' forcefield dashboard --help',\n '',\n 'Examples:',\n ' forcefield dashboard start',\n ' forcefield dashboard start --dir ./dashboard',\n ' forcefield dashboard start --local --force',\n ].join('\\n'),\n );\n}\n\nexport function parseDashboardCommand(args: string[]): DashboardCommand {\n const defaultOptions: DashboardStartOptions = {\n dir: DEFAULT_DIR,\n local: false,\n force: false,\n install: true,\n run: true,\n };\n\n if (args.includes('--help') || args.includes('-h')) {\n return { type: 'help', options: defaultOptions };\n }\n\n const first = args[0];\n const isStart = !first || first === 'start';\n if (!isStart) {\n return {\n type: 'help',\n invalidCommand: first,\n options: defaultOptions,\n };\n }\n\n const optionArgs = first === 'start' ? args.slice(1) : args;\n const options = { ...defaultOptions };\n\n for (let i = 0; i < optionArgs.length; i += 1) {\n const arg = optionArgs[i];\n if (arg === '--dir' || arg === '-d') {\n const value = optionArgs[i + 1];\n if (!value || value.startsWith('-')) {\n return {\n type: 'help',\n parseError: 'Missing value for --dir.',\n options: defaultOptions,\n };\n }\n options.dir = value;\n i += 1;\n continue;\n }\n\n if (arg === '--local') {\n options.local = true;\n continue;\n }\n\n if (arg === '--force' || arg === '-f') {\n options.force = true;\n continue;\n }\n\n if (arg === '--no-install') {\n options.install = false;\n continue;\n }\n\n if (arg === '--no-run') {\n options.run = false;\n continue;\n }\n\n return {\n type: 'help',\n parseError: `Unknown option: ${arg}`,\n options: defaultOptions,\n };\n }\n\n return {\n type: 'start',\n options,\n };\n}\n\nasync function runProcess(\n command: string,\n args: string[],\n options?: { cwd?: string; capture?: boolean },\n): Promise<{ code: number; stdout: string; stderr: string }> {\n return new Promise((resolvePromise, rejectPromise) => {\n const child = spawn(command, args, {\n cwd: options?.cwd,\n env: process.env,\n stdio: options?.capture ? ['ignore', 'pipe', 'pipe'] : 'inherit',\n });\n\n let stdout = '';\n let stderr = '';\n\n if (options?.capture) {\n child.stdout.on('data', (chunk) => {\n stdout += String(chunk);\n });\n child.stderr.on('data', (chunk) => {\n stderr += String(chunk);\n });\n }\n\n child.on('error', (error) => {\n rejectPromise(error);\n });\n\n child.on('close', (code) => {\n resolvePromise({ code: code ?? 1, stdout, stderr });\n });\n });\n}\n\nfunction parseEnvAssignments(raw: string): Record<string, string> {\n const env: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const match = trimmed.match(/^(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);\n if (!match) continue;\n const key = match[1]!;\n let value = match[2] ?? '';\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n env[key] = value;\n }\n return env;\n}\n\nfunction formatManualFallback(targetDir: string, force: boolean): string {\n return [\n 'Manual fallback:',\n ` npx -y @forcefield/dashboard-template@beta init --dir ${targetDir}${force ? ' --force' : ''}`,\n ].join('\\n');\n}\n\nconst defaultOps: DashboardOps = {\n async scaffoldDashboard(targetDir, force) {\n const args = [\n 'exec',\n '--yes',\n '--package=@forcefield/dashboard-template@beta',\n 'forcefield-dashboard',\n '--',\n 'init',\n '--dir',\n targetDir,\n ];\n if (force) {\n args.push('--force');\n }\n\n try {\n const result = await runProcess(npmCmd(), args);\n if (result.code !== 0) {\n throw new Error(`Scaffold command exited with code ${result.code}.`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to scaffold dashboard automatically: ${message}\\n${formatManualFallback(targetDir, force)}`,\n );\n }\n },\n\n async getLocalEnv() {\n let result;\n try {\n result = await runProcess('supabase', ['status', '-o', 'env'], { capture: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Could not run 'supabase status -o env': ${message}. Install Supabase CLI and run ${pc.cyan('supabase start')}, or remove ${pc.cyan('--local')}.`,\n );\n }\n\n if (result.code !== 0) {\n const detail = (result.stderr || result.stdout).trim() || `exit code ${result.code}`;\n throw new Error(\n `Local Supabase is unavailable (${detail}). Run ${pc.cyan('supabase start')} first, or remove ${pc.cyan('--local')}.`,\n );\n }\n\n const env = parseEnvAssignments(result.stdout);\n const supabaseUrl = env.SUPABASE_URL || LOCAL_SUPABASE_URL;\n const anonKey = env.SUPABASE_ANON_KEY || env.ANON_KEY;\n\n if (!anonKey) {\n throw new Error(\n `Could not find an anon key from ${pc.cyan('supabase status -o env')}. Ensure local stack is running, or remove ${pc.cyan('--local')}.`,\n );\n }\n\n return { supabaseUrl, anonKey };\n },\n\n async installDependencies(targetDir) {\n const result = await runProcess(npmCmd(), ['install'], { cwd: targetDir });\n if (result.code !== 0) {\n throw new Error(`Dependency install failed (exit ${result.code}).`);\n }\n },\n\n async startDevServer(targetDir) {\n const result = await runProcess(npmCmd(), ['run', 'dev'], { cwd: targetDir });\n if (result.code !== 0) {\n throw new Error(`Dashboard dev server exited with code ${result.code}.`);\n }\n },\n};\n\nasync function writeDashboardEnv(\n targetDir: string,\n env: DashboardEnv,\n force: boolean,\n): Promise<{ path: string; wrote: boolean }> {\n const envPath = join(targetDir, '.env.local');\n\n if (existsSync(envPath) && !force) {\n return { path: envPath, wrote: false };\n }\n\n const content = [\n `NEXT_PUBLIC_SUPABASE_URL=${env.supabaseUrl}`,\n `NEXT_PUBLIC_SUPABASE_ANON_KEY=${env.anonKey}`,\n '',\n ].join('\\n');\n\n await writeFile(envPath, content, 'utf-8');\n return { path: envPath, wrote: true };\n}\n\nexport async function runDashboardStart(\n options: DashboardStartOptions,\n ops: DashboardOps = defaultOps,\n): Promise<void> {\n const targetDir = resolve(process.cwd(), options.dir);\n\n console.log(pc.bold('Forcefield Dashboard Bootstrap'));\n console.log(`Target: ${pc.cyan(targetDir)}`);\n\n await ops.scaffoldDashboard(targetDir, options.force);\n\n const env = options.local\n ? await ops.getLocalEnv()\n : {\n supabaseUrl: PRODUCTION_SUPABASE_URL,\n anonKey: PRODUCTION_SUPABASE_PUBLISHABLE_KEY,\n };\n\n const envWrite = await writeDashboardEnv(targetDir, env, options.force);\n if (envWrite.wrote) {\n console.log(`${pc.green('✓')} Wrote ${pc.cyan(envWrite.path)} (${options.local ? 'local' : 'hosted'} backend).`);\n } else {\n console.log(`${pc.yellow('•')} Preserved existing ${pc.cyan(envWrite.path)} (use ${pc.cyan('--force')} to overwrite).`);\n }\n\n if (options.install) {\n console.log(`${pc.dim('→')} Installing dashboard dependencies...`);\n await ops.installDependencies(targetDir);\n } else {\n console.log(`${pc.yellow('•')} Skipped dependency install (${pc.cyan('--no-install')}).`);\n }\n\n if (options.run) {\n console.log(`${pc.dim('→')} Starting dashboard dev server...`);\n console.log(pc.dim('Press Ctrl+C to stop.'));\n await ops.startDevServer(targetDir);\n return;\n }\n\n console.log(`${pc.yellow('•')} Skipped dev server startup (${pc.cyan('--no-run')}).`);\n console.log('');\n console.log('Next steps:');\n console.log(` cd ${targetDir}`);\n if (!options.install) {\n console.log(' npm install');\n }\n console.log(' npm run dev');\n console.log('');\n console.log('Then open http://localhost:3000 and sign in.');\n}\n\nexport async function runDashboardCli(args: string[]): Promise<void> {\n const parsed = parseDashboardCommand(args);\n\n if (parsed.type === 'help') {\n if (parsed.invalidCommand) {\n console.error(pc.red(`Unknown dashboard subcommand: ${parsed.invalidCommand}`));\n }\n if (parsed.parseError) {\n console.error(pc.red(parsed.parseError));\n }\n printUsage();\n if (parsed.invalidCommand || parsed.parseError) {\n process.exitCode = 1;\n }\n return;\n }\n\n await runDashboardStart(parsed.options);\n}\n\nexport { parseEnvAssignments };\n"],"mappings":"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","names":["printUsage"]}
1
+ {"version":3,"sources":["../../cli/dashboard.ts","../../cli/index.ts","../../cli/entry.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport pc from 'picocolors';\nimport {\n LOCAL_SUPABASE_URL,\n PRODUCTION_SUPABASE_PUBLISHABLE_KEY,\n PRODUCTION_SUPABASE_URL,\n} from '../src/supabase-defaults.js';\n\nconst DEFAULT_DIR = './forcefield-dashboard';\n\nexport interface DashboardStartOptions {\n dir: string;\n local: boolean;\n force: boolean;\n install: boolean;\n run: boolean;\n}\n\ninterface DashboardCommand {\n type: 'start' | 'help';\n options: DashboardStartOptions;\n invalidCommand?: string;\n parseError?: string;\n}\n\ninterface DashboardEnv {\n supabaseUrl: string;\n anonKey: string;\n}\n\ninterface DashboardOps {\n scaffoldDashboard(targetDir: string, force: boolean): Promise<void>;\n getLocalEnv(): Promise<DashboardEnv>;\n installDependencies(targetDir: string): Promise<void>;\n startDevServer(targetDir: string): Promise<void>;\n}\n\nfunction npmCmd(): string {\n return process.platform === 'win32' ? 'npm.cmd' : 'npm';\n}\n\nfunction printUsage(): void {\n console.log(\n [\n 'Forcefield Dashboard',\n '',\n 'Usage:',\n ' forcefield dashboard start [--dir <path>] [--local] [--force] [--no-install] [--no-run]',\n ' forcefield dashboard --help',\n '',\n 'Examples:',\n ' forcefield dashboard start',\n ' forcefield dashboard start --dir ./dashboard',\n ' forcefield dashboard start --local --force',\n ].join('\\n'),\n );\n}\n\nexport function parseDashboardCommand(args: string[]): DashboardCommand {\n const defaultOptions: DashboardStartOptions = {\n dir: DEFAULT_DIR,\n local: false,\n force: false,\n install: true,\n run: true,\n };\n\n if (args.includes('--help') || args.includes('-h')) {\n return { type: 'help', options: defaultOptions };\n }\n\n const first = args[0];\n const isStart = !first || first === 'start';\n if (!isStart) {\n return {\n type: 'help',\n invalidCommand: first,\n options: defaultOptions,\n };\n }\n\n const optionArgs = first === 'start' ? args.slice(1) : args;\n const options = { ...defaultOptions };\n\n for (let i = 0; i < optionArgs.length; i += 1) {\n const arg = optionArgs[i];\n if (arg === '--dir' || arg === '-d') {\n const value = optionArgs[i + 1];\n if (!value || value.startsWith('-')) {\n return {\n type: 'help',\n parseError: 'Missing value for --dir.',\n options: defaultOptions,\n };\n }\n options.dir = value;\n i += 1;\n continue;\n }\n\n if (arg === '--local') {\n options.local = true;\n continue;\n }\n\n if (arg === '--force' || arg === '-f') {\n options.force = true;\n continue;\n }\n\n if (arg === '--no-install') {\n options.install = false;\n continue;\n }\n\n if (arg === '--no-run') {\n options.run = false;\n continue;\n }\n\n return {\n type: 'help',\n parseError: `Unknown option: ${arg}`,\n options: defaultOptions,\n };\n }\n\n return {\n type: 'start',\n options,\n };\n}\n\nasync function runProcess(\n command: string,\n args: string[],\n options?: { cwd?: string; capture?: boolean },\n): Promise<{ code: number; stdout: string; stderr: string }> {\n return new Promise((resolvePromise, rejectPromise) => {\n const child = spawn(command, args, {\n cwd: options?.cwd,\n env: process.env,\n stdio: options?.capture ? ['ignore', 'pipe', 'pipe'] : 'inherit',\n });\n\n let stdout = '';\n let stderr = '';\n\n if (options?.capture) {\n child.stdout.on('data', (chunk) => {\n stdout += String(chunk);\n });\n child.stderr.on('data', (chunk) => {\n stderr += String(chunk);\n });\n }\n\n child.on('error', (error) => {\n rejectPromise(error);\n });\n\n child.on('close', (code) => {\n resolvePromise({ code: code ?? 1, stdout, stderr });\n });\n });\n}\n\nfunction parseEnvAssignments(raw: string): Record<string, string> {\n const env: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const match = trimmed.match(/^(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);\n if (!match) continue;\n const key = match[1]!;\n let value = match[2] ?? '';\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n env[key] = value;\n }\n return env;\n}\n\nfunction formatManualFallback(targetDir: string, force: boolean): string {\n return [\n 'Manual fallback:',\n ` npx -y @forcefield/dashboard-template@beta init --dir ${targetDir}${force ? ' --force' : ''}`,\n ].join('\\n');\n}\n\nconst defaultOps: DashboardOps = {\n async scaffoldDashboard(targetDir, force) {\n const args = [\n 'exec',\n '--yes',\n '--package=@forcefield/dashboard-template@beta',\n 'forcefield-dashboard',\n '--',\n 'init',\n '--dir',\n targetDir,\n ];\n if (force) {\n args.push('--force');\n }\n\n try {\n const result = await runProcess(npmCmd(), args);\n if (result.code !== 0) {\n throw new Error(`Scaffold command exited with code ${result.code}.`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to scaffold dashboard automatically: ${message}\\n${formatManualFallback(targetDir, force)}`,\n );\n }\n },\n\n async getLocalEnv() {\n let result;\n try {\n result = await runProcess('supabase', ['status', '-o', 'env'], { capture: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Could not run 'supabase status -o env': ${message}. Install Supabase CLI and run ${pc.cyan('supabase start')}, or remove ${pc.cyan('--local')}.`,\n );\n }\n\n if (result.code !== 0) {\n const detail = (result.stderr || result.stdout).trim() || `exit code ${result.code}`;\n throw new Error(\n `Local Supabase is unavailable (${detail}). Run ${pc.cyan('supabase start')} first, or remove ${pc.cyan('--local')}.`,\n );\n }\n\n const env = parseEnvAssignments(result.stdout);\n const supabaseUrl = env.SUPABASE_URL || LOCAL_SUPABASE_URL;\n const anonKey = env.SUPABASE_ANON_KEY || env.ANON_KEY;\n\n if (!anonKey) {\n throw new Error(\n `Could not find an anon key from ${pc.cyan('supabase status -o env')}. Ensure local stack is running, or remove ${pc.cyan('--local')}.`,\n );\n }\n\n return { supabaseUrl, anonKey };\n },\n\n async installDependencies(targetDir) {\n const result = await runProcess(npmCmd(), ['install'], { cwd: targetDir });\n if (result.code !== 0) {\n throw new Error(`Dependency install failed (exit ${result.code}).`);\n }\n },\n\n async startDevServer(targetDir) {\n const result = await runProcess(npmCmd(), ['run', 'dev'], { cwd: targetDir });\n if (result.code !== 0) {\n throw new Error(`Dashboard dev server exited with code ${result.code}.`);\n }\n },\n};\n\nasync function writeDashboardEnv(\n targetDir: string,\n env: DashboardEnv,\n force: boolean,\n): Promise<{ path: string; wrote: boolean }> {\n const envPath = join(targetDir, '.env.local');\n\n if (existsSync(envPath) && !force) {\n return { path: envPath, wrote: false };\n }\n\n const content = [\n `NEXT_PUBLIC_SUPABASE_URL=${env.supabaseUrl}`,\n `NEXT_PUBLIC_SUPABASE_ANON_KEY=${env.anonKey}`,\n '',\n ].join('\\n');\n\n await writeFile(envPath, content, 'utf-8');\n return { path: envPath, wrote: true };\n}\n\nexport async function runDashboardStart(\n options: DashboardStartOptions,\n ops: DashboardOps = defaultOps,\n): Promise<void> {\n const targetDir = resolve(process.cwd(), options.dir);\n\n console.log(pc.bold('Forcefield Dashboard Bootstrap'));\n console.log(`Target: ${pc.cyan(targetDir)}`);\n\n await ops.scaffoldDashboard(targetDir, options.force);\n\n const env = options.local\n ? await ops.getLocalEnv()\n : {\n supabaseUrl: PRODUCTION_SUPABASE_URL,\n anonKey: PRODUCTION_SUPABASE_PUBLISHABLE_KEY,\n };\n\n const envWrite = await writeDashboardEnv(targetDir, env, options.force);\n if (envWrite.wrote) {\n console.log(`${pc.green('✓')} Wrote ${pc.cyan(envWrite.path)} (${options.local ? 'local' : 'hosted'} backend).`);\n } else {\n console.log(`${pc.yellow('•')} Preserved existing ${pc.cyan(envWrite.path)} (use ${pc.cyan('--force')} to overwrite).`);\n }\n\n if (options.install) {\n console.log(`${pc.dim('→')} Installing dashboard dependencies...`);\n await ops.installDependencies(targetDir);\n } else {\n console.log(`${pc.yellow('•')} Skipped dependency install (${pc.cyan('--no-install')}).`);\n }\n\n if (options.run) {\n console.log(`${pc.dim('→')} Starting dashboard dev server...`);\n console.log(pc.dim('Press Ctrl+C to stop.'));\n await ops.startDevServer(targetDir);\n return;\n }\n\n console.log(`${pc.yellow('•')} Skipped dev server startup (${pc.cyan('--no-run')}).`);\n console.log('');\n console.log('Next steps:');\n console.log(` cd ${targetDir}`);\n if (!options.install) {\n console.log(' npm install');\n }\n console.log(' npm run dev');\n console.log('');\n console.log('Then open http://localhost:3000 and sign in.');\n}\n\nexport async function runDashboardCli(args: string[]): Promise<void> {\n const parsed = parseDashboardCommand(args);\n\n if (parsed.type === 'help') {\n if (parsed.invalidCommand) {\n console.error(pc.red(`Unknown dashboard subcommand: ${parsed.invalidCommand}`));\n }\n if (parsed.parseError) {\n console.error(pc.red(parsed.parseError));\n }\n printUsage();\n if (parsed.invalidCommand || parsed.parseError) {\n process.exitCode = 1;\n }\n return;\n }\n\n await runDashboardStart(parsed.options);\n}\n\nexport { parseEnvAssignments };\n","/**\n * Unified Forcefield CLI entrypoint.\n *\n * Gives users a single command surface:\n * forcefield setup\n * forcefield doctor\n * forcefield status\n * forcefield dashboard start\n * forcefield mcp\n */\n\nimport { runSetupCli } from '../setup/index.js';\nimport { runMcpCli } from '../src/index.js';\nimport { runDashboardCli } from './dashboard.js';\n\ntype ForcefieldCommand = 'setup' | 'doctor' | 'status' | 'dashboard' | 'mcp' | 'help';\n\nexport function parseForcefieldCommand(argv: string[]): { command: ForcefieldCommand; rest: string[] } {\n const cmd = argv[2];\n const rest = argv.slice(3);\n\n if (!cmd || cmd === 'setup') return { command: 'setup', rest };\n if (cmd === 'doctor') return { command: 'doctor', rest };\n if (cmd === 'status') return { command: 'status', rest };\n if (cmd === 'dashboard') return { command: 'dashboard', rest };\n if (cmd === 'mcp') return { command: 'mcp', rest };\n if (cmd === 'help' || cmd === '--help' || cmd === '-h') return { command: 'help', rest };\n\n return { command: 'help', rest: [cmd, ...rest] };\n}\n\nfunction printUsage(): void {\n console.log(\n [\n 'Forcefield CLI',\n '',\n 'Usage:',\n ' forcefield setup Run interactive setup wizard',\n ' forcefield doctor Validate setup + MCP connectivity',\n ' forcefield status Show setup status in current project',\n ' forcefield dashboard start Scaffold + run local dashboard (hosted backend by default)',\n ' forcefield mcp Start MCP server process (stdio)',\n ' forcefield help Show this help',\n '',\n 'One-off without global install:',\n ' npx -y @forcefield/forcefield setup',\n ' npx -y @forcefield/forcefield dashboard start',\n '',\n 'Direct runtime package path (equivalent):',\n ' npx -y -p @forcefield/mcp-server forcefield setup',\n ].join('\\n'),\n );\n}\n\nexport async function runForcefieldCli(argv: string[] = process.argv): Promise<void> {\n const { command, rest } = parseForcefieldCommand(argv);\n\n if (command === 'help') {\n printUsage();\n if (rest.length > 0) {\n process.exitCode = 1;\n }\n return;\n }\n\n if (command === 'mcp') {\n await runMcpCli();\n return;\n }\n\n if (command === 'dashboard') {\n await runDashboardCli(rest);\n return;\n }\n\n const setupArgv = ['node', 'forcefield-setup'];\n if (command === 'doctor') setupArgv.push('--doctor');\n if (command === 'status') setupArgv.push('--status');\n setupArgv.push(...rest);\n await runSetupCli(setupArgv);\n}\n","import { runForcefieldCli } from './index.js';\n\nvoid runForcefieldCli();\n"],"mappings":"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","names":["printUsage"]}
package/build/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runMcpCli
4
- } from "./chunk-K464TYAJ.js";
4
+ } from "./chunk-N46MYH57.js";
5
5
  import "./chunk-UOMOGP46.js";
6
- export {
7
- runMcpCli
8
- };
6
+
7
+ // src/mcp-entry.ts
8
+ void runMcpCli();
9
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../src/mcp-entry.ts"],"sourcesContent":["import { runMcpCli } from './index.js';\n\nvoid runMcpCli();\n"],"mappings":";;;;;;;AAEA,KAAK,UAAU;","names":[]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  parseArgs,
4
4
  runSetupCli
5
- } from "../chunk-LLRIGBUL.js";
5
+ } from "../chunk-GCWFF4C5.js";
6
6
  import "../chunk-UOMOGP46.js";
7
7
  export {
8
8
  parseArgs,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forcefield/mcp-server",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "AI-powered corporate compliance MCP server",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",