@insforge/cli 0.1.69 → 0.1.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/prompts.ts","../src/lib/config.ts","../src/commands/login.ts","../src/lib/errors.ts","../src/lib/auth.ts","../src/lib/credentials.ts","../src/lib/api/platform.ts","../src/lib/output.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/orgs/list.ts","../src/commands/projects/list.ts","../src/lib/analytics.ts","../src/commands/branch/switch.ts","../src/commands/branch/create.ts","../src/commands/branch/list.ts","../src/commands/branch/merge.ts","../src/commands/branch/reset.ts","../src/commands/branch/delete.ts","../src/commands/branch/index.ts","../src/commands/projects/link.ts","../src/lib/skills.ts","../src/auth-providers/apply.ts","../src/lib/api/oss.ts","../src/commands/create.ts","../src/lib/env.ts","../src/commands/deployments/deploy.ts","../src/commands/db/query.ts","../src/commands/db/tables.ts","../src/commands/db/functions.ts","../src/commands/db/indexes.ts","../src/commands/db/policies.ts","../src/commands/db/triggers.ts","../src/commands/db/rpc.ts","../src/commands/db/export.ts","../src/commands/db/import.ts","../src/commands/db/migrations.ts","../src/lib/migrations.ts","../src/commands/db/connection-string.ts","../src/commands/records/list.ts","../src/commands/records/create.ts","../src/commands/records/update.ts","../src/commands/records/delete.ts","../src/commands/functions/list.ts","../src/commands/functions/deploy.ts","../src/commands/functions/invoke.ts","../src/commands/functions/code.ts","../src/commands/functions/delete.ts","../src/commands/storage/buckets.ts","../src/commands/storage/upload.ts","../src/commands/storage/download.ts","../src/commands/storage/create-bucket.ts","../src/commands/storage/delete-bucket.ts","../src/commands/storage/list-objects.ts","../src/commands/info.ts","../src/commands/list.ts","../src/commands/deployments/list.ts","../src/commands/deployments/status.ts","../src/commands/deployments/cancel.ts","../src/commands/deployments/env-vars.ts","../src/commands/docs.ts","../src/commands/secrets/list.ts","../src/commands/secrets/get.ts","../src/commands/secrets/add.ts","../src/commands/secrets/update.ts","../src/commands/secrets/delete.ts","../src/commands/schedules/list.ts","../src/commands/schedules/get.ts","../src/commands/schedules/create.ts","../src/commands/schedules/update.ts","../src/commands/schedules/delete.ts","../src/commands/schedules/logs.ts","../src/commands/compute/list.ts","../src/commands/compute/get.ts","../src/commands/compute/update.ts","../src/commands/compute/delete.ts","../src/commands/compute/start.ts","../src/commands/compute/stop.ts","../src/commands/compute/events.ts","../src/commands/compute/deploy.ts","../src/lib/env-file.ts","../src/lib/flyctl.ts","../src/commands/logs.ts","../src/commands/metadata.ts","../src/commands/diagnose/index.ts","../src/commands/diagnose/metrics.ts","../src/commands/diagnose/advisor.ts","../src/commands/diagnose/db.ts","../src/commands/diagnose/logs.ts","../src/lib/api/payments.ts","../src/commands/payments/utils.ts","../src/commands/payments/catalog.ts","../src/commands/payments/config.ts","../src/commands/payments/customers.ts","../src/commands/payments/history.ts","../src/commands/payments/prices.ts","../src/commands/payments/products.ts","../src/commands/payments/status.ts","../src/commands/payments/subscriptions.ts","../src/commands/payments/sync.ts","../src/commands/payments/webhooks.ts","../src/commands/payments/index.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from './lib/prompts.js';\nimport { getCredentials, getProjectConfig } from './lib/config.js';\nimport { registerLoginCommand } from './commands/login.js';\nimport { registerLogoutCommand } from './commands/logout.js';\nimport { registerWhoamiCommand } from './commands/whoami.js';\nimport { registerOrgsCommands } from './commands/orgs/list.js';\nimport { registerProjectsCommands } from './commands/projects/list.js';\nimport { registerBranchCommands } from './commands/branch/index.js';\nimport { registerProjectLinkCommand } from './commands/projects/link.js';\nimport { registerDbCommands } from './commands/db/query.js';\nimport { registerDbTablesCommand } from './commands/db/tables.js';\nimport { registerDbFunctionsCommand } from './commands/db/functions.js';\nimport { registerDbIndexesCommand } from './commands/db/indexes.js';\nimport { registerDbPoliciesCommand } from './commands/db/policies.js';\nimport { registerDbTriggersCommand } from './commands/db/triggers.js';\nimport { registerDbRpcCommand } from './commands/db/rpc.js';\nimport { registerDbExportCommand } from './commands/db/export.js';\nimport { registerDbImportCommand } from './commands/db/import.js';\nimport { registerDbMigrationsCommand } from './commands/db/migrations.js';\nimport { registerDbConnectionStringCommand } from './commands/db/connection-string.js';\nimport { registerRecordsCommands } from './commands/records/list.js';\nimport { registerRecordsCreateCommand } from './commands/records/create.js';\nimport { registerRecordsUpdateCommand } from './commands/records/update.js';\nimport { registerRecordsDeleteCommand } from './commands/records/delete.js';\nimport { registerFunctionsCommands } from './commands/functions/list.js';\nimport { registerFunctionsDeployCommand } from './commands/functions/deploy.js';\nimport { registerFunctionsInvokeCommand } from './commands/functions/invoke.js';\nimport { registerFunctionsCodeCommand } from './commands/functions/code.js';\nimport { registerFunctionsDeleteCommand } from './commands/functions/delete.js';\nimport { registerStorageBucketsCommand } from './commands/storage/buckets.js';\nimport { registerStorageUploadCommand } from './commands/storage/upload.js';\nimport { registerStorageDownloadCommand } from './commands/storage/download.js';\nimport { registerStorageCreateBucketCommand } from './commands/storage/create-bucket.js';\nimport { registerStorageDeleteBucketCommand } from './commands/storage/delete-bucket.js';\nimport { registerStorageListObjectsCommand } from './commands/storage/list-objects.js';\nimport { registerCreateCommand } from './commands/create.js';\nimport { registerContextCommand } from './commands/info.js';\nimport { registerListCommand } from './commands/list.js';\nimport { registerDeploymentsDeployCommand } from './commands/deployments/deploy.js';\nimport { registerDeploymentsListCommand } from './commands/deployments/list.js';\nimport { registerDeploymentsStatusCommand } from './commands/deployments/status.js';\nimport { registerDeploymentsCancelCommand } from './commands/deployments/cancel.js';\nimport { registerDeploymentsEnvVarsCommand } from './commands/deployments/env-vars.js';\n\nimport { registerDocsCommand } from './commands/docs.js';\nimport { registerSecretsListCommand } from './commands/secrets/list.js';\nimport { registerSecretsGetCommand } from './commands/secrets/get.js';\nimport { registerSecretsAddCommand } from './commands/secrets/add.js';\nimport { registerSecretsUpdateCommand } from './commands/secrets/update.js';\nimport { registerSecretsDeleteCommand } from './commands/secrets/delete.js';\n\nimport { registerSchedulesListCommand } from './commands/schedules/list.js';\nimport { registerSchedulesGetCommand } from './commands/schedules/get.js';\nimport { registerSchedulesCreateCommand } from './commands/schedules/create.js';\nimport { registerSchedulesUpdateCommand } from './commands/schedules/update.js';\nimport { registerSchedulesDeleteCommand } from './commands/schedules/delete.js';\nimport { registerSchedulesLogsCommand } from './commands/schedules/logs.js';\n\nimport { registerComputeListCommand } from './commands/compute/list.js';\nimport { registerComputeGetCommand } from './commands/compute/get.js';\nimport { registerComputeUpdateCommand } from './commands/compute/update.js';\nimport { registerComputeDeleteCommand } from './commands/compute/delete.js';\nimport { registerComputeStartCommand } from './commands/compute/start.js';\nimport { registerComputeStopCommand } from './commands/compute/stop.js';\nimport { registerComputeEventsCommand } from './commands/compute/events.js';\nimport { registerComputeDeployCommand } from './commands/compute/deploy.js';\n\nimport { registerLogsCommand } from './commands/logs.js';\nimport { registerMetadataCommand } from './commands/metadata.js';\nimport { registerDiagnoseCommands } from './commands/diagnose/index.js';\nimport { registerPaymentsCommands } from './commands/payments/index.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8')) as { version: string };\n\nconst INSFORGE_LOGO = `\n██╗███╗ ██╗███████╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗\n██║████╗ ██║██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝\n██║██╔██╗ ██║███████╗█████╗ ██║ ██║██████╔╝██║ ███╗█████╗\n██║██║╚██╗██║╚════██║██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝\n██║██║ ╚████║███████║██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗\n╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝\n`;\n\nconst program = new Command();\n\nprogram\n .name('insforge')\n .description('InsForge CLI - Command line tool for InsForge platform')\n .version(pkg.version);\n\n// Global options\nprogram\n .option('--json', 'Output in JSON format')\n .option('--api-url <url>', 'Override Platform API URL')\n .option('-y, --yes', 'Skip confirmation prompts');\n\n// Top-level commands\nregisterLoginCommand(program);\nregisterLogoutCommand(program);\nregisterWhoamiCommand(program);\nregisterCreateCommand(program);\nregisterContextCommand(program);\nregisterListCommand(program);\nregisterDocsCommand(program);\nregisterProjectLinkCommand(program);\n\n// Orgs commands (hidden — use `insforge list` instead)\nconst orgsCmd = program.command('orgs', { hidden: true }).description('Manage organizations');\nregisterOrgsCommands(orgsCmd);\n\n// Projects commands (hidden — use `insforge list` instead)\nconst projectsCmd = program.command('projects', { hidden: true }).description('Manage projects');\nregisterProjectsCommands(projectsCmd);\n\n// Branch commands\nregisterBranchCommands(program);\n\n// Database commands\nconst dbCmd = program.command('db').description('Database operations');\nregisterDbCommands(dbCmd);\nregisterDbTablesCommand(dbCmd);\nregisterDbFunctionsCommand(dbCmd);\nregisterDbIndexesCommand(dbCmd);\nregisterDbPoliciesCommand(dbCmd);\nregisterDbTriggersCommand(dbCmd);\nregisterDbRpcCommand(dbCmd);\nregisterDbExportCommand(dbCmd);\nregisterDbImportCommand(dbCmd);\nregisterDbMigrationsCommand(dbCmd);\nregisterDbConnectionStringCommand(dbCmd);\n\n// Records commands (hidden — do not use for now)\nconst recordsCmd = program.command('records', { hidden: true }).description('CRUD operations on table records');\nregisterRecordsCommands(recordsCmd);\nregisterRecordsCreateCommand(recordsCmd);\nregisterRecordsUpdateCommand(recordsCmd);\nregisterRecordsDeleteCommand(recordsCmd);\n\n// Functions commands\nconst functionsCmd = program.command('functions').description('Manage edge functions');\nregisterFunctionsCommands(functionsCmd);\nregisterFunctionsCodeCommand(functionsCmd);\nregisterFunctionsDeployCommand(functionsCmd);\nregisterFunctionsInvokeCommand(functionsCmd);\nregisterFunctionsDeleteCommand(functionsCmd);\n\n// Storage commands\nconst storageCmd = program.command('storage').description('Manage storage');\nregisterStorageBucketsCommand(storageCmd);\nregisterStorageCreateBucketCommand(storageCmd);\nregisterStorageDeleteBucketCommand(storageCmd);\nregisterStorageListObjectsCommand(storageCmd);\nregisterStorageUploadCommand(storageCmd);\nregisterStorageDownloadCommand(storageCmd);\n\n// Deployments commands\nconst deploymentsCmd = program.command('deployments').description('Deploy and manage frontend sites');\nregisterDeploymentsDeployCommand(deploymentsCmd);\nregisterDeploymentsListCommand(deploymentsCmd);\nregisterDeploymentsStatusCommand(deploymentsCmd);\nregisterDeploymentsCancelCommand(deploymentsCmd);\nregisterDeploymentsEnvVarsCommand(deploymentsCmd);\n// registerDeploymentsMetadataCommand(deploymentsCmd);\n// slug command doesn't work yet.\n// registerDeploymentsSlugCommand(deploymentsCmd);\n\n// Secrets commands\nconst secretsCmd = program.command('secrets').description('Manage secrets');\nregisterSecretsListCommand(secretsCmd);\nregisterSecretsGetCommand(secretsCmd);\nregisterSecretsAddCommand(secretsCmd);\nregisterSecretsUpdateCommand(secretsCmd);\nregisterSecretsDeleteCommand(secretsCmd);\n\n// Logs command\nregisterLogsCommand(program);\n\n// Metadata command\nregisterMetadataCommand(program);\n\n// Diagnose commands\nconst diagnoseCmd = program.command('diagnose');\nregisterDiagnoseCommands(diagnoseCmd);\n\n// Payments commands\nconst paymentsCmd = program.command('payments').description('Manage Stripe payments');\nregisterPaymentsCommands(paymentsCmd);\n\n// Compute commands\nconst computeCmd = program.command('compute').description('Manage compute services (Docker containers on Fly.io)');\nregisterComputeListCommand(computeCmd);\nregisterComputeGetCommand(computeCmd);\nregisterComputeDeployCommand(computeCmd);\nregisterComputeUpdateCommand(computeCmd);\nregisterComputeDeleteCommand(computeCmd);\nregisterComputeStartCommand(computeCmd);\nregisterComputeStopCommand(computeCmd);\nregisterComputeEventsCommand(computeCmd);\n\n// Schedules commands\nconst schedulesCmd = program.command('schedules').description('Manage scheduled tasks (cron jobs)');\nregisterSchedulesListCommand(schedulesCmd);\nregisterSchedulesGetCommand(schedulesCmd);\nregisterSchedulesCreateCommand(schedulesCmd);\nregisterSchedulesUpdateCommand(schedulesCmd);\nregisterSchedulesDeleteCommand(schedulesCmd);\nregisterSchedulesLogsCommand(schedulesCmd);\n\nif (process.argv.length <= 2 && process.stdout.isTTY) {\n await showInteractiveMenu();\n} else {\n program.parse();\n}\n\nasync function showInteractiveMenu(): Promise<void> {\n let isLoggedIn = false;\n let isLinked = false;\n\n try {\n isLoggedIn = !!getCredentials()?.access_token;\n } catch { /* corrupted credentials file */ }\n\n try {\n isLinked = !!getProjectConfig()?.project_id;\n } catch { /* no project config */ }\n\n console.log(INSFORGE_LOGO);\n clack.intro(`InsForge CLI v${pkg.version}`);\n\n type Action = 'login' | 'create' | 'link' | 'deploy' | 'docs' | 'help';\n const options: { value: Action; label: string; hint?: string }[] = [];\n\n if (!isLoggedIn) {\n options.push({ value: 'login', label: 'Log in to InsForge' });\n }\n\n options.push(\n { value: 'create', label: 'Create a new project', hint: isLoggedIn ? undefined : 'requires login' },\n { value: 'link', label: 'Link an existing project', hint: isLoggedIn ? undefined : 'requires login' },\n );\n\n if (isLinked) {\n options.push({ value: 'deploy', label: 'Deploy your project' });\n }\n\n options.push(\n { value: 'docs', label: 'View documentation' },\n { value: 'help', label: 'Show all commands' },\n );\n\n const action = await prompts.select<string>({\n message: 'What would you like to do?',\n options,\n });\n\n if (prompts.isCancel(action)) {\n clack.cancel('Bye!');\n process.exit(0);\n }\n\n switch (action) {\n case 'login':\n await program.parseAsync(['node', 'insforge', 'login']);\n break;\n case 'create':\n await program.parseAsync(['node', 'insforge', 'create']);\n break;\n case 'link':\n await program.parseAsync(['node', 'insforge', 'link']);\n break;\n case 'deploy':\n await program.parseAsync(['node', 'insforge', 'deployments', 'deploy']);\n break;\n case 'docs':\n await program.parseAsync(['node', 'insforge', 'docs']);\n break;\n case 'help':\n program.help();\n break;\n }\n}\n","import * as readline from 'node:readline';\nimport * as clack from '@clack/prompts';\n\nexport const isInteractive = !!(process.stdin.isTTY && process.stdout.isTTY);\n\n/**\n * A line reader that buffers parsed lines and exposes a pull-based readLine API.\n *\n * readline.promises.question() loses 'line' events that fire between question() calls,\n * and does not reject cleanly on stream close. A buffered queue handles both.\n */\nexport class LineReader {\n private queue: string[] = [];\n private waiter: ((line: string | null) => void) | null = null;\n private closed = false;\n private rl: readline.Interface;\n\n constructor(\n input: NodeJS.ReadableStream,\n private output: NodeJS.WritableStream,\n ) {\n this.rl = readline.createInterface({ input });\n this.rl.on('line', (line) => {\n if (this.waiter) {\n const w = this.waiter;\n this.waiter = null;\n w(line);\n } else {\n this.queue.push(line);\n }\n });\n this.rl.on('close', () => {\n this.closed = true;\n if (this.waiter) {\n const w = this.waiter;\n this.waiter = null;\n w(null);\n }\n });\n }\n\n async readLine(prompt: string): Promise<string | null> {\n this.output.write(prompt);\n if (this.queue.length > 0) return this.queue.shift()!;\n if (this.closed) return null;\n return new Promise((resolve) => {\n this.waiter = resolve;\n });\n }\n\n close(): void {\n this.rl.close();\n }\n}\n\nlet sharedReader: LineReader | null = null;\nfunction getReader(): LineReader {\n if (!sharedReader) {\n sharedReader = new LineReader(process.stdin, process.stdout);\n }\n return sharedReader;\n}\n\nexport const CANCEL: unique symbol = Symbol('prompt.cancel');\nexport type CancelSymbol = typeof CANCEL;\n\nexport function isCancel<T>(v: T | CancelSymbol): v is CancelSymbol {\n return v === CANCEL || clack.isCancel(v);\n}\n\nexport interface TextOptions {\n message: string;\n initialValue?: string;\n placeholder?: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport interface SelectOption<T> {\n value: T;\n label: string;\n hint?: string;\n}\n\nexport interface SelectOptions<T> {\n message: string;\n options: SelectOption<T>[];\n initialValue?: T;\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function text(opts: TextOptions): Promise<string | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.text({\n message: opts.message,\n initialValue: opts.initialValue,\n placeholder: opts.placeholder,\n validate: opts.validate,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n return nonTtyText(opts);\n}\n\nexport async function select<T>(opts: SelectOptions<T>): Promise<T | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.select({\n message: opts.message,\n options: opts.options as { value: T; label: string; hint?: string }[],\n initialValue: opts.initialValue,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result as T;\n }\n return nonTtySelect(opts);\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.confirm({\n message: opts.message,\n initialValue: opts.initialValue,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n return nonTtyConfirm(opts);\n}\n\nexport async function password(opts: { message: string }): Promise<string | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.password({ message: opts.message });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n // Non-TTY: can't mask input over a pipe, just read the line. Preserve whitespace\n // since it can be valid in passwords.\n return nonTtyText({ message: opts.message, trim: false });\n}\n\nexport async function nonTtyText(\n opts: TextOptions & { trim?: boolean },\n io: { reader?: LineReader; stderr?: NodeJS.WritableStream } = {},\n): Promise<string | CancelSymbol> {\n const reader = io.reader ?? getReader();\n const stderr = io.stderr ?? process.stderr;\n const shouldTrim = opts.trim ?? true;\n const defaultHint = opts.initialValue ? ` [${opts.initialValue}]` : '';\n for (;;) {\n const raw = await reader.readLine(`? ${opts.message}${defaultHint} `);\n if (raw === null) return CANCEL;\n const normalized = shouldTrim ? raw.trim() : raw;\n const value = normalized === '' ? (opts.initialValue ?? '') : normalized;\n if (opts.validate) {\n const err = opts.validate(value);\n if (err) {\n stderr.write(` ${err}\\n`);\n continue;\n }\n }\n return value;\n }\n}\n\nexport async function nonTtySelect<T>(\n opts: SelectOptions<T>,\n io: { reader?: LineReader; stdout?: NodeJS.WritableStream; stderr?: NodeJS.WritableStream } = {},\n): Promise<T | CancelSymbol> {\n if (opts.options.length === 0) {\n throw new Error(`No options available for prompt \"${opts.message}\".`);\n }\n const reader = io.reader ?? getReader();\n const stdout = io.stdout ?? process.stdout;\n const stderr = io.stderr ?? process.stderr;\n stdout.write(`? ${opts.message}\\n`);\n opts.options.forEach((o, i) => {\n const hint = o.hint ? ` — ${o.hint}` : '';\n stdout.write(` ${i + 1}) ${o.label}${hint}\\n`);\n });\n for (;;) {\n const raw = await reader.readLine(`Enter number [1-${opts.options.length}]: `);\n if (raw === null) return CANCEL;\n const n = Number.parseInt(raw.trim(), 10);\n if (Number.isInteger(n) && n >= 1 && n <= opts.options.length) {\n return opts.options[n - 1].value;\n }\n stderr.write(` Please enter a number between 1 and ${opts.options.length}.\\n`);\n }\n}\n\nexport async function nonTtyConfirm(\n opts: ConfirmOptions,\n io: { reader?: LineReader; stderr?: NodeJS.WritableStream } = {},\n): Promise<boolean | CancelSymbol> {\n const reader = io.reader ?? getReader();\n const stderr = io.stderr ?? process.stderr;\n const defaultHint = opts.initialValue === true ? ' [Y/n]' : opts.initialValue === false ? ' [y/N]' : ' [y/n]';\n for (;;) {\n const raw = await reader.readLine(`? ${opts.message}${defaultHint} `);\n if (raw === null) return CANCEL;\n const answer = raw.trim().toLowerCase();\n if (answer === '' && opts.initialValue !== undefined) return opts.initialValue;\n if (answer === 'y' || answer === 'yes') return true;\n if (answer === 'n' || answer === 'no') return false;\n stderr.write(` Please answer y or n.\\n`);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { GlobalConfig, ProjectConfig, StoredCredentials } from '../types.js';\n\nconst GLOBAL_DIR = join(homedir(), '.insforge');\nconst CREDENTIALS_FILE = join(GLOBAL_DIR, 'credentials.json');\nconst CONFIG_FILE = join(GLOBAL_DIR, 'config.json');\n\nconst DEFAULT_PLATFORM_URL = 'https://api.insforge.dev';\nconst DEFAULT_FRONTEND_URL = 'https://insforge.dev';\n\n/** Sentinel project ID for OSS/self-hosted linking (valid UUID, never matches a real project). */\nexport const FAKE_PROJECT_ID = 'fa4e0000-1234-5678-90ab-cd1234567890';\nexport const FAKE_ORG_ID = 'fa4e0001-1234-5678-90ab-cd1234567890';\n\nfunction ensureGlobalDir(): void {\n if (!existsSync(GLOBAL_DIR)) {\n mkdirSync(GLOBAL_DIR, { recursive: true });\n }\n}\n\n// --- Global Config ---\n\nexport function getGlobalConfig(): GlobalConfig {\n if (!existsSync(CONFIG_FILE)) {\n return { platform_api_url: DEFAULT_PLATFORM_URL };\n }\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveGlobalConfig(config: GlobalConfig): void {\n ensureGlobalDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));\n}\n\n// --- Credentials ---\n\nexport function getCredentials(): StoredCredentials | null {\n if (!existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n const raw = readFileSync(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveCredentials(creds: StoredCredentials): void {\n ensureGlobalDir();\n writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n}\n\nexport function clearCredentials(): void {\n if (existsSync(CREDENTIALS_FILE)) {\n unlinkSync(CREDENTIALS_FILE);\n }\n // Clear session-related config (default_org_id) but keep platform_api_url etc.\n const config = getGlobalConfig();\n if (config.default_org_id) {\n delete config.default_org_id;\n saveGlobalConfig(config);\n }\n}\n\n// --- Project Config (local) ---\n\nfunction getLocalConfigDir(): string {\n return join(process.cwd(), '.insforge');\n}\n\nfunction getLocalConfigFile(): string {\n return join(getLocalConfigDir(), 'project.json');\n}\n\n/** Path to the backup of `.insforge/project.json` written by `branch switch`\n * the first time the directory is moved off the parent project. Restored\n * by `branch switch --parent`. Exported so switch.ts can manage the file. */\nexport function getParentBackupFile(): string {\n return join(getLocalConfigDir(), 'project.parent.json');\n}\n\n/** Exposed so command code (e.g. branch switch) can write the active\n * project file path verbatim. */\nexport function getProjectConfigFile(): string {\n return getLocalConfigFile();\n}\n\nexport function getProjectConfig(): ProjectConfig | null {\n const file = getLocalConfigFile();\n if (!existsSync(file)) {\n return null;\n }\n const raw = readFileSync(file, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveProjectConfig(config: ProjectConfig): void {\n const dir = getLocalConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(getLocalConfigFile(), JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\n// --- Resolved values (env vars > flags > config) ---\n\nexport function getPlatformApiUrl(override?: string): string {\n return process.env.INSFORGE_API_URL ?? override ?? getGlobalConfig().platform_api_url ?? DEFAULT_PLATFORM_URL;\n}\n\nexport function getFrontendUrl(): string {\n return process.env.INSFORGE_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n}\n\nexport function getAccessToken(): string | null {\n return process.env.INSFORGE_ACCESS_TOKEN ?? getCredentials()?.access_token ?? null;\n}\n\nexport function getProjectId(override?: string): string | null {\n return process.env.INSFORGE_PROJECT_ID ?? override ?? getProjectConfig()?.project_id ?? null;\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../lib/prompts.js';\nimport { saveCredentials, getPlatformApiUrl } from '../lib/config.js';\nimport { login as platformLogin } from '../lib/api/platform.js';\nimport { performOAuthLogin } from '../lib/auth.js';\nimport { handleError, getRootOpts, CLIError, formatFetchError } from '../lib/errors.js';\nimport type { StoredCredentials, User } from '../types.js';\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Authenticate with InsForge platform')\n .option('--email', 'Login with email and password instead of browser')\n .option('--client-id <id>', 'OAuth client ID (defaults to insforge-cli)')\n .option('--user-api-key <key>', 'Authenticate with a uak_ personal access token')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n\n try {\n if (opts.userApiKey) {\n await loginWithUserApiKey(opts.userApiKey, json, apiUrl);\n } else if (opts.email) {\n await loginWithEmail(json, apiUrl);\n } else {\n await loginWithOAuth(json, apiUrl);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('cancelled')) {\n process.exit(0);\n }\n handleError(err, json);\n }\n });\n}\n\nasync function loginWithEmail(json: boolean, apiUrl?: string): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n const email = json\n ? process.env.INSFORGE_EMAIL\n : await prompts.text({\n message: 'Email:',\n validate: (v) => (v.includes('@') ? undefined : 'Please enter a valid email'),\n });\n\n if (prompts.isCancel(email)) {\n clack.cancel('Login cancelled.');\n throw new Error('cancelled');\n }\n\n const password = json\n ? process.env.INSFORGE_PASSWORD\n : await prompts.password({\n message: 'Password:',\n });\n\n if (prompts.isCancel(password)) {\n clack.cancel('Login cancelled.');\n throw new Error('cancelled');\n }\n\n if (!email || !password) {\n throw new Error('Email and password are required. Set INSFORGE_EMAIL and INSFORGE_PASSWORD environment variables for non-interactive mode.');\n }\n\n if (!json) {\n const s = clack.spinner();\n s.start('Authenticating...');\n\n const result = await platformLogin(email as string, password as string, apiUrl);\n const creds: StoredCredentials = {\n access_token: result.token,\n refresh_token: result._refreshToken ?? '',\n user: result.user,\n };\n saveCredentials(creds);\n\n s.stop(`Authenticated as ${result.user.email}`);\n clack.outro('Done');\n } else {\n const result = await platformLogin(email as string, password as string, apiUrl);\n const creds: StoredCredentials = {\n access_token: result.token,\n refresh_token: result._refreshToken ?? '',\n user: result.user,\n };\n saveCredentials(creds);\n console.log(JSON.stringify({ success: true, user: result.user }));\n }\n}\n\nasync function loginWithOAuth(json: boolean, apiUrl?: string): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n const creds = await performOAuthLogin(apiUrl);\n\n if (!json) {\n clack.outro('Done');\n } else {\n console.log(JSON.stringify({ success: true, user: creds.user }));\n }\n}\n\nasync function loginWithUserApiKey(\n key: string,\n json: boolean,\n apiUrl?: string,\n): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n if (!key.startsWith('uak_')) {\n throw new CLIError('Invalid API key — must start with \"uak_\".');\n }\n\n const s = !json ? clack.spinner() : null;\n s?.start('Verifying API key...');\n\n let jwt: string;\n let user: User;\n try {\n const exchanged = await exchangePatForJwt(key, apiUrl);\n jwt = exchanged.token;\n user = exchanged.user;\n } catch (err) {\n s?.stop('API key verification failed');\n throw err instanceof CLIError\n ? err\n : new CLIError(err instanceof Error ? err.message : String(err));\n }\n\n // Storage: access_token holds the JWT, refresh_token holds the PAT.\n // Detect PAT login later by checking refresh_token.startsWith('uak_').\n saveCredentials({\n access_token: jwt,\n refresh_token: key,\n user,\n });\n\n if (!json) {\n s?.stop(`Authenticated as ${user.email}`);\n clack.outro('Done');\n } else {\n console.log(JSON.stringify({ success: true, user }));\n }\n}\n\n/**\n * Exchange a uak_ PAT for a short-lived JWT via the backend exchange endpoint.\n * The PAT itself is never stored as an access token — we store the JWT and\n * keep the PAT only for silent re-exchange when the JWT expires.\n */\nasync function exchangePatForJwt(\n apiKey: string,\n apiUrl?: string,\n): Promise<{ token: string; user: User }> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const fullUrl = `${baseUrl}/auth/v1/exchange-api-key`;\n\n let res: Response;\n try {\n res = await fetch(fullUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey }),\n });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n };\n const msg = body.message ?? body.error ?? `HTTP ${res.status}`;\n throw new CLIError(`API key is invalid or revoked: ${msg}`);\n }\n\n const data = (await res.json().catch(() => ({}))) as { token?: unknown };\n if (typeof data.token !== 'string' || data.token.length === 0) {\n throw new CLIError('Exchange endpoint returned an invalid response (missing token).');\n }\n const jwt = data.token;\n\n // The exchange endpoint returns only the JWT. Fetch the user via /auth/v1/profile\n // using the fresh JWT so we can persist identity in credentials.json.\n let profileRes: Response;\n try {\n profileRes = await fetch(`${baseUrl}/auth/v1/profile`, {\n headers: { Authorization: `Bearer ${jwt}` },\n });\n } catch (err) {\n throw new CLIError(formatFetchError(err, `${baseUrl}/auth/v1/profile`));\n }\n if (!profileRes.ok) {\n throw new CLIError(`Exchange succeeded but could not fetch profile: HTTP ${profileRes.status}`);\n }\n const profile = (await profileRes.json().catch(() => null)) as\n | { user?: User }\n | User\n | null;\n const user =\n profile && typeof profile === 'object' && 'user' in profile\n ? (profile as { user?: User }).user\n : ((profile as User | null) ?? undefined);\n if (!user) {\n throw new CLIError('Exchange succeeded but profile response was empty');\n }\n\n return { token: jwt, user };\n}\n","import type { Command } from 'commander';\n\nexport class CLIError extends Error {\n constructor(\n message: string,\n public exitCode: number = 1,\n public code?: string,\n ) {\n super(message);\n this.name = 'CLIError';\n }\n}\n\nexport class AuthError extends CLIError {\n constructor(message: string = 'Not authenticated. Run `npx @insforge/cli login` first.') {\n super(message, 2, 'AUTH_ERROR');\n }\n}\n\nexport class ProjectNotLinkedError extends CLIError {\n constructor() {\n super('No project linked. Run `npx @insforge/cli link` first.', 3, 'PROJECT_NOT_LINKED');\n }\n}\n\nexport class NotFoundError extends CLIError {\n constructor(resource: string) {\n super(`${resource} not found.`, 4, 'NOT_FOUND');\n }\n}\n\nexport class PermissionError extends CLIError {\n constructor(message: string = 'Permission denied.') {\n super(message, 5, 'PERMISSION_DENIED');\n }\n}\n\n/**\n * Format a Node fetch error with actionable context.\n *\n * Node's undici-based fetch throws a generic Error with `message: 'fetch failed'`\n * for any network-layer failure (DNS, connect, TLS, reset, timeout). The real\n * reason sits on `err.cause` with a `code` like ENOTFOUND / ECONNREFUSED /\n * ETIMEDOUT / UND_ERR_CONNECT_TIMEOUT / CERT_HAS_EXPIRED, etc. Unpack it so\n * users see something actionable instead of \"fetch failed\".\n */\nexport function formatFetchError(err: unknown, url: string): string {\n if (!(err instanceof Error)) return `Network request to ${url} failed: ${String(err)}`;\n if (err.message !== 'fetch failed') return err.message;\n\n const cause = (err as { cause?: unknown }).cause;\n const code =\n (cause as { code?: string } | undefined)?.code ??\n (cause as { errno?: string } | undefined)?.errno;\n const causeMsg =\n cause instanceof Error ? cause.message : typeof cause === 'string' ? cause : undefined;\n\n let host = url;\n try { host = new URL(url).host; } catch { /* url may already be a host */ }\n\n switch (code) {\n case 'ENOTFOUND':\n case 'EAI_AGAIN':\n return `Cannot resolve ${host} (DNS lookup failed: ${code}). Check your internet connection or DNS settings.`;\n case 'ECONNREFUSED':\n return `Connection to ${host} refused. The server may be down or blocked by a firewall.`;\n case 'ETIMEDOUT':\n case 'UND_ERR_CONNECT_TIMEOUT':\n return `Connection to ${host} timed out. Check your network, VPN, or proxy settings.`;\n case 'ECONNRESET':\n case 'UND_ERR_SOCKET':\n return `Connection to ${host} was reset. A proxy, VPN, or firewall may be interfering.`;\n case 'CERT_HAS_EXPIRED':\n case 'UNABLE_TO_VERIFY_LEAF_SIGNATURE':\n case 'SELF_SIGNED_CERT_IN_CHAIN':\n case 'DEPTH_ZERO_SELF_SIGNED_CERT':\n return `TLS certificate error contacting ${host} (${code}). Your network may be intercepting HTTPS (corporate proxy / VPN).`;\n }\n\n if (code) return `Network error contacting ${host}: ${code}${causeMsg ? ` — ${causeMsg}` : ''}`;\n if (causeMsg) return `Network error contacting ${host}: ${causeMsg}`;\n return `Network error contacting ${host}.`;\n}\n\n/**\n * Extract error message from a deployment's metadata field.\n * DeploymentSchema stores errors in metadata.error.errorMessage rather than a top-level field.\n */\nexport function getDeploymentError(metadata: Record<string, unknown> | null): string | null {\n if (!metadata || typeof metadata.error !== 'object' || !metadata.error) return null;\n return (metadata.error as { errorMessage?: string }).errorMessage ?? null;\n}\n\nexport function handleError(err: unknown, json: boolean): never {\n if (err instanceof CLIError) {\n if (json) {\n console.error(JSON.stringify({ error: err.message, code: err.code }));\n } else {\n console.error(`Error: ${err.message}`);\n }\n process.exit(err.exitCode);\n }\n\n const message = err instanceof Error ? err.message : String(err);\n if (json) {\n console.error(JSON.stringify({ error: message, code: 'UNKNOWN_ERROR' }));\n } else {\n console.error(`Error: ${message}`);\n }\n process.exit(1);\n}\n\nexport function getJsonFlag(cmd: Command): boolean {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root.opts().json ?? false;\n}\n\nexport function getRootOpts(cmd: Command): { json: boolean; apiUrl?: string; yes: boolean } {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n const opts = root.opts();\n return {\n json: opts.json ?? false,\n apiUrl: opts.apiUrl,\n yes: opts.yes ?? false,\n };\n}\n","import { createServer } from 'node:http';\nimport { randomBytes, createHash } from 'node:crypto';\nimport { URL } from 'node:url';\nimport * as clack from '@clack/prompts';\nimport pc from 'picocolors';\nimport { isInteractive } from './prompts.js';\nimport { getGlobalConfig, getPlatformApiUrl, saveCredentials } from './config.js';\nimport { getProfile } from './api/platform.js';\nimport { formatFetchError } from './errors.js';\nimport type { StoredCredentials } from '../types.js';\n\n// Default OAuth client for InsForge CLI (pre-registered on the platform)\nexport const DEFAULT_CLIENT_ID = 'clf_NK8cMUs41gm8ZcfdtSguVw';\nexport const OAUTH_SCOPES = 'user:read organizations:read projects:read projects:write';\n\nexport interface PKCEChallenge {\n code_verifier: string;\n code_challenge: string;\n}\n\nexport interface OAuthCallbackResult {\n code: string;\n state: string;\n}\n\n/**\n * Generate PKCE code_verifier and code_challenge (S256).\n */\nexport function generatePKCE(): PKCEChallenge {\n const code_verifier = randomBytes(32).toString('base64url');\n const code_challenge = createHash('sha256').update(code_verifier).digest('base64url');\n return { code_verifier, code_challenge };\n}\n\n/**\n * Generate a random state parameter for CSRF protection.\n */\nexport function generateState(): string {\n return randomBytes(16).toString('base64url');\n}\n\n/**\n * Build the OAuth authorization URL.\n */\nexport function buildAuthorizeUrl(params: {\n platformUrl: string;\n clientId: string;\n redirectUri: string;\n codeChallenge: string;\n state: string;\n scopes: string;\n}): string {\n const url = new URL(`${params.platformUrl}/api/oauth/v1/authorize`);\n url.searchParams.set('client_id', params.clientId);\n url.searchParams.set('redirect_uri', params.redirectUri);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('scope', params.scopes);\n url.searchParams.set('code_challenge', params.codeChallenge);\n url.searchParams.set('code_challenge_method', 'S256');\n url.searchParams.set('state', params.state);\n return url.toString();\n}\n\n/**\n * Exchange authorization code for tokens via the token endpoint.\n */\nexport async function exchangeCodeForTokens(params: {\n platformUrl: string;\n code: string;\n redirectUri: string;\n clientId: string;\n codeVerifier: string;\n}): Promise<{ access_token: string; refresh_token: string; expires_in: number; scope: string }> {\n const tokenUrl = `${params.platformUrl}/api/oauth/v1/token`;\n let res: Response;\n try {\n res = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'authorization_code',\n code: params.code,\n redirect_uri: params.redirectUri,\n client_id: params.clientId,\n code_verifier: params.codeVerifier,\n }),\n });\n } catch (err) {\n throw new Error(`Token exchange failed — ${formatFetchError(err, tokenUrl)}`, { cause: err });\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error_description?: string; error?: string };\n throw new Error(err.error_description ?? err.error ?? `Token exchange failed (HTTP ${res.status})`);\n }\n\n return await res.json() as { access_token: string; refresh_token: string; expires_in: number; scope: string };\n}\n\n/**\n * Refresh an OAuth access token using a refresh token.\n */\nexport async function refreshOAuthToken(params: {\n platformUrl: string;\n refreshToken: string;\n clientId: string;\n}): Promise<{ access_token: string; refresh_token?: string; expires_in: number }> {\n const tokenUrl = `${params.platformUrl}/api/oauth/v1/token`;\n let res: Response;\n try {\n res = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: params.refreshToken,\n client_id: params.clientId,\n }),\n });\n } catch (err) {\n throw new Error(`Token refresh failed — ${formatFetchError(err, tokenUrl)}`, { cause: err });\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error_description?: string; error?: string };\n throw new Error(err.error_description ?? err.error ?? `Token refresh failed (HTTP ${res.status})`);\n }\n\n return await res.json() as { access_token: string; refresh_token?: string; expires_in: number };\n}\n\n/**\n * Start a local HTTP server to receive the OAuth authorization code callback.\n */\nexport function startCallbackServer(): Promise<{\n port: number;\n result: Promise<OAuthCallbackResult>;\n close: () => void;\n}> {\n return new Promise((resolveServer) => {\n let resolveResult: (value: OAuthCallbackResult) => void;\n let rejectResult: (reason: Error) => void;\n\n const resultPromise = new Promise<OAuthCallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = 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 state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n const desc = url.searchParams.get('error_description') ?? error;\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<html><body><h2>Authentication failed</h2><p>${desc}</p><p>You can close this window.</p></body></html>`);\n rejectResult!(new Error(desc));\n return;\n }\n\n if (!code || !state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Invalid callback</h2><p>Missing authorization code.</p></body></html>');\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication successful!</h2><p>You can close this window and return to the terminal.</p></body></html>');\n resolveResult!({ code, state });\n } else {\n res.writeHead(404);\n res.end('Not found');\n }\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address();\n const port = typeof addr === 'object' ? addr!.port : 0;\n resolveServer({\n port,\n result: resultPromise,\n close: () => { server.close(); server.closeAllConnections(); },\n });\n });\n\n // Timeout after 5 minutes (unref so it doesn't keep the process alive)\n setTimeout(() => {\n rejectResult!(new Error('Authentication timed out. Please try again.'));\n server.close();\n }, 5 * 60 * 1000).unref();\n });\n}\n\n/**\n * Perform the full OAuth PKCE login flow:\n * generate PKCE + state, start callback server, open browser, exchange code, save credentials.\n * Returns the stored credentials on success.\n */\nexport async function performOAuthLogin(apiUrl?: string): Promise<StoredCredentials> {\n const platformUrl = getPlatformApiUrl(apiUrl);\n const config = getGlobalConfig();\n const clientId = config.oauth_client_id ?? DEFAULT_CLIENT_ID;\n\n // 1. Generate PKCE and state\n const pkce = generatePKCE();\n const state = generateState();\n\n // 2. Start local callback server\n const { port, result, close } = await startCallbackServer();\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n\n // 3. Build authorization URL\n const authUrl = buildAuthorizeUrl({\n platformUrl,\n clientId,\n redirectUri,\n codeChallenge: pkce.code_challenge,\n state,\n scopes: OAUTH_SCOPES,\n });\n\n if (isInteractive) {\n clack.log.info('Opening browser for authentication...');\n clack.log.info(`If browser doesn't open, visit:\\n${authUrl}`);\n } else {\n // Non-TTY (agent shell): surface the URL prominently via stderr so it stays out of\n // any JSON stdout stream but is still visible to agents and humans.\n process.stderr.write(`\\nTo sign in, open this URL in your browser:\\n\\n ${pc.cyan(pc.underline(authUrl))}\\n\\n`);\n }\n\n // 4. Open browser (best effort — often works even from agent shells since we're on the same machine)\n try {\n const open = (await import('open')).default;\n await open(authUrl);\n } catch {\n if (isInteractive) clack.log.warn('Could not open browser. Please visit the URL above.');\n }\n\n // 5. Wait for callback — use clack spinner only in TTY (non-TTY spinner renders garbage)\n const s = isInteractive ? clack.spinner() : null;\n s?.start('Waiting for authentication...');\n if (!isInteractive) process.stderr.write('Waiting for authentication...\\n');\n\n try {\n const callbackResult = await result;\n close();\n\n // Verify state\n if (callbackResult.state !== state) {\n s?.stop('Authentication failed');\n throw new Error('State mismatch. Possible CSRF attack.');\n }\n\n // 6. Exchange code for tokens\n s?.message('Exchanging authorization code...');\n const tokens = await exchangeCodeForTokens({\n platformUrl,\n code: callbackResult.code,\n redirectUri,\n clientId,\n codeVerifier: pkce.code_verifier,\n });\n\n // 7. Save credentials and fetch profile\n const creds: StoredCredentials = {\n access_token: tokens.access_token,\n refresh_token: tokens.refresh_token,\n user: { id: '', name: '', email: '', avatar_url: null, email_verified: true },\n };\n saveCredentials(creds);\n\n try {\n const profile = await getProfile(apiUrl);\n creds.user = profile;\n saveCredentials(creds);\n s?.stop(`Authenticated as ${profile.email}`);\n if (!isInteractive) process.stderr.write(`Authenticated as ${profile.email}\\n`);\n } catch {\n s?.stop('Authenticated successfully');\n if (!isInteractive) process.stderr.write('Authenticated successfully\\n');\n }\n\n return creds;\n } catch (err) {\n close();\n s?.stop('Authentication failed');\n if (!isInteractive) process.stderr.write('Authentication failed\\n');\n throw err;\n }\n}\n","import { getCredentials, getGlobalConfig, getPlatformApiUrl, saveCredentials, getProjectConfig, FAKE_PROJECT_ID } from './config.js';\nimport { AuthError } from './errors.js';\nimport { refreshOAuthToken, DEFAULT_CLIENT_ID, performOAuthLogin } from './auth.js';\nimport * as clack from '@clack/prompts';\nimport * as prompts from './prompts.js';\nimport type { StoredCredentials } from '../types.js';\n\n/** True if stored credentials represent a PAT-based login (refresh_token is a uak_ token). */\nexport function isPatLogin(creds: StoredCredentials | null | undefined): boolean {\n return creds?.refresh_token?.startsWith('uak_') ?? false;\n}\n\nexport async function requireAuth(apiUrl?: string, allowOssBypass = true): Promise<StoredCredentials> {\n const projConfig = getProjectConfig();\n if (allowOssBypass && projConfig?.project_id === FAKE_PROJECT_ID) {\n return {\n access_token: 'oss-token',\n refresh_token: 'oss-refresh',\n user: {\n id: 'oss-user',\n name: 'OSS User',\n email: 'oss@insforge.local',\n avatar_url: null,\n email_verified: true,\n },\n };\n }\n\n const creds = getCredentials();\n if (creds && creds.access_token) return creds;\n\n // PAT session with an expired/empty access_token: silently re-exchange\n // instead of prompting for browser OAuth.\n if (isPatLogin(creds)) {\n await refreshAccessToken(apiUrl);\n return getCredentials()!;\n }\n\n clack.log.info('You need to log in to continue.');\n\n for (;;) {\n try {\n return await performOAuthLogin(apiUrl);\n } catch (err) {\n if (!process.stdout.isTTY) throw err;\n\n const msg = err instanceof Error ? err.message : 'Unknown error';\n clack.log.error(`Login failed: ${msg}`);\n\n const retry = await prompts.confirm({ message: 'Would you like to try again?' });\n if (prompts.isCancel(retry) || !retry) {\n throw new AuthError('Authentication required. Run `npx @insforge/cli login` to authenticate.');\n }\n }\n }\n}\n\nexport async function refreshAccessToken(apiUrl?: string): Promise<string> {\n const creds = getCredentials();\n if (!creds) {\n throw new AuthError('Not logged in. Run `npx @insforge/cli login` first.');\n }\n\n const platformUrl = getPlatformApiUrl(apiUrl);\n\n // PAT branch: re-exchange the stored uak_ for a fresh JWT.\n if (isPatLogin(creds)) {\n let res: Response;\n try {\n res = await fetch(`${platformUrl}/auth/v1/exchange-api-key`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey: creds.refresh_token }),\n });\n } catch {\n // Background refresh path — surface a network error clearly.\n throw new AuthError(\n `Unable to reach auth server at ${platformUrl}. Check your network connection.`\n );\n }\n if (!res.ok) {\n // Auth failures (401/403/404) mean the PAT is actually bad — ask the user\n // to rotate. Everything else (5xx, 429, gateway errors) is transient and\n // shouldn't instruct the user to rotate a healthy key.\n if (res.status === 401 || res.status === 403 || res.status === 404) {\n throw new AuthError(\n 'API key is invalid or revoked. Run `npx @insforge/cli login --user-api-key <new-key>` again.'\n );\n }\n throw new AuthError(\n `Auth server returned HTTP ${res.status} while refreshing session. Please retry shortly.`\n );\n }\n const data = (await res.json().catch(() => ({}))) as { token?: unknown };\n if (typeof data.token !== 'string' || data.token.length === 0) {\n throw new AuthError('Exchange endpoint returned an invalid response (missing token).');\n }\n saveCredentials({ ...creds, access_token: data.token });\n return data.token;\n }\n\n if (!creds.refresh_token) {\n throw new AuthError('Refresh token not found. Run `npx @insforge/cli login` again.');\n }\n\n const config = getGlobalConfig();\n const clientId = config.oauth_client_id ?? DEFAULT_CLIENT_ID;\n\n try {\n const data = await refreshOAuthToken({\n platformUrl,\n refreshToken: creds.refresh_token,\n clientId,\n });\n\n const updated: StoredCredentials = {\n ...creds,\n access_token: data.access_token,\n // Update refresh token if rotated\n refresh_token: data.refresh_token ?? creds.refresh_token,\n };\n saveCredentials(updated);\n return data.access_token;\n } catch {\n // Token refresh failed — try re-authenticating interactively\n if (process.stdout.isTTY) {\n clack.log.warn('Session expired. Please log in again.');\n const newCreds = await performOAuthLogin(apiUrl);\n return newCreds.access_token;\n }\n throw new AuthError('Failed to refresh token. Run `npx @insforge/cli login` again.');\n }\n}\n","import { getAccessToken, getPlatformApiUrl } from '../config.js';\nimport { AuthError, CLIError, formatFetchError } from '../errors.js';\nimport { refreshAccessToken } from '../credentials.js';\nimport type {\n ApiKeyResponse,\n Branch,\n BranchMode,\n DiffResult,\n LoginResponse,\n MergeConflictResponse,\n MergeExecuteResponse,\n Organization,\n Project,\n User,\n} from '../../types.js';\n\nexport interface PlatformFetchOptions extends RequestInit {\n /**\n * HTTP status codes that should be returned to the caller instead of\n * thrown as CLIError. The 401-refresh path is unaffected. Use when the\n * caller wants to render a structured error body (e.g. merge 409).\n */\n passThroughStatuses?: number[];\n}\n\nexport async function platformFetch(\n path: string,\n options: PlatformFetchOptions = {},\n apiUrl?: string,\n): Promise<Response> {\n const { passThroughStatuses, ...fetchOptions } = options;\n const baseUrl = getPlatformApiUrl(apiUrl);\n const token = getAccessToken();\n if (!token) {\n throw new AuthError();\n }\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n ...(fetchOptions.headers as Record<string, string> ?? {}),\n };\n\n const fullUrl = `${baseUrl}${path}`;\n if (process.env.INSFORGE_DEBUG) {\n console.error(`[DEBUG] ${fetchOptions.method ?? 'GET'} ${fullUrl}`);\n console.error(`[DEBUG] Headers: ${JSON.stringify(headers, null, 2)}`);\n if (fetchOptions.body) {\n console.error(`[DEBUG] Body: ${typeof fetchOptions.body === 'string' ? fetchOptions.body : JSON.stringify(fetchOptions.body)}`);\n }\n }\n\n let res: Response;\n try {\n res = await fetch(fullUrl, { ...fetchOptions, headers });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n\n // Auto-refresh on 401\n if (res.status === 401) {\n const newToken = await refreshAccessToken(apiUrl);\n headers.Authorization = `Bearer ${newToken}`;\n let retryRes: Response;\n try {\n retryRes = await fetch(fullUrl, { ...fetchOptions, headers });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n if (passThroughStatuses?.includes(retryRes.status)) {\n return retryRes;\n }\n if (!retryRes.ok) {\n const err = await retryRes.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Request failed: ${retryRes.status}`, retryRes.status === 403 ? 5 : 1);\n }\n return retryRes;\n }\n\n if (passThroughStatuses?.includes(res.status)) {\n return res;\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string; message?: string };\n const msg = err.message ? `${err.error ?? res.status}: ${err.message}` : (err.error ?? `Request failed: ${res.status}`);\n throw new CLIError(msg, res.status === 403 ? 5 : 1);\n }\n\n return res;\n}\n\n// --- Auth ---\n\nexport async function login(email: string, password: string, apiUrl?: string): Promise<LoginResponse & { _refreshToken?: string }> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const res = await fetch(`${baseUrl}/auth/v1/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new AuthError(err.error ?? 'Login failed. Check your email and password.');\n }\n\n // Extract refresh token from Set-Cookie header\n const setCookie = res.headers.get('set-cookie') ?? '';\n const refreshTokenMatch = setCookie.match(/refreshToken=([^;]+)/);\n const data = (await res.json()) as LoginResponse;\n\n return {\n ...data,\n // Attach refresh token to the response for storage\n _refreshToken: refreshTokenMatch?.[1],\n } as LoginResponse & { _refreshToken?: string };\n}\n\nexport async function getProfile(apiUrl?: string): Promise<User> {\n const res = await platformFetch('/auth/v1/profile', {}, apiUrl);\n const data = await res.json() as { user?: User };\n return data.user ?? (data as unknown as User);\n}\n\n// --- Organizations ---\n\nexport async function listOrganizations(apiUrl?: string): Promise<Organization[]> {\n const res = await platformFetch('/organizations/v1', {}, apiUrl);\n const data = await res.json() as { organizations?: Organization[] };\n return data.organizations ?? (data as unknown as Organization[]);\n}\n\n// --- Projects ---\n\nexport async function listProjects(orgId: string, apiUrl?: string): Promise<Project[]> {\n const res = await platformFetch(`/organizations/v1/${orgId}/projects`, {}, apiUrl);\n const data = await res.json() as { projects?: Project[] };\n return data.projects ?? (data as unknown as Project[]);\n}\n\nexport async function getProject(projectId: string, apiUrl?: string): Promise<Project> {\n const res = await platformFetch(`/projects/v1/${projectId}`, {}, apiUrl);\n const data = await res.json() as { project?: Project };\n return data.project ?? (data as unknown as Project);\n}\n\nexport async function getProjectApiKey(projectId: string, apiUrl?: string): Promise<string> {\n const res = await platformFetch(`/projects/v1/${projectId}/access-api-key`, {}, apiUrl);\n const data = (await res.json()) as ApiKeyResponse;\n return data.access_api_key;\n}\n\nexport async function reportAgentConnected(\n payload: { project_id?: string; app_key?: string },\n apiUrl?: string,\n): Promise<void> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n const token = getAccessToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n await fetch(`${baseUrl}/tracking/v1/agent-connected`, {\n method: 'POST',\n headers,\n body: JSON.stringify({ ...payload, client: 'cli' }),\n });\n}\n\nexport interface DiagnosticRequest {\n project_id: string;\n question: string;\n context: {\n context_version: string;\n metrics?: unknown;\n advisor?: unknown;\n db?: unknown;\n logs?: unknown;\n client_info?: {\n cli_version?: string;\n node_version?: string;\n os?: string;\n };\n };\n}\n\nexport interface DiagnosticSSEEvent {\n type: 'delta' | 'tool_call' | 'tool_result' | 'done' | 'error';\n data: Record<string, unknown>;\n}\n\nexport type DiagnosticEventHandler = (event: DiagnosticSSEEvent) => void;\n\n/**\n * Stream diagnostic analysis via SSE. Calls `onEvent` for each SSE event.\n * Returns the raw Response so the caller can handle errors before streaming.\n */\nexport async function streamDiagnosticAnalysis(\n payload: DiagnosticRequest,\n onEvent: DiagnosticEventHandler,\n apiUrl?: string,\n): Promise<void> {\n const res = await platformFetch('/diagnostic/v1/analyze', {\n method: 'POST',\n body: JSON.stringify(payload),\n }, apiUrl);\n\n const body = res.body;\n if (!body) throw new CLIError('No response body from diagnostic API.');\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let currentEvent: DiagnosticSSEEvent['type'] | null = 'delta';\n\n const VALID_EVENTS = new Set<string>(['delta', 'tool_call', 'tool_result', 'done', 'error']);\n\n const processLine = (line: string): void => {\n if (line.startsWith('event:')) {\n const evt = line.slice(6).trim();\n currentEvent = VALID_EVENTS.has(evt) ? evt as DiagnosticSSEEvent['type'] : null;\n } else if (line.startsWith('data:')) {\n if (!currentEvent) return;\n const raw = line.slice(5).trim();\n if (!raw) return;\n try {\n const data = JSON.parse(raw) as Record<string, unknown>;\n onEvent({ type: currentEvent, data });\n } catch {\n // skip malformed JSON\n }\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n processLine(line);\n }\n }\n\n // Flush remaining bytes from multi-byte sequences\n buffer += decoder.decode();\n if (buffer.trim()) {\n processLine(buffer);\n }\n}\n\nexport async function rateDiagnosticSession(\n sessionId: string,\n rating: 'helpful' | 'not_helpful' | 'incorrect',\n comment?: string,\n apiUrl?: string,\n): Promise<void> {\n const body: Record<string, string> = { rating };\n if (comment) body.comment = comment;\n await platformFetch(`/diagnostic/v1/sessions/${sessionId}/rating`, {\n method: 'POST',\n body: JSON.stringify(body),\n }, apiUrl);\n}\n\nexport async function createProject(\n orgId: string,\n name: string,\n region?: string,\n apiUrl?: string,\n): Promise<Project> {\n const body: Record<string, string> = { name };\n if (region) body.region = region;\n\n const res = await platformFetch(`/organizations/v1/${orgId}/projects`, {\n method: 'POST',\n body: JSON.stringify(body),\n }, apiUrl);\n const data = await res.json() as { project?: Project };\n return data.project ?? (data as unknown as Project);\n}\n\n// --- Branching ---\n\nexport async function createBranchApi(\n parentProjectId: string,\n body: { mode: BranchMode; name: string },\n apiUrl?: string,\n): Promise<Branch> {\n const res = await platformFetch(`/projects/v1/${parentProjectId}/branches`, {\n method: 'POST',\n body: JSON.stringify(body),\n }, apiUrl);\n const data = await res.json() as { branch: Branch };\n return data.branch;\n}\n\nexport async function listBranchesApi(parentProjectId: string, apiUrl?: string): Promise<Branch[]> {\n const res = await platformFetch(`/projects/v1/${parentProjectId}/branches`, {}, apiUrl);\n const data = await res.json() as { data?: Branch[] };\n return data.data ?? [];\n}\n\nexport async function getBranchApi(branchId: string, apiUrl?: string): Promise<Branch> {\n const res = await platformFetch(`/projects/v1/branches/${branchId}`, {}, apiUrl);\n const data = await res.json() as { branch: Branch };\n return data.branch;\n}\n\nexport async function deleteBranchApi(branchId: string, apiUrl?: string): Promise<void> {\n await platformFetch(`/projects/v1/branches/${branchId}`, { method: 'DELETE' }, apiUrl);\n}\n\n/**\n * Trigger an async branch reset. Backend transitions branch_state to\n * 'resetting', kicks off pg_restore from the T0 backup, and returns 202\n * with the post-transition row. Callers should poll getBranchApi until\n * branch_state goes back to 'ready'.\n */\nexport async function resetBranchApi(branchId: string, apiUrl?: string): Promise<Branch> {\n const res = await platformFetch(\n `/projects/v1/branches/${branchId}/reset`,\n { method: 'POST' },\n apiUrl,\n );\n const data = await res.json() as { branch: Branch };\n return data.branch;\n}\n\nexport async function mergeBranchDryRunApi(branchId: string, apiUrl?: string): Promise<DiffResult> {\n const res = await platformFetch(\n `/projects/v1/branches/${branchId}/merge?dryRun=true`,\n { method: 'POST' },\n apiUrl,\n );\n return await res.json() as DiffResult;\n}\n\n/**\n * Merge execute. Returns the success body on clean merge, or the conflict\n * body on 409. The 409 status is passed through platformFetch so callers\n * can render the diff/conflict structure directly while still inheriting\n * the auto-401-refresh and debug logging behavior.\n */\nexport async function mergeBranchExecuteApi(\n branchId: string,\n apiUrl?: string,\n): Promise<{ ok: true; result: MergeExecuteResponse } | { ok: false; conflict: MergeConflictResponse }> {\n const res = await platformFetch(\n `/projects/v1/branches/${branchId}/merge`,\n { method: 'POST', passThroughStatuses: [409] },\n apiUrl,\n );\n if (res.status === 409) {\n return { ok: false, conflict: await res.json() as MergeConflictResponse };\n }\n return { ok: true, result: await res.json() as MergeExecuteResponse };\n}\n\n","import Table from 'cli-table3';\n\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function outputTable(headers: string[], rows: string[][]): void {\n const table = new Table({\n head: headers,\n style: { head: ['cyan'] },\n });\n for (const row of rows) {\n table.push(row);\n }\n console.log(table.toString());\n}\n\nexport function outputSuccess(message: string): void {\n console.log(`✓ ${message}`);\n}\n\nexport function outputInfo(message: string): void {\n console.log(message);\n}\n","import type { Command } from 'commander';\nimport { clearCredentials } from '../lib/config.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputSuccess, outputJson } from '../lib/output.js';\n\nexport function registerLogoutCommand(program: Command): void {\n program\n .command('logout')\n .description('Log out from InsForge platform')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n clearCredentials();\n if (json) {\n outputJson({ success: true, message: 'Logged out successfully' });\n } else {\n outputSuccess('Logged out successfully.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getProfile } from '../lib/api/platform.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputInfo } from '../lib/output.js';\nimport { requireAuth } from '../lib/credentials.js';\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Show current authenticated user')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const profile = await getProfile(apiUrl);\n\n if (json) {\n outputJson(profile);\n } else {\n outputInfo(`Logged in as: ${profile.email ?? profile.name}`);\n if (profile.name) outputInfo(`Name: ${profile.name}`);\n if (profile.id) outputInfo(`ID: ${profile.id}`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listOrganizations } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerOrgsCommands(orgsCmd: Command): void {\n orgsCmd\n .command('list')\n .description('List all organizations')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const orgs = await listOrganizations(apiUrl);\n\n if (json) {\n outputJson(orgs);\n } else {\n if (!orgs.length) {\n console.log('No organizations found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Type'],\n orgs.map((o) => [\n o.id,\n o.name,\n o.type ?? '-',\n ]),\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { listOrganizations, listProjects } from '../../lib/api/platform.js';\nimport { getGlobalConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerProjectsCommands(projectsCmd: Command): void {\n projectsCmd\n .command('list')\n .description('List all projects in an organization')\n .option('--org-id <id>', 'Organization ID (uses default if not specified)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n\n let orgId = opts.orgId ?? getGlobalConfig().default_org_id;\n\n if (!orgId) {\n // Try to auto-select if user has only one org\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found. Create one on the InsForge dashboard.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n } else if (!json) {\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) {\n process.exit(0);\n }\n orgId = selected;\n } else {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n }\n\n const projects = await listProjects(orgId, apiUrl);\n\n if (json) {\n outputJson(projects);\n } else {\n if (!projects.length) {\n console.log('No projects found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Region', 'Status', 'AppKey'],\n projects.map((p) => [p.id, p.name, p.region, p.status, p.appkey]),\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { PostHog } from 'posthog-node';\nimport type { ProjectConfig } from '../types.js';\nimport { FAKE_PROJECT_ID } from './config.js';\n\nconst POSTHOG_API_KEY = process.env.POSTHOG_API_KEY;\nconst POSTHOG_HOST = process.env.POSTHOG_HOST || 'https://us.i.posthog.com';\n\nlet client: PostHog | null = null;\n\nfunction getClient(): PostHog | null {\n if (!POSTHOG_API_KEY) return null;\n if (!client) {\n client = new PostHog(POSTHOG_API_KEY, { host: POSTHOG_HOST });\n }\n return client;\n}\n\nexport function captureEvent(\n distinctId: string,\n event: string,\n properties?: Record<string, unknown>,\n): void {\n try {\n getClient()?.capture({ distinctId, event, properties });\n } catch {\n // analytics should never break the CLI\n }\n}\n\nexport function trackCommand(command: string, distinctId: string, properties?: Record<string, unknown>): void {\n captureEvent(distinctId, 'cli_command_invoked', {\n command,\n ...properties,\n });\n}\n\nexport function trackDiagnose(subcommand: string, config: ProjectConfig): void {\n captureEvent(config.project_id, 'cli_diagnose_invoked', {\n subcommand,\n project_id: config.project_id,\n project_name: config.project_name,\n org_id: config.org_id,\n region: config.region,\n oss_mode: config.project_id === FAKE_PROJECT_ID,\n });\n}\n\nexport function trackPayments(\n subcommand: string,\n config: ProjectConfig,\n properties?: Record<string, unknown>,\n): void {\n captureEvent(config.project_id, 'cli_payments_invoked', {\n subcommand,\n project_id: config.project_id,\n project_name: config.project_name,\n org_id: config.org_id,\n region: config.region,\n oss_mode: config.project_id === FAKE_PROJECT_ID,\n ...properties,\n });\n}\n\nexport async function shutdownAnalytics(): Promise<void> {\n try {\n if (client) await client.shutdown();\n } catch {\n // ignore\n }\n}\n","import type { Command } from 'commander';\nimport { copyFileSync, existsSync, unlinkSync } from 'node:fs';\nimport {\n getProjectConfig,\n saveProjectConfig,\n getProjectConfigFile,\n getParentBackupFile,\n} from '../../lib/config.js';\nimport { listBranchesApi, getProjectApiKey } from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\n\nexport interface RunBranchSwitchOptions {\n name?: string;\n toParent?: boolean;\n apiUrl: string | undefined;\n json: boolean;\n /**\n * Suppress the success/JSON output from this function. Set when called as a\n * sub-step of another command (e.g. `branch create --switch`) so the caller\n * can emit a single, authoritative payload.\n */\n silent?: boolean;\n}\n\n/**\n * Public entry point: lets `branch create` chain into the same context-flip\n * logic without re-parsing through Commander.\n */\nexport async function runBranchSwitch(input: RunBranchSwitchOptions): Promise<void> {\n await requireAuth(input.apiUrl);\n const current = getProjectConfig();\n if (!current) {\n throw new CLIError('No project linked. Run `insforge link` first.');\n }\n\n if (input.toParent && input.name) {\n throw new CLIError('Pass either a branch name or --parent, not both.');\n }\n\n const projectFile = getProjectConfigFile();\n const parentBackup = getParentBackupFile();\n\n if (input.toParent) {\n if (!existsSync(parentBackup)) {\n throw new CLIError(\n 'No parent backup found. Re-link the directory with `insforge link --project-id <parent>`.',\n );\n }\n copyFileSync(parentBackup, projectFile);\n unlinkSync(parentBackup);\n captureEvent(current.project_id, 'cli_branch_switch', { direction: 'to_parent' });\n if (!input.silent) {\n if (input.json) {\n outputJson({ switched: 'parent' });\n } else {\n outputSuccess('Switched back to parent.');\n }\n }\n return;\n }\n\n if (!input.name) {\n throw new CLIError('Branch name required (or pass --parent).');\n }\n\n // Resolve branch by name within the parent's branch list. If we're already on\n // a branch, list siblings of the original parent.\n const parentId = current.branched_from?.project_id ?? current.project_id;\n const branches = await listBranchesApi(parentId, input.apiUrl);\n const target = branches.find(b => b.name === input.name);\n if (!target) {\n throw new CLIError(`Branch '${input.name}' not found.`);\n }\n if (target.branch_state !== 'ready') {\n throw new CLIError(\n `Branch '${input.name}' is in state '${target.branch_state}', cannot switch.`,\n );\n }\n\n // First time leaving the parent: snapshot the current project.json so\n // `--parent` can restore it. Subsequent branch -> branch switches keep\n // the original parent backup unchanged.\n if (!existsSync(parentBackup)) {\n copyFileSync(projectFile, parentBackup);\n }\n\n const apiKey = await getProjectApiKey(target.id, input.apiUrl);\n const ossHost = `${target.appkey}.${target.region}.insforge.app`;\n const branched_from = current.branched_from ?? {\n project_id: current.project_id,\n project_name: current.project_name,\n };\n\n saveProjectConfig({\n project_id: target.id,\n project_name: target.name,\n org_id: target.organization_id,\n appkey: target.appkey,\n region: target.region,\n api_key: apiKey,\n oss_host: ossHost,\n branched_from,\n });\n\n captureEvent(parentId, 'cli_branch_switch', { direction: 'to_branch' });\n\n if (!input.silent) {\n if (input.json) {\n outputJson({ switched: 'branch', branch_id: target.id });\n } else {\n outputSuccess(`Switched to branch '${target.name}'.`);\n }\n }\n}\n\nexport function registerBranchSwitchCommand(branch: Command): void {\n branch\n .command('switch [name]')\n .description(\"Switch this directory's context to a branch (or back with --parent)\")\n .option('--parent', 'Switch back to the parent project')\n .action(async (name: string | undefined, opts: { parent?: boolean }, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await runBranchSwitch({ name, toParent: opts.parent, apiUrl, json });\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { createBranchApi, getBranchApi } from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\nimport { runBranchSwitch } from './switch.js';\nimport type { Branch, BranchMode } from '../../types.js';\n\nconst POLL_INTERVAL_MS = 3_000;\nconst POLL_TIMEOUT_MS = 5 * 60 * 1_000;\n\nexport function registerBranchCreateCommand(branch: Command): void {\n branch\n .command('create <name>')\n .description('Create a branch from the currently linked project')\n .option('--mode <mode>', 'full | schema-only', 'full')\n .option('--no-switch', 'Do not auto-switch context after creation')\n .action(async (name: string, opts: { mode: string; switch: boolean }, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const project = getProjectConfig();\n if (!project) {\n throw new CLIError('No project linked. Run `insforge link` first.');\n }\n // Disallow nested branching at the CLI layer (cloud-backend rejects too,\n // but a clear local error saves a round-trip).\n if (project.branched_from) {\n throw new CLIError(\n \"This directory is currently switched to a branch. Run `insforge branch switch --parent` first, then create a new branch from the parent.\",\n );\n }\n if (opts.mode !== 'full' && opts.mode !== 'schema-only') {\n throw new CLIError(`Invalid --mode: ${opts.mode} (must be \"full\" or \"schema-only\")`);\n }\n const mode = opts.mode as BranchMode;\n\n const created = await createBranchApi(project.project_id, { mode, name }, apiUrl);\n captureEvent(project.project_id, 'cli_branch_create', {\n mode,\n parent_project_id: project.project_id,\n });\n\n if (!json) {\n outputSuccess(`Branch '${name}' created (appkey: ${created.appkey}). Provisioning…`);\n }\n\n const ready = await pollUntilReady(created.id, apiUrl, !json);\n\n // Run auto-switch BEFORE emitting the final success/JSON payload so a\n // failed switch does not surface as a successful create.\n if (opts.switch && ready.branch_state === 'ready') {\n // silent in JSON mode so we don't emit two JSON documents — the\n // single `outputJson({ branch: ready })` below is authoritative.\n await runBranchSwitch({ name, apiUrl, json, silent: json });\n }\n\n if (json) {\n outputJson({ branch: ready });\n } else if (ready.branch_state === 'ready') {\n outputSuccess(`Branch '${name}' is ready.`);\n if (opts.switch) {\n outputInfo(\n '⚠ Re-source your dev server env (.env) to pick up the new INSFORGE_URL / ANON_KEY.',\n );\n }\n } else {\n outputInfo(\n `Branch '${name}' is still in '${ready.branch_state}' state. Run \\`insforge branch list\\` to check.`,\n );\n }\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\nasync function pollUntilReady(\n branchId: string,\n apiUrl: string | undefined,\n showProgress: boolean,\n): Promise<Branch> {\n const start = Date.now();\n let lastState = '';\n while (Date.now() - start < POLL_TIMEOUT_MS) {\n const branch = await getBranchApi(branchId, apiUrl);\n if (branch.branch_state === 'ready') return branch;\n if (branch.branch_state === 'deleted' || branch.branch_state === 'conflicted') {\n throw new CLIError(`Branch creation failed (state: ${branch.branch_state})`);\n }\n if (showProgress && branch.branch_state !== lastState) {\n outputInfo(` state: ${branch.branch_state}…`);\n lastState = branch.branch_state;\n }\n await new Promise(r => setTimeout(r, POLL_INTERVAL_MS));\n }\n // Timed out — re-check terminal failure states so a state flip just before\n // the deadline is not silently reported as “still in state …”.\n const branch = await getBranchApi(branchId, apiUrl);\n if (branch.branch_state === 'deleted' || branch.branch_state === 'conflicted') {\n throw new CLIError(`Branch creation failed (state: ${branch.branch_state})`);\n }\n return branch;\n}\n","import type { Command } from 'commander';\nimport { listBranchesApi } from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable, outputInfo } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\n\nexport function registerBranchListCommand(branch: Command): void {\n branch\n .command('list')\n .description('List branches of the currently linked project')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const project = getProjectConfig();\n if (!project) {\n throw new CLIError('No project linked. Run `insforge link` first.');\n }\n // If currently switched onto a branch, list siblings of its parent.\n const parentId = project.branched_from?.project_id ?? project.project_id;\n const branches = await listBranchesApi(parentId, apiUrl);\n captureEvent(parentId, 'cli_branch_list', { count: branches.length });\n\n if (json) {\n outputJson({ data: branches });\n return;\n }\n if (branches.length === 0) {\n outputInfo('No branches.');\n return;\n }\n const currentBranchId = project.branched_from ? project.project_id : null;\n const rows = branches.map(b => [\n b.id === currentBranchId ? '*' : ' ',\n b.name,\n b.branch_state,\n b.branch_metadata?.mode ?? '?',\n new Date(b.branch_created_at).toLocaleString(),\n ]);\n outputTable(['', 'Name', 'State', 'Mode', 'Created'], rows);\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { writeFileSync } from 'node:fs';\nimport * as clack from '@clack/prompts';\nimport {\n listBranchesApi,\n mergeBranchDryRunApi,\n mergeBranchExecuteApi,\n} from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\n\ninterface MergeOptions {\n dryRun?: boolean;\n saveSql?: string;\n}\n\nexport function registerBranchMergeCommand(branch: Command): void {\n branch\n .command('merge <name>')\n .description('Merge a branch back to its parent project')\n .option('--dry-run', 'Compute the diff and print rendered SQL; do not apply')\n .option('--save-sql <path>', 'Write rendered SQL preview to a file')\n .action(async (name: string, opts: MergeOptions, cmd) => {\n const { json, apiUrl, yes } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const project = getProjectConfig();\n if (!project) throw new CLIError('No project linked. Run `insforge link` first.');\n\n // Resolve branch by name. parent_id flips depending on whether the\n // directory is currently on a branch.\n const parentId = project.branched_from?.project_id ?? project.project_id;\n const branches = await listBranchesApi(parentId, apiUrl);\n const target = branches.find(b => b.name === name);\n if (!target) throw new CLIError(`Branch '${name}' not found.`);\n\n // Always compute diff first (cheap, gives the user a preview).\n const diff = await mergeBranchDryRunApi(target.id, apiUrl);\n\n if (opts.saveSql) {\n writeFileSync(opts.saveSql, diff.rendered_sql);\n if (!json) outputInfo(`SQL preview saved to ${opts.saveSql}`);\n }\n\n if (!json) {\n console.log(diff.rendered_sql);\n console.log();\n outputInfo(\n `${diff.summary.added} added, ${diff.summary.modified} modified, ${diff.summary.conflicts} conflict(s).`,\n );\n }\n\n if (diff.summary.conflicts > 0) {\n captureEvent(parentId, 'cli_branch_merge_conflict', {\n conflicts: diff.summary.conflicts,\n });\n if (json) {\n outputJson({\n diff,\n applied: false,\n dryRun: !!opts.dryRun,\n error: 'merge_conflict',\n });\n } else {\n outputInfo('');\n outputInfo('Merge blocked: resolve conflicts before retrying.');\n for (const c of diff.conflicts) {\n outputInfo(` - ${c.schema}.${c.object} [${c.type}] — ${c.hint}`);\n }\n }\n process.exit(2);\n }\n\n if (opts.dryRun) {\n captureEvent(parentId, 'cli_branch_merge', {\n dry_run: true,\n conflicts: 0,\n applied: false,\n });\n if (json) {\n outputJson({ diff, applied: false, dryRun: true });\n }\n return;\n }\n\n // Confirm before executing (unless --yes or --json).\n if (!yes && !json) {\n const parentLabel = project.branched_from?.project_name ?? project.project_name;\n const confirmed = await clack.confirm({\n message: `Apply this merge to parent project '${parentLabel}'?`,\n });\n if (clack.isCancel(confirmed) || !confirmed) {\n outputInfo('Merge cancelled.');\n return;\n }\n }\n\n const result = await mergeBranchExecuteApi(target.id, apiUrl);\n if (!result.ok) {\n // Race: dry-run was clean but execute saw conflicts (parent moved).\n captureEvent(parentId, 'cli_branch_merge_conflict', {\n conflicts: result.conflict.diff.summary.conflicts,\n });\n if (json) {\n outputJson({\n diff: result.conflict.diff,\n applied: false,\n dryRun: false,\n error: 'merge_conflict',\n });\n } else {\n outputInfo('Merge blocked by a conflict that appeared between dry-run and apply:');\n for (const c of result.conflict.diff.conflicts) {\n outputInfo(` - ${c.schema}.${c.object} [${c.type}] — ${c.hint}`);\n }\n }\n process.exit(2);\n }\n\n captureEvent(parentId, 'cli_branch_merge', {\n dry_run: false,\n conflicts: 0,\n applied: true,\n });\n\n if (json) {\n outputJson({ ...result.result, diff, applied: true, dryRun: false });\n } else {\n outputSuccess(`Merged. Branch '${name}' is now in 'merged' state.`);\n outputInfo('⚠ Reminder: redeploy edge functions, website, and compute as needed.');\n }\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport { listBranchesApi, resetBranchApi, getBranchApi } from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\nimport type { Branch } from '../../types.js';\n\nconst POLL_INTERVAL_MS = 3_000;\n// Reset re-runs pg_restore in-place, plus (for schema-only) the truncate\n// finalize. Same order of magnitude as create — minutes for a small DB,\n// longer for a populated one. Match create's 5-min budget.\nconst POLL_TIMEOUT_MS = 5 * 60 * 1_000;\n\nexport function registerBranchResetCommand(branch: Command): void {\n branch\n .command('reset <name>')\n .description(\"Reset a branch's database back to T0 (the parent snapshot at branch creation)\")\n .action(async (name: string, _opts: Record<string, never>, cmd) => {\n const { json, apiUrl, yes } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const project = getProjectConfig();\n if (!project) throw new CLIError('No project linked. Run `insforge link` first.');\n\n // Resolve branch by name. parent_id flips depending on whether the\n // directory is currently switched onto a branch.\n const parentId = project.branched_from?.project_id ?? project.project_id;\n const branches = await listBranchesApi(parentId, apiUrl);\n const target = branches.find(b => b.name === name);\n if (!target) throw new CLIError(`Branch '${name}' not found.`);\n\n if (target.branch_state !== 'ready' && target.branch_state !== 'merged') {\n throw new CLIError(\n `Branch '${name}' is in '${target.branch_state}' state; reset requires 'ready' or 'merged'.`,\n );\n }\n const entryState = target.branch_state;\n\n if (!yes && !json) {\n const confirmed = await clack.confirm({\n message:\n `Reset branch '${name}' back to T0? This wipes all schema/data/policy/function/migration changes made on the branch since creation.` +\n (entryState === 'merged'\n ? ' (Branch is currently merged — reset will reopen it for further work.)'\n : ''),\n });\n if (clack.isCancel(confirmed) || !confirmed) {\n outputInfo('Cancelled.');\n return;\n }\n }\n\n const initial = await resetBranchApi(target.id, apiUrl);\n captureEvent(parentId, 'cli_branch_reset', {\n entry_state: entryState,\n mode: target.branch_metadata?.mode,\n });\n\n if (!json) {\n outputSuccess(`Reset enqueued for branch '${name}'. Restoring T0…`);\n }\n\n const final = await pollUntilReady(target.id, apiUrl, !json, initial.branch_state);\n\n if (json) {\n outputJson({ branch: final });\n } else if (final.branch_state === 'ready') {\n outputSuccess(`Branch '${name}' is back to T0 and ready.`);\n outputInfo('⚠ Reminder: edge functions, website, and compute aren’t touched by reset; redeploy if needed.');\n } else {\n outputInfo(\n `Branch '${name}' is still in '${final.branch_state}' state. Run \\`insforge branch list\\` to check.`,\n );\n }\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\nasync function pollUntilReady(\n branchId: string,\n apiUrl: string | undefined,\n showProgress: boolean,\n startingState: string,\n): Promise<Branch> {\n const start = Date.now();\n let lastState = startingState;\n if (showProgress) outputInfo(` state: ${startingState}…`);\n while (Date.now() - start < POLL_TIMEOUT_MS) {\n const branch = await getBranchApi(branchId, apiUrl);\n // Reset always lands at ready (even when entry was merged) — see\n // backend BranchQueue.processResetFinalize. A bounce back to ready\n // OR merged is the rollback path; treat both as terminal so the user\n // sees the final state without a 5-minute wait.\n if (branch.branch_state === 'ready') return branch;\n if (branch.branch_state === 'merged') return branch;\n if (branch.branch_state === 'deleted' || branch.branch_state === 'conflicted') {\n throw new CLIError(`Branch reset failed (state: ${branch.branch_state})`);\n }\n if (showProgress && branch.branch_state !== lastState) {\n outputInfo(` state: ${branch.branch_state}…`);\n lastState = branch.branch_state;\n }\n await new Promise(r => setTimeout(r, POLL_INTERVAL_MS));\n }\n // Timed out — re-check terminal failure states so a state flip just before\n // the deadline is not silently reported as “still in state …”.\n const branch = await getBranchApi(branchId, apiUrl);\n if (branch.branch_state === 'deleted' || branch.branch_state === 'conflicted') {\n throw new CLIError(`Branch reset failed (state: ${branch.branch_state})`);\n }\n return branch;\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport { listBranchesApi, deleteBranchApi } from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\nimport { runBranchSwitch } from './switch.js';\n\nexport function registerBranchDeleteCommand(branch: Command): void {\n branch\n .command('delete <name>')\n .description('Delete a branch')\n .action(async (name: string, _opts: Record<string, never>, cmd) => {\n const { json, apiUrl, yes } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const project = getProjectConfig();\n if (!project) throw new CLIError('No project linked. Run `insforge link` first.');\n\n const parentId = project.branched_from?.project_id ?? project.project_id;\n const branches = await listBranchesApi(parentId, apiUrl);\n const target = branches.find(b => b.name === name);\n if (!target) throw new CLIError(`Branch '${name}' not found.`);\n\n if (!yes && !json) {\n const confirmed = await clack.confirm({\n message: `Delete branch '${name}'? This terminates its EC2 instance.`,\n });\n if (clack.isCancel(confirmed) || !confirmed) {\n outputInfo('Cancelled.');\n return;\n }\n }\n\n await deleteBranchApi(target.id, apiUrl);\n captureEvent(parentId, 'cli_branch_delete', {});\n\n // If the directory is currently switched onto the deleted branch,\n // flip back to parent so subsequent commands don't operate on a\n // dead instance.\n const currentlyOnDeleted = project.project_id === target.id;\n if (currentlyOnDeleted) {\n try {\n // silent in JSON mode so we don't emit two JSON documents — the\n // single `outputJson({ deleted, ... })` below is authoritative.\n await runBranchSwitch({ toParent: true, apiUrl, json, silent: json });\n } catch (err) {\n // Non-fatal: the branch is gone, but we can at least tell the user.\n outputInfo(\n `Switched-to-parent failed (${(err as Error).message}). Run \\`insforge branch switch --parent\\` manually.`,\n );\n }\n }\n\n if (json) {\n outputJson({ deleted: true, branch_id: target.id, switched_back: currentlyOnDeleted });\n } else {\n outputSuccess(`Branch '${name}' deletion enqueued.`);\n if (currentlyOnDeleted) outputInfo('Switched back to parent.');\n }\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { registerBranchCreateCommand } from './create.js';\nimport { registerBranchListCommand } from './list.js';\nimport { registerBranchSwitchCommand } from './switch.js';\nimport { registerBranchMergeCommand } from './merge.js';\nimport { registerBranchResetCommand } from './reset.js';\nimport { registerBranchDeleteCommand } from './delete.js';\n\nexport function registerBranchCommands(program: Command): void {\n const branch = program.command('branch').description('Manage backend branches');\n registerBranchCreateCommand(branch);\n registerBranchListCommand(branch);\n registerBranchSwitchCommand(branch);\n registerBranchMergeCommand(branch);\n registerBranchResetCommand(branch);\n registerBranchDeleteCommand(branch);\n}\n","import type { Command } from 'commander';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport pc from 'picocolors';\nimport * as prompts from '../../lib/prompts.js';\nimport {\n listOrganizations,\n listProjects,\n getProject,\n getProjectApiKey,\n reportAgentConnected,\n} from '../../lib/api/platform.js';\nimport { getGlobalConfig, saveGlobalConfig, saveProjectConfig, getFrontendUrl, FAKE_PROJECT_ID, FAKE_ORG_ID } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { installSkills, reportCliUsage } from '../../lib/skills.js';\nimport { applyAuthProvider, VALID_AUTH_PROVIDERS, type AuthProvider } from '../../auth-providers/apply.js';\nimport { captureEvent, trackCommand, shutdownAnalytics } from '../../lib/analytics.js';\nimport { downloadGitHubTemplate } from '../create.js';\nimport type { ProjectConfig } from '../../types.js';\n\nconst execAsync = promisify(exec);\n\nfunction buildOssHost(appkey: string, region: string): string {\n return `https://${appkey}.${region}.insforge.app`;\n}\n\nasync function runNpmInstall(startMessage = 'Installing dependencies...'): Promise<void> {\n const spinner = clack.spinner();\n spinner.start(startMessage);\n try {\n await execAsync('npm install', { cwd: process.cwd(), maxBuffer: 10 * 1024 * 1024 });\n spinner.stop('Dependencies installed');\n } catch (err) {\n spinner.stop('Failed to install dependencies');\n clack.log.warn(`npm install failed: ${(err as Error).message}`);\n clack.log.info('Run `npm install` manually to install dependencies.');\n }\n}\n\nexport function registerProjectLinkCommand(program: Command): void {\n program\n .command('link')\n .description('Link current directory to an InsForge project')\n .option('--project-id <id>', 'Project ID to link')\n .option('--org-id <id>', 'Organization ID')\n .option('--template <template>', 'Download a template after linking: react, nextjs, chatbot, crm, e-commerce, todo')\n .option('--auth <provider>', 'Wire a third-party auth provider into the chosen template (currently: better-auth)')\n .option('--api-base-url <url>', 'API Base URL for direct linking (OSS/Self-hosted)')\n .option('--api-key <key>', 'API Key for direct linking (OSS/Self-hosted)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n\n // Every template value accepted here is a directory in the InsForge\n // templates repo, so validation and the download call reference the\n // same single list.\n const validTemplates = ['react', 'nextjs', 'chatbot', 'crm', 'e-commerce', 'todo'];\n\n // --auth is a flag-only escape hatch (not in the interactive picker). It\n // composes onto whatever the link/template flow produces by overlaying\n // an auth-provider scaffold from CLI's bundled assets — no templates-repo\n // directory required.\n if (opts.auth && !VALID_AUTH_PROVIDERS.includes(opts.auth)) {\n throw new CLIError(`Invalid --auth \"${opts.auth}\". Valid: ${VALID_AUTH_PROVIDERS.join(', ')}`);\n }\n\n try {\n if (opts.template && !validTemplates.includes(opts.template)) {\n throw new CLIError(`Invalid template \"${opts.template}\". Valid options: ${validTemplates.join(', ')}`);\n }\n\n if (opts.apiBaseUrl || opts.apiKey) {\n try {\n if (!opts.apiBaseUrl || !opts.apiKey) {\n throw new CLIError('Both --api-base-url and --api-key must be provided together for direct linking.');\n }\n\n try {\n new URL(opts.apiBaseUrl);\n } catch {\n throw new CLIError('Invalid --api-base-url. Please provide a valid URL.');\n }\n\n // Direct OSS/Self-hosted linking bypasses OAuth\n const projectConfig: ProjectConfig = {\n project_id: FAKE_PROJECT_ID,\n project_name: 'oss-project',\n org_id: FAKE_ORG_ID,\n appkey: 'ossfkey',\n region: 'us-test',\n api_key: opts.apiKey,\n oss_host: opts.apiBaseUrl.replace(/\\/$/, ''), // remove trailing slash if any\n };\n\n const template = opts.template as string | undefined;\n\n // Template path: create a subdirectory, link inside it, download template,\n // install deps. Mirrors the OAuth template flow below.\n if (template) {\n const defaultDir = `insforge-${template}`;\n let dirName = defaultDir;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: defaultDir,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n const templateDir = path.resolve(process.cwd(), dirName);\n const dirExists = await fs.stat(templateDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(templateDir);\n process.chdir(templateDir);\n\n saveProjectConfig(projectConfig);\n\n if (json) {\n outputJson({\n success: true,\n project: { id: projectConfig.project_id, name: projectConfig.project_name, region: projectConfig.region },\n directory: dirName,\n template,\n });\n } else {\n outputSuccess(`Linked to direct project at ${projectConfig.oss_host}`);\n }\n\n captureEvent(FAKE_ORG_ID, 'template_selected', { template, source: 'link_direct' });\n\n await downloadGitHubTemplate(template, projectConfig, json);\n\n const templateDownloaded = await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null);\n\n // Overlay --auth scaffold BEFORE npm install so the overlay's\n // packageJsonPatch is in package.json by install time — otherwise\n // its new deps (better-auth, pg, jsonwebtoken, …) are listed but\n // never actually installed.\n if (opts.auth) {\n try {\n const result = await applyAuthProvider(opts.auth as AuthProvider, process.cwd(), projectConfig, json);\n if (!json) clack.log.success(`Wired in ${opts.auth}: ${result.written.length} new, ${result.overwritten.length} replaced`);\n } catch (err) {\n const msg = `Failed to apply --auth ${opts.auth}: ${(err as Error).message}`;\n if (json) console.error(JSON.stringify({ warning: msg }));\n else clack.log.warn(msg);\n }\n }\n\n if (templateDownloaded && !json) {\n await runNpmInstall();\n }\n\n await installSkills(json);\n trackCommand('link', 'oss-org', { direct: true, template });\n await reportCliUsage('cli.link_direct', true, 6, projectConfig);\n\n // Report agent-connected event (best-effort)\n try {\n const urlMatch = opts.apiBaseUrl.match(/^https?:\\/\\/([^.]+)\\.[^.]+\\.insforge\\.app/);\n if (urlMatch) {\n await reportAgentConnected({ app_key: urlMatch[1] }, apiUrl);\n }\n } catch { /* ignore */ }\n\n if (!json) {\n if (templateDownloaded) {\n const runCommand = `${pc.cyan('cd')} ${pc.green(dirName)} ${pc.dim('&&')} ${pc.cyan('npm run dev')}`;\n const steps = [\n `${pc.bold('1.')} ${runCommand}`,\n `${pc.bold('2.')} Open ${pc.cyan('Claude Code')} or ${pc.cyan('Cursor')} and prompt your agent to add more features`,\n ];\n clack.note(steps.join('\\n'), \"What's next\");\n } else {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n }\n }\n return;\n }\n\n // Non-template direct-link: save config in cwd and return.\n saveProjectConfig(projectConfig);\n\n if (json) {\n outputJson({ success: true, project: { id: projectConfig.project_id, name: projectConfig.project_name, region: projectConfig.region } });\n } else {\n outputSuccess(`Linked to direct project at ${projectConfig.oss_host}`);\n }\n\n // --auth without --template: overlay scaffold straight into cwd.\n // This is the \"add Better Auth to my existing project\" flow.\n if (opts.auth) {\n try {\n const result = await applyAuthProvider(opts.auth as AuthProvider, process.cwd(), projectConfig, json);\n if (!json) {\n clack.log.success(`Wired in ${opts.auth}: ${result.written.length} new, ${result.overwritten.length} replaced`);\n }\n // Re-install when the overlay patched package.json — otherwise\n // its new deps (better-auth, pg, jsonwebtoken, …) are listed\n // but never installed and `npm run setup` fails with\n // \"Cannot find package 'pg'\".\n if (result.packageJsonPatched && !json) {\n await runNpmInstall('Installing new dependencies...');\n }\n if (!json) clack.note(result.nextSteps, \"What's next\");\n } catch (err) {\n const msg = `Failed to apply --auth ${opts.auth}: ${(err as Error).message}`;\n if (json) console.error(JSON.stringify({ warning: msg }));\n else clack.log.warn(msg);\n }\n }\n\n trackCommand('link', 'oss-org', { direct: true });\n\n // Install agent skills\n await installSkills(json);\n await reportCliUsage('cli.link_direct', true, 6, projectConfig);\n\n // Report agent-connected event (best-effort)\n try {\n const urlMatch = opts.apiBaseUrl.match(/^https?:\\/\\/([^.]+)\\.[^.]+\\.insforge\\.app/);\n if (urlMatch) {\n await reportAgentConnected({ app_key: urlMatch[1] }, apiUrl);\n }\n } catch { /* ignore */ }\n return;\n } catch (err) {\n await reportCliUsage('cli.link_direct', false);\n await shutdownAnalytics();\n handleError(err, json);\n }\n }\n\n const creds = await requireAuth(apiUrl, false);\n\n let orgId = opts.orgId;\n let projectId = opts.projectId;\n\n // Show organization selection (auto-select if only one)\n if (!orgId && !projectId) {\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n if (!json) clack.log.info(`Using organization: ${orgs[0].name}`);\n } else {\n if (json) {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n orgId = selected;\n }\n }\n\n // Save default org\n const config = getGlobalConfig();\n config.default_org_id = orgId;\n saveGlobalConfig(config);\n\n // Select project if not specified\n if (!projectId) {\n const projects = await listProjects(orgId, apiUrl);\n if (projects.length === 0) {\n throw new CLIError('No projects found in this organization.');\n }\n if (json) {\n throw new CLIError('Specify --project-id in JSON mode.');\n }\n const selected = await prompts.select<string>({\n message: 'Select a project to link:',\n options: projects.map((p) => ({\n value: p.id,\n label: `${p.name} (${p.region}, ${p.status})`,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n projectId = selected;\n }\n\n // Fetch project details and API key\n let project;\n let apiKey;\n try {\n [project, apiKey] = await Promise.all([\n getProject(projectId, apiUrl),\n getProjectApiKey(projectId, apiUrl),\n ]);\n } catch (err) {\n if (err instanceof CLIError && (err.exitCode === 5 || err.exitCode === 4 || err.message.includes('not found'))) {\n const identity = creds.user?.email ?? creds.user?.name ?? 'unknown user';\n throw new CLIError(\n `No access to project ${projectId} as ${identity}. Double-check the project ID, or run \\`npx @insforge/cli logout\\` to switch accounts.`,\n 5,\n 'PERMISSION_DENIED',\n );\n }\n throw err;\n }\n\n const projectConfig: ProjectConfig = {\n project_id: project.id,\n project_name: project.name,\n org_id: project.organization_id,\n appkey: project.appkey,\n region: project.region,\n api_key: apiKey,\n oss_host: buildOssHost(project.appkey, project.region),\n };\n\n // Save config in cwd only if not using --template (template flow saves in subdirectory)\n if (!opts.template) {\n saveProjectConfig(projectConfig);\n }\n\n trackCommand('link', project.organization_id);\n\n if (json) {\n outputJson({ success: true, project: { id: project.id, name: project.name, region: project.region } });\n } else {\n outputSuccess(`Linked to project \"${project.name}\" (${project.appkey}.${project.region})`);\n }\n\n // Report agent-connected event (best-effort)\n try {\n await reportAgentConnected({ project_id: project.id }, apiUrl);\n } catch { /* ignore */ }\n\n // Template download (only when --template flag is passed).\n // Validation already ran at the top of the action.\n const template = opts.template as string | undefined;\n if (template) {\n // Ask for directory name\n let dirName = project.name;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: project.name,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n const templateDir = path.resolve(process.cwd(), dirName);\n const dirExists = await fs.stat(templateDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(templateDir);\n process.chdir(templateDir);\n\n // Save project config in the new directory\n saveProjectConfig(projectConfig);\n\n captureEvent(orgId ?? project.organization_id, 'template_selected', { template, source: 'link' });\n\n await downloadGitHubTemplate(template, projectConfig, json);\n\n // Only proceed with install/next steps if template actually downloaded\n const templateDownloaded = await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null);\n\n // Overlay --auth scaffold (after template, before install).\n if (opts.auth) {\n try {\n const result = await applyAuthProvider(opts.auth as AuthProvider, process.cwd(), projectConfig, json);\n if (!json) clack.log.success(`Wired in ${opts.auth}: ${result.written.length} new, ${result.overwritten.length} replaced`);\n } catch (err) {\n const msg = `Failed to apply --auth ${opts.auth}: ${(err as Error).message}`;\n if (json) console.error(JSON.stringify({ warning: msg }));\n else clack.log.warn(msg);\n }\n }\n\n if (templateDownloaded && !json) {\n await runNpmInstall();\n }\n\n // Install agent skills inside the project directory\n await installSkills(json);\n await reportCliUsage('cli.link', true, 6, projectConfig);\n\n if (!json) {\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n clack.log.step(`Dashboard: ${pc.underline(dashboardUrl)}`);\n if (templateDownloaded) {\n const runCommand = `${pc.cyan('cd')} ${pc.green(dirName)} ${pc.dim('&&')} ${pc.cyan('npm run dev')}`;\n const steps = [\n `${pc.bold('1.')} ${runCommand}`,\n `${pc.bold('2.')} Open ${pc.cyan('Claude Code')} or ${pc.cyan('Cursor')} and prompt your agent to add more features`,\n ];\n clack.note(steps.join('\\n'), \"What's next\");\n } else {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n }\n }\n } else {\n // No template path. If --auth was passed, overlay the auth scaffold\n // straight into cwd (the \"add Better Auth to my existing project\"\n // flow). Otherwise we just save config in cwd and exit.\n if (opts.auth) {\n try {\n const result = await applyAuthProvider(opts.auth as AuthProvider, process.cwd(), projectConfig, json);\n if (!json) {\n clack.log.success(`Wired in ${opts.auth}: ${result.written.length} new, ${result.overwritten.length} replaced`);\n }\n\n // Re-install when the overlay patched package.json — same as\n // the direct-OSS bare-overlay path above.\n if (result.packageJsonPatched && !json) {\n await runNpmInstall('Installing new dependencies...');\n }\n\n if (!json) clack.note(result.nextSteps, \"What's next\");\n } catch (err) {\n const msg = `Failed to apply --auth ${opts.auth}: ${(err as Error).message}`;\n if (json) console.error(JSON.stringify({ warning: msg }));\n else clack.log.warn(msg);\n }\n }\n\n // No template — install agent skills in the current directory\n await installSkills(json);\n await reportCliUsage('cli.link', true, 6, projectConfig);\n\n if (!json) {\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n clack.log.step(`Dashboard: ${dashboardUrl}`);\n\n const prompts = [\n 'Build a todo app with Google OAuth sign-in',\n 'Build an Instagram clone where users can upload photos, like, and comment',\n 'Build an AI chatbot with conversation history and deploy it to a live URL',\n ];\n clack.note(\n `Open your coding agent (Claude Code, Codex, Cursor, etc.) and try:\\n\\n${prompts.map((p) => `• \"${p}\"`).join('\\n')}`,\n 'Start building',\n );\n }\n }\n } catch (err) {\n await reportCliUsage('cli.link', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\n\n","import { exec } from 'node:child_process';\nimport { existsSync, readFileSync, appendFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { promisify } from 'node:util';\nimport * as clack from '@clack/prompts';\nimport { getProjectConfig } from './config.js';\n\nconst execAsync = promisify(exec);\n\nconst SKILL_INSTALL_TIMEOUT_MS = 60_000;\n\nexport function describeExecError(err: unknown): string {\n const e = err as {\n killed?: boolean;\n signal?: string;\n code?: number | string;\n stderr?: string | Buffer;\n message?: string;\n };\n\n if (e.killed && (e.signal === 'SIGTERM' || e.signal === 'SIGKILL')) {\n return `timed out after ${SKILL_INSTALL_TIMEOUT_MS / 1000}s — the npm registry may be slow or blocked by your network`;\n }\n if (e.code === 'ENOENT') {\n return '`npx` is not on your PATH — install Node.js 18+ and reopen your shell';\n }\n\n const stderr = (typeof e.stderr === 'string' ? e.stderr : e.stderr?.toString()) ?? '';\n if (/ENOTFOUND|EAI_AGAIN|getaddrinfo/i.test(stderr)) return 'cannot reach the npm registry (DNS lookup failed) — check your internet connection';\n if (/ECONNREFUSED/i.test(stderr)) return 'connection to the npm registry was refused — a proxy or firewall is likely blocking it';\n if (/ETIMEDOUT|ESOCKETTIMEDOUT|network timeout/i.test(stderr)) return 'the npm registry timed out — check your VPN, proxy, or corporate network';\n if (/CERT_HAS_EXPIRED|UNABLE_TO_VERIFY_LEAF_SIGNATURE|SELF_SIGNED_CERT/i.test(stderr)) return 'TLS error reaching the npm registry — a corporate proxy may be intercepting HTTPS';\n if (/\\bE404\\b|404 Not Found/i.test(stderr)) return 'npm returned 404 — the `skills` package or a dependency could not be found (check your npm registry config)';\n if (/EACCES|permission denied/i.test(stderr)) return 'permission denied writing files — run from a directory you own, without sudo';\n if (/ENOSPC|no space left/i.test(stderr)) return 'no disk space left to install the package';\n if (/\\b401\\b|EAUTH|authentication/i.test(stderr)) return 'npm authentication failed — check ~/.npmrc';\n\n if (typeof e.code === 'number') return `npx exited with code ${e.code}`;\n if (typeof e.code === 'string') return e.code;\n return e.message ?? 'unknown error';\n}\n\nconst GITIGNORE_ENTRIES = [\n '.insforge',\n '.agent',\n '.agents',\n '.augment',\n '.claude',\n '.cline',\n '.github/copilot*',\n '.kilocode',\n '.qoder',\n '.qwen',\n '.roo',\n '.trae',\n '.windsurf',\n];\n\nfunction updateGitignore(): void {\n const gitignorePath = join(process.cwd(), '.gitignore');\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : '';\n const lines = new Set(existing.split('\\n').map((l) => l.trim()));\n\n const missing = GITIGNORE_ENTRIES.filter((entry) => !lines.has(entry));\n if (!missing.length) return;\n\n const block = `\\n# InsForge & AI agent skills\\n${missing.join('\\n')}\\n`;\n appendFileSync(gitignorePath, block);\n}\n\nexport async function installSkills(json: boolean): Promise<void> {\n try {\n if (!json) clack.log.info('Installing InsForge agent skills (global)...');\n await execAsync('npx skills add insforge/agent-skills -g -y -a antigravity -a augment -a claude-code -a cline -a codex -a cursor -a gemini-cli -a github-copilot -a kilo -a qoder -a qwen-code -a roo -a trae -a windsurf', {\n cwd: process.cwd(),\n timeout: SKILL_INSTALL_TIMEOUT_MS,\n });\n if (!json) clack.log.success('InsForge agent skills installed.');\n } catch (err) {\n if (!json) {\n clack.log.warn(`Could not install agent skills: ${describeExecError(err)}`);\n clack.log.info('Run `npx skills add insforge/agent-skills` once resolved to see the full output.');\n }\n }\n\n // Install find-skills from vercel-labs for skill discovery\n try {\n if (!json) clack.log.info('Installing find-skills (global)...');\n await execAsync('npx skills add https://github.com/vercel-labs/skills --skill find-skills -g -y', {\n cwd: process.cwd(),\n timeout: SKILL_INSTALL_TIMEOUT_MS,\n });\n if (!json) clack.log.success('find-skills installed.');\n } catch (err) {\n if (!json) {\n clack.log.warn(`Could not install find-skills: ${describeExecError(err)}`);\n clack.log.info('Run `npx skills add https://github.com/vercel-labs/skills --skill find-skills` once resolved.');\n }\n }\n\n try {\n updateGitignore();\n } catch {\n // non-critical, silently ignore\n }\n}\n\nexport async function reportCliUsage(\n toolName: string,\n success: boolean,\n maxRetries = 1,\n explicitConfig?: { oss_host: string; api_key: string },\n): Promise<void> {\n let config: { oss_host: string; api_key: string } | null | undefined = explicitConfig;\n if (!config) {\n try {\n config = getProjectConfig();\n } catch {\n return;\n }\n }\n if (!config) return;\n\n const payload = JSON.stringify({\n tool_name: toolName,\n success,\n timestamp: new Date().toISOString(),\n });\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 3_000);\n try {\n const res = await fetch(`${config.oss_host}/api/usage/mcp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': config.api_key,\n },\n body: payload,\n signal: controller.signal,\n });\n\n if (res.status < 500) return;\n // 5xx — server may not be ready yet, retry\n } finally {\n clearTimeout(timer);\n }\n } catch {\n // network/abort error — server may not be ready yet, retry\n }\n\n if (attempt < maxRetries - 1) {\n await new Promise((r) => setTimeout(r, 5_000));\n }\n }\n}\n","// Apply an auth provider's scaffold to a directory. Overlay-safe: files that\n// already exist are left untouched (warned), package.json is deep-merged, and\n// .env.example is appended rather than replaced.\n//\n// Auth-provider scaffolds live in the InsForge templates repo under\n// `auth-providers/<provider>/` — they are NOT regular templates and never\n// appear in the CLI's `create` template picker. This function shallow-clones\n// the templates repo to a tempdir, reads `manifest.json` from the provider\n// directory, then runs the overlay engine (file copy, package.json deep-merge,\n// .env.example/.env.local collision-resolved append). Cleans up tempdir on\n// completion.\n\nimport { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { randomBytes } from 'node:crypto';\nimport * as clack from '@clack/prompts';\n\nimport { getAnonKey, getDatabaseConnectionString, getJwtSecret } from '../lib/api/oss.js';\nimport type { ProjectConfig } from '../types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const VALID_AUTH_PROVIDERS = ['better-auth'] as const;\nexport type AuthProvider = (typeof VALID_AUTH_PROVIDERS)[number];\n\n// Shape of the manifest.json shipped alongside each provider's files in the\n// templates repo. Keep this in sync with auth-providers/<name>/manifest.json\n// schema there.\ninterface AuthProviderManifest {\n name: string;\n description?: string;\n files: string[];\n packageJsonPatch: {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n };\n envExampleAppend: string;\n nextSteps: string;\n}\n\nfunction pathExists(p: string): Promise<boolean> {\n return fs.stat(p).then(() => true, () => false);\n}\n\n// Deep-merge two plain objects. The base wins on key collisions for primitive\n// values — i.e. if the user already has \"better-auth\": \"^1.5.0\" in their deps,\n// we don't downgrade them to \"^1.6.0\" from our manifest. Nested objects\n// recurse. Arrays are not deep-merged (auth provider patches don't use them).\nfunction deepMergeKeepBase<T extends Record<string, unknown>>(base: T, patch: Record<string, unknown>): T {\n const out: Record<string, unknown> = { ...base };\n for (const [k, v] of Object.entries(patch)) {\n if (\n v && typeof v === 'object' && !Array.isArray(v) &&\n out[k] && typeof out[k] === 'object' && !Array.isArray(out[k])\n ) {\n out[k] = deepMergeKeepBase(out[k] as Record<string, unknown>, v as Record<string, unknown>);\n } else if (out[k] === undefined) {\n out[k] = v;\n }\n // else: base has a primitive at this key — preserve it\n }\n return out as T;\n}\n\ninterface ApplyResult {\n written: string[];\n skipped: string[];\n overwritten: string[];\n packageJsonPatched: boolean;\n envExampleAppended: boolean;\n envLocalWritten: boolean;\n envKeysSkipped: string[];\n envKeysRefreshed: string[];\n nextSteps: string;\n}\n\n// Parse `KEY=...` lines from a dotenv blob and return the set of defined keys.\n// Comments and blank lines are ignored. Quoted values, leading `export `, and\n// inline `#` comments don't matter — we only care about the LHS.\n// Exported for unit testing.\nexport function extractEnvKeys(content: string): Set<string> {\n const keys = new Set<string>();\n for (const line of content.split('\\n')) {\n const trimmed = line.replace(/^\\s*export\\s+/, '').trimStart();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const m = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=/);\n if (m) keys.add(m[1]);\n }\n return keys;\n}\n\n// Parse `KEY=value` lines into a Map. Comments and blank lines are ignored.\n// We use this to compare the user's .env.local values against the manifest's\n// literal defaults so we can distinguish \"user customized\" from \"user has\n// the stale default\".\n// Exported for unit testing.\nexport function extractEnvPairs(content: string): Map<string, string> {\n const out = new Map<string, string>();\n for (const line of content.split('\\n')) {\n const trimmed = line.replace(/^\\s*export\\s+/, '').trimStart();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const m = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=(.*)$/);\n if (m) out.set(m[1], m[2]);\n }\n return out;\n}\n\n// Refresh stale platform defaults in the user's .env.local. If the user's\n// value matches the manifest's literal default AND the platform now has a\n// real value (e.g., cloud DATABASE_URL), overwrite the line. User-customized\n// values (anything that differs from the manifest default) are preserved.\n// Exported for unit testing.\nexport function refreshStaleEnvDefaults(\n existing: string,\n manifestDefaults: Map<string, string>,\n platformValues: Map<string, string>,\n): { updated: string; refreshed: string[] } {\n const refreshed: string[] = [];\n const lines = existing.split('\\n').map((line) => {\n const m = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=(.*)$/);\n if (!m) return line;\n const key = m[1];\n const userValue = m[2];\n const def = manifestDefaults.get(key);\n const real = platformValues.get(key);\n if (def !== undefined && real !== undefined && userValue === def && real !== def) {\n refreshed.push(key);\n return `${key}=${real}`;\n }\n return line;\n });\n return { updated: lines.join('\\n'), refreshed };\n}\n\n// Remove any `KEY=value` lines from `append` whose KEY already appears in\n// `existingKeys`. Comments and blank lines are kept verbatim so the section\n// header survives even if every var below it collides. Returns the filtered\n// blob plus the list of keys we dropped (for telemetry / user warning).\n// Exported for unit testing.\nexport function filterCollidingEnvLines(append: string, existingKeys: Set<string>): { filtered: string; dropped: string[] } {\n const dropped: string[] = [];\n const out: string[] = [];\n for (const line of append.split('\\n')) {\n const m = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=/);\n if (m && existingKeys.has(m[1])) {\n dropped.push(m[1]);\n continue;\n }\n out.push(line);\n }\n return { filtered: out.join('\\n'), dropped };\n}\n\nasync function walkFiles(dir: string, base = dir): Promise<string[]> {\n const out: string[] = [];\n for (const entry of await fs.readdir(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) out.push(...(await walkFiles(full, base)));\n else out.push(path.relative(base, full));\n }\n return out;\n}\n\n// Files in the cloned auth-providers/<name>/ directory that are NOT part of\n// the scaffold — they describe the overlay rather than belonging in the\n// user's project.\nconst PROVIDER_META_FILES = new Set(['manifest.json', 'README.md']);\n\n// INSFORGE_TEMPLATES_REPO and INSFORGE_TEMPLATES_BRANCH are escape hatches for\n// development against unmerged template branches. They are passed to git via\n// execFile's argv (no shell), but we still validate them so an env var can't\n// inject a `--upload-pack` or other git option that consumes the next argv.\nconst SAFE_REPO_PATTERN = /^(https?:\\/\\/|git@)[A-Za-z0-9._:/@~+-]+(\\.git)?$/;\nconst SAFE_BRANCH_PATTERN = /^[A-Za-z0-9._/-]+$/;\n\n// Shallow-clone the templates repo and return the path to\n// `auth-providers/<provider>/`.\nasync function fetchProviderTree(provider: AuthProvider): Promise<{ dir: string; cleanup: () => Promise<void> }> {\n const tempDir = path.join(tmpdir(), `insforge-auth-${provider}-${Date.now()}`);\n await fs.mkdir(tempDir, { recursive: true });\n const cleanup = () => fs.rm(tempDir, { recursive: true, force: true }).catch(() => undefined);\n\n try {\n const repo = process.env.INSFORGE_TEMPLATES_REPO ?? 'https://github.com/InsForge/insforge-templates.git';\n if (!SAFE_REPO_PATTERN.test(repo)) {\n throw new Error(`INSFORGE_TEMPLATES_REPO has unsupported characters: ${repo}`);\n }\n const branch = process.env.INSFORGE_TEMPLATES_BRANCH;\n if (branch !== undefined && !SAFE_BRANCH_PATTERN.test(branch)) {\n throw new Error(`INSFORGE_TEMPLATES_BRANCH has unsupported characters: ${branch}`);\n }\n\n const args = ['clone', '--depth', '1'];\n if (branch) args.push('-b', branch);\n args.push('--', repo, '.');\n await execFileAsync('git', args, {\n cwd: tempDir,\n maxBuffer: 10 * 1024 * 1024,\n timeout: 60_000,\n });\n\n const providerDir = path.join(tempDir, 'auth-providers', provider);\n if (!(await pathExists(providerDir))) {\n await cleanup();\n throw new Error(\n `Auth provider \"${provider}\" not found in templates repo. ` +\n `Looked for auth-providers/${provider}/ in ${repo}${branch ? ` (branch: ${branch})` : ''}.`,\n );\n }\n return { dir: providerDir, cleanup };\n } catch (err) {\n await cleanup();\n throw err;\n }\n}\n\nasync function loadManifest(providerDir: string): Promise<AuthProviderManifest> {\n const manifestPath = path.join(providerDir, 'manifest.json');\n if (!(await pathExists(manifestPath))) {\n throw new Error(`Missing manifest.json in ${providerDir}`);\n }\n const parsed = JSON.parse(await fs.readFile(manifestPath, 'utf-8')) as Partial<AuthProviderManifest>;\n // Sanity-check the shape so a malformed templates manifest fails with a\n // helpful message instead of a downstream `Cannot read properties of undefined`.\n const missing: string[] = [];\n if (typeof parsed.name !== 'string') missing.push('name');\n if (!Array.isArray(parsed.files)) missing.push('files (array)');\n if (!parsed.packageJsonPatch || typeof parsed.packageJsonPatch !== 'object') missing.push('packageJsonPatch (object)');\n if (typeof parsed.envExampleAppend !== 'string') missing.push('envExampleAppend (string)');\n if (typeof parsed.nextSteps !== 'string') missing.push('nextSteps (string)');\n if (missing.length > 0) {\n throw new Error(`Malformed manifest.json in ${providerDir} — missing or wrong-typed fields: ${missing.join(', ')}`);\n }\n return parsed as AuthProviderManifest;\n}\n\nexport async function applyAuthProvider(\n provider: AuthProvider,\n cwd: string,\n projectConfig: ProjectConfig,\n json: boolean,\n): Promise<ApplyResult> {\n if (!VALID_AUTH_PROVIDERS.includes(provider)) {\n throw new Error(`Unknown auth provider: ${provider}`);\n }\n\n const fetchSpinner = !json ? clack.spinner() : null;\n fetchSpinner?.start(`Fetching ${provider} scaffold from templates repo...`);\n const { dir: providerDir, cleanup } = await fetchProviderTree(provider);\n fetchSpinner?.stop(`${provider} scaffold ready`);\n\n try {\n const manifest = await loadManifest(providerDir);\n\n const result: ApplyResult = {\n written: [], skipped: [], overwritten: [],\n packageJsonPatched: false, envExampleAppended: false, envLocalWritten: false,\n envKeysSkipped: [],\n envKeysRefreshed: [],\n nextSteps: manifest.nextSteps,\n };\n\n // 1. Copy files. Auth-provider overlays REPLACE on collision — the user\n // opted into `--auth <provider>` expressing intent that the provider's\n // auth primitives win over whatever the base template ships. Without\n // this, base templates that pre-populate src/lib/insforge.ts (with a\n // different export shape) silently shadow the overlay version and the\n // overlay's pages crash at runtime. Track overwrites so we can warn.\n // Walk the provider tree and exclude overlay-meta files\n // (manifest.json, README.md).\n const allFiles = (await walkFiles(providerDir)).filter((rel) => !PROVIDER_META_FILES.has(rel));\n for (const rel of allFiles) {\n const src = path.join(providerDir, rel);\n const dest = path.join(cwd, rel);\n const existed = await pathExists(dest);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n await fs.copyFile(src, dest);\n if (existed) result.overwritten.push(rel);\n else result.written.push(rel);\n }\n\n // 2. Deep-merge package.json (preserve user's existing values).\n const pkgPath = path.join(cwd, 'package.json');\n if (await pathExists(pkgPath)) {\n const existing = JSON.parse(await fs.readFile(pkgPath, 'utf-8')) as Record<string, unknown>;\n const merged = deepMergeKeepBase(existing, manifest.packageJsonPatch);\n await fs.writeFile(pkgPath, JSON.stringify(merged, null, 2) + '\\n');\n result.packageJsonPatched = true;\n } else {\n // Fresh project (no package.json yet): create a minimal one.\n const fresh: Record<string, unknown> = {\n name: path.basename(cwd),\n version: '0.0.1',\n private: true,\n ...manifest.packageJsonPatch,\n };\n await fs.writeFile(pkgPath, JSON.stringify(fresh, null, 2) + '\\n');\n result.packageJsonPatched = true;\n }\n\n // 3. Append to .env.example (or create if absent). On collision, the\n // user's existing key wins — drop our line silently and report it\n // via envKeysSkipped so the caller can warn.\n const envExamplePath = path.join(cwd, '.env.example');\n if (await pathExists(envExamplePath)) {\n const existing = await fs.readFile(envExamplePath, 'utf-8');\n if (!existing.includes('# ─── Better Auth + InsForge bridge')) {\n const existingKeys = extractEnvKeys(existing);\n const { filtered, dropped } = filterCollidingEnvLines(manifest.envExampleAppend, existingKeys);\n result.envKeysSkipped = dropped;\n await fs.writeFile(envExamplePath, existing.replace(/\\n*$/, '\\n\\n') + filtered + '\\n');\n result.envExampleAppended = true;\n }\n } else {\n await fs.writeFile(envExamplePath, manifest.envExampleAppend + '\\n');\n result.envExampleAppended = true;\n }\n\n // 4. Write/extend .env.local with auto-filled values. Substitution rules:\n // INSFORGE_*_URL, INSFORGE_*_ANON_KEY, NEXT_PUBLIC_APP_URL, *_JWT_SECRET,\n // BETTER_AUTH_SECRET. If .env.local already exists we APPEND only the\n // keys it doesn't already define — same base-wins rule as .env.example.\n const envLocalPath = path.join(cwd, '.env.local');\n const envLocalExists = await pathExists(envLocalPath);\n const existingLocal = envLocalExists ? await fs.readFile(envLocalPath, 'utf-8') : '';\n const existingLocalKeys = envLocalExists ? extractEnvKeys(existingLocal) : new Set<string>();\n\n const [anonKey, jwtSecret, databaseUrl] = await Promise.all([\n getAnonKey(),\n getJwtSecret(),\n getDatabaseConnectionString(),\n ]);\n const filled = manifest.envExampleAppend.replace(\n /^([A-Z][A-Z0-9_]*=)(.*)$/gm,\n (_, prefix: string, value: string) => {\n const key = prefix.slice(0, -1);\n if (/INSFORGE.*(URL|BASE_URL)$/.test(key)) return `${prefix}${projectConfig.oss_host}`;\n if (/INSFORGE.*ANON_KEY$/.test(key)) return `${prefix}${anonKey}`;\n if (key === 'NEXT_PUBLIC_APP_URL') return `${prefix}https://${projectConfig.appkey}.insforge.site`;\n if (/JWT_SECRET$/.test(key)) return `${prefix}${jwtSecret ?? value}`;\n if (key === 'BETTER_AUTH_SECRET') return `${prefix}${randomBytes(32).toString('hex')}`;\n if (key === 'DATABASE_URL') return `${prefix}${databaseUrl ?? value}`;\n return `${prefix}${value}`;\n },\n );\n\n if (!envLocalExists) {\n await fs.writeFile(envLocalPath, filled + '\\n');\n result.envLocalWritten = true;\n } else {\n // Two passes:\n // 1. Refresh stale platform defaults in-place. If the user's existing\n // value matches the manifest's literal default AND we now have a\n // real platform value (e.g., they re-linked against a cloud project\n // after the CLI started fetching DATABASE_URL), update the line.\n // User-customized values are preserved untouched.\n // 2. Append any genuinely new keys at the end.\n const manifestDefaults = extractEnvPairs(manifest.envExampleAppend);\n const platformValues = extractEnvPairs(filled);\n const { updated, refreshed } = refreshStaleEnvDefaults(existingLocal, manifestDefaults, platformValues);\n\n const refreshedSet = new Set(refreshed);\n const keysAfterRefresh = new Set([...existingLocalKeys, ...refreshedSet]);\n const { filtered, dropped } = filterCollidingEnvLines(filled, keysAfterRefresh);\n const hasNewKey = filtered.split('\\n').some((l) => /^[A-Z][A-Z0-9_]*=/.test(l));\n\n if (refreshed.length > 0 || hasNewKey) {\n const base = hasNewKey ? updated.replace(/\\n*$/, '\\n\\n') + filtered + '\\n' : updated;\n await fs.writeFile(envLocalPath, base);\n result.envLocalWritten = true;\n }\n result.envKeysSkipped = Array.from(new Set([...result.envKeysSkipped, ...dropped]));\n result.envKeysRefreshed = Array.from(new Set([...result.envKeysRefreshed, ...refreshed]));\n }\n\n if (!jwtSecret && !json) {\n clack.log.warn('Could not auto-fill JWT_SECRET — run `npx @insforge/cli secrets get JWT_SECRET` and paste it into .env.local.');\n }\n\n if (result.envKeysSkipped.length > 0 && !json) {\n clack.log.warn(\n `Kept your existing values for: ${result.envKeysSkipped.join(', ')}. ` +\n `If any of these need the auth-provider's defaults, see .env.example for reference.`,\n );\n }\n\n if (result.envKeysRefreshed.length > 0 && !json) {\n clack.log.info(\n `Refreshed stale platform defaults: ${result.envKeysRefreshed.join(', ')}. ` +\n `Your value matched the manifest's default, so we replaced it with the live one.`,\n );\n }\n\n return result;\n } finally {\n await cleanup();\n }\n}\n","import { getProjectConfig } from '../config.js';\nimport { CLIError, ProjectNotLinkedError } from '../errors.js';\nimport type { ProjectConfig } from '../../types.js';\n\nfunction requireProjectConfig(): ProjectConfig {\n const config = getProjectConfig();\n if (!config) {\n throw new ProjectNotLinkedError();\n }\n return config;\n}\n\n/**\n * Unified OSS API fetch. Uses API key as Bearer token for all requests,\n * which grants superadmin access (SQL execution, bucket management, etc.).\n */\nexport interface RawSqlResult {\n rows: Record<string, unknown>[];\n raw: Record<string, unknown>;\n}\n\nexport async function runRawSql(sql: string, unrestricted = false): Promise<RawSqlResult> {\n const endpoint = unrestricted\n ? '/api/database/advance/rawsql/unrestricted'\n : '/api/database/advance/rawsql';\n const res = await ossFetch(endpoint, {\n method: 'POST',\n body: JSON.stringify({ query: sql }),\n });\n const raw = await res.json() as Record<string, unknown>;\n const rows = (raw.rows ?? raw.data ?? []) as Record<string, unknown>[];\n return { rows, raw };\n}\n\nexport async function getAnonKey(): Promise<string> {\n const res = await ossFetch('/api/auth/tokens/anon', { method: 'POST' });\n const data = await res.json() as { accessToken: string };\n return data.accessToken;\n}\n\nexport async function getJwtSecret(): Promise<string | null> {\n // Returns null if the project doesn't expose JWT_SECRET — caller falls back\n // to leaving the env var as-is so the user can fill it manually.\n try {\n const res = await ossFetch('/api/secrets/JWT_SECRET');\n const data = await res.json() as { value?: string };\n return typeof data.value === 'string' && data.value.length > 0 ? data.value : null;\n } catch {\n return null;\n }\n}\n\nexport async function getDatabaseConnectionString(): Promise<string | null> {\n // Cloud-only: returns the project's Postgres URL (with sslmode). Self-hosted\n // returns null so callers leave DATABASE_URL at the localhost default —\n // self-hosters know their own connection string.\n try {\n const res = await ossFetch('/api/metadata/database-connection-string');\n const data = await res.json() as { connectionURL?: string };\n return typeof data.connectionURL === 'string' && data.connectionURL.length > 0\n ? data.connectionURL\n : null;\n } catch {\n return null;\n }\n}\n\nexport async function ossFetch(\n path: string,\n options: RequestInit = {},\n): Promise<Response> {\n const config = requireProjectConfig();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n ...(options.headers as Record<string, string> ?? {}),\n };\n\n const res = await fetch(`${config.oss_host}${path}`, { ...options, headers });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as {\n error?: string;\n message?: string;\n nextActions?: string;\n statusCode?: number;\n };\n\n let message = err.message ?? err.error ?? `OSS request failed: ${res.status}`;\n if (err.nextActions) {\n message += `\\n${err.nextActions}`;\n }\n\n // Feature not available on this backend version — ONLY when the 404 is a\n // route-level miss (no structured error code), not a resource-level miss\n // like COMPUTE_SERVICE_NOT_FOUND. Otherwise we'd hide real \"service doesn't\n // exist\" errors behind a misleading \"feature not enabled\" message.\n const isRouteLevel404 = !err.error || err.error === 'NOT_FOUND';\n if (res.status === 404 && isRouteLevel404 && path.startsWith('/api/compute')) {\n message = 'Compute services are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud: contact your InsForge admin to enable compute.';\n }\n\n if (res.status === 404 && isRouteLevel404 && path.startsWith('/api/payments')) {\n message = 'Payments are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud/private preview: contact your InsForge admin to enable payments.';\n }\n\n if (res.status === 404 && isRouteLevel404 && path === '/api/database/migrations') {\n message = 'Database migrations are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud: contact your InsForge admin about database migration support.';\n }\n\n throw new CLIError(message);\n }\n\n return res;\n}\n","import type { Command } from 'commander';\nimport { exec, execFile } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { promisify } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../lib/prompts.js';\nimport {\n listOrganizations,\n createProject,\n getProject,\n getProjectApiKey,\n} from '../lib/api/platform.js';\nimport { getAnonKey, runRawSql } from '../lib/api/oss.js';\nimport { applyAuthProvider, VALID_AUTH_PROVIDERS, type AuthProvider } from '../auth-providers/apply.js';\nimport { getGlobalConfig, saveGlobalConfig, saveProjectConfig, getFrontendUrl } from '../lib/config.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\nimport { readEnvFile } from '../lib/env.js';\nimport { installSkills, reportCliUsage } from '../lib/skills.js';\nimport { captureEvent, trackCommand, shutdownAnalytics } from '../lib/analytics.js';\nimport { deployProject } from './deployments/deploy.js';\nimport type { ProjectConfig } from '../types.js';\n\nconst execAsync = promisify(exec);\nconst execFileAsync = promisify(execFile);\n\n// Same safety guard fetchProviderTree uses in apply.ts. INSFORGE_TEMPLATES_REPO\n// and INSFORGE_TEMPLATES_BRANCH are escape hatches for development against\n// unmerged branches; they are passed to git's argv (no shell), but we still\n// validate the values so a hostile env var can't slip in extra git options.\nconst SAFE_REPO_PATTERN = /^(https?:\\/\\/|git@)[A-Za-z0-9._:/@~+-]+(\\.git)?$/;\nconst SAFE_BRANCH_PATTERN = /^[A-Za-z0-9._/-]+$/;\n\nexport type Framework = 'react' | 'nextjs';\n\nfunction buildOssHost(appkey: string, region: string): string {\n return `https://${appkey}.${region}.insforge.app`;\n}\n\nasync function waitForProjectActive(projectId: string, apiUrl?: string, timeoutMs = 120_000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n const project = await getProject(projectId, apiUrl);\n if (project.status === 'active') return;\n await new Promise((r) => setTimeout(r, 3000));\n }\n throw new CLIError('Project creation timed out. Check the dashboard for status.');\n}\n\nconst INSFORGE_BANNER = [\n '██╗███╗ ██╗███████╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗',\n '██║████╗ ██║██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝',\n '██║██╔██╗ ██║███████╗█████╗ ██║ ██║██████╔╝██║ ███╗█████╗ ',\n '██║██║╚██╗██║╚════██║██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝ ',\n '██║██║ ╚████║███████║██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗',\n '╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝',\n];\n\nasync function animateBanner(): Promise<void> {\n const isTTY = process.stderr.isTTY;\n if (!isTTY || process.env.CI) {\n // Non-interactive: just print static banner\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`${line}\\n`);\n }\n process.stderr.write('\\n');\n return;\n }\n\n const totalLines = INSFORGE_BANNER.length;\n const maxLen = Math.max(...INSFORGE_BANNER.map((l) => l.length));\n const cols = process.stderr.columns ?? 0;\n\n // Narrow terminal: skip animation to avoid garbled output from line wrapping\n if (cols > 0 && cols < maxLen) {\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`\\x1b[97m${line}\\x1b[0m\\n`);\n }\n process.stderr.write('\\n');\n return;\n }\n\n // Phase 1: Line-by-line reveal with cursor sweep\n const REVEAL_STEPS = 10;\n const REVEAL_DELAY = 30;\n for (let lineIdx = 0; lineIdx < totalLines; lineIdx++) {\n const line = INSFORGE_BANNER[lineIdx];\n for (let step = 0; step <= REVEAL_STEPS; step++) {\n const pos = Math.floor((step / REVEAL_STEPS) * line.length);\n let rendered = '';\n for (let i = 0; i < line.length; i++) {\n if (i < pos) {\n rendered += `\\x1b[97m${line[i]}\\x1b[0m`; // bright white (revealed)\n } else if (i === pos) {\n rendered += `\\x1b[1;37m${line[i]}\\x1b[0m`; // bold white (cursor)\n } else {\n rendered += `\\x1b[90m${line[i]}\\x1b[0m`; // dim gray (hidden)\n }\n }\n process.stderr.write(`\\r${rendered}`);\n await new Promise((r) => setTimeout(r, REVEAL_DELAY));\n }\n process.stderr.write('\\n');\n }\n\n // Phase 2: Shimmer pass across the full banner\n const SHIMMER_STEPS = 16;\n const SHIMMER_DELAY = 40;\n const SHIMMER_WIDTH = 4;\n for (let step = 0; step < SHIMMER_STEPS; step++) {\n const shimmerPos = Math.floor((step / SHIMMER_STEPS) * (maxLen + SHIMMER_WIDTH));\n // Move cursor up to start of banner\n process.stderr.write(`\\x1b[${totalLines}A`);\n for (const line of INSFORGE_BANNER) {\n let rendered = '';\n for (let i = 0; i < line.length; i++) {\n const dist = Math.abs(i - shimmerPos);\n if (dist === 0) {\n rendered += `\\x1b[1;97m${line[i]}\\x1b[0m`; // bold bright white (shimmer peak)\n } else if (dist <= SHIMMER_WIDTH) {\n rendered += `\\x1b[37m${line[i]}\\x1b[0m`; // white (shimmer edge)\n } else {\n rendered += `\\x1b[90m${line[i]}\\x1b[0m`; // dim (base)\n }\n }\n process.stderr.write(`${rendered}\\n`);\n }\n await new Promise((r) => setTimeout(r, SHIMMER_DELAY));\n }\n\n // Final: show banner in steady bright white\n process.stderr.write(`\\x1b[${totalLines}A`);\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`\\x1b[97m${line}\\x1b[0m\\n`);\n }\n process.stderr.write('\\n');\n}\n\nfunction getDefaultProjectName(): string {\n const dirName = path.basename(process.cwd());\n const sanitized = dirName.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n return sanitized.length >= 2 ? sanitized : '';\n}\n\nexport async function copyDir(src: string, dest: string): Promise<void> {\n const entries = await fs.readdir(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n if (entry.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true });\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\nexport function registerCreateCommand(program: Command): void {\n program\n .command('create')\n .description('Create a new InsForge project')\n .option('--name <name>', 'Project name')\n .option('--org-id <id>', 'Organization ID')\n .option('--region <region>', 'Deployment region (us-east, us-west, eu-central, ap-southeast)')\n .option('--template <template>', 'Template to use: react, nextjs, chatbot, crm, e-commerce, todo, or empty')\n .option('--auth <provider>', 'Wire a third-party auth provider into the chosen template (currently: better-auth)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl, false);\n\n if (!json) {\n await animateBanner();\n clack.intro(\"Let's build something great\");\n }\n\n // 1. Select organization (auto-select if only one)\n let orgId = opts.orgId;\n if (!orgId) {\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n if (!json) clack.log.info(`Using organization: ${orgs[0].name}`);\n } else {\n if (json) {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n orgId = selected;\n }\n }\n\n // Save default org\n const globalConfig = getGlobalConfig();\n globalConfig.default_org_id = orgId;\n saveGlobalConfig(globalConfig);\n\n // 2. Project name (pre-filled from directory name)\n let projectName = opts.name;\n if (!projectName) {\n if (json) throw new CLIError('--name is required in JSON mode.');\n const defaultName = getDefaultProjectName();\n const name = await prompts.text({\n message: 'Project name:',\n ...(defaultName ? { initialValue: defaultName } : {}),\n validate: (v) => (v.length >= 2 ? undefined : 'Name must be at least 2 characters'),\n });\n if (prompts.isCancel(name)) process.exit(0);\n projectName = name;\n }\n\n // Sanitize project name to prevent path traversal\n projectName = path.basename(projectName).replace(/[^a-zA-Z0-9._-]/g, '-').replace(/\\.+/g, '.');\n if (projectName.length < 2 || projectName === '.' || projectName === '..') {\n throw new CLIError('Project name must be at least 2 safe characters (letters, numbers, hyphens).');\n }\n\n // 3. Select template (two-step: blank vs template, then pick template)\n const validTemplates = ['react', 'nextjs', 'chatbot', 'crm', 'e-commerce', 'todo', 'empty'];\n let template = opts.template as string | undefined;\n\n // --auth is FLAG-ONLY; not in the interactive picker. It composes onto\n // any base template by overlaying scaffolded files after the template\n // download. With no --template, it overlays straight into cwd.\n if (opts.auth && !VALID_AUTH_PROVIDERS.includes(opts.auth)) {\n throw new CLIError(`Invalid --auth \"${opts.auth}\". Valid: ${VALID_AUTH_PROVIDERS.join(', ')}`);\n }\n\n if (template && !validTemplates.includes(template)) {\n throw new CLIError(`Invalid template \"${template}\". Valid options: ${validTemplates.join(', ')}`);\n }\n if (!template) {\n if (json) {\n template = 'empty';\n } else {\n const approach = await prompts.select<string>({\n message: 'How would you like to start?',\n options: [\n { value: 'blank', label: 'Blank project', hint: 'Start from scratch with .env.local ready' },\n { value: 'template', label: 'Start from a template', hint: 'Pre-built starter apps' },\n ],\n });\n if (prompts.isCancel(approach)) process.exit(0);\n\n captureEvent(orgId, 'create_approach_selected', {\n approach,\n });\n\n if (approach === 'blank') {\n template = 'empty';\n } else {\n const selected = await prompts.select<string>({\n message: 'Choose a starter template:',\n options: [\n { value: 'react', label: 'Web app template with React' },\n { value: 'nextjs', label: 'Web app template with Next.js' },\n { value: 'chatbot', label: 'AI Chatbot with Next.js' },\n { value: 'crm', label: 'CRM with Next.js' },\n { value: 'e-commerce', label: 'E-Commerce store with Next.js' },\n { value: 'todo', label: 'Todo app with Next.js' },\n ],\n });\n if (prompts.isCancel(selected)) process.exit(0);\n template = selected;\n }\n }\n }\n\n captureEvent(orgId, 'template_selected', {\n template,\n approach: template === 'empty' ? 'blank' : 'template',\n });\n\n // 4. Choose directory (templates need a subdirectory, blank uses cwd)\n const hasTemplate = template !== 'empty';\n let dirName: string | null = null;\n const originalCwd = process.cwd();\n let projectDir = originalCwd;\n\n if (hasTemplate) {\n dirName = projectName;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: projectName,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n // Validate normalized dirName\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n // Create the project directory and switch into it\n projectDir = path.resolve(originalCwd, dirName);\n const dirExists = await fs.stat(projectDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(projectDir);\n process.chdir(projectDir);\n }\n\n // 5. Create project via Platform API\n let projectLinked = false;\n const s = !json ? clack.spinner() : null;\n try {\n s?.start('Creating project...');\n\n const project = await createProject(orgId, projectName, opts.region, apiUrl);\n\n s?.message('Waiting for project to become active...');\n await waitForProjectActive(project.id, apiUrl);\n\n // 6. Fetch API key and link project\n const apiKey = await getProjectApiKey(project.id, apiUrl);\n const projectConfig: ProjectConfig = {\n project_id: project.id,\n project_name: project.name,\n org_id: project.organization_id,\n appkey: project.appkey,\n region: project.region,\n api_key: apiKey,\n oss_host: buildOssHost(project.appkey, project.region),\n };\n saveProjectConfig(projectConfig);\n projectLinked = true;\n\n s?.stop(`Project \"${project.name}\" created and linked`);\n\n // 7. Download template or seed env for blank projects\n const githubTemplates = ['chatbot', 'crm', 'e-commerce', 'nextjs', 'react', 'todo'];\n if (githubTemplates.includes(template!)) {\n await downloadGitHubTemplate(template!, projectConfig, json);\n } else if (hasTemplate) {\n await downloadTemplate(template as Framework, projectConfig, projectName, json, apiUrl);\n } else {\n // Blank project: seed .env.local with InsForge credentials (non-fatal)\n try {\n const anonKey = await getAnonKey();\n if (!anonKey) {\n if (!json) clack.log.warn('Could not retrieve anon key. You can add it to .env.local manually.');\n } else {\n const envPath = path.join(process.cwd(), '.env.local');\n const envContent = [\n '# InsForge',\n `NEXT_PUBLIC_INSFORGE_URL=${projectConfig.oss_host}`,\n `NEXT_PUBLIC_INSFORGE_ANON_KEY=${anonKey}`,\n '',\n ].join('\\n');\n await fs.writeFile(envPath, envContent, { flag: 'wx' });\n if (!json) {\n clack.log.success('Created .env.local with your InsForge credentials');\n }\n }\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (!json) {\n if (error.code === 'EEXIST') {\n clack.log.warn('.env.local already exists; skipping InsForge key seeding.');\n } else {\n clack.log.warn(`Failed to create .env.local: ${error.message}`);\n }\n }\n }\n }\n\n // 7b. If --auth was passed, overlay the auth-provider scaffold onto\n // whatever the template (or blank project) produced. Auth-provider\n // scaffolds are fetched from the InsForge templates repo at runtime\n // (auth-providers/<name>/), not bundled with the CLI.\n if (opts.auth) {\n try {\n const result = await applyAuthProvider(opts.auth as AuthProvider, process.cwd(), projectConfig, json);\n if (!json) {\n clack.log.success(`Wired in ${opts.auth}: ${result.written.length} new, ${result.overwritten.length} replaced`);\n }\n } catch (err) {\n const msg = `Failed to apply --auth ${opts.auth}: ${(err as Error).message}`;\n if (json) console.error(JSON.stringify({ warning: msg }));\n else clack.log.warn(msg);\n }\n }\n\n // Install agent skills\n await installSkills(json);\n trackCommand('create', orgId);\n await reportCliUsage('cli.create', true, 6);\n\n // 8. Install npm dependencies (template projects only, if download succeeded)\n const templateDownloaded = hasTemplate\n ? await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null)\n : null;\n\n if (templateDownloaded) {\n const installSpinner = !json ? clack.spinner() : null;\n installSpinner?.start('Installing dependencies...');\n try {\n await execAsync('npm install', { cwd: process.cwd(), maxBuffer: 10 * 1024 * 1024 });\n installSpinner?.stop('Dependencies installed');\n } catch (err) {\n installSpinner?.stop('Failed to install dependencies');\n if (!json) {\n clack.log.warn(`npm install failed: ${(err as Error).message}`);\n clack.log.info('Run `npm install` manually to install dependencies.');\n }\n }\n }\n\n // 9. Offer to deploy (template projects, interactive mode only)\n let liveUrl: string | null = null;\n if (templateDownloaded && !json) {\n const shouldDeploy = await prompts.confirm({\n message: 'Would you like to deploy now?',\n });\n\n if (!prompts.isCancel(shouldDeploy) && shouldDeploy) {\n try {\n // Read env vars from .env.local or .env to pass to deployment\n const envVars = await readEnvFile(process.cwd());\n const startBody: { envVars?: Array<{ key: string; value: string }> } = {};\n if (envVars.length > 0) {\n startBody.envVars = envVars;\n }\n\n const deploySpinner = clack.spinner();\n const result = await deployProject({\n sourceDir: process.cwd(),\n startBody,\n spinner: deploySpinner,\n });\n\n if (result.isReady) {\n deploySpinner.stop('Deployment complete');\n liveUrl = result.liveUrl;\n } else {\n deploySpinner.stop('Deployment is still building');\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n clack.log.warn('Deployment did not finish within 2 minutes.');\n clack.log.info(`Check status with: npx @insforge/cli deployments status ${result.deploymentId}`);\n }\n } catch (err) {\n clack.log.warn(`Deploy failed: ${(err as Error).message}`);\n }\n }\n }\n\n // 10. Show links and next steps\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n\n if (json) {\n outputJson({\n success: true,\n project: { id: project.id, name: project.name, appkey: project.appkey, region: project.region },\n template,\n ...(dirName ? { directory: dirName } : {}),\n urls: {\n dashboard: dashboardUrl,\n ...(liveUrl ? { liveSite: liveUrl } : {}),\n },\n });\n } else {\n clack.log.step(`Dashboard: ${dashboardUrl}`);\n if (liveUrl) {\n clack.log.success(`Live site: ${liveUrl}`);\n }\n\n // Next steps\n if (templateDownloaded) {\n const steps = [\n `cd ${dirName}`,\n 'npm run dev',\n ];\n clack.note(steps.join('\\n'), 'Next steps');\n clack.note('Open your coding agent (Claude Code, Codex, Cursor, etc.) to add new features.', 'Keep building');\n } else if (hasTemplate && !templateDownloaded) {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n } else {\n const prompts = [\n 'Build a todo app with Google OAuth sign-in',\n 'Build an Instagram clone where users can upload photos, like, and comment',\n 'Build an AI chatbot with conversation history',\n ];\n clack.note(\n `Open your coding agent (Claude Code, Codex, Cursor, etc.) and try:\\n\\n${prompts.map((p) => `• \"${p}\"`).join('\\n')}`,\n 'Start building',\n );\n }\n clack.outro('Done!');\n }\n } catch (err) {\n // Clean up the project directory if it was created but linking failed\n if (!projectLinked && hasTemplate && projectDir !== originalCwd) {\n process.chdir(originalCwd);\n await fs.rm(projectDir, { recursive: true, force: true }).catch(() => {});\n }\n throw err;\n }\n } catch (err) {\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\nexport async function downloadTemplate(\n framework: Framework,\n projectConfig: ProjectConfig,\n projectName: string,\n json: boolean,\n _apiUrl?: string,\n): Promise<void> {\n const s = !json ? clack.spinner() : null;\n s?.start('Downloading template...');\n\n try {\n // Get the anon key from the OSS backend\n const anonKey = await getAnonKey();\n if (!anonKey) {\n throw new Error('Failed to retrieve anon key from backend');\n }\n\n // Create temp directory for download\n const tempDir = tmpdir();\n const targetDir = projectName;\n const templatePath = path.join(tempDir, targetDir);\n\n // Remove existing temp directory if it exists\n try {\n await fs.rm(templatePath, { recursive: true, force: true });\n } catch {\n // Directory doesn't exist, which is fine\n }\n\n const frame = framework === 'nextjs' ? 'nextjs' : 'react';\n const esc = (s: string) => process.platform === 'win32' ? `\"${s.replace(/\"/g, '\\\\\"')}\"` : `'${s.replace(/'/g, \"'\\\\''\")}'`;\n const command = `npx --yes create-insforge-app@latest ${esc(targetDir)} --frame ${frame} --base-url ${esc(projectConfig.oss_host)} --anon-key ${esc(anonKey)} --skip-install`;\n\n s?.message(`Running create-insforge-app (${frame})...`);\n\n await execAsync(command, {\n maxBuffer: 10 * 1024 * 1024,\n cwd: tempDir,\n });\n\n // Copy template files to current directory\n s?.message('Copying template files...');\n const cwd = process.cwd();\n await copyDir(templatePath, cwd);\n\n // Cleanup temp directory\n await fs.rm(templatePath, { recursive: true, force: true }).catch(() => {});\n\n s?.stop('Template files downloaded');\n } catch (err) {\n s?.stop('Template download failed');\n if (!json) {\n clack.log.warn(`Failed to download template: ${(err as Error).message}`);\n clack.log.info('You can manually set up the template later.');\n }\n }\n}\n\nexport async function downloadGitHubTemplate(\n templateName: string,\n projectConfig: ProjectConfig,\n json: boolean,\n): Promise<void> {\n const s = !json ? clack.spinner() : null;\n s?.start(`Downloading ${templateName} template...`);\n\n const tempDir = path.join(tmpdir(), `insforge-template-${Date.now()}`);\n\n try {\n await fs.mkdir(tempDir, { recursive: true });\n\n // Shallow clone the templates repo. INSFORGE_TEMPLATES_REPO + INSFORGE_TEMPLATES_BRANCH\n // are escape hatches for development against unmerged template branches.\n // Validated against safe-character patterns and passed via argv (execFile),\n // not a shell string, so a hostile env var can't inject extra git options.\n const templatesRepo = process.env.INSFORGE_TEMPLATES_REPO ?? 'https://github.com/InsForge/insforge-templates.git';\n if (!SAFE_REPO_PATTERN.test(templatesRepo)) {\n throw new Error(`INSFORGE_TEMPLATES_REPO has unsupported characters: ${templatesRepo}`);\n }\n const templatesBranch = process.env.INSFORGE_TEMPLATES_BRANCH;\n if (templatesBranch !== undefined && !SAFE_BRANCH_PATTERN.test(templatesBranch)) {\n throw new Error(`INSFORGE_TEMPLATES_BRANCH has unsupported characters: ${templatesBranch}`);\n }\n const cloneArgs = ['clone', '--depth', '1'];\n if (templatesBranch) cloneArgs.push('-b', templatesBranch);\n cloneArgs.push('--', templatesRepo, '.');\n await execFileAsync('git', cloneArgs, {\n cwd: tempDir,\n maxBuffer: 10 * 1024 * 1024,\n timeout: 60_000,\n });\n\n const templateDir = path.join(tempDir, templateName);\n const stat = await fs.stat(templateDir).catch(() => null);\n if (!stat?.isDirectory()) {\n throw new Error(`Template \"${templateName}\" not found in repository`);\n }\n\n // Copy template files to cwd\n s?.message('Copying template files...');\n const cwd = process.cwd();\n await copyDir(templateDir, cwd);\n\n // Write .env.local from .env.example with InsForge credentials filled in\n const envExamplePath = path.join(cwd, '.env.example');\n const envExampleExists = await fs.stat(envExamplePath).catch(() => null);\n if (envExampleExists) {\n const anonKey = await getAnonKey();\n const envExample = await fs.readFile(envExamplePath, 'utf-8');\n const envFinal = envExample.replace(\n /^([A-Z][A-Z0-9_]*=)(.*)$/gm,\n (_, prefix: string, _value: string) => {\n const key = prefix.slice(0, -1); // remove trailing '='\n if (/INSFORGE.*(URL|BASE_URL)$/.test(key)) return `${prefix}${projectConfig.oss_host}`;\n if (/INSFORGE.*ANON_KEY$/.test(key)) return `${prefix}${anonKey}`;\n if (key === 'NEXT_PUBLIC_APP_URL') return `${prefix}https://${projectConfig.appkey}.insforge.site`;\n return `${prefix}${_value}`;\n },\n );\n // (Auth-provider scaffolds handle their own env vars via applyAuthProvider.)\n const envLocalPath = path.join(cwd, '.env.local');\n try {\n await fs.writeFile(envLocalPath, envFinal, { flag: 'wx' });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'EEXIST') {\n if (!json) clack.log.warn('.env.local already exists; skipping env seeding.');\n } else {\n throw e;\n }\n }\n }\n\n s?.stop(`${templateName} template downloaded`);\n\n // Auto-run database migrations if db_init.sql exists\n const migrationPath = path.join(cwd, 'migrations', 'db_init.sql');\n const migrationExists = await fs.stat(migrationPath).catch(() => null);\n if (migrationExists) {\n const dbSpinner = !json ? clack.spinner() : null;\n dbSpinner?.start('Running database migrations...');\n try {\n const sql = await fs.readFile(migrationPath, 'utf-8');\n await runRawSql(sql, true);\n dbSpinner?.stop('Database migrations applied');\n } catch (err) {\n dbSpinner?.stop('Database migration failed');\n if (!json) {\n clack.log.warn(`Migration failed: ${(err as Error).message}`);\n clack.log.info('You can run the migration manually: npx @insforge/cli db query --unrestricted \"$(cat migrations/db_init.sql)\"');\n } else {\n throw err;\n }\n }\n }\n } catch (err) {\n s?.stop(`${templateName} template download failed`);\n const msg = `Failed to download ${templateName} template: ${(err as Error).message}`;\n if (json) {\n console.error(JSON.stringify({ warning: msg }));\n } else {\n clack.log.warn(msg);\n clack.log.info('You can manually clone from: https://github.com/InsForge/insforge-templates');\n }\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n}\n\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n/**\n * Read environment variables from the first env file found in the directory.\n * Priority: .env.local > .env.production > .env\n */\nexport async function readEnvFile(cwd: string): Promise<Array<{ key: string; value: string }>> {\n const candidates = ['.env.local', '.env.production', '.env'];\n for (const name of candidates) {\n const filePath = path.join(cwd, name);\n const exists = await fs.stat(filePath).catch(() => null);\n if (!exists) continue;\n\n const content = await fs.readFile(filePath, 'utf-8');\n const vars: Array<{ key: string; value: string }> = [];\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n // Strip surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n if (key) vars.push({ key, value });\n }\n return vars;\n }\n return [];\n}\n","import type { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createReadStream } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport * as clack from '@clack/prompts';\nimport archiver from 'archiver';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError, getDeploymentError, formatFetchError } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type {\n CreateDeploymentResponse,\n CreateDirectDeploymentRequest,\n CreateDirectDeploymentResponse,\n DeploymentManifestFile,\n DeploymentManifestFileEntry,\n DeploymentSchema,\n ProjectConfig,\n StartDeploymentRequest,\n} from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nconst POLL_INTERVAL_MS = 5_000;\nconst POLL_TIMEOUT_MS = 300_000;\nconst DIRECT_UPLOAD_CONCURRENCY = 8;\n\nconst EXCLUDE_PATTERNS = [\n 'node_modules',\n '.git',\n '.next',\n '.env',\n '.env.local',\n 'dist',\n 'build',\n '.DS_Store',\n '.insforge',\n // IDE and AI agent configs\n '.claude',\n '.agents',\n '.augment',\n '.kilocode',\n '.kiro',\n '.qoder',\n '.qwen',\n '.roo',\n '.trae',\n '.windsurf',\n '.vercel',\n '.turbo',\n '.cache',\n 'skills',\n 'coverage',\n];\n\ntype LocalDeploymentFile = DeploymentManifestFileEntry & {\n absolutePath: string;\n};\n\nclass DirectDeploymentUnsupportedError extends Error {\n constructor() {\n super('Direct deployment endpoints are not available on this backend');\n this.name = 'DirectDeploymentUnsupportedError';\n }\n}\n\nfunction shouldExclude(name: string): boolean {\n const normalized = name.replace(/\\\\/g, '/');\n for (const pattern of EXCLUDE_PATTERNS) {\n if (\n normalized === pattern ||\n normalized.startsWith(pattern + '/') ||\n normalized.endsWith('/' + pattern) ||\n normalized.includes('/' + pattern + '/')\n ) {\n return true;\n }\n }\n if (normalized.endsWith('.log')) return true;\n return false;\n}\n\nfunction isInsforgeCloudOssHost(ossHost: string): boolean {\n try {\n return new URL(ossHost).hostname.endsWith('.insforge.app');\n } catch {\n return false;\n }\n}\n\nfunction normalizeRelativePath(sourceDir: string, absolutePath: string): string {\n return path.relative(sourceDir, absolutePath).split(path.sep).join('/').replace(/\\\\/g, '/');\n}\n\nasync function hashFile(filePath: string): Promise<{ sha: string; size: number }> {\n const hash = createHash('sha1');\n let size = 0;\n\n for await (const chunk of createReadStream(filePath)) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n hash.update(buffer);\n }\n\n return { sha: hash.digest('hex'), size };\n}\n\nasync function collectDeploymentFiles(sourceDir: string): Promise<LocalDeploymentFile[]> {\n const files: LocalDeploymentFile[] = [];\n\n async function walk(currentDir: string): Promise<void> {\n const entries = await fs.readdir(currentDir, { withFileTypes: true });\n entries.sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const absolutePath = path.join(currentDir, entry.name);\n const normalizedPath = normalizeRelativePath(sourceDir, absolutePath);\n\n if (!normalizedPath || shouldExclude(normalizedPath)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await walk(absolutePath);\n continue;\n }\n\n if (!entry.isFile()) {\n continue;\n }\n\n const { sha, size } = await hashFile(absolutePath);\n files.push({\n absolutePath,\n path: normalizedPath,\n sha,\n size,\n });\n }\n }\n\n await walk(sourceDir);\n return files;\n}\n\nasync function createZipBuffer(sourceDir: string): Promise<Buffer> {\n return new Promise<Buffer>((resolve, reject) => {\n const archive = archiver('zip', { zlib: { level: 9 } });\n const chunks: Buffer[] = [];\n\n archive.on('data', (chunk: Buffer) => chunks.push(chunk));\n archive.on('end', () => resolve(Buffer.concat(chunks)));\n archive.on('error', (err: Error) => reject(err));\n\n archive.directory(sourceDir, false, (entry) => {\n if (shouldExclude(entry.name)) return false;\n return entry;\n });\n\n void archive.finalize();\n });\n}\n\nasync function runWithConcurrency<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n let nextIndex = 0;\n\n async function runWorker(): Promise<void> {\n while (nextIndex < items.length) {\n const index = nextIndex;\n nextIndex += 1;\n await worker(items[index], index);\n }\n }\n\n const workerCount = Math.min(concurrency, items.length);\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n}\n\nasync function createDirectDeploymentSession(\n config: ProjectConfig,\n files: CreateDirectDeploymentRequest['files'],\n): Promise<CreateDirectDeploymentResponse> {\n const url = `${config.oss_host}/api/deployments/direct`;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n },\n body: JSON.stringify({ files }),\n });\n } catch (error) {\n throw new CLIError(formatFetchError(error, url));\n }\n\n if (response.status === 404) {\n throw new DirectDeploymentUnsupportedError();\n }\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n nextActions?: string;\n };\n\n let message = err.message ?? err.error ?? `OSS request failed: ${response.status}`;\n if (err.nextActions) {\n message += `\\n${err.nextActions}`;\n }\n\n throw new CLIError(message);\n }\n\n const payload = (await response.json()) as Partial<CreateDirectDeploymentResponse>;\n if (!payload.id || !Array.isArray(payload.files)) {\n throw new CLIError('Unexpected response from direct deployment create endpoint.');\n }\n\n return payload as CreateDirectDeploymentResponse;\n}\n\nasync function uploadDirectDeploymentFile(\n deploymentId: string,\n manifestFile: DeploymentManifestFile,\n localFile: LocalDeploymentFile,\n): Promise<void> {\n const requestInit = {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'Content-Length': String(localFile.size),\n },\n body: createReadStream(localFile.absolutePath),\n duplex: 'half',\n } as RequestInit & { duplex: 'half' };\n\n await ossFetch(\n `/api/deployments/${encodeURIComponent(deploymentId)}/files/${encodeURIComponent(manifestFile.fileId)}/content`,\n requestInit,\n );\n}\n\nasync function startDirectDeployment(\n deploymentId: string,\n startBody: StartDeploymentRequest,\n): Promise<void> {\n const response = await ossFetch(`/api/deployments/${encodeURIComponent(deploymentId)}/start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(startBody),\n });\n\n await response.json();\n}\n\nasync function pollDeployment(\n deploymentId: string,\n spinner: ReturnType<typeof clack.spinner> | null | undefined,\n syncBeforeRead: boolean,\n): Promise<DeployProjectResult> {\n spinner?.message('Building and deploying...');\n const startTime = Date.now();\n let deployment: DeploymentSchema | null = null;\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n try {\n if (syncBeforeRead) {\n await ossFetch(`/api/deployments/${deploymentId}/sync`, { method: 'POST' });\n }\n\n const statusRes = await ossFetch(`/api/deployments/${deploymentId}`);\n deployment = (await statusRes.json()) as DeploymentSchema;\n const status = deployment.status.toUpperCase();\n\n if (status === 'READY') {\n break;\n }\n if (status === 'ERROR' || status === 'CANCELED') {\n spinner?.stop('Deployment failed');\n throw new CLIError(\n getDeploymentError(deployment.metadata) ?? `Deployment failed with status: ${deployment.status}`,\n );\n }\n\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n spinner?.message(`Building and deploying... (${elapsed}s, status: ${deployment.status})`);\n } catch (err) {\n if (err instanceof CLIError) throw err;\n // Ignore transient fetch errors during polling\n }\n }\n\n const isReady = deployment?.status.toUpperCase() === 'READY';\n const liveUrl = isReady ? (deployment?.url ?? null) : null;\n\n return { deploymentId, deployment, isReady, liveUrl };\n}\n\nasync function deployProjectDirect(\n opts: DeployProjectOptions,\n config: ProjectConfig,\n): Promise<DeployProjectResult> {\n const { sourceDir, startBody = {}, spinner } = opts;\n\n spinner?.start('Scanning source files...');\n const localFiles = await collectDeploymentFiles(sourceDir);\n if (localFiles.length === 0) {\n throw new CLIError('No deployable files found in the source directory.');\n }\n\n spinner?.message('Creating deployment...');\n const createResult = await createDirectDeploymentSession(\n config,\n localFiles.map(({ path: relativePath, sha, size }) => ({ path: relativePath, sha, size })),\n );\n\n const localFileByPath = new Map(localFiles.map((file) => [file.path, file]));\n\n const pendingFiles = createResult.files.filter((file) => !file.uploadedAt);\n\n spinner?.message(`Uploading ${pendingFiles.length} file${pendingFiles.length === 1 ? '' : 's'}...`);\n await runWithConcurrency(pendingFiles, DIRECT_UPLOAD_CONCURRENCY, async (manifestFile) => {\n const localFile = localFileByPath.get(manifestFile.path);\n if (!localFile) {\n throw new CLIError(`Backend returned an unknown file path: ${manifestFile.path}`);\n }\n if (localFile.sha !== manifestFile.sha || localFile.size !== manifestFile.size) {\n throw new CLIError(`Backend file metadata mismatch for: ${manifestFile.path}`);\n }\n\n await uploadDirectDeploymentFile(createResult.id, manifestFile, localFile);\n });\n\n spinner?.message('Starting deployment...');\n await startDirectDeployment(createResult.id, startBody);\n\n return await pollDeployment(createResult.id, spinner, !isInsforgeCloudOssHost(config.oss_host));\n}\n\nasync function deployProjectLegacy(\n opts: DeployProjectOptions,\n): Promise<DeployProjectResult> {\n const { sourceDir, startBody = {}, spinner } = opts;\n\n spinner?.message('Creating deployment...');\n const createRes = await ossFetch('/api/deployments', { method: 'POST' });\n const { id: deploymentId, uploadUrl, uploadFields } =\n (await createRes.json()) as CreateDeploymentResponse;\n\n spinner?.message('Compressing source files...');\n const zipBuffer = await createZipBuffer(sourceDir);\n\n spinner?.message('Uploading...');\n const formData = new FormData();\n for (const [key, value] of Object.entries(uploadFields)) {\n formData.append(key, value);\n }\n formData.append('file', new Blob([zipBuffer], { type: 'application/zip' }), 'deployment.zip');\n\n const uploadRes = await fetch(uploadUrl, { method: 'POST', body: formData });\n if (!uploadRes.ok) {\n const uploadErr = await uploadRes.text();\n throw new CLIError(`Failed to upload: ${uploadErr}`);\n }\n\n spinner?.message('Starting deployment...');\n const startRes = await ossFetch(`/api/deployments/${deploymentId}/start`, {\n method: 'POST',\n body: JSON.stringify(startBody),\n });\n await startRes.json();\n\n return await pollDeployment(deploymentId, spinner, false);\n}\n\nexport interface DeployProjectOptions {\n sourceDir: string;\n startBody?: StartDeploymentRequest;\n spinner?: ReturnType<typeof clack.spinner> | null;\n}\n\nexport interface DeployProjectResult {\n deploymentId: string;\n deployment: DeploymentSchema | null;\n isReady: boolean;\n liveUrl: string | null;\n}\n\n/**\n * Core deploy logic: direct upload -> start -> poll.\n * Falls back to the legacy zip upload flow when the backend does not expose\n * the direct deployment endpoints yet.\n */\nexport async function deployProject(opts: DeployProjectOptions): Promise<DeployProjectResult> {\n const config = getProjectConfig();\n if (!config) {\n throw new ProjectNotLinkedError();\n }\n\n try {\n return await deployProjectDirect(opts, config);\n } catch (error) {\n if (!(error instanceof DirectDeploymentUnsupportedError)) {\n throw error;\n }\n\n opts.spinner?.message('Direct deployment is not available on this backend. Falling back to the legacy zip upload flow...');\n return await deployProjectLegacy(opts);\n }\n}\n\nexport function registerDeploymentsDeployCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('deploy [directory]')\n .description('Deploy a frontend project to Vercel')\n .option('--env <vars>', 'Environment variables as JSON (e.g. {\"KEY\":\"value\"})')\n .option('--meta <meta>', 'Deployment metadata as JSON')\n .action(async (directory: string | undefined, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n // Resolve source directory\n const sourceDir = path.resolve(directory ?? '.');\n const stats = await fs.stat(sourceDir).catch(() => null);\n if (!stats?.isDirectory()) {\n throw new CLIError(`\"${sourceDir}\" is not a valid directory.`);\n }\n\n // Reject excluded directories as deploy source\n const dirName = path.basename(sourceDir);\n if (EXCLUDE_PATTERNS.includes(dirName)) {\n throw new CLIError(\n `\"${dirName}\" is an excluded directory and cannot be used as a deploy source. Please specify your project root or output directory instead.`,\n );\n }\n\n const spinner = !json ? clack.spinner() : null;\n\n // Parse env/meta from CLI flags\n const startBody: StartDeploymentRequest = {};\n if (opts.env) {\n try {\n const parsed = JSON.parse(opts.env) as unknown;\n if (Array.isArray(parsed)) {\n startBody.envVars = parsed as Array<{ key: string; value: string }>;\n } else if (parsed && typeof parsed === 'object') {\n startBody.envVars = Object.entries(parsed as Record<string, unknown>).map(([key, value]) => ({\n key,\n value: String(value),\n }));\n } else {\n throw new CLIError('Invalid --env JSON. Expected an object or array.');\n }\n } catch {\n throw new CLIError('Invalid --env JSON.');\n }\n }\n if (opts.meta) {\n try {\n startBody.meta = JSON.parse(opts.meta);\n } catch {\n throw new CLIError('Invalid --meta JSON.');\n }\n }\n\n const result = await deployProject({ sourceDir, startBody, spinner });\n\n if (result.isReady) {\n spinner?.stop('Deployment complete');\n if (json) {\n outputJson(result.deployment);\n } else {\n if (result.liveUrl) {\n clack.log.success(`Live at: ${result.liveUrl}`);\n }\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n }\n } else {\n spinner?.stop('Deployment is still building');\n if (json) {\n outputJson({\n id: result.deploymentId,\n status: result.deployment?.status ?? 'building',\n timedOut: true,\n });\n } else {\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n clack.log.warn('Deployment did not finish within 5 minutes.');\n clack.log.info(`Check status with: npx @insforge/cli deployments status ${result.deploymentId}`);\n }\n }\n await reportCliUsage('cli.deployments.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.deploy', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { runRawSql } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbCommands(dbCmd: Command): void {\n dbCmd\n .command('query <sql>')\n .description('Execute a SQL query against the database')\n .option('--unrestricted', 'Use unrestricted mode (allows system table access)')\n .action(async (sql: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const { rows, raw } = await runRawSql(sql, !!opts.unrestricted);\n\n if (json) {\n outputJson(raw);\n } else {\n if (rows.length > 0) {\n const headers = Object.keys(rows[0]);\n outputTable(\n headers,\n rows.map((row) => headers.map((h) => String(row[h] ?? ''))),\n );\n console.log(`${rows.length} row(s) returned.`);\n } else {\n console.log('Query executed successfully.');\n if (rows.length === 0) {\n console.log('No rows returned.');\n }\n }\n }\n await reportCliUsage('cli.db.query', true);\n } catch (err) {\n await reportCliUsage('cli.db.query', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbTablesCommand(dbCmd: Command): void {\n dbCmd\n .command('tables')\n .description('List all database tables')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/tables');\n const tables = await res.json() as string[];\n\n if (json) {\n outputJson(tables);\n } else {\n if (tables.length === 0) {\n console.log('No tables found.');\n return;\n }\n outputTable(\n ['Table Name'],\n tables.map((t) => [t]),\n );\n }\n await reportCliUsage('cli.db.tables', true);\n } catch (err) {\n await reportCliUsage('cli.db.tables', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseFunctionsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbFunctionsCommand(dbCmd: Command): void {\n dbCmd\n .command('functions')\n .description('List all database functions')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/functions');\n const raw = await res.json();\n const functions: DatabaseFunctionsResponse['functions'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseFunctionsResponse).functions ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (functions.length === 0) {\n console.log('No database functions found.');\n return;\n }\n outputTable(\n ['Name', 'Definition', 'Kind'],\n functions.map((f) => [f.functionName, f.functionDef, f.kind]),\n );\n }\n await reportCliUsage('cli.db.functions', true);\n } catch (err) {\n await reportCliUsage('cli.db.functions', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseIndexesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbIndexesCommand(dbCmd: Command): void {\n dbCmd\n .command('indexes')\n .description('List all database indexes')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/indexes');\n const raw = await res.json();\n const indexes: DatabaseIndexesResponse['indexes'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseIndexesResponse).indexes ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (indexes.length === 0) {\n console.log('No database indexes found.');\n return;\n }\n outputTable(\n ['Table', 'Index Name', 'Definition', 'Unique', 'Primary'],\n indexes.map((i) => [\n i.tableName,\n i.indexName,\n i.indexDef,\n i.isUnique ? 'Yes' : 'No',\n i.isPrimary ? 'Yes' : 'No',\n ]),\n );\n }\n await reportCliUsage('cli.db.indexes', true);\n } catch (err) {\n await reportCliUsage('cli.db.indexes', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabasePoliciesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbPoliciesCommand(dbCmd: Command): void {\n dbCmd\n .command('policies')\n .description('List all RLS policies')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/policies');\n const raw = await res.json();\n const policies: DatabasePoliciesResponse['policies'] = Array.isArray(raw)\n ? raw\n : (raw as DatabasePoliciesResponse).policies ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (policies.length === 0) {\n console.log('No RLS policies found.');\n return;\n }\n outputTable(\n ['Table', 'Policy Name', 'Command', 'Roles', 'Qual', 'With Check'],\n policies.map((p) => [\n String(p.tableName ?? '-'),\n String(p.policyName ?? '-'),\n String(p.cmd ?? '-'),\n Array.isArray(p.roles) ? p.roles.join(', ') : String(p.roles ?? '-'),\n String(p.qual ?? '-'),\n String(p.withCheck ?? '-'),\n ]),\n );\n }\n await reportCliUsage('cli.db.policies', true);\n } catch (err) {\n await reportCliUsage('cli.db.policies', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseTriggersResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbTriggersCommand(dbCmd: Command): void {\n dbCmd\n .command('triggers')\n .description('List all database triggers')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/triggers');\n const raw = await res.json();\n const triggers: DatabaseTriggersResponse['triggers'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseTriggersResponse).triggers ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (triggers.length === 0) {\n console.log('No database triggers found.');\n return;\n }\n outputTable(\n ['Name', 'Table', 'Timing', 'Events', 'ActionOrientation', 'ActionCondition', 'ActionStatement'],\n triggers.map((t) => [\n t.triggerName,\n t.tableName,\n t.actionTiming,\n t.eventManipulation,\n t.actionOrientation,\n t.actionCondition ?? '-',\n t.actionStatement,\n ]),\n );\n }\n await reportCliUsage('cli.db.triggers', true);\n } catch (err) {\n await reportCliUsage('cli.db.triggers', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbRpcCommand(dbCmd: Command): void {\n dbCmd\n .command('rpc <functionName>')\n .description('Call a database function via RPC')\n .option('--data <json>', 'JSON body to pass as function parameters')\n .action(async (functionName: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body = opts.data ? JSON.stringify(JSON.parse(opts.data) as unknown) : undefined;\n\n const res = await ossFetch(`/api/database/rpc/${encodeURIComponent(functionName)}`, {\n method: body ? 'POST' : 'GET',\n ...(body ? { body } : {}),\n });\n\n const result = await res.json() as unknown;\n\n if (json) {\n outputJson(result);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n await reportCliUsage('cli.db.rpc', true);\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDbExportCommand(dbCmd: Command): void {\n dbCmd\n .command('export')\n .description('Export database schema and/or data')\n .option('--format <format>', 'Export format: sql or json', 'sql')\n .option('--tables <tables>', 'Comma-separated list of tables to export (default: all)')\n .option('--no-data', 'Exclude table data (schema only)')\n .option('--include-functions', 'Include database functions')\n .option('--include-sequences', 'Include sequences')\n .option('--include-views', 'Include views')\n .option('--row-limit <n>', 'Maximum rows per table')\n .option('-o, --output <file>', 'Output file path (default: stdout)')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {\n format: opts.format,\n includeData: opts.data !== false,\n };\n\n if (opts.tables) {\n body.tables = (opts.tables as string).split(',').map((t: string) => t.trim());\n }\n if (opts.includeFunctions) body.includeFunctions = true;\n if (opts.includeSequences) body.includeSequences = true;\n if (opts.includeViews) body.includeViews = true;\n if (opts.rowLimit) body.rowLimit = parseInt(opts.rowLimit as string, 10);\n\n const res = await ossFetch('/api/database/advance/export', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const raw = await res.text();\n\n // API may return JSON wrapper { format, content, tables } or raw SQL/JSON text\n let content: string;\n let meta: { format?: string; tables?: string[] } | null = null;\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed.content === 'string') {\n content = parsed.content;\n meta = { format: parsed.format as string, tables: parsed.tables as string[] };\n } else {\n content = raw;\n }\n } catch {\n content = raw;\n }\n\n if (json) {\n outputJson(meta ?? { content });\n return;\n }\n\n if (opts.output) {\n writeFileSync(opts.output as string, content);\n const tableCount = meta?.tables?.length;\n const suffix = tableCount ? ` (${tableCount} tables, format: ${meta?.format ?? opts.format})` : '';\n outputSuccess(`Exported to ${opts.output}${suffix}`);\n } else {\n console.log(content);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDbImportCommand(dbCmd: Command): void {\n dbCmd\n .command('import <file>')\n .description('Import database from a local SQL file')\n .option('--truncate', 'Truncate existing tables before import')\n .action(async (file: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const fileContent = readFileSync(file);\n const fileName = basename(file);\n\n const formData = new FormData();\n formData.append('file', new Blob([fileContent]), fileName);\n if (opts.truncate) {\n formData.append('truncate', 'true');\n }\n\n const res = await fetch(`${config.oss_host}/api/database/advance/import`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n body: formData,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Import failed: ${res.status}`);\n }\n\n const data = await res.json() as { filename: string; fileSize: number; tables: string[]; rowsImported: number };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Imported ${data.filename} (${data.tables.length} tables, ${data.rowsImported} rows)`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport {\n canonicalMigrationVersion,\n compareMigrationVersions,\n ensureMigrationsDir,\n findOlderThanHeadLocalMigrations,\n formatMigrationSql,\n getMigrationsDir,\n getNextLocalMigrationVersion,\n getRemoteMigrationVersionStatus,\n listLocalMigrationFilenames,\n parseMigrationFilename,\n parseStrictLocalMigrations,\n resolveMigrationTarget,\n} from '../../lib/migrations.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type {\n CreateMigrationRequest,\n CreateMigrationResponse,\n DatabaseMigrationsResponse,\n Migration,\n} from '../../types.js';\n\nfunction getLatestRemoteVersion(migrations: Migration[]): string | null {\n return migrations.reduce(\n (latestVersion, migration) =>\n !latestVersion || compareMigrationVersions(migration.version, latestVersion) > 0\n ? migration.version\n : latestVersion,\n null as string | null,\n );\n}\n\nfunction buildMigrationFilename(version: string, name: string): string {\n return `${version}_${name}.sql`;\n}\n\nfunction buildOlderThanHeadError(\n migrationLabel: string,\n latestRemoteVersion: string,\n): CLIError {\n return new CLIError(\n `Migration ${migrationLabel} is older than the current remote head (${latestRemoteVersion}) and is not applied remotely. Rename it with a newer timestamp, or delete it locally if it is stale.`,\n );\n}\n\nfunction formatCreatedAt(createdAt: string): string {\n const date = new Date(createdAt);\n return Number.isNaN(date.getTime()) ? createdAt : date.toLocaleString();\n}\n\nasync function fetchRemoteMigrations(): Promise<Migration[]> {\n const res = await ossFetch('/api/database/migrations');\n const raw = (await res.json()) as DatabaseMigrationsResponse;\n const migrations = Array.isArray(raw.migrations) ? raw.migrations : [];\n\n for (const migration of migrations) {\n migration.version = canonicalMigrationVersion(migration.version);\n }\n\n return migrations;\n}\n\nfunction assertValidMigrationName(name: string): void {\n if (!/^[a-z0-9-]+$/u.test(name)) {\n throw new CLIError('Migration name must use lowercase letters, numbers, and hyphens only.');\n }\n}\n\nasync function applyMigration(\n targetMigration: Pick<Migration, 'version' | 'name'>,\n sql: string,\n): Promise<CreateMigrationResponse> {\n const body: CreateMigrationRequest = {\n version: targetMigration.version,\n name: targetMigration.name,\n sql,\n };\n\n const res = await ossFetch('/api/database/migrations', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const createdMigration = (await res.json()) as CreateMigrationResponse;\n\n if (createdMigration.version !== targetMigration.version) {\n throw new CLIError(\n `Applied migration version mismatch. Expected ${targetMigration.version}, received ${createdMigration.version}.`,\n );\n }\n\n return createdMigration;\n}\n\nexport function registerDbMigrationsCommand(dbCmd: Command): void {\n const migrationsCmd = dbCmd.command('migrations').description('Manage database migration files');\n\n migrationsCmd\n .command('list')\n .description('List applied remote database migrations')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n\n if (json) {\n outputJson({ migrations });\n } else if (migrations.length === 0) {\n console.log('No database migrations found.');\n } else {\n outputTable(\n ['Version', 'Name', 'Created At'],\n migrations.map((migration) => [\n migration.version,\n migration.name,\n formatCreatedAt(migration.createdAt),\n ]),\n );\n }\n\n await reportCliUsage('cli.db.migrations.list', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.list', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('fetch')\n .description('Fetch applied remote migrations into migrations/')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n const migrationsDir = ensureMigrationsDir();\n // Skip by canonical version, not just filepath: a local `0001_foo.sql`\n // and a remote `1_foo.sql` refer to the same migration, and writing\n // both would fail parseStrictLocalMigrations' duplicate-version check.\n const existingLocalVersions = new Set(\n listLocalMigrationFilenames()\n .map((filename) => parseMigrationFilename(filename))\n .filter((migration): migration is NonNullable<typeof migration> => migration !== null)\n .map((migration) => migration.version),\n );\n const createdFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n for (const migration of [...migrations].sort(\n (left, right) => compareMigrationVersions(left.version, right.version),\n )) {\n assertValidMigrationName(migration.name);\n\n const filename = buildMigrationFilename(\n migration.version,\n migration.name,\n );\n const filePath = join(migrationsDir, filename);\n\n if (existingLocalVersions.has(migration.version) || existsSync(filePath)) {\n skippedFiles.push(filename);\n continue;\n }\n\n writeFileSync(filePath, formatMigrationSql(migration.statements));\n createdFiles.push(filename);\n existingLocalVersions.add(migration.version);\n }\n\n if (json) {\n outputJson({\n directory: migrationsDir,\n totalRemoteMigrations: migrations.length,\n createdFiles,\n skippedFiles,\n });\n } else {\n outputSuccess(\n `Fetched ${migrations.length} remote migration(s) into ${migrationsDir}.`,\n );\n console.log(`Created: ${createdFiles.length}`);\n console.log(`Skipped: ${skippedFiles.length}`);\n }\n\n await reportCliUsage('cli.db.migrations.fetch', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.fetch', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('new <migration-name>')\n .description('Create a new local migration file')\n .action(async (migrationName: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n assertValidMigrationName(migrationName);\n\n const migrations = await fetchRemoteMigrations();\n const latestRemoteVersion = getLatestRemoteVersion(migrations);\n const localMigrations = parseStrictLocalMigrations(listLocalMigrationFilenames());\n const nextVersion = getNextLocalMigrationVersion(\n localMigrations,\n latestRemoteVersion,\n );\n\n const filename = buildMigrationFilename(nextVersion, migrationName);\n const migrationsDir = ensureMigrationsDir();\n const filePath = join(migrationsDir, filename);\n\n try {\n writeFileSync(filePath, '', { flag: 'wx' });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new CLIError(`Migration file already exists: ${filename}`);\n }\n throw error;\n }\n\n if (json) {\n outputJson({ filename, path: filePath, version: nextVersion });\n } else {\n outputSuccess(`Created migration file ${filename}`);\n }\n\n await reportCliUsage('cli.db.migrations.new', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.new', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('up [target]')\n .description('Apply one or more local migration files')\n .option('--all', 'Apply all pending local migration files')\n .option('--to <version-or-filename>', 'Apply pending local migrations up to a version or file')\n .action(async (target: string | undefined, options, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n const latestRemoteVersion = getLatestRemoteVersion(migrations);\n const appliedRemoteVersions = new Set(\n migrations.map((migration) => migration.version),\n );\n const filenames = listLocalMigrationFilenames();\n\n const requestedModes = [Boolean(target), Boolean(options.all), Boolean(options.to)].filter(Boolean);\n if (requestedModes.length !== 1) {\n throw new CLIError(\n 'Use exactly one apply mode: `up <target>`, `up --to <version-or-filename>`, or `up --all`.',\n );\n }\n\n const applySingleTarget = async (targetMigrationFilenameOrVersion: string) => {\n const targetMigration = resolveMigrationTarget(targetMigrationFilenameOrVersion, filenames);\n const validLocalMigrations = filenames\n .map((filename) => parseMigrationFilename(filename))\n .filter((migration): migration is NonNullable<typeof migration> => migration !== null)\n .sort((left, right) => compareMigrationVersions(left.version, right.version));\n\n const targetRemoteStatus = getRemoteMigrationVersionStatus(\n targetMigration.version,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n\n if (targetRemoteStatus === 'already-applied') {\n throw new CLIError(`Migration ${targetMigration.filename} is already applied remotely.`);\n }\n\n if (targetRemoteStatus === 'older-than-head' && latestRemoteVersion) {\n throw buildOlderThanHeadError(targetMigration.filename, latestRemoteVersion);\n }\n\n const earlierPendingMigration = validLocalMigrations.find(\n (migration) =>\n migration.version !== targetMigration.version &&\n (!latestRemoteVersion ||\n compareMigrationVersions(migration.version, latestRemoteVersion) > 0) &&\n compareMigrationVersions(migration.version, targetMigration.version) < 0,\n );\n\n if (earlierPendingMigration) {\n throw new CLIError(\n `Migration ${targetMigration.filename} is not the next pending local migration. Apply ${earlierPendingMigration.filename} first, or fix/delete it locally if it is invalid or no longer needed.`,\n );\n }\n\n const filePath = join(getMigrationsDir(), targetMigration.filename);\n if (!existsSync(filePath)) {\n throw new CLIError(`Local migration file not found: ${targetMigration.filename}`);\n }\n\n const sql = readFileSync(filePath, 'utf-8');\n if (!sql.trim()) {\n throw new CLIError(`Migration file is empty: ${targetMigration.filename}`);\n }\n\n return applyMigration(targetMigration, sql);\n };\n\n let appliedMigrations: CreateMigrationResponse[] = [];\n\n if (target) {\n appliedMigrations = [await applySingleTarget(target)];\n } else {\n const localMigrations = parseStrictLocalMigrations(filenames);\n const olderThanHeadMigrations = findOlderThanHeadLocalMigrations(\n localMigrations,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n const pendingMigrations = localMigrations.filter(\n (migration) =>\n getRemoteMigrationVersionStatus(\n migration.version,\n appliedRemoteVersions,\n latestRemoteVersion,\n ) === 'pending',\n );\n\n if (olderThanHeadMigrations.length > 0 && latestRemoteVersion) {\n throw buildOlderThanHeadError(\n olderThanHeadMigrations[0].filename,\n latestRemoteVersion,\n );\n }\n\n if (pendingMigrations.length === 0) {\n if (json) {\n outputJson({ appliedMigrations: [] });\n } else {\n outputSuccess('No pending local migrations to apply.');\n }\n\n await reportCliUsage('cli.db.migrations.up', true);\n return;\n }\n\n let migrationsToApply = pendingMigrations;\n\n if (options.to) {\n const targetVersion = /^\\d{14}$/u.test(options.to)\n ? options.to\n : resolveMigrationTarget(options.to, filenames).version;\n\n const targetRemoteStatus = getRemoteMigrationVersionStatus(\n targetVersion,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n\n if (targetRemoteStatus === 'already-applied') {\n throw new CLIError(`Migration ${options.to} is already applied remotely.`);\n }\n\n if (targetRemoteStatus === 'older-than-head' && latestRemoteVersion) {\n throw buildOlderThanHeadError(options.to, latestRemoteVersion);\n }\n\n migrationsToApply = pendingMigrations.filter(\n (migration) => compareMigrationVersions(migration.version, targetVersion) <= 0,\n );\n\n if (\n migrationsToApply.length === 0 ||\n migrationsToApply[migrationsToApply.length - 1]?.version !== targetVersion\n ) {\n throw new CLIError(\n `Pending local migration not found for target ${options.to}.`,\n );\n }\n }\n\n for (const migration of migrationsToApply) {\n const filePath = join(getMigrationsDir(), migration.filename);\n if (!existsSync(filePath)) {\n throw new CLIError(`Local migration file not found: ${migration.filename}`);\n }\n\n const sql = readFileSync(filePath, 'utf-8');\n if (!sql.trim()) {\n throw new CLIError(`Migration file is empty: ${migration.filename}`);\n }\n\n appliedMigrations.push(await applyMigration(migration, sql));\n }\n }\n\n if (json) {\n outputJson({ appliedMigrations });\n } else {\n outputSuccess(`Applied ${appliedMigrations.length} migration file(s).`);\n for (const migration of appliedMigrations) {\n console.log(`- ${buildMigrationFilename(migration.version, migration.name)}`);\n }\n }\n\n await reportCliUsage('cli.db.migrations.up', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.up', false);\n handleError(err, json);\n }\n });\n}\n","import { existsSync, mkdirSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { CLIError } from './errors.js';\n\nexport interface ParsedMigrationFile {\n filename: string;\n version: string;\n name: string;\n}\n\nexport type RemoteMigrationVersionStatus = 'already-applied' | 'older-than-head' | 'pending';\n\n// Cap at 64 digits so unbounded input can't DoS BigInt conversions or\n// the backend's `version::numeric` casts. 64 comfortably fits 4-digit\n// Drizzle sequences, 14-digit YYYYMMDDHHmmss timestamps, and anything\n// realistic in between.\nconst MIGRATION_VERSION_REGEX = /^\\d{1,64}$/u;\nconst MIGRATION_FILENAME_REGEX = /^(\\d{1,64})_([a-z0-9-]+)\\.sql$/u;\n\nexport function assertValidMigrationVersion(version: string): void {\n if (!MIGRATION_VERSION_REGEX.test(version)) {\n throw new CLIError(`Invalid migration version: ${version}. Expected a numeric string of at most 64 digits (e.g. 0001 or 20260418091500).`);\n }\n}\n\n// Numeric prefixes like \"0001\" and \"1\" refer to the same migration. Strip\n// leading zeros so Set lookups, equality checks, and duplicate detection all\n// agree with the numeric ordering in compareMigrationVersions.\nexport function canonicalMigrationVersion(version: string): string {\n assertValidMigrationVersion(version);\n return BigInt(version).toString();\n}\n\nexport function parseMigrationFilename(filename: string): ParsedMigrationFile | null {\n const match = MIGRATION_FILENAME_REGEX.exec(filename);\n if (!match) {\n return null;\n }\n\n return {\n filename,\n version: canonicalMigrationVersion(match[1]),\n name: match[2],\n };\n}\n\nexport function compareMigrationVersions(left: string, right: string): number {\n if (MIGRATION_VERSION_REGEX.test(left) && MIGRATION_VERSION_REGEX.test(right)) {\n const a = BigInt(left);\n const b = BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n }\n return left.localeCompare(right);\n}\n\nexport function getRemoteMigrationVersionStatus(\n version: string,\n appliedVersions: ReadonlySet<string>,\n latestRemoteVersion: string | null,\n): RemoteMigrationVersionStatus {\n if (appliedVersions.has(version)) {\n return 'already-applied';\n }\n\n if (\n latestRemoteVersion &&\n compareMigrationVersions(version, latestRemoteVersion) < 0\n ) {\n return 'older-than-head';\n }\n\n return 'pending';\n}\n\nfunction formatMigrationVersion(date: Date): string {\n const year = String(date.getUTCFullYear());\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const day = String(date.getUTCDate()).padStart(2, '0');\n const hour = String(date.getUTCHours()).padStart(2, '0');\n const minute = String(date.getUTCMinutes()).padStart(2, '0');\n const second = String(date.getUTCSeconds()).padStart(2, '0');\n\n return `${year}${month}${day}${hour}${minute}${second}`;\n}\n\nexport function incrementMigrationVersion(version: string): string {\n assertValidMigrationVersion(version);\n if (!/^\\d{14}$/u.test(version)) {\n return String(BigInt(version) + 1n);\n }\n const year = Number(version.slice(0, 4));\n const month = Number(version.slice(4, 6)) - 1;\n const day = Number(version.slice(6, 8));\n const hour = Number(version.slice(8, 10));\n const minute = Number(version.slice(10, 12));\n const second = Number(version.slice(12, 14));\n const nextTimestamp = Date.UTC(year, month, day, hour, minute, second + 1);\n\n return formatMigrationVersion(new Date(nextTimestamp));\n}\n\nexport function getMigrationsDir(cwd: string = process.cwd()): string {\n return join(cwd, 'migrations');\n}\n\nexport function ensureMigrationsDir(cwd: string = process.cwd()): string {\n const migrationsDir = getMigrationsDir(cwd);\n if (!existsSync(migrationsDir)) {\n mkdirSync(migrationsDir, { recursive: true });\n }\n return migrationsDir;\n}\n\nexport function listLocalMigrationFilenames(cwd: string = process.cwd()): string[] {\n const migrationsDir = getMigrationsDir(cwd);\n if (!existsSync(migrationsDir)) {\n return [];\n }\n\n return readdirSync(migrationsDir).sort((left, right) => left.localeCompare(right));\n}\n\nexport function parseStrictLocalMigrations(filenames: string[]): ParsedMigrationFile[] {\n const migrations = filenames.map((filename) => {\n const parsedMigration = parseMigrationFilename(filename);\n if (!parsedMigration) {\n throw new CLIError(\n `Invalid migration filename: ${filename}. Expected <migration_version>_<migration-name>.sql.`,\n );\n }\n return parsedMigration;\n });\n\n assertNoDuplicateMigrationVersions(migrations);\n return migrations.sort((left, right) => compareMigrationVersions(left.version, right.version));\n}\n\nexport function assertNoDuplicateMigrationVersions(migrations: ParsedMigrationFile[]): void {\n const seen = new Set<string>();\n\n for (const migration of migrations) {\n if (seen.has(migration.version)) {\n throw new CLIError(`Duplicate local migration version found: ${migration.version}`);\n }\n seen.add(migration.version);\n }\n}\n\nexport function getNextLocalMigrationVersion(\n migrations: ParsedMigrationFile[],\n latestRemoteVersion: string | null,\n now: Date = new Date(),\n): string {\n const orderedMigrations = [...migrations].sort((left, right) =>\n compareMigrationVersions(left.version, right.version),\n );\n assertNoDuplicateMigrationVersions(orderedMigrations);\n\n const latestKnownVersion = orderedMigrations.reduce<string | null>(\n (latestVersion, migration) => {\n if (!latestVersion || compareMigrationVersions(migration.version, latestVersion) > 0) {\n return migration.version;\n }\n return latestVersion;\n },\n latestRemoteVersion,\n );\n\n const currentVersion = formatMigrationVersion(now);\n if (!latestKnownVersion || compareMigrationVersions(currentVersion, latestKnownVersion) > 0) {\n return currentVersion;\n }\n\n return incrementMigrationVersion(latestKnownVersion);\n}\n\nexport function formatMigrationSql(statements: string[]): string {\n const normalizedStatements = statements\n .map((statement) => statement.trim().replace(/;\\s*$/u, ''))\n .filter(Boolean);\n\n return normalizedStatements\n .join(';\\n\\n')\n .concat(normalizedStatements.length > 0 ? ';\\n' : '');\n}\n\nexport function findOlderThanHeadLocalMigrations(\n migrations: ParsedMigrationFile[],\n appliedVersions: ReadonlySet<string>,\n latestRemoteVersion: string | null,\n): ParsedMigrationFile[] {\n return migrations.filter(\n (migration) =>\n getRemoteMigrationVersionStatus(\n migration.version,\n appliedVersions,\n latestRemoteVersion,\n ) === 'older-than-head',\n );\n}\n\nexport function findLocalMigrationByVersion(\n version: string,\n filenames: string[],\n): ParsedMigrationFile {\n const canonicalVersion = canonicalMigrationVersion(version);\n const matches = filenames\n .map((filename) => parseMigrationFilename(filename))\n .filter(\n (migration): migration is ParsedMigrationFile =>\n migration !== null && migration.version === canonicalVersion,\n );\n\n if (matches.length === 0) {\n throw new CLIError(`Local migration for version ${version} not found.`);\n }\n\n if (matches.length > 1) {\n throw new CLIError(\n `Multiple local migration files found for version ${version}.`,\n );\n }\n\n return matches[0];\n}\n\nexport function resolveMigrationTarget(\n target: string,\n filenames: string[],\n): ParsedMigrationFile {\n if (/^\\d{1,64}$/u.test(target)) {\n return findLocalMigrationByVersion(target, filenames);\n }\n\n const parsedTarget = parseMigrationFilename(target);\n if (!parsedTarget) {\n throw new CLIError(\n 'Migration file names must match <migration_version>_<migration-name>.sql.',\n );\n }\n\n if (!filenames.includes(target)) {\n throw new CLIError(`Local migration file not found: ${target}`);\n }\n\n return parsedTarget;\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type { ConnectionStringResponse } from '../../types.js';\n\nexport function registerDbConnectionStringCommand(dbCmd: Command): void {\n dbCmd\n .command('connection-string')\n .description('Print the project Postgres connection URL (cloud projects only)')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const res = await ossFetch('/api/metadata/database-connection-string');\n const body = (await res.json()) as ConnectionStringResponse;\n if (json) {\n outputJson(body);\n } else {\n console.log(body.connectionURL);\n }\n await reportCliUsage('cli.db.connection-string', true);\n } catch (err) {\n await reportCliUsage('cli.db.connection-string', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerRecordsCommands(recordsCmd: Command): void {\n recordsCmd\n .command('list <table>')\n .description('List records from a table')\n .option('--select <columns>', 'Columns to select (comma-separated)')\n .option('--filter <filter>', 'Filter expression (e.g. \"name=eq.John\")')\n .option('--order <order>', 'Order by (e.g. \"created_at.desc\")')\n .option('--limit <n>', 'Limit number of records', parseInt)\n .option('--offset <n>', 'Offset for pagination', parseInt)\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const params = new URLSearchParams();\n if (opts.select) params.set('select', opts.select);\n if (opts.filter) params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n if (opts.order) params.set('order', opts.order);\n if (opts.limit) params.set('limit', String(opts.limit));\n if (opts.offset) params.set('offset', String(opts.offset));\n\n const query = params.toString();\n const path = `/api/database/records/${encodeURIComponent(table)}${query ? `?${query}` : ''}`;\n const res = await ossFetch(path);\n const data = await res.json() as { data?: Record<string, unknown>[] };\n const records = data.data ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (records.length === 0) {\n console.log('No records found.');\n return;\n }\n const headers = Object.keys(records[0]);\n outputTable(\n headers,\n records.map((r) => headers.map((h) => {\n const val = r[h];\n if (val === null || val === undefined) return '';\n if (typeof val === 'object') return JSON.stringify(val);\n return String(val);\n })),\n );\n console.log(`${records.length} record(s).`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsCreateCommand(recordsCmd: Command): void {\n recordsCmd\n .command('create <table>')\n .description('Create record(s) in a table')\n .option('--data <json>', 'JSON data to insert (object or array of objects)')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.data) {\n throw new CLIError('--data is required. Example: --data \\'{\"name\":\"John\"}\\'');\n }\n\n let records: unknown[];\n try {\n const parsed = JSON.parse(opts.data) as unknown;\n records = Array.isArray(parsed) ? parsed : [parsed];\n } catch {\n throw new CLIError('Invalid JSON in --data. Provide a JSON object or array.');\n }\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?return=representation`,\n {\n method: 'POST',\n body: JSON.stringify(records),\n },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const created = data.data ?? [];\n outputSuccess(`Created ${created.length || records.length} record(s) in \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsUpdateCommand(recordsCmd: Command): void {\n recordsCmd\n .command('update <table>')\n .description('Update records in a table matching a filter')\n .option('--filter <filter>', 'Filter expression (e.g. \"id=eq.123\")')\n .option('--data <json>', 'JSON data to update')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.filter) {\n throw new CLIError('--filter is required to prevent accidental updates to all rows.');\n }\n if (!opts.data) {\n throw new CLIError('--data is required. Example: --data \\'{\"name\":\"Jane\"}\\'');\n }\n\n let body: unknown;\n try {\n body = JSON.parse(opts.data) as unknown;\n } catch {\n throw new CLIError('Invalid JSON in --data.');\n }\n\n const params = new URLSearchParams();\n params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n params.set('return', 'representation');\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?${params}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const updated = data.data ?? [];\n outputSuccess(`Updated ${updated.length} record(s) in \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsDeleteCommand(recordsCmd: Command): void {\n recordsCmd\n .command('delete <table>')\n .description('Delete records from a table matching a filter')\n .option('--filter <filter>', 'Filter expression (e.g. \"id=eq.123\")')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.filter) {\n throw new CLIError('--filter is required to prevent accidental deletion of all rows.');\n }\n\n const params = new URLSearchParams();\n params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n params.set('return', 'representation');\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?${params}`,\n { method: 'DELETE' },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const deleted = data.data ?? [];\n outputSuccess(`Deleted ${deleted.length} record(s) from \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListFunctionsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerFunctionsCommands(functionsCmd: Command): void {\n functionsCmd\n .command('list')\n .description('List all edge functions')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/functions');\n const raw = await res.json();\n // API may return array directly or { functions: [...] }\n const functions: ListFunctionsResponse['functions'] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'functions' in raw\n ? (raw as ListFunctionsResponse).functions ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (functions.length === 0) {\n console.log('No functions found.');\n return;\n }\n outputTable(\n ['Slug', 'Name', 'Status', 'Created At'],\n functions.map((f) => [\n f.slug,\n f.name ?? '-',\n f.status ?? '-',\n f.createdAt ? new Date(f.createdAt).toLocaleString() : '-',\n ]),\n );\n }\n await reportCliUsage('cli.functions.list', true);\n } catch (err) {\n await reportCliUsage('cli.functions.list', false);\n handleError(err, json);\n }\n });\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type { FunctionResponse } from '../../types.js';\n\nexport function registerFunctionsDeployCommand(functionsCmd: Command): void {\n functionsCmd\n .command('deploy <slug>')\n .description('Deploy an edge function (create or update)')\n .option('--file <path>', 'Path to the function source file')\n .option('--name <name>', 'Function display name')\n .option('--description <desc>', 'Function description')\n .action(async (slug: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n // Resolve source file\n const filePath = opts.file ?? join(process.cwd(), 'insforge', 'functions', slug, 'index.ts');\n if (!existsSync(filePath)) {\n throw new CLIError(\n `Source file not found: ${filePath}\\n` +\n `Specify --file <path> or create ${join('insforge', 'functions', slug, 'index.ts')}`,\n );\n }\n\n const code = readFileSync(filePath, 'utf-8');\n const name = opts.name ?? slug;\n const description = opts.description ?? '';\n\n // Check if function exists\n let exists = false;\n try {\n await ossFetch(`/api/functions/${encodeURIComponent(slug)}`);\n exists = true;\n } catch {\n exists = false;\n }\n\n let res: Response;\n if (exists) {\n res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`, {\n method: 'PUT',\n body: JSON.stringify({ name, description, code }),\n });\n } else {\n res = await ossFetch('/api/functions', {\n method: 'POST',\n body: JSON.stringify({ slug, name, description, code }),\n });\n }\n\n const result = await res.json() as FunctionResponse;\n\n const deployFailed = result.deployment?.status === 'failed';\n\n if (json) {\n outputJson(result);\n } else {\n const action = exists ? 'updation' : 'creation';\n const resultStatus = result.success ? 'success' : 'failed';\n outputSuccess(`Function \"${result.function.slug}\" ${action} ${resultStatus}.`);\n if (result.deployment) {\n if (result.deployment.status === 'success') {\n console.log(` Deployment: ${result.deployment.status}${result.deployment.url ? ` → ${result.deployment.url}` : ''}`);\n } else {\n console.log(` Deployment: ${result.deployment.status}`);\n if (result.deployment.buildLogs?.length) {\n console.log(' Build logs:');\n for (const line of result.deployment.buildLogs) {\n console.log(` ${line}`);\n }\n }\n }\n }\n }\n if (deployFailed) throw new CLIError('Function deployment failed');\n await reportCliUsage('cli.functions.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.functions.deploy', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError, CLIError } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\n\nexport function registerFunctionsInvokeCommand(functionsCmd: Command): void {\n functionsCmd\n .command('invoke <slug>')\n .description('Invoke an edge function')\n .option('--data <json>', 'JSON body to send to the function')\n .option('--method <method>', 'HTTP method (GET, POST, PUT, PATCH, DELETE)', 'POST')\n .action(async (slug: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const method = opts.method.toUpperCase();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n };\n\n const fetchOpts: RequestInit = { method, headers };\n\n if (opts.data && ['POST', 'PUT', 'PATCH'].includes(method)) {\n fetchOpts.body = opts.data;\n }\n\n // Functions client endpoint is at /functions/{slug} (not /api/functions/{slug})\n // Use direct fetch so we always show the function's full response,\n // even on non-200 status codes (function errors are part of the output).\n const res = await fetch(\n `${config.oss_host}/functions/${encodeURIComponent(slug)}`,\n fetchOpts,\n );\n\n const contentType = res.headers.get('content-type') ?? '';\n const status = res.status;\n\n if (contentType.includes('application/json')) {\n const data = await res.json();\n if (json) {\n outputJson({ status, body: data });\n } else {\n console.log(JSON.stringify(data, null, 2));\n }\n } else {\n const text = await res.text();\n console.log(text);\n }\n\n // Exit with non-zero code on function errors\n if (status >= 400) {\n throw new CLIError(`HTTP ${status}`, 1, 'HTTP_ERROR');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\n\ninterface FunctionDetails {\n id: string;\n slug: string;\n name: string;\n description: string | null;\n code: string;\n status: string;\n created_at: string;\n updated_at: string;\n deployed_at: string | null;\n}\n\nexport function registerFunctionsCodeCommand(functionsCmd: Command): void {\n functionsCmd\n .command('code <slug>')\n .description('Fetch and display the source code of an edge function')\n .action(async (slug: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`);\n const fn = await res.json() as FunctionDetails;\n\n if (json) {\n outputJson(fn);\n } else {\n console.log(`Function: ${fn.name} (${fn.slug})`);\n console.log(`Status: ${fn.status}`);\n if (fn.description) console.log(`Desc: ${fn.description}`);\n if (fn.deployed_at) console.log(`Deployed: ${fn.deployed_at}`);\n console.log('---');\n console.log(fn.code);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type { FunctionResponse } from '../../types.js';\n\nexport function registerFunctionsDeleteCommand(functionsCmd: Command): void {\n functionsCmd\n .command('delete <slug>')\n .description('Delete an edge function')\n .action(async (slug: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirmed = await prompts.confirm({\n message: `Delete function \"${slug}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirmed) || !confirmed) {\n clack.log.info('Cancelled.');\n return;\n }\n }\n\n const res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`, {\n method: 'DELETE',\n });\n const result = await res.json() as FunctionResponse;\n\n if (json) {\n outputJson(result);\n } else {\n if (result.success) {\n outputSuccess(`Function \"${slug}\" deleted successfully.`);\n } else {\n outputSuccess(`Failed to delete function \"${slug}\".`);\n }\n }\n await reportCliUsage('cli.functions.delete', true);\n } catch (err) {\n await reportCliUsage('cli.functions.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { StorageBucketSchema } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerStorageBucketsCommand(storageCmd: Command): void {\n storageCmd\n .command('buckets')\n .description('List all storage buckets')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/storage/buckets');\n const raw = await res.json();\n // API may return array directly or { buckets: [...] }\n const buckets: StorageBucketSchema[] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'buckets' in raw\n ? (raw as { buckets?: StorageBucketSchema[] }).buckets ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (buckets.length === 0) {\n console.log('No buckets found.');\n return;\n }\n outputTable(\n ['Bucket Name', 'Public'],\n buckets.map((b) => [b.name, b.public ? 'Yes' : 'No']),\n );\n }\n await reportCliUsage('cli.storage.buckets', true);\n } catch (err) {\n await reportCliUsage('cli.storage.buckets', false);\n handleError(err, json);\n }\n });\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageUploadCommand(storageCmd: Command): void {\n storageCmd\n .command('upload <file>')\n .description('Upload a file to a storage bucket')\n .requiredOption('--bucket <name>', 'Target bucket name')\n .option('--key <objectKey>', 'Object key (defaults to filename)')\n .action(async (file: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n if (!existsSync(file)) {\n throw new CLIError(`File not found: ${file}`);\n }\n\n const fileContent = readFileSync(file);\n const objectKey = opts.key ?? basename(file);\n const bucketName = opts.bucket;\n\n // Build multipart form data\n const formData = new FormData();\n const blob = new Blob([fileContent]);\n formData.append('file', blob, objectKey);\n\n // PUT /api/storage/buckets/{bucket}/objects/{key} for named upload\n const url = `${config.oss_host}/api/storage/buckets/${encodeURIComponent(bucketName)}/objects/${encodeURIComponent(objectKey)}`;\n\n const res = await fetch(url, {\n method: 'PUT',\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n body: formData,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Upload failed: ${res.status}`);\n }\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Uploaded \"${basename(file)}\" to bucket \"${bucketName}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageDownloadCommand(storageCmd: Command): void {\n storageCmd\n .command('download <objectKey>')\n .description('Download a file from a storage bucket')\n .requiredOption('--bucket <name>', 'Source bucket name')\n .option('--output <path>', 'Output file path (defaults to current directory)')\n .action(async (objectKey: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const bucketName = opts.bucket;\n const url = `${config.oss_host}/api/storage/buckets/${encodeURIComponent(bucketName)}/objects/${encodeURIComponent(objectKey)}`;\n\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Download failed: ${res.status}`);\n }\n\n const buffer = Buffer.from(await res.arrayBuffer());\n const outputPath = opts.output ?? join(process.cwd(), basename(objectKey));\n writeFileSync(outputPath, buffer);\n\n if (json) {\n outputJson({ success: true, path: outputPath, size: buffer.length });\n } else {\n outputSuccess(`Downloaded \"${objectKey}\" to ${outputPath} (${buffer.length} bytes).`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerStorageCreateBucketCommand(storageCmd: Command): void {\n storageCmd\n .command('create-bucket <name>')\n .description('Create a new storage bucket')\n .option('--public', 'Make the bucket publicly accessible (default)')\n .option('--private', 'Make the bucket private')\n .action(async (name: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const isPublic = !opts.private;\n\n const res = await ossFetch('/api/storage/buckets', {\n method: 'POST',\n body: JSON.stringify({ bucketName: name, isPublic }),\n });\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Bucket \"${name}\" created (${isPublic ? 'public' : 'private'}).`);\n }\n await reportCliUsage('cli.storage.create-bucket', true);\n } catch (err) {\n await reportCliUsage('cli.storage.create-bucket', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageDeleteBucketCommand(storageCmd: Command): void {\n storageCmd\n .command('delete-bucket <name>')\n .description('Delete a storage bucket and all its objects')\n .action(async (name: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete bucket \"${name}\" and all its objects? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/storage/buckets/${encodeURIComponent(name)}`, {\n method: 'DELETE',\n });\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Bucket \"${name}\" deleted.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\ninterface StoredFile {\n key: string;\n size: number;\n mimeType?: string;\n uploadedAt: string;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function registerStorageListObjectsCommand(storageCmd: Command): void {\n storageCmd\n .command('list-objects <bucket>')\n .description('List objects in a storage bucket')\n .option('--limit <n>', 'Maximum number of objects to return', '100')\n .option('--offset <n>', 'Number of objects to skip', '0')\n .option('--prefix <prefix>', 'Filter objects by key prefix')\n .option('--search <term>', 'Search objects by key (partial match)')\n .option('--sort <field>', 'Sort by field: key, size, uploadedAt (default: key)')\n .action(async (bucket: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const params = new URLSearchParams();\n params.set('limit', opts.limit);\n params.set('offset', opts.offset);\n if (opts.prefix) params.set('prefix', opts.prefix);\n if (opts.search) params.set('search', opts.search);\n\n const res = await ossFetch(\n `/api/storage/buckets/${encodeURIComponent(bucket)}/objects?${params.toString()}`,\n );\n const raw = await res.json() as { data?: StoredFile[]; pagination?: { total?: number } };\n\n const objects: StoredFile[] = Array.isArray(raw)\n ? raw as StoredFile[]\n : (raw.data ?? []);\n\n // Client-side sort\n const sortField = opts.sort ?? 'key';\n objects.sort((a, b) => {\n if (sortField === 'size') return a.size - b.size;\n if (sortField === 'uploadedAt') return a.uploadedAt.localeCompare(b.uploadedAt);\n return a.key.localeCompare(b.key);\n });\n\n if (json) {\n outputJson(raw);\n } else {\n if (objects.length === 0) {\n console.log(`No objects found in bucket \"${bucket}\".`);\n return;\n }\n const total = raw.pagination?.total;\n if (total !== undefined) {\n console.log(`Showing ${objects.length} of ${total} objects:\\n`);\n }\n outputTable(\n ['Key', 'Size', 'Type', 'Uploaded At'],\n objects.map((o) => [\n o.key,\n formatSize(o.size),\n o.mimeType ?? '-',\n o.uploadedAt,\n ]),\n );\n }\n await reportCliUsage('cli.storage.list-objects', true);\n } catch (err) {\n await reportCliUsage('cli.storage.list-objects', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getCredentials, getGlobalConfig, getProjectConfig } from '../lib/config.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\n\nexport function registerContextCommand(program: Command): void {\n program\n .command('current')\n .description('Show current CLI context (user, org, project)')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const creds = getCredentials();\n const globalConfig = getGlobalConfig();\n const projectConfig = getProjectConfig();\n\n if (json) {\n outputJson({\n authenticated: !!creds,\n user: creds?.user ?? null,\n default_org_id: globalConfig.default_org_id ?? null,\n project: projectConfig,\n });\n return;\n }\n\n console.log('\\n InsForge CLI Context\\n');\n\n // Auth status\n if (creds) {\n console.log(` User: ${creds.user.name} <${creds.user.email}>`);\n } else {\n console.log(' User: (not logged in)');\n }\n\n // Org (only relevant when logged in)\n if (creds && globalConfig.default_org_id) {\n console.log(` Default Org: ${globalConfig.default_org_id}`);\n } else if (creds) {\n console.log(' Default Org: (none)');\n }\n\n // Project\n if (projectConfig) {\n console.log('');\n console.log(` Project: ${projectConfig.project_name} (${projectConfig.project_id})`);\n console.log(` App Key: ${projectConfig.appkey}`);\n console.log(` Region: ${projectConfig.region}`);\n console.log(` OSS Host: ${projectConfig.oss_host}`);\n } else {\n console.log('\\n Project: (not linked — run `npx @insforge/cli link`)');\n }\n\n console.log('');\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listOrganizations, listProjects } from '../lib/api/platform.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all organizations and their projects')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const orgs = await listOrganizations(apiUrl);\n\n if (orgs.length === 0) {\n if (json) {\n outputJson([]);\n } else {\n console.log('No organizations found.');\n }\n return;\n }\n\n // Fetch projects for all orgs in parallel\n const orgProjects = await Promise.all(\n orgs.map(async (org) => ({\n org,\n projects: await listProjects(org.id, apiUrl),\n })),\n );\n\n if (json) {\n outputJson(\n orgProjects.map(({ org, projects }) => ({\n id: org.id,\n name: org.name,\n type: org.type ?? null,\n projects: projects.map((p) => ({\n id: p.id,\n name: p.name,\n region: p.region,\n status: p.status,\n appkey: p.appkey,\n })),\n })),\n );\n return;\n }\n\n // Human-readable: grouped table\n const rows: string[][] = [];\n for (const { org, projects } of orgProjects) {\n if (projects.length === 0) {\n rows.push([org.name, '-', '-', '-', '-']);\n } else {\n for (let i = 0; i < projects.length; i++) {\n const p = projects[i];\n rows.push([\n i === 0 ? org.name : '',\n p.name,\n p.region,\n p.status,\n p.appkey,\n ]);\n }\n }\n }\n\n outputTable(['Organization', 'Project', 'Region', 'Status', 'AppKey'], rows);\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListDeploymentsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDeploymentsListCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('list')\n .description('List all deployments')\n .option('--limit <n>', 'Limit number of results', '20')\n .option('--offset <n>', 'Offset for pagination', '0')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch(`/api/deployments?limit=${opts.limit}&offset=${opts.offset}`);\n const raw = await res.json();\n // API may return array directly or { data: [...] }\n const deployments: ListDeploymentsResponse['data'] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'data' in raw\n ? (raw as ListDeploymentsResponse).data ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (!deployments.length) {\n console.log('No deployments found.');\n return;\n }\n outputTable(\n ['ID', 'Status', 'Provider', 'URL', 'Created'],\n deployments.map((d) => [\n d.id,\n d.status,\n d.provider,\n d.url ?? '-',\n new Date(d.createdAt).toLocaleString(),\n ]),\n );\n }\n await reportCliUsage('cli.deployments.list', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError, getDeploymentError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DeploymentSchema } from '../../types.js';\n\nexport function registerDeploymentsStatusCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('status <id>')\n .description('Get deployment details and sync status from Vercel')\n .option('--sync', 'Sync status from Vercel before showing')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n // Optionally sync status from Vercel first\n if (opts.sync) {\n await ossFetch(`/api/deployments/${id}/sync`, { method: 'POST' });\n }\n\n const res = await ossFetch(`/api/deployments/${id}`);\n const d = (await res.json()) as DeploymentSchema;\n\n if (json) {\n outputJson(d);\n } else {\n const errorMessage = getDeploymentError(d.metadata);\n outputTable(\n ['Field', 'Value'],\n [\n ['ID', d.id],\n ['Status', d.status],\n ['Provider', d.provider ?? '-'],\n ['Provider ID', d.providerDeploymentId ?? '-'],\n ['URL', d.url ?? '-'],\n ['Created', new Date(d.createdAt).toLocaleString()],\n ['Updated', new Date(d.updatedAt).toLocaleString()],\n ...(errorMessage ? [['Error', errorMessage]] : []),\n ],\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDeploymentsCancelCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('cancel <id>')\n .description('Cancel a deployment')\n .action(async (id: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n if (!yes && !json) {\n const confirmed = await prompts.confirm({\n message: `Cancel deployment ${id}?`,\n });\n if (prompts.isCancel(confirmed) || !confirmed) process.exit(0);\n }\n\n const res = await ossFetch(`/api/deployments/${id}/cancel`, { method: 'POST' });\n const result = await res.json();\n\n if (json) {\n outputJson(result);\n } else {\n outputSuccess(`Deployment ${id} cancelled.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\ninterface EnvVar {\n id: string;\n key: string;\n type: string;\n updatedAt: number;\n}\n\nexport function registerDeploymentsEnvVarsCommand(deploymentsCmd: Command): void {\n const envCmd = deploymentsCmd.command('env').description('Manage deployment environment variables');\n\n // list\n envCmd\n .command('list')\n .description('List all deployment environment variables')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch('/api/deployments/env-vars');\n const data = (await res.json()) as { envVars: EnvVar[] };\n const envVars = data.envVars ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (!envVars.length) {\n console.log('No environment variables found.');\n return;\n }\n outputTable(\n ['ID', 'Key', 'Type', 'Updated At'],\n envVars.map((v) => [\n v.id,\n v.key,\n v.type,\n new Date(v.updatedAt).toLocaleString(),\n ]),\n );\n }\n await reportCliUsage('cli.deployments.env.list', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.list', false);\n handleError(err, json);\n }\n });\n\n // create / update\n envCmd\n .command('set <key> <value>')\n .description('Create or update a deployment environment variable')\n .action(async (key: string, value: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch('/api/deployments/env-vars', {\n method: 'POST',\n body: JSON.stringify({ envVars: [{ key, value }] }),\n });\n const data = (await res.json()) as { success: boolean; message: string; count: number };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message);\n }\n await reportCliUsage('cli.deployments.env.set', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.set', false);\n handleError(err, json);\n }\n });\n\n // delete\n envCmd\n .command('delete <id>')\n .description('Delete a deployment environment variable by ID')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch(`/api/deployments/env-vars/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = (await res.json()) as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message);\n }\n await reportCliUsage('cli.deployments.env.delete', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\nimport { reportCliUsage } from '../lib/skills.js';\n\nconst FEATURES = ['db', 'storage', 'functions', 'auth', 'ai', 'realtime'] as const;\nconst LANGUAGES = ['typescript', 'swift', 'kotlin', 'rest-api'] as const;\n\nexport function registerDocsCommand(program: Command): void {\n program\n .command('docs [feature] [language]')\n .description('Browse InsForge SDK documentation')\n .addHelpText('after', `\nFeatures: ${FEATURES.join(', ')}\nLanguages: ${LANGUAGES.join(', ')}\n\nExamples:\n npx @insforge/cli docs List all available docs\n npx @insforge/cli docs instructions Show setup instructions\n npx @insforge/cli docs db typescript Show TypeScript database SDK docs\n npx @insforge/cli docs auth swift Show Swift auth SDK docs\n npx @insforge/cli docs storage rest-api Show REST API storage docs`)\n .action(async (feature: string | undefined, language: string | undefined, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n await reportCliUsage('cli.docs', true);\n // No args → list all docs\n if (!feature) {\n await listDocs(json);\n return;\n }\n\n // Single arg → legacy doc type (e.g. \"instructions\")\n if (!language) {\n await fetchDoc(`/api/docs/${encodeURIComponent(feature)}`, feature, json);\n return;\n }\n\n // Two args → feature + language\n await fetchDoc(\n `/api/docs/${encodeURIComponent(feature)}/${encodeURIComponent(language)}`,\n `${feature}/${language}`,\n json,\n );\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n\nasync function listDocs(json: boolean): Promise<void> {\n const res = await ossFetch('/api/docs');\n const data = await res.json() as { data?: DocEntry[] } | DocEntry[];\n const docs = Array.isArray(data) ? data : (data.data ?? []);\n\n if (json) {\n outputJson(docs);\n } else {\n if (!docs.length) {\n console.log('No documentation available.');\n return;\n }\n outputTable(\n ['Type', 'Endpoint'],\n docs.map((d) => [String(d.type ?? '-'), String(d.endpoint ?? '-')]),\n );\n }\n}\n\nasync function fetchDoc(path: string, label: string, json: boolean): Promise<void> {\n const res = await ossFetch(path);\n const data = await res.json() as { data?: { type?: string; content?: string }; type?: string; content?: string };\n const doc = data.data ?? data;\n\n if (json) {\n outputJson(doc);\n } else {\n if (doc.content) {\n console.log(doc.content);\n } else {\n console.log(`No content returned for \"${label}\".`);\n }\n }\n}\n\ninterface DocEntry {\n type?: string;\n filename?: string;\n endpoint?: string;\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListSecretsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSecretsListCommand(secretsCmd: Command): void {\n secretsCmd\n .command('list')\n .description('List secrets (metadata only, values are hidden)')\n .option('--all', 'Include inactive (deleted) secrets')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/secrets');\n const data = await res.json() as ListSecretsResponse;\n let secrets = data.secrets ?? [];\n\n if (!opts.all) {\n secrets = secrets.filter((s) => s.isActive !== false);\n }\n\n if (json) {\n outputJson(opts.all ? data : { secrets });\n } else {\n if (!secrets.length) {\n console.log('No secrets found.');\n return;\n }\n const headers = opts.all\n ? ['Key', 'Active', 'Reserved', 'Expires', 'Updated']\n : ['Key', 'Reserved', 'Expires', 'Updated'];\n outputTable(\n headers,\n secrets.map((s) => {\n const row = [\n String(s.key ?? '-'),\n ...(opts.all ? [s.isActive ? 'Yes' : 'No'] : []),\n s.isReserved ? 'Yes' : 'No',\n s.expiresAt ? new Date(String(s.expiresAt)).toLocaleString() : '-',\n s.updatedAt ? new Date(String(s.updatedAt)).toLocaleString() : '-',\n ];\n return row;\n }),\n );\n }\n await reportCliUsage('cli.secrets.list', true);\n } catch (err) {\n await reportCliUsage('cli.secrets.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type { GetSecretValueResponse } from '../../types.js';\n\nexport function registerSecretsGetCommand(secretsCmd: Command): void {\n secretsCmd\n .command('get <key>')\n .description('Get the decrypted value of a secret')\n .action(async (key: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`);\n const data = await res.json();\n const secret = data as GetSecretValueResponse;\n\n if (json) {\n outputJson(data);\n } else {\n console.log(`${secret.key} = ${secret.value}`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { CreateSecretResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSecretsAddCommand(secretsCmd: Command): void {\n secretsCmd\n .command('add <key> <value>')\n .description('Create a new secret')\n .option('--reserved', 'Mark secret as protected from deletion')\n .option('--expires <date>', 'Expiration date (ISO 8601 format)')\n .action(async (key: string, value: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = { key, value };\n if (opts.reserved) body.isReserved = true;\n if (opts.expires) body.expiresAt = opts.expires;\n\n const res = await ossFetch('/api/secrets', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json() as CreateSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} created.`);\n }\n await reportCliUsage('cli.secrets.add', true);\n } catch (err) {\n await reportCliUsage('cli.secrets.add', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { UpdateSecretResponse } from '../../types.js';\n\nexport function registerSecretsUpdateCommand(secretsCmd: Command): void {\n secretsCmd\n .command('update <key>')\n .description('Update an existing secret')\n .option('--value <value>', 'New secret value')\n .option('--active <bool>', 'Set active status (true/false)')\n .option('--reserved <bool>', 'Set reserved status (true/false)')\n .option('--expires <date>', 'Expiration date (ISO 8601, or \"null\" to remove)')\n .action(async (key: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.value !== undefined) body.value = opts.value;\n if (opts.active !== undefined) body.isActive = opts.active === 'true';\n if (opts.reserved !== undefined) body.isReserved = opts.reserved === 'true';\n if (opts.expires !== undefined) body.expiresAt = opts.expires === 'null' ? null : opts.expires;\n\n if (Object.keys(body).length === 0) {\n throw new CLIError('Provide at least one option to update (--value, --active, --reserved, --expires).');\n }\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n const data = await res.json() as UpdateSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} updated.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { DeleteSecretResponse } from '../../types.js';\n\nexport function registerSecretsDeleteCommand(secretsCmd: Command): void {\n secretsCmd\n .command('delete <key>')\n .description('Delete a secret')\n .action(async (key: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete secret \"${key}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as DeleteSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} deleted.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListSchedulesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSchedulesListCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('list')\n .description('List all schedules')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/schedules');\n const data = await res.json();\n const schedules: ListSchedulesResponse = data as ListSchedulesResponse;\n\n if (json) {\n outputJson(schedules);\n } else {\n if (!schedules.length) {\n console.log('No schedules found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Cron', 'URL', 'Method', 'Active', 'Next Run'],\n schedules.map((s) => [\n String(s.id ?? '-'),\n String(s.name ?? '-'),\n String(s.cronSchedule ?? '-'),\n String(s.functionUrl ?? '-'),\n String(s.httpMethod ?? '-'),\n s.isActive === false ? 'No' : 'Yes',\n s.nextRun ? new Date(String(s.nextRun)).toLocaleString() : '-',\n ]),\n );\n }\n await reportCliUsage('cli.schedules.list', true);\n } catch (err) {\n await reportCliUsage('cli.schedules.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type { GetScheduleResponse } from '../../types.js';\n\nexport function registerSchedulesGetCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('get <id>')\n .description('Get schedule details')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`);\n const data = await res.json() as GetScheduleResponse;\n\n if (json) {\n outputJson(data);\n } else {\n console.log(`\\n Name: ${data.name ?? '-'}`);\n console.log(` ID: ${data.id ?? '-'}`);\n console.log(` Cron: ${data.cronSchedule ?? '-'}`);\n console.log(` URL: ${data.functionUrl ?? '-'}`);\n console.log(` Method: ${data.httpMethod ?? '-'}`);\n console.log(` Active: ${data.isActive === false ? 'No' : 'Yes'}`);\n if (data.headers) console.log(` Headers: ${JSON.stringify(data.headers)}`);\n if (data.body) console.log(` Body: ${JSON.stringify(data.body)}`);\n console.log(` Next Run: ${data.nextRun ? new Date(String(data.nextRun)).toLocaleString() : '-'}`);\n console.log(` Created: ${data.createdAt ? new Date(String(data.createdAt)).toLocaleString() : '-'}`);\n console.log('');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { CreateScheduleResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSchedulesCreateCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('create')\n .description('Create a new schedule')\n .requiredOption('--name <name>', 'Schedule name')\n .requiredOption(\n '--cron <expression>',\n 'Cron expression. 5-field cron (e.g. \"*/5 * * * *\", \"0 9 * * 1-5\") or pg_cron interval syntax for sub-minute cadence (e.g. \"30 seconds\", \"5 minutes\").'\n )\n .requiredOption('--url <url>', 'URL to invoke')\n .requiredOption('--method <method>', 'HTTP method (GET, POST, PUT, PATCH, DELETE)')\n .option('--headers <json>', 'HTTP headers as JSON')\n .option('--body <json>', 'Request body as JSON')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {\n name: opts.name,\n cronSchedule: opts.cron,\n functionUrl: opts.url,\n httpMethod: opts.method.toUpperCase(),\n };\n\n if (opts.headers) {\n try {\n body.headers = JSON.parse(opts.headers);\n } catch {\n throw new CLIError('Invalid JSON for --headers');\n }\n }\n if (opts.body) {\n try {\n body.body = JSON.parse(opts.body);\n } catch {\n throw new CLIError('Invalid JSON for --body');\n }\n }\n\n const res = await ossFetch('/api/schedules', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json() as CreateScheduleResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Schedule \"${opts.name}\" created (ID: ${data.id ?? 'unknown'}).`);\n }\n await reportCliUsage('cli.schedules.create', true);\n } catch (err) {\n await reportCliUsage('cli.schedules.create', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerSchedulesUpdateCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('update <id>')\n .description('Update a schedule')\n .option('--name <name>', 'New schedule name')\n .option(\n '--cron <expression>',\n 'New cron expression. 5-field cron or pg_cron interval syntax (e.g. \"30 seconds\").'\n )\n .option('--url <url>', 'New URL to invoke')\n .option('--method <method>', 'New HTTP method')\n .option('--headers <json>', 'New HTTP headers as JSON')\n .option('--body <json>', 'New request body as JSON')\n .option('--active <bool>', 'Enable/disable schedule (true/false)')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.name !== undefined) body.name = opts.name;\n if (opts.cron !== undefined) body.cronSchedule = opts.cron;\n if (opts.url !== undefined) body.functionUrl = opts.url;\n if (opts.method !== undefined) body.httpMethod = opts.method.toUpperCase();\n if (opts.active !== undefined) body.isActive = opts.active === 'true';\n\n if (opts.headers !== undefined) {\n try {\n body.headers = JSON.parse(opts.headers);\n } catch {\n throw new CLIError('Invalid JSON for --headers');\n }\n }\n if (opts.body !== undefined) {\n try {\n body.body = JSON.parse(opts.body);\n } catch {\n throw new CLIError('Invalid JSON for --body');\n }\n }\n\n if (Object.keys(body).length === 0) {\n throw new CLIError('Provide at least one option to update (--name, --cron, --url, --method, --headers, --body, --active).');\n }\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n const data = await res.json() as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? 'Schedule updated.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerSchedulesDeleteCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('delete <id>')\n .description('Delete a schedule')\n .action(async (id: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete schedule \"${id}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? 'Schedule deleted.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListExecutionLogsResponse } from '../../types.js';\n\nexport function registerSchedulesLogsCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('logs <id>')\n .description('Get execution logs for a schedule')\n .option('--limit <n>', 'Max logs to return (default: 50, max: 100)', '50')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const limit = parseInt(opts.limit, 10) || 50;\n const offset = parseInt(opts.offset, 10) || 0;\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}/logs?limit=${limit}&offset=${offset}`);\n const data = await res.json() as ListExecutionLogsResponse;\n const logs = data.logs ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (!logs.length) {\n console.log('No execution logs found.');\n return;\n }\n outputTable(\n ['Executed At', 'Status', 'Success', 'Duration (ms)'],\n logs.map((l) => [\n l.executedAt ? new Date(String(l.executedAt)).toLocaleString() : '-',\n String(l.statusCode ?? '-'),\n l.success ? 'Yes' : 'No',\n String(l.durationMs ?? '-'),\n ]),\n );\n if (data.totalCount > offset + logs.length) {\n console.log(`\\n Showing ${offset + 1}-${offset + logs.length} of ${data.totalCount}. Use --offset to paginate.`);\n }\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeListCommand(computeCmd: Command): void {\n computeCmd\n .command('list')\n .description('List all compute services')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/compute/services');\n const raw = await res.json();\n const services: Record<string, unknown>[] = Array.isArray(raw) ? raw : [];\n\n if (json) {\n outputJson(services);\n } else {\n if (services.length === 0) {\n console.log('No compute services found.');\n await reportCliUsage('cli.compute.list', true);\n return;\n }\n outputTable(\n ['Name', 'Status', 'Image', 'CPU', 'Memory', 'Endpoint'],\n services.map((s) => [\n String(s.name ?? '-'),\n String(s.status ?? '-'),\n String(s.imageUrl ?? '-'),\n String(s.cpu ?? '-'),\n s.memory ? `${s.memory}MB` : '-',\n String(s.endpointUrl ?? '-'),\n ]),\n );\n }\n await reportCliUsage('cli.compute.list', true);\n } catch (err) {\n await reportCliUsage('cli.compute.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputInfo } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeGetCommand(computeCmd: Command): void {\n computeCmd\n .command('get <id>')\n .description('Get details of a compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`);\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputInfo(`Name: ${service.name}`);\n outputInfo(`ID: ${service.id}`);\n outputInfo(`Status: ${service.status}`);\n outputInfo(`Image: ${service.imageUrl}`);\n outputInfo(`CPU: ${service.cpu}`);\n outputInfo(`Memory: ${service.memory}MB`);\n outputInfo(`Region: ${service.region}`);\n outputInfo(`Endpoint: ${service.endpointUrl ?? 'n/a'}`);\n outputInfo(`Created: ${service.createdAt}`);\n }\n await reportCliUsage('cli.compute.get', true);\n } catch (err) {\n await reportCliUsage('cli.compute.get', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nconst ENV_KEY_REGEX = /^[A-Z_][A-Z0-9_]*$/;\n\n// Commander collector for repeatable flags. Each invocation appends to the\n// running list rather than overwriting.\nfunction collect(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n// Parse a \"KEY=VALUE\" string into a tuple, validating the key shape against\n// the same regex the OSS schema enforces. Values may contain '=' and are\n// preserved verbatim — only the first '=' separates key from value.\nfunction parseKeyValue(raw: string): [string, string] {\n const eq = raw.indexOf('=');\n if (eq <= 0) {\n throw new CLIError(\n `Invalid --env-set \"${raw}\": expected KEY=VALUE (key first, then '=', then value)`\n );\n }\n const key = raw.slice(0, eq);\n const value = raw.slice(eq + 1);\n if (!ENV_KEY_REGEX.test(key)) {\n throw new CLIError(`Invalid env var key \"${key}\": must match [A-Z_][A-Z0-9_]*`);\n }\n return [key, value];\n}\n\nfunction assertValidKey(key: string): void {\n if (!ENV_KEY_REGEX.test(key)) {\n throw new CLIError(`Invalid env var key \"${key}\": must match [A-Z_][A-Z0-9_]*`);\n }\n}\n\nexport function registerComputeUpdateCommand(computeCmd: Command): void {\n computeCmd\n .command('update <id>')\n .description('Update a compute service')\n .option('--image <image>', 'Docker image URL')\n .option('--port <port>', 'Container port')\n .option('--cpu <tier>', 'CPU tier')\n .option('--memory <mb>', 'Memory in MB')\n .option('--region <region>', 'Fly.io region')\n .option(\n '--env <json>',\n 'Replace ALL env vars with this JSON object. To rotate one secret without restating the others, use --env-set instead.'\n )\n .option(\n '--env-set <KEY=VALUE>',\n 'Set or update one env var (repeatable). Merges with existing — does not clear other vars.',\n collect,\n []\n )\n .option(\n '--env-unset <KEY>',\n 'Remove one env var (repeatable). Merges with existing — leaves other vars in place.',\n collect,\n []\n )\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.image) body.imageUrl = opts.image;\n if (opts.port) {\n if (!Number.isFinite(Number(opts.port))) {\n throw new CLIError('Invalid value for --port: must be a number');\n }\n body.port = Number(opts.port);\n }\n if (opts.cpu) body.cpu = opts.cpu;\n if (opts.memory) {\n if (!Number.isFinite(Number(opts.memory))) {\n throw new CLIError('Invalid value for --memory: must be a number');\n }\n body.memory = Number(opts.memory);\n }\n if (opts.region) body.region = opts.region;\n\n const envSetArgs = opts.envSet as string[];\n const envUnsetArgs = opts.envUnset as string[];\n const hasPatch = envSetArgs.length > 0 || envUnsetArgs.length > 0;\n\n if (opts.env && hasPatch) {\n throw new CLIError(\n '--env (wholesale replace) and --env-set/--env-unset (partial merge) are mutually exclusive — pick one.'\n );\n }\n\n if (opts.env) {\n try {\n body.envVars = JSON.parse(opts.env);\n } catch {\n throw new CLIError('Invalid JSON for --env');\n }\n }\n\n if (hasPatch) {\n const setMap: Record<string, string> = {};\n for (const arg of envSetArgs) {\n const [k, v] = parseKeyValue(arg);\n setMap[k] = v;\n }\n for (const k of envUnsetArgs) assertValidKey(k);\n body.envVarsPatch = {\n ...(envSetArgs.length > 0 && { set: setMap }),\n ...(envUnsetArgs.length > 0 && { unset: envUnsetArgs }),\n };\n }\n\n if (Object.keys(body).length === 0) {\n throw new CLIError(\n 'No update fields provided. Use --image, --port, --cpu, --memory, --region, --env, --env-set, or --env-unset.'\n );\n }\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" updated [${service.status}]`);\n }\n await reportCliUsage('cli.compute.update', true);\n } catch (err) {\n await reportCliUsage('cli.compute.update', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeDeleteCommand(computeCmd: Command): void {\n computeCmd\n .command('delete <id>')\n .description('Delete a compute service and its Fly.io resources')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess('Service deleted.');\n }\n await reportCliUsage('cli.compute.delete', true);\n } catch (err) {\n await reportCliUsage('cli.compute.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeStartCommand(computeCmd: Command): void {\n computeCmd\n .command('start <id>')\n .description('Start a stopped compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}/start`, {\n method: 'POST',\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" started [${service.status}]`);\n if (service.endpointUrl) {\n console.log(` Endpoint: ${service.endpointUrl}`);\n }\n }\n await reportCliUsage('cli.compute.start', true);\n } catch (err) {\n await reportCliUsage('cli.compute.start', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeStopCommand(computeCmd: Command): void {\n computeCmd\n .command('stop <id>')\n .description('Stop a running compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}/stop`, {\n method: 'POST',\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" stopped.`);\n }\n await reportCliUsage('cli.compute.stop', true);\n } catch (err) {\n await reportCliUsage('cli.compute.stop', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\n// `compute events <id>` returns Fly machine lifecycle events (start/stop/exit/\n// restart) — not container stdout/stderr. The previous name `compute logs`\n// was misleading; container log streaming is roadmap work and will reuse the\n// freshly-vacated `logs` command name when it lands.\nexport function registerComputeEventsCommand(computeCmd: Command): void {\n computeCmd\n .command('events <id>')\n .description('Get compute service machine events (start/stop/exit/restart)')\n .option('--limit <n>', 'Max number of event entries', '50')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const limit = Math.max(1, Math.min(Number(opts.limit) || 50, 1000));\n const res = await ossFetch(\n `/api/compute/services/${encodeURIComponent(id)}/events?limit=${limit}`,\n );\n const events = await res.json() as { timestamp: number; message: string }[];\n\n if (json) {\n outputJson(events);\n } else {\n if (!Array.isArray(events) || events.length === 0) {\n console.log('No events found.');\n await reportCliUsage('cli.compute.events', true);\n return;\n }\n for (const entry of events) {\n const ts = new Date(entry.timestamp).toISOString();\n console.log(`${ts} ${entry.message}`);\n }\n }\n await reportCliUsage('cli.compute.events', true);\n } catch (err) {\n await reportCliUsage('cli.compute.events', false);\n handleError(err, json);\n }\n });\n}\n","import { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { parseEnvFile } from '../../lib/env-file.js';\nimport {\n ensureFlyctlAvailable,\n flyctlBuildAndPush,\n} from '../../lib/flyctl.js';\n\n// `compute deploy` has two modes:\n//\n// 1. Image mode (--image <url>):\n// Deploy a pre-built image from any registry. No flyctl/Docker needed.\n//\n// 2. Source mode ([dir]) — Path A (compute v3.2):\n// CLI runs `flyctl deploy --remote-only --build-only` against the user's\n// source directory using a per-app, attenuated deploy token minted by\n// the cloud. The remote builder runs on Fly's infrastructure and pushes\n// the image straight to registry.fly.io/<app>:<tag>. The cloud then\n// launches the machine pointing at the freshly-pushed image.\n// Requires `flyctl` on PATH (no Docker daemon needed).\n// The deploy token is scoped to one app + builder/wg, with `else: deny`\n// — it cannot deploy or read anything else in the InsForge Fly org.\nexport function registerComputeDeployCommand(computeCmd: Command): void {\n computeCmd\n .command('deploy [dir]')\n .description(\n 'Deploy a compute service. Two modes:\\n' +\n ' compute deploy <dir> --name <name> (source mode — flyctl remote build + push, requires flyctl on PATH; no Docker needed)\\n' +\n ' compute deploy --image <url> --name <name> (image mode — deploys pre-built image, no flyctl/Docker required)'\n )\n .requiredOption('--name <name>', 'Service name (DNS-safe, e.g. my-api)')\n .option('--image <url>', 'Pre-built image URL (image mode)')\n .option('--port <port>', 'Container port', '8080')\n .option(\n '--cpu <tier>',\n 'CPU tier in <kind>-<N>x format (e.g. shared-1x, performance-2x)',\n 'shared-1x'\n )\n .option('--memory <mb>', 'Memory in MB', '512')\n .option('--region <region>', 'Fly.io region', 'iad')\n .option('--env <json>', 'Env vars as JSON object')\n .option(\n '--env-file <path>',\n 'Path to a .env file (KEY=VALUE per line, #-comments + blank lines ok). Mutually exclusive with --env.'\n )\n .action(async (dir: string | undefined, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (dir && opts.image) {\n throw new CLIError('Cannot use both [dir] and --image — pick one mode.');\n }\n if (!dir && !opts.image) {\n throw new CLIError(\n 'Must provide either [dir] (source mode) or --image <url> (image mode).'\n );\n }\n\n // Shared validation\n const port = Number(opts.port);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new CLIError(`Invalid --port: ${opts.port}`);\n }\n const memory = Number(opts.memory);\n if (!Number.isInteger(memory) || memory <= 0) {\n throw new CLIError(`Invalid --memory: ${opts.memory}`);\n }\n if (opts.env && opts.envFile) {\n throw new CLIError(\n '--env and --env-file are mutually exclusive — pick one source for the env vars.'\n );\n }\n let envVars: Record<string, string> | undefined;\n if (opts.env) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.env);\n } catch {\n throw new CLIError('Invalid JSON for --env');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new CLIError('--env must be a JSON object like {\"KEY\":\"value\"}');\n }\n for (const [k, v] of Object.entries(parsed)) {\n if (typeof v !== 'string') {\n throw new CLIError(\n `--env values must be strings — got ${typeof v} for key \"${k}\"`\n );\n }\n }\n envVars = parsed as Record<string, string>;\n } else if (opts.envFile) {\n envVars = parseEnvFile(resolve(opts.envFile));\n }\n\n const baseBody: Record<string, unknown> = {\n name: opts.name,\n port,\n cpu: opts.cpu,\n memory,\n region: opts.region,\n };\n if (envVars) baseBody.envVars = envVars;\n\n // ─── Image mode ─────────────────────────────────────────────────\n if (!dir) {\n const body: Record<string, unknown> = { ...baseBody, imageUrl: opts.image };\n\n // List → find by name → POST or PATCH\n const listRes = await ossFetch('/api/compute/services');\n const existing = ((await listRes.json()) as Array<{ id: string; name: string }>).find(\n (s) => s.name === opts.name\n );\n\n let res;\n if (existing) {\n if (!json) outputInfo(`Found existing service \"${opts.name}\", updating...`);\n const updateBody: Record<string, unknown> = { ...body };\n delete updateBody.name;\n res = await ossFetch(`/api/compute/services/${encodeURIComponent(existing.id)}`, {\n method: 'PATCH',\n body: JSON.stringify(updateBody),\n });\n } else {\n res = await ossFetch('/api/compute/services', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n const service = (await res.json()) as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n const verb = existing ? 'updated' : 'deployed';\n outputSuccess(`Service \"${service.name}\" ${verb} [${service.status}]`);\n if (service.endpointUrl) console.log(` Endpoint: ${service.endpointUrl}`);\n }\n await reportCliUsage('cli.compute.deploy', true);\n return;\n }\n\n // ─── Source mode (Path A) ───────────────────────────────────────\n const absDir = resolve(dir);\n const dockerfilePath = join(absDir, 'Dockerfile');\n if (!existsSync(dockerfilePath)) {\n throw new CLIError(\n `No Dockerfile at ${dockerfilePath}.\\n` +\n ` Either:\\n` +\n ` • Create one (ask your AI agent — see the insforge-cli skill)\\n` +\n ` • Use --image <url> to deploy a pre-built image instead`\n );\n }\n ensureFlyctlAvailable();\n\n if (!json) outputInfo(`Detected Dockerfile at ${dockerfilePath}`);\n\n // 1. Resolve service: list → find by name → /deploy if missing\n const listRes = await ossFetch('/api/compute/services');\n const existing = ((await listRes.json()) as Array<{\n id: string;\n name: string;\n flyAppId?: string | null;\n }>).find((s) => s.name === opts.name);\n\n let serviceId: string;\n let flyAppId: string;\n if (existing) {\n if (!existing.flyAppId) {\n throw new CLIError(\n `Service \"${opts.name}\" exists but has no Fly app yet. Delete it and redeploy.`\n );\n }\n serviceId = existing.id;\n flyAppId = existing.flyAppId;\n if (!json) outputInfo(`Found existing service \"${opts.name}\" (${flyAppId}), updating...`);\n } else {\n if (!json) outputInfo(`Creating service \"${opts.name}\"...`);\n const prepareRes = await ossFetch('/api/compute/services/deploy', {\n method: 'POST',\n body: JSON.stringify(baseBody),\n });\n const prepared = (await prepareRes.json()) as {\n id: string;\n flyAppId: string;\n };\n serviceId = prepared.id;\n flyAppId = prepared.flyAppId;\n if (!json) outputInfo(`Created Fly app ${flyAppId}`);\n }\n\n // 2. Mint per-app deploy token (20-min TTL, scoped to this app only)\n if (!json) outputInfo('Requesting deploy token...');\n const tokenRes = await ossFetch(\n `/api/compute/services/${encodeURIComponent(serviceId)}/deploy-token`,\n { method: 'POST' }\n );\n const tokenJson = (await tokenRes.json()) as { token: string; expirySeconds: number };\n\n // 3. Remote build + push (no local Docker daemon needed).\n // flyctl ships the build context to Fly's remote builder, builds\n // there, and pushes to registry.fly.io/<app>:<tag> using the\n // attenuated FLY_API_TOKEN we just received.\n // If the build fails on a freshly-created service, roll back the\n // cloud row + Fly app so the user can retry without a manual\n // `compute delete`. Don't roll back on update of an existing\n // service — the running machine should survive transient build\n // errors.\n const imageLabel = `cli-${Date.now()}`;\n if (!json) outputInfo(`Building & pushing on Fly remote builder...`);\n let imageRef: string;\n try {\n ({ imageRef } = await flyctlBuildAndPush({\n dir: absDir,\n appId: flyAppId,\n imageLabel,\n token: tokenJson.token,\n region: opts.region,\n port,\n }));\n } catch (buildErr) {\n if (!existing) {\n try {\n await ossFetch(`/api/compute/services/${encodeURIComponent(serviceId)}`, {\n method: 'DELETE',\n });\n if (!json) outputInfo(`Rolled back service \"${opts.name}\" after build failure.`);\n } catch {\n if (!json) {\n outputInfo(\n `Build failed and rollback also failed. ` +\n `Run: npx @insforge/cli compute delete ${serviceId}`\n );\n }\n }\n }\n throw buildErr;\n }\n\n // 4. Tell cloud the image is ready — launches new machine or\n // updates existing one. PATCH includes any deploy-affecting\n // field changes (port/cpu/memory/envVars/region) too.\n if (!json) outputInfo('Launching machine...');\n const updateBody: Record<string, unknown> = {\n imageUrl: imageRef,\n port,\n cpu: opts.cpu,\n memory,\n region: opts.region,\n };\n if (envVars) updateBody.envVars = envVars;\n\n const finalRes = await ossFetch(\n `/api/compute/services/${encodeURIComponent(serviceId)}`,\n { method: 'PATCH', body: JSON.stringify(updateBody) }\n );\n const service = (await finalRes.json()) as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n const verb = existing ? 'updated' : 'deployed';\n outputSuccess(`Service \"${service.name}\" ${verb} [${service.status}]`);\n if (service.endpointUrl) console.log(` Endpoint: ${service.endpointUrl}`);\n console.log(` Image: ${imageRef} (built remotely; no local image to clean up)`);\n }\n\n await reportCliUsage('cli.compute.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.compute.deploy', false);\n handleError(err, json);\n }\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { CLIError } from './errors.js';\n\nconst ENV_KEY_REGEX = /^[A-Z_][A-Z0-9_]*$/;\n\n// Minimal dotenv parser. Handles:\n// • KEY=VALUE lines\n// • Blank lines and # comment lines\n// • Optional surrounding quotes (\"...\" or '...') stripped from VALUE\n// • Inline trailing comments after unquoted values: KEY=val # note\n//\n// Keeps escape-sequence handling deliberately out of scope — anything fancy\n// (multiline strings, $VAR expansion) belongs in a real dotenv library; for\n// `compute deploy --env-file` the goal is feature-parity with `--env <json>`\n// for the 95% case, not full dotenv semantics.\nexport function parseEnvFile(path: string): Record<string, string> {\n let raw: string;\n try {\n raw = readFileSync(path, 'utf-8');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new CLIError(`Could not read --env-file at ${path}: ${msg}`);\n }\n\n const result: Record<string, string> = {};\n const lines = raw.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === '' || line.startsWith('#')) continue;\n\n const eq = line.indexOf('=');\n if (eq <= 0) {\n throw new CLIError(\n `${path}:${i + 1}: expected KEY=VALUE, got \"${line}\"`\n );\n }\n const key = line.slice(0, eq).trim();\n if (!ENV_KEY_REGEX.test(key)) {\n throw new CLIError(\n `${path}:${i + 1}: invalid env var key \"${key}\" (must match [A-Z_][A-Z0-9_]*)`\n );\n }\n\n let value = line.slice(eq + 1).trim();\n\n // Surrounding quotes (matching pair) — strip them and use the inner\n // string verbatim. Anything inside quotes is preserved including '#'.\n if (\n (value.startsWith('\"') && value.endsWith('\"') && value.length >= 2) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\") && value.length >= 2)\n ) {\n value = value.slice(1, -1);\n } else {\n // Unquoted value — strip a trailing inline comment (`KEY=val # note`).\n const hash = value.indexOf(' #');\n if (hash >= 0) value = value.slice(0, hash).trimEnd();\n }\n\n result[key] = value;\n }\n return result;\n}\n","// flyctl helpers for compute v3.2 source-deploy. Path A — refined:\n// the CLI shells out to `flyctl deploy --remote-only --build-only --push`\n// using a per-app deploy token minted by the cloud. Build runs on Fly's\n// remote builder; the resulting image is pushed straight to registry.fly.io.\n// No local Docker daemon required — the user only needs the single flyctl\n// binary on their PATH.\n//\n// Token shape: short-lived (~20 min) macaroon attenuated to one app +\n// builder/wg features, with `else: deny`. It can deploy to that one app and\n// nothing else, even within the InsForge Fly org.\n\nimport { spawn, spawnSync } from 'node:child_process';\nimport { existsSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { CLIError } from './errors.js';\n\nexport function ensureFlyctlAvailable(): void {\n const r = spawnSync('flyctl', ['version'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n if (r.error || r.status !== 0) {\n throw new CLIError(\n 'flyctl is required for source-mode deploy.\\n' +\n ' • Install: curl -L https://fly.io/install.sh | sh\\n' +\n ' • Or use --image <pre-built-image> instead.\\n' +\n (r.stderr ? ` Detail: ${r.stderr.trim().slice(0, 200)}` : '')\n );\n }\n}\n\nexport interface FlyctlBuildPushOptions {\n dir: string;\n appId: string; // Fly app name, e.g. \"my-svc-<projectId>\"\n imageLabel: string; // tag suffix; only used as buildkit's --image-label.\n token: string; // attenuated FlyV1 deploy token from cloud /deploy-token\n region: string; // Fly region — written into the stub fly.toml\n port: number; // container internal port — written into the stub fly.toml\n}\n\n/**\n * Write a minimal stub fly.toml in the user's directory so `flyctl deploy\n * --remote-only` has app config. On a freshly-created Fly app with zero\n * machines, flyctl errors with \"could not create a fly.toml from any\n * machines\" — it tries to derive config from existing machines and there\n * are none yet. The comment claiming \"flyctl will invent a fly.toml\" was\n * wrong: it does so only if the app already has machines to introspect.\n *\n * If the user already has a fly.toml, leave it alone — they're either\n * customising or driving a non-trivial setup (multi-process, volumes, etc.).\n *\n * Returns a cleanup callback the caller MUST run in a finally block to\n * delete the stub if (and only if) we created it.\n */\nfunction ensureFlyTomlStub(opts: { dir: string; appId: string; region: string; port: number }): () => void {\n const path = join(opts.dir, 'fly.toml');\n if (existsSync(path)) {\n return () => {\n /* user owns the file — leave as-is */\n };\n }\n const stub =\n `# Auto-generated by @insforge/cli for compute deploy. Safe to delete.\\n` +\n `app = \"${opts.appId}\"\\n` +\n `primary_region = \"${opts.region}\"\\n` +\n `\\n` +\n `[build]\\n` +\n `\\n` +\n `[http_service]\\n` +\n ` internal_port = ${opts.port}\\n` +\n ` force_https = true\\n` +\n ` auto_stop_machines = false\\n` +\n ` auto_start_machines = true\\n` +\n ` min_machines_running = 0\\n`;\n writeFileSync(path, stub, 'utf8');\n return () => {\n try {\n unlinkSync(path);\n } catch {\n /* best-effort */\n }\n };\n}\n\n/**\n * Run `flyctl deploy --remote-only --build-only --push` against the user's\n * source directory. Builds on Fly's remote builder, pushes to registry.fly.io,\n * and returns the resulting image ref. Does NOT launch a machine — the cloud\n * backend handles that step (it owns DB state and quota enforcement).\n *\n * IMPORTANT: returns the **digest-pinned** ref `<app>@sha256:<digest>`, not\n * the tag-based `<app>:<label>` ref. buildkit's `--build-only --push` lands\n * the manifest in the remote builder's namespace, and Fly's registry then\n * aliases the user-app namespace to it by content digest. The bare tag does\n * not always resolve (and racily fails on Fly's side as MANIFEST_UNKNOWN),\n * but the digest always does. The cloud's launchMachine accepts either form.\n *\n * If the user's directory has no fly.toml, we write a stub before invoking\n * flyctl and remove it after. flyctl needs the stub on a fresh app with no\n * machines — the comment claiming otherwise was wrong.\n */\nexport function flyctlBuildAndPush(\n opts: FlyctlBuildPushOptions\n): Promise<{ imageRef: string }> {\n return new Promise<{ imageRef: string }>((resolve, reject) => {\n const cleanupStub = ensureFlyTomlStub({\n dir: opts.dir,\n appId: opts.appId,\n region: opts.region,\n port: opts.port,\n });\n const child = spawn(\n 'flyctl',\n [\n 'deploy',\n '--remote-only',\n '--build-only',\n '--push',\n '--app',\n opts.appId,\n '--image-label',\n opts.imageLabel,\n '--no-cache',\n ],\n {\n cwd: opts.dir,\n env: { ...process.env, FLY_API_TOKEN: opts.token },\n stdio: ['inherit', 'pipe', 'pipe'],\n }\n );\n\n // Tee child's stdout+stderr to our own (so the user sees buildkit\n // progress in real time) AND capture them so we can parse the digest.\n let captured = '';\n child.stdout?.on('data', (b) => {\n const s = b.toString();\n captured += s;\n process.stdout.write(s);\n });\n child.stderr?.on('data', (b) => {\n const s = b.toString();\n captured += s;\n process.stderr.write(s);\n });\n child.on('error', (err) => {\n cleanupStub();\n reject(new CLIError(`flyctl deploy could not start: ${err.message}`));\n });\n child.on('exit', (code) => {\n cleanupStub();\n if (code !== 0) {\n return reject(\n new CLIError(`flyctl deploy --build-only failed (exit ${code}). See output above.`)\n );\n }\n // buildkit emits \"pushing manifest for registry.fly.io/<app>:<label>@sha256:<digest>\"\n // when the upload lands. Pin to that digest so the cloud's machine API\n // can resolve unambiguously regardless of registry tag-aliasing races.\n const m = captured.match(/pushing manifest for registry\\.fly\\.io\\/[^\\s]+@(sha256:[0-9a-f]+)/);\n if (!m) {\n return reject(\n new CLIError(\n 'flyctl deploy succeeded but the buildkit \"pushing manifest\" line was not found. ' +\n 'Cannot determine image digest — please re-run with FLY_LOG_LEVEL=debug and report.'\n )\n );\n }\n resolve({ imageRef: `registry.fly.io/${opts.appId}@${m[1]}` });\n });\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\n\nconst VALID_SOURCES = ['insforge.logs', 'postgREST.logs', 'postgres.logs', 'function.logs', 'function-deploy.logs'] as const;\nconst SOURCE_LOOKUP = new Map(VALID_SOURCES.map((s) => [s.toLowerCase(), s]));\n\n/** Maps source names to their API paths. Most use /api/logs/{source}, but some have custom paths. */\nconst SOURCE_PATH: Record<string, string> = {\n 'function-deploy.logs': '/api/logs/functions/build-logs',\n};\n\nfunction getLogPath(source: string, limit: number): string {\n const custom = SOURCE_PATH[source];\n if (custom) return `${custom}?limit=${limit}`;\n return `/api/logs/${encodeURIComponent(source)}?limit=${limit}`;\n}\n\nexport function registerLogsCommand(program: Command): void {\n program\n .command('logs <source>')\n .description('Fetch backend container logs (insforge.logs | postgREST.logs | postgres.logs | function.logs | function-deploy.logs)')\n .option('--limit <n>', 'Number of log entries to return', '20')\n .action(async (source: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const resolved = SOURCE_LOOKUP.get(source.toLowerCase());\n if (!resolved) {\n throw new CLIError(`Invalid log source \"${source}\". Valid sources: ${VALID_SOURCES.join(', ')}`);\n }\n\n const limit = parseInt(opts.limit, 10) || 20;\n const res = await ossFetch(getLogPath(resolved, limit));\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n const logs = Array.isArray(data) ? data : (data as Record<string, unknown>).logs;\n if (!Array.isArray(logs) || !logs.length) {\n console.log('No logs found.');\n return;\n }\n for (const entry of logs) {\n if (typeof entry === 'string') {\n console.log(entry);\n } else {\n const e = entry as Record<string, unknown>;\n const ts = e.timestamp ?? e.time ?? '';\n const msg = e.message ?? e.msg ?? e.log ?? JSON.stringify(e);\n console.log(`${ts} ${msg}`);\n }\n }\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { AppMetadataSchema } from '@insforge/shared-schemas';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\nimport { reportCliUsage } from '../lib/skills.js';\n\nexport function registerMetadataCommand(program: Command): void {\n program\n .command('metadata')\n .description('Show backend metadata (auth, database, buckets, edge functions, realtime, AI models)')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/metadata');\n const data = await res.json() as AppMetadataSchema;\n\n if (json) {\n outputJson(data);\n return;\n }\n\n // Auth\n console.log('\\n Auth');\n console.log(` OAuth Providers: ${data.auth.oAuthProviders.length ? data.auth.oAuthProviders.join(', ') : '(none)'}`);\n console.log(` Email Verification: ${data.auth.requireEmailVerification ? 'Yes' : 'No'}`);\n console.log(` Password Policy:`);\n console.log(` Min Length: ${data.auth.passwordMinLength}, requireLowercase: ${data.auth.requireLowercase}, requireNumber: ${data.auth.requireNumber}, requireSpecialChar: ${data.auth.requireSpecialChar}, requireUppercase: ${data.auth.requireUppercase}`);\n console.log(` Verify Email Method: ${data.auth.verifyEmailMethod}`);\n console.log(` Reset Password Method: ${data.auth.resetPasswordMethod}`);\n\n // Database\n console.log('\\n Database');\n console.log(` Size: ${formatSize(data.database.totalSizeInGB)}`);\n if (data.database.tables.length) {\n outputTable(\n ['Table', 'Records'],\n data.database.tables.map((t) => [t.tableName, String(t.recordCount)]),\n );\n } else {\n console.log(' No tables.');\n }\n\n // Storage\n console.log('\\n Storage');\n console.log(` Size: ${formatSize(data.storage.totalSizeInGB)}`);\n if (data.storage.buckets.length) {\n outputTable(\n ['Bucket', 'Public', 'Objects'],\n data.storage.buckets.map((b) => [b.name, b.public ? 'Yes' : 'No', String(b.objectCount ?? '-')]),\n );\n } else {\n console.log(' No buckets.');\n }\n\n // Functions\n console.log('\\n Functions');\n if (data.functions.length) {\n outputTable(\n ['Slug', 'Name', 'Status', 'Description'],\n data.functions.map((f) => [f.slug, f.name, f.status, f.description || '-']),\n );\n } else {\n console.log(' No functions deployed.');\n }\n\n // AI\n if (data.aiIntegration?.models?.length) {\n console.log('\\n AI Models');\n outputTable(\n ['Model', 'Input', 'Output'],\n data.aiIntegration.models.map((m) => [\n m.modelId,\n m.inputModality.join(', '),\n m.outputModality.join(', '),\n ]),\n );\n }\n\n // Realtime\n if (data.realtime?.channels && Array.isArray(data.realtime.channels) && data.realtime.channels.length) {\n console.log(`\\n Realtime: ${data.realtime.channels.length} channel(s)`);\n outputTable(\n ['Id', 'Pattern', 'Webhook URLs', 'Enabled', 'Description'],\n data.realtime.channels.map((c) => [c.id, c.pattern, c.webhookUrls?.join(', ') || '-', c.enabled ? 'Yes' : 'No', c.description || '-']),\n );\n }\n\n // Version\n if (data.version) {\n console.log(`\\n Version: ${data.version}`);\n }\n\n console.log('');\n await reportCliUsage('cli.metadata', true);\n } catch (err) {\n await reportCliUsage('cli.metadata', false);\n handleError(err, json);\n }\n });\n}\n\nfunction formatSize(gb: number): string {\n if (gb < 0.001) return `${(gb * 1024 * 1024).toFixed(1)} KB`;\n if (gb < 1) return `${(gb * 1024).toFixed(2)} MB`;\n return `${gb.toFixed(2)} GB`;\n}\n","import type { Command } from 'commander';\nimport * as os from 'node:os';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../../lib/prompts.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\nimport { streamDiagnosticAnalysis, rateDiagnosticSession } from '../../lib/api/platform.js';\n\nimport { fetchMetricsSummary, registerDiagnoseMetricsCommand } from './metrics.js';\nimport { fetchAdvisorSummary, registerDiagnoseAdvisorCommand } from './advisor.js';\nimport { runDbChecks, registerDiagnoseDbCommand } from './db.js';\nimport { fetchLogsSummary, registerDiagnoseLogsCommand } from './logs.js';\n\nfunction sectionHeader(title: string): string {\n return `── ${title} ${'─'.repeat(Math.max(0, 44 - title.length))}`;\n}\n\ninterface DiagnosticContext {\n metrics: unknown | null;\n advisor: unknown | null;\n db: unknown | null;\n logs: unknown | null;\n errors: string[];\n}\n\nasync function collectDiagnosticData(\n projectId: string,\n ossMode: boolean,\n apiUrl?: string,\n): Promise<DiagnosticContext> {\n const metricsPromise = ossMode\n ? Promise.reject(new Error('Platform login required (linked via --api-key)'))\n : fetchMetricsSummary(projectId, apiUrl);\n const advisorPromise = ossMode\n ? Promise.reject(new Error('Platform login required (linked via --api-key)'))\n : fetchAdvisorSummary(projectId, apiUrl);\n\n const [metricsResult, advisorResult, dbResult, logsResult] = await Promise.allSettled([\n metricsPromise,\n advisorPromise,\n runDbChecks(),\n fetchLogsSummary(100),\n ]);\n\n const errors: string[] = [];\n let metrics: unknown | null = null;\n let advisor: unknown | null = null;\n let db: unknown | null = null;\n let logs: unknown | null = null;\n\n if (metricsResult.status === 'fulfilled') {\n const data = metricsResult.value;\n metrics = data.metrics\n .filter((m) => m.data.length > 0)\n .map((m) => {\n let sum = 0;\n let max = -Infinity;\n for (const d of m.data) {\n sum += d.value;\n if (d.value > max) max = d.value;\n }\n return {\n metric: m.metric,\n latest: m.data[m.data.length - 1].value,\n avg: sum / m.data.length,\n max,\n };\n });\n } else {\n errors.push(metricsResult.reason?.message ?? 'Metrics unavailable');\n }\n\n if (advisorResult.status === 'fulfilled') {\n advisor = advisorResult.value;\n } else {\n errors.push(advisorResult.reason?.message ?? 'Advisor unavailable');\n }\n\n if (dbResult.status === 'fulfilled') {\n db = dbResult.value;\n } else {\n errors.push(dbResult.reason?.message ?? 'DB checks unavailable');\n }\n\n if (logsResult.status === 'fulfilled') {\n logs = logsResult.value;\n } else {\n errors.push(logsResult.reason?.message ?? 'Logs unavailable');\n }\n\n return { metrics, advisor, db, logs, errors };\n}\n\nexport function registerDiagnoseCommands(diagnoseCmd: Command): void {\n // Comprehensive report (no subcommand)\n diagnoseCmd\n .description('Backend diagnostics — run with no subcommand for a full health report')\n .option('--ai <question>', 'Ask AI to analyze your diagnostic data (1-2000 chars)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n const usageEvent = opts.ai ? 'cli.diagnose.ai' : 'cli.diagnose';\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const projectId = config.project_id;\n const projectName = config.project_name;\n const ossMode = config.project_id === FAKE_PROJECT_ID;\n trackDiagnose(opts.ai ? 'ai' : 'report', config);\n\n // AI analysis mode\n if (opts.ai) {\n const question = String(opts.ai).trim();\n if (question.length === 0 || question.length > 2000) {\n throw new CLIError('Question must be between 1 and 2000 characters.');\n }\n\n const s = !json ? clack.spinner() : null;\n s?.start('Collecting diagnostic data...');\n\n const data = await collectDiagnosticData(projectId, ossMode, apiUrl);\n\n const cliVersion = process.env.CLI_VERSION || 'unknown';\n\n s?.stop('Data collected');\n\n if (!json) {\n console.log(`\\n AI Diagnosis — ${projectName}\\n`);\n console.log(sectionHeader('Question'));\n console.log(` ${question}\\n`);\n console.log(sectionHeader('Analysis'));\n }\n\n let sessionId: string | undefined;\n let fullText = '';\n const jsonEvents: Record<string, unknown>[] = [];\n let streamError: CLIError | undefined;\n\n // Build context — transform collected data to match backend schema exactly\n const context: Record<string, unknown> = {\n context_version: 'diagnostic-v1',\n client_info: {\n cli_version: cliVersion,\n node_version: process.version,\n os: `${os.platform()} ${os.release()}`,\n },\n };\n if (Array.isArray(data.metrics) && data.metrics.length > 0) {\n context.metrics = data.metrics;\n }\n if (data.advisor) {\n // Spec only accepts: { summary, collectorErrors: string[] }\n const adv = data.advisor as Record<string, unknown>;\n const summary = adv.summary as Record<string, number> | undefined;\n const rawErrors = adv.collectorErrors as unknown[] | undefined;\n if (summary) {\n context.advisor = {\n summary: {\n total: summary.total ?? 0,\n critical: summary.critical ?? 0,\n warning: summary.warning ?? 0,\n info: summary.info ?? 0,\n },\n collectorErrors: rawErrors?.map((e) =>\n typeof e === 'string' ? e : JSON.stringify(e),\n ) ?? [],\n };\n }\n }\n if (data.db) {\n // Stringify all values to match spec (active: string, dead_tuples: string, etc.)\n const rawDb = data.db as Record<string, Record<string, unknown>[]>;\n const safeDb: Record<string, Record<string, unknown>[]> = {};\n for (const [key, rows] of Object.entries(rawDb)) {\n safeDb[key] = rows.map((row) => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(row)) {\n out[k] = (v === null || v === undefined) ? '' : String(v);\n }\n return out;\n });\n }\n if (Object.keys(safeDb).length > 0) {\n context.db = safeDb;\n }\n }\n if (Array.isArray(data.logs) && data.logs.length > 0) {\n // Spec: { source: string, total: integer, errors: [{timestamp, message, source}] }\n context.logs = (data.logs as { source: string; total: number; errors: { timestamp: string; message: string; source: string }[] }[])\n .map((s) => ({\n source: s.source,\n total: s.total,\n errors: s.errors.map((e) => ({\n timestamp: e.timestamp ?? '',\n message: e.message ?? '',\n source: e.source ?? '',\n })),\n }));\n }\n\n await streamDiagnosticAnalysis({\n project_id: projectId,\n question,\n context,\n } as Parameters<typeof streamDiagnosticAnalysis>[0], (event) => {\n // Capture sessionId and errors before any early return\n if (event.type === 'done') {\n sessionId = event.data.session_id as string | undefined;\n }\n if (event.type === 'error') {\n streamError = new CLIError(String(event.data.message ?? 'Unknown diagnostic error'));\n }\n\n if (json) {\n jsonEvents.push({ type: event.type, ...event.data });\n return;\n }\n\n switch (event.type) {\n case 'delta':\n process.stdout.write(String(event.data.text ?? ''));\n fullText += String(event.data.text ?? '');\n break;\n case 'tool_call':\n console.log(`\\n [calling ${event.data.tool_name}...]`);\n break;\n case 'tool_result':\n // silently consume tool results\n break;\n case 'done':\n break;\n case 'error':\n console.error(`\\n Error: ${streamError?.message ?? 'Unknown error'}`);\n break;\n }\n }, apiUrl);\n\n if (streamError) {\n throw streamError;\n }\n\n if (!json) {\n // Ensure newline after streamed text\n if (fullText && !fullText.endsWith('\\n')) console.log('');\n console.log('');\n }\n\n if (json) {\n outputJson({ sessionId, events: jsonEvents });\n }\n\n // Optional rating prompt (interactive only)\n if (!json && sessionId) {\n const ratingChoice = await prompts.select<string>({\n message: 'Was this analysis helpful?',\n options: [\n { value: 'skip', label: 'Skip', hint: 'no rating' },\n { value: 'helpful', label: 'Helpful', hint: 'solved or pointed in right direction' },\n { value: 'not_helpful', label: 'Not helpful', hint: 'didn\\'t apply to the problem' },\n { value: 'incorrect', label: 'Incorrect', hint: 'diagnosis was wrong or misleading' },\n ],\n });\n\n if (!prompts.isCancel(ratingChoice) && ratingChoice !== 'skip') {\n try {\n await rateDiagnosticSession(\n sessionId,\n ratingChoice as 'helpful' | 'not_helpful' | 'incorrect',\n undefined,\n apiUrl,\n );\n clack.log.success('Thanks for your feedback!');\n } catch {\n clack.log.warn('Failed to submit rating.');\n }\n }\n }\n\n await reportCliUsage(usageEvent, true);\n return;\n }\n\n // Standard report mode\n const data = await collectDiagnosticData(projectId, ossMode, apiUrl);\n\n if (json) {\n outputJson({ project: projectName, ...data });\n } else {\n console.log(`\\n InsForge Health Report — ${projectName}\\n`);\n\n // Metrics section\n console.log(sectionHeader('System Metrics (last 1h)'));\n if (data.metrics) {\n const metricsArr = data.metrics as { metric: string; latest: number }[];\n if (metricsArr.length === 0) {\n console.log(' No metrics data available.');\n } else {\n const vals: Record<string, number> = {};\n for (const m of metricsArr) {\n vals[m.metric] = m.latest;\n }\n const cpu = vals.cpu_usage !== undefined ? `${vals.cpu_usage.toFixed(1)}%` : 'N/A';\n const mem = vals.memory_usage !== undefined ? `${vals.memory_usage.toFixed(1)}%` : 'N/A';\n const disk = vals.disk_usage !== undefined ? `${vals.disk_usage.toFixed(1)}%` : 'N/A';\n const netIn = vals.network_in !== undefined ? formatBytesCompact(vals.network_in) + '/s' : 'N/A';\n const netOut = vals.network_out !== undefined ? formatBytesCompact(vals.network_out) + '/s' : 'N/A';\n console.log(` CPU: ${cpu} Memory: ${mem}`);\n console.log(` Disk: ${disk} Network: ↓${netIn} ↑${netOut}`);\n }\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Metrics') || e.includes('Platform')) ?? 'unavailable'}`);\n }\n\n // Advisor section\n console.log('\\n' + sectionHeader('Advisor Scan'));\n if (data.advisor) {\n const scan = data.advisor as { scannedAt: string; status: string; summary: { critical: number; warning: number; info: number } };\n const date = new Date(scan.scannedAt).toLocaleDateString();\n console.log(` ${date} (${scan.status}) — ${scan.summary.critical} critical · ${scan.summary.warning} warning · ${scan.summary.info} info`);\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Advisor') || e.includes('Platform')) ?? 'unavailable'}`);\n }\n\n // DB section\n console.log('\\n' + sectionHeader('Database'));\n if (data.db) {\n const db = data.db as Record<string, Record<string, unknown>[]>;\n const conn = db.connections?.[0];\n const cache = db['cache-hit']?.[0];\n const deadTuples = (db.bloat ?? []).reduce(\n (sum: number, r: Record<string, unknown>) => sum + (Number(r.dead_tuples) || 0),\n 0,\n );\n const lockCount = (db.locks ?? []).length;\n\n console.log(\n ` Connections: ${conn?.active ?? '?'}/${conn?.max ?? '?'} Cache Hit: ${cache?.ratio ?? '?'}%`,\n );\n console.log(\n ` Dead tuples: ${deadTuples.toLocaleString()} Locks waiting: ${lockCount}`,\n );\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('DB')) ?? 'unavailable'}`);\n }\n\n // Logs section\n console.log('\\n' + sectionHeader('Recent Errors (last 100 logs/source)'));\n if (data.logs) {\n const summaries = data.logs as { source: string; errors: unknown[] }[];\n const parts = summaries.map((s) => `${s.source}: ${s.errors.length}`);\n console.log(` ${parts.join(' ')}`);\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Logs')) ?? 'unavailable'}`);\n }\n\n console.log('');\n }\n await reportCliUsage(usageEvent, true);\n } catch (err) {\n await reportCliUsage(usageEvent, false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n\n // Register subcommands\n registerDiagnoseMetricsCommand(diagnoseCmd);\n registerDiagnoseAdvisorCommand(diagnoseCmd);\n registerDiagnoseDbCommand(diagnoseCmd);\n registerDiagnoseLogsCommand(diagnoseCmd);\n}\n\nfunction formatBytesCompact(bytes: number): string {\n if (bytes < 1024) return `${bytes.toFixed(0)}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n","import type { Command } from 'commander';\nimport { platformFetch } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\ninterface MetricDataPoint {\n timestamp: number;\n value: number;\n}\n\ninterface MetricSeries {\n metric: string;\n instance_id: string;\n data: MetricDataPoint[];\n}\n\ninterface MetricsResponse {\n project_id: string;\n range: string;\n metrics: MetricSeries[];\n _meta?: { requested_at: string; query_time_ms: number; cached: boolean };\n}\n\nconst METRIC_LABELS: Record<string, string> = {\n cpu_usage: 'CPU Usage',\n memory_usage: 'Memory Usage',\n disk_usage: 'Disk Usage',\n network_in: 'Network In',\n network_out: 'Network Out',\n};\n\nconst NETWORK_METRICS = new Set(['network_in', 'network_out']);\n\nfunction formatValue(metric: string, value: number): string {\n if (NETWORK_METRICS.has(metric)) {\n return formatBytes(value) + '/s';\n }\n return `${value.toFixed(1)}%`;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes.toFixed(1)} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction computeStats(data: MetricDataPoint[]): { latest: number; avg: number; max: number } {\n if (data.length === 0) return { latest: 0, avg: 0, max: 0 };\n const latest = data[data.length - 1].value;\n let sum = 0;\n let max = -Infinity;\n for (const d of data) {\n sum += d.value;\n if (d.value > max) max = d.value;\n }\n return { latest, avg: sum / data.length, max };\n}\n\n/**\n * Aggregate multiple series of the same metric (e.g. multiple network interfaces)\n * into a single series per metric name. Network metrics are summed; others take the first series.\n */\nfunction aggregateByMetric(series: MetricSeries[]): MetricSeries[] {\n const grouped = new Map<string, MetricSeries[]>();\n for (const s of series) {\n const existing = grouped.get(s.metric);\n if (existing) existing.push(s);\n else grouped.set(s.metric, [s]);\n }\n\n const result: MetricSeries[] = [];\n for (const [metric, group] of grouped) {\n if (group.length === 1 || !NETWORK_METRICS.has(metric)) {\n result.push(group[0]);\n continue;\n }\n // Sum network metrics across interfaces by matching timestamps\n const tsMap = new Map<number, number>();\n for (const s of group) {\n for (const d of s.data) {\n tsMap.set(d.timestamp, (tsMap.get(d.timestamp) ?? 0) + d.value);\n }\n }\n const merged: MetricDataPoint[] = [...tsMap.entries()]\n .sort((a, b) => a[0] - b[0])\n .map(([timestamp, value]) => ({ timestamp, value }));\n result.push({ metric, instance_id: 'aggregate', data: merged });\n }\n return result;\n}\n\nexport async function fetchMetricsSummary(\n projectId: string,\n apiUrl?: string,\n): Promise<MetricsResponse> {\n const res = await platformFetch(`/projects/v1/${projectId}/metrics?range=1h`, {}, apiUrl);\n return (await res.json()) as MetricsResponse;\n}\n\nexport function registerDiagnoseMetricsCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('metrics')\n .description('Display EC2 instance metrics (CPU, memory, disk, network)')\n .option('--range <range>', 'Time range: 1h, 6h, 24h, 7d', '1h')\n .option('--metrics <list>', 'Comma-separated metrics to query')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n if (config.project_id === FAKE_PROJECT_ID) {\n throw new CLIError(\n 'Metrics requires InsForge Platform login. Not available when linked via --api-key.',\n );\n }\n trackDiagnose('metrics', config);\n\n const params = new URLSearchParams({ range: opts.range });\n if (opts.metrics) params.set('metrics', opts.metrics);\n\n const res = await platformFetch(\n `/projects/v1/${config.project_id}/metrics?${params.toString()}`,\n {},\n apiUrl,\n );\n const data = (await res.json()) as MetricsResponse;\n\n const aggregated = aggregateByMetric(data.metrics);\n\n if (json) {\n const enriched = {\n ...data,\n metrics: aggregated.map((m) => {\n const stats = computeStats(m.data);\n return { ...m, latest: stats.latest, avg: stats.avg, max: stats.max };\n }),\n };\n outputJson(enriched);\n } else {\n if (!aggregated.length) {\n console.log('No metrics data available.');\n return;\n }\n const headers = ['Metric', 'Latest', 'Avg', 'Max', 'Range'];\n const rows = aggregated.map((m) => {\n const stats = computeStats(m.data);\n return [\n METRIC_LABELS[m.metric] ?? m.metric,\n formatValue(m.metric, stats.latest),\n formatValue(m.metric, stats.avg),\n formatValue(m.metric, stats.max),\n data.range,\n ];\n });\n outputTable(headers, rows);\n }\n await reportCliUsage('cli.diagnose.metrics', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.metrics', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { platformFetch } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\n\ninterface AdvisorScanSummary {\n scanId: string;\n status: string;\n scanType: string;\n scannedAt: string;\n summary: { total: number; critical: number; warning: number; info: number };\n collectorErrors: { collector: string; error: string; timestamp: string }[];\n}\n\ninterface AdvisorIssue {\n id: string;\n ruleId: string;\n severity: string;\n category: string;\n title: string;\n description: string;\n affectedObject: string;\n recommendation: string;\n isResolved: boolean;\n}\n\ninterface AdvisorIssuesResponse {\n issues: AdvisorIssue[];\n total: number;\n}\n\nexport async function fetchAdvisorSummary(\n projectId: string,\n apiUrl?: string,\n): Promise<AdvisorScanSummary> {\n const res = await platformFetch(`/projects/v1/${projectId}/advisor/latest`, {}, apiUrl);\n return (await res.json()) as AdvisorScanSummary;\n}\n\nexport function registerDiagnoseAdvisorCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('advisor')\n .description('Display latest advisor scan results and issues')\n .option('--severity <level>', 'Filter by severity: critical, warning, info')\n .option('--category <cat>', 'Filter by category: security, performance, health')\n .option('--limit <n>', 'Maximum number of issues to return', '50')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n if (config.project_id === FAKE_PROJECT_ID) {\n throw new CLIError(\n 'Advisor requires InsForge Platform login. Not available when linked via --api-key.',\n );\n }\n trackDiagnose('advisor', config);\n\n const projectId = config.project_id;\n\n // Fetch scan summary\n const scanRes = await platformFetch(\n `/projects/v1/${projectId}/advisor/latest`,\n {},\n apiUrl,\n );\n const scan = (await scanRes.json()) as AdvisorScanSummary;\n\n // Fetch issues\n const issueParams = new URLSearchParams();\n if (opts.severity) issueParams.set('severity', opts.severity);\n if (opts.category) issueParams.set('category', opts.category);\n issueParams.set('limit', opts.limit);\n\n const issuesRes = await platformFetch(\n `/projects/v1/${projectId}/advisor/latest/issues?${issueParams.toString()}`,\n {},\n apiUrl,\n );\n const issuesData = (await issuesRes.json()) as AdvisorIssuesResponse;\n\n if (json) {\n outputJson({ scan, issues: issuesData.issues });\n } else {\n // Scan summary line\n const date = new Date(scan.scannedAt).toLocaleDateString();\n const s = scan.summary;\n console.log(\n `Scan: ${date} (${scan.status}) — ${s.critical} critical, ${s.warning} warning, ${s.info} info\\n`,\n );\n\n if (!issuesData.issues || issuesData.issues.length === 0) {\n console.log('No issues found.');\n return;\n }\n\n const headers = ['Severity', 'Category', 'Affected Object', 'Title'];\n const rows = issuesData.issues.map((issue) => [\n issue.severity,\n issue.category,\n issue.affectedObject,\n issue.title,\n ]);\n outputTable(headers, rows);\n }\n await reportCliUsage('cli.diagnose.advisor', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.advisor', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { runRawSql } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\ninterface DbCheck {\n label: string;\n sql: string;\n format: (rows: Record<string, unknown>[]) => void;\n}\n\nconst DB_CHECKS: Record<string, DbCheck> = {\n connections: {\n label: 'Connections',\n sql: `SELECT\n (SELECT count(*) FROM pg_stat_activity WHERE state IS NOT NULL) AS active,\n (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') AS max`,\n format(rows) {\n const r = rows[0] ?? {};\n console.log(` Active: ${r.active} / ${r.max}`);\n },\n },\n 'slow-queries': {\n label: 'Slow Queries (>5s)',\n sql: `SELECT pid, now() - query_start AS duration, substring(query for 80) AS query\n FROM pg_stat_activity\n WHERE state = 'active' AND now() - query_start > interval '5 seconds'\n ORDER BY query_start ASC`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' None');\n return;\n }\n const headers = ['PID', 'Duration', 'Query'];\n const tableRows = rows.map((r) => [\n String(r.pid ?? ''),\n String(r.duration ?? ''),\n String(r.query ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n bloat: {\n label: 'Table Bloat (top 10)',\n sql: `SELECT schemaname || '.' || relname AS table, n_dead_tup AS dead_tuples\n FROM pg_stat_user_tables\n ORDER BY n_dead_tup DESC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No user tables found.');\n return;\n }\n const headers = ['Table', 'Dead Tuples'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.dead_tuples ?? 0),\n ]);\n outputTable(headers, tableRows);\n },\n },\n size: {\n label: 'Table Sizes (top 10)',\n sql: `SELECT schemaname || '.' || relname AS table,\n pg_size_pretty(pg_total_relation_size(relid)) AS size\n FROM pg_stat_user_tables\n ORDER BY pg_total_relation_size(relid) DESC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No user tables found.');\n return;\n }\n const headers = ['Table', 'Size'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.size ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n 'index-usage': {\n label: 'Index Usage (worst 10)',\n sql: `SELECT schemaname || '.' || relname AS table, idx_scan, seq_scan,\n CASE WHEN (idx_scan + seq_scan) > 0\n THEN round(100.0 * idx_scan / (idx_scan + seq_scan), 1)\n ELSE 0 END AS idx_ratio\n FROM pg_stat_user_tables\n WHERE (idx_scan + seq_scan) > 0\n ORDER BY idx_ratio ASC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No scan data available.');\n return;\n }\n const headers = ['Table', 'Index Scans', 'Seq Scans', 'Index Ratio'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.idx_scan ?? 0),\n String(r.seq_scan ?? 0),\n `${r.idx_ratio ?? 0}%`,\n ]);\n outputTable(headers, tableRows);\n },\n },\n locks: {\n label: 'Waiting Locks',\n sql: `SELECT pid, mode, relation::regclass AS relation, granted\n FROM pg_locks\n WHERE NOT granted`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' None');\n return;\n }\n const headers = ['PID', 'Mode', 'Relation', 'Granted'];\n const tableRows = rows.map((r) => [\n String(r.pid ?? ''),\n String(r.mode ?? ''),\n String(r.relation ?? ''),\n String(r.granted ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n 'cache-hit': {\n label: 'Cache Hit Ratio',\n sql: `SELECT CASE WHEN sum(heap_blks_hit + heap_blks_read) > 0\n THEN round(100.0 * sum(heap_blks_hit) / sum(heap_blks_hit + heap_blks_read), 1)\n ELSE 0 END AS ratio\n FROM pg_statio_user_tables`,\n format(rows) {\n const ratio = rows[0]?.ratio ?? 0;\n console.log(` ${ratio}%`);\n },\n },\n};\n\nconst ALL_CHECKS = Object.keys(DB_CHECKS);\n\nexport async function runDbChecks(): Promise<Record<string, Record<string, unknown>[]>> {\n const results: Record<string, Record<string, unknown>[]> = {};\n for (const key of ALL_CHECKS) {\n try {\n const { rows } = await runRawSql(DB_CHECKS[key].sql, true);\n results[key] = rows;\n } catch {\n results[key] = [];\n }\n }\n return results;\n}\n\nexport function registerDiagnoseDbCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('db')\n .description('Run database health checks (connections, bloat, index usage, etc.)')\n .option('--check <checks>', 'Comma-separated checks: ' + ALL_CHECKS.join(', '), 'all')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n trackDiagnose('db', config);\n\n const checkNames =\n opts.check === 'all'\n ? ALL_CHECKS\n : (opts.check as string).split(',').map((s: string) => s.trim());\n\n const results: Record<string, Record<string, unknown>[]> = {};\n\n for (const name of checkNames) {\n const check = DB_CHECKS[name];\n if (!check) {\n console.error(`Unknown check: ${name}. Available: ${ALL_CHECKS.join(', ')}`);\n continue;\n }\n try {\n const { rows } = await runRawSql(check.sql, true);\n results[name] = rows;\n } catch (err) {\n results[name] = [];\n if (!json) {\n console.error(` Failed to run ${name}: ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n if (json) {\n outputJson(results);\n } else {\n for (const name of checkNames) {\n const check = DB_CHECKS[name];\n if (!check) continue;\n console.log(`\\n── ${check.label} ${'─'.repeat(Math.max(0, 40 - check.label.length))}`);\n check.format(results[name] ?? []);\n }\n console.log('');\n }\n await reportCliUsage('cli.diagnose.db', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.db', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\nconst LOG_SOURCES = ['insforge.logs', 'postgREST.logs', 'postgres.logs', 'function.logs', 'function-deploy.logs'] as const;\n\nconst ERROR_PATTERN = /\\b(error|fatal|panic)\\b/i;\n\n/** Maps source names to their API paths. Most use /api/logs/{source}, but some have custom paths. */\nconst SOURCE_PATH: Record<string, string> = {\n 'function-deploy.logs': '/api/logs/functions/build-logs',\n};\n\ninterface LogEntry {\n timestamp: string;\n message: string;\n source: string;\n}\n\ninterface SourceSummary {\n source: string;\n total: number;\n errors: LogEntry[];\n}\n\nfunction parseLogEntry(entry: unknown): { ts: string; msg: string } {\n if (typeof entry === 'string') {\n return { ts: '', msg: entry };\n }\n const e = entry as Record<string, unknown>;\n const ts = String(e.timestamp ?? e.time ?? '');\n const msg = String(e.message ?? e.msg ?? e.log ?? JSON.stringify(e));\n return { ts, msg };\n}\n\nfunction getLogPath(source: string, limit: number): string {\n const custom = SOURCE_PATH[source];\n if (custom) return `${custom}?limit=${limit}`;\n return `/api/logs/${encodeURIComponent(source)}?limit=${limit}`;\n}\n\nasync function fetchSourceLogs(source: string, limit: number): Promise<SourceSummary> {\n const res = await ossFetch(getLogPath(source, limit));\n const data = await res.json();\n const logs = Array.isArray(data) ? data : ((data as Record<string, unknown>).logs as unknown[]) ?? [];\n\n const errors: LogEntry[] = [];\n for (const entry of logs) {\n const { ts, msg } = parseLogEntry(entry);\n if (ERROR_PATTERN.test(msg)) {\n errors.push({ timestamp: ts, message: msg, source });\n }\n }\n\n return { source, total: logs.length, errors };\n}\n\nexport async function fetchLogsSummary(limit = 100): Promise<SourceSummary[]> {\n const results: SourceSummary[] = [];\n for (const source of LOG_SOURCES) {\n try {\n results.push(await fetchSourceLogs(source, limit));\n } catch {\n results.push({ source, total: 0, errors: [] });\n }\n }\n return results;\n}\n\nexport function registerDiagnoseLogsCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('logs')\n .description('Aggregate error-level logs from all backend sources')\n .option('--source <name>', 'Specific log source to check')\n .option('--limit <n>', 'Number of log entries per source', '100')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n trackDiagnose('logs', config);\n\n const limit = parseInt(opts.limit, 10) || 100;\n const sources = opts.source ? [opts.source as string] : [...LOG_SOURCES];\n\n const summaries: SourceSummary[] = [];\n for (const source of sources) {\n try {\n summaries.push(await fetchSourceLogs(source, limit));\n } catch {\n summaries.push({ source, total: 0, errors: [] });\n }\n }\n\n if (json) {\n outputJson({ sources: summaries });\n } else {\n // Summary table\n const headers = ['Source', 'Total', 'Errors'];\n const rows = summaries.map((s) => [s.source, String(s.total), String(s.errors.length)]);\n outputTable(headers, rows);\n\n // Error details\n const allErrors = summaries.flatMap((s) => s.errors);\n if (allErrors.length > 0) {\n console.log('\\n── Error Details ' + '─'.repeat(30));\n for (const err of allErrors) {\n const prefix = err.timestamp ? `[${err.source}] ${err.timestamp}` : `[${err.source}]`;\n console.log(`\\n ${prefix}`);\n console.log(` ${err.message}`);\n }\n console.log('');\n }\n }\n await reportCliUsage('cli.diagnose.logs', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.logs', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import { ossFetch } from \"./oss.js\";\nimport type {\n ArchivePaymentPriceResponse,\n ConfigurePaymentWebhookResponse,\n CreatePaymentPriceBody,\n CreatePaymentProductBody,\n DeletePaymentProductResponse,\n GetPaymentPriceResponse,\n GetPaymentProductResponse,\n GetPaymentsConfigResponse,\n GetPaymentsStatusResponse,\n ListPaymentCatalogResponse,\n ListPaymentCustomersRequest,\n ListPaymentCustomersResponse,\n ListPaymentHistoryQuery,\n ListPaymentHistoryResponse,\n ListPaymentPricesResponse,\n ListPaymentProductsResponse,\n ListSubscriptionsQuery,\n ListSubscriptionsResponse,\n MutatePaymentPriceResponse,\n MutatePaymentProductResponse,\n StripeEnvironment,\n SyncPaymentsRequest,\n SyncPaymentsResponse,\n UpdatePaymentPriceBody,\n UpdatePaymentProductBody,\n} from \"@insforge/shared-schemas\";\ntype ListPaymentCustomersQuery = Partial<\n Omit<ListPaymentCustomersRequest, \"environment\">\n>;\n\nfunction withQuery(\n path: string,\n params: Record<string, string | number | undefined>,\n): string {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) query.set(key, String(value));\n }\n const suffix = query.toString();\n return suffix ? `${path}?${suffix}` : path;\n}\n\nasync function readJson<T>(res: Response): Promise<T> {\n return (await res.json()) as T;\n}\n\nfunction withEnvironmentPath(\n environment: StripeEnvironment,\n suffix: string,\n): string {\n return `/api/payments/${encodeURIComponent(environment)}${suffix}`;\n}\n\nexport async function getPaymentsStatus(): Promise<GetPaymentsStatusResponse> {\n return readJson(await ossFetch(\"/api/payments/status\"));\n}\n\nexport async function getPaymentsConfig(): Promise<GetPaymentsConfigResponse> {\n return readJson(await ossFetch(\"/api/payments/config\"));\n}\n\nexport async function setStripeSecretKey(\n environment: StripeEnvironment,\n secretKey: string,\n): Promise<GetPaymentsConfigResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/config\"), {\n method: \"PUT\",\n body: JSON.stringify({ secretKey }),\n }),\n );\n}\n\nexport async function removeStripeSecretKey(\n environment: StripeEnvironment,\n): Promise<GetPaymentsConfigResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/config\"), {\n method: \"DELETE\",\n }),\n );\n}\n\nexport async function syncPayments(\n environment: SyncPaymentsRequest[\"environment\"] = \"all\",\n): Promise<SyncPaymentsResponse> {\n return readJson(\n await ossFetch(\n environment === \"all\"\n ? \"/api/payments/sync\"\n : withEnvironmentPath(environment, \"/sync\"),\n { method: \"POST\" },\n ),\n );\n}\n\nexport async function configurePaymentWebhook(\n environment: StripeEnvironment,\n): Promise<ConfigurePaymentWebhookResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/webhook\"), {\n method: \"POST\",\n }),\n );\n}\n\nexport async function listPaymentCatalog(\n environment: StripeEnvironment,\n): Promise<ListPaymentCatalogResponse> {\n return readJson(await ossFetch(withEnvironmentPath(environment, \"/catalog\")));\n}\n\nexport async function listPaymentProducts(\n environment: StripeEnvironment,\n): Promise<ListPaymentProductsResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/catalog/products\")),\n );\n}\n\nexport async function getPaymentProduct(\n environment: StripeEnvironment,\n productId: string,\n): Promise<GetPaymentProductResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/products/${encodeURIComponent(productId)}`,\n ),\n ),\n );\n}\n\nexport async function createPaymentProduct(\n environment: StripeEnvironment,\n request: CreatePaymentProductBody,\n): Promise<MutatePaymentProductResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/catalog/products\"), {\n method: \"POST\",\n body: JSON.stringify(request),\n }),\n );\n}\n\nexport async function updatePaymentProduct(\n environment: StripeEnvironment,\n productId: string,\n request: UpdatePaymentProductBody,\n): Promise<MutatePaymentProductResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/products/${encodeURIComponent(productId)}`,\n ),\n {\n method: \"PATCH\",\n body: JSON.stringify(request),\n },\n ),\n );\n}\n\nexport async function deletePaymentProduct(\n environment: StripeEnvironment,\n productId: string,\n): Promise<DeletePaymentProductResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/products/${encodeURIComponent(productId)}`,\n ),\n { method: \"DELETE\" },\n ),\n );\n}\n\nexport async function listPaymentPrices(\n environment: StripeEnvironment,\n stripeProductId?: string,\n): Promise<ListPaymentPricesResponse> {\n return readJson(\n await ossFetch(\n withQuery(withEnvironmentPath(environment, \"/catalog/prices\"), {\n stripeProductId,\n }),\n ),\n );\n}\n\nexport async function getPaymentPrice(\n environment: StripeEnvironment,\n priceId: string,\n): Promise<GetPaymentPriceResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/prices/${encodeURIComponent(priceId)}`,\n ),\n ),\n );\n}\n\nexport async function createPaymentPrice(\n environment: StripeEnvironment,\n request: CreatePaymentPriceBody,\n): Promise<MutatePaymentPriceResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/catalog/prices\"), {\n method: \"POST\",\n body: JSON.stringify(request),\n }),\n );\n}\n\nexport async function updatePaymentPrice(\n environment: StripeEnvironment,\n priceId: string,\n request: UpdatePaymentPriceBody,\n): Promise<MutatePaymentPriceResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/prices/${encodeURIComponent(priceId)}`,\n ),\n {\n method: \"PATCH\",\n body: JSON.stringify(request),\n },\n ),\n );\n}\n\nexport async function archivePaymentPrice(\n environment: StripeEnvironment,\n priceId: string,\n): Promise<ArchivePaymentPriceResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/prices/${encodeURIComponent(priceId)}`,\n ),\n { method: \"DELETE\" },\n ),\n );\n}\n\nexport async function listSubscriptions(\n environment: StripeEnvironment,\n request: ListSubscriptionsQuery,\n): Promise<ListSubscriptionsResponse> {\n return readJson(\n await ossFetch(\n withQuery(withEnvironmentPath(environment, \"/subscriptions\"), request),\n ),\n );\n}\n\nexport async function listPaymentCustomers(\n environment: StripeEnvironment,\n request: ListPaymentCustomersQuery = {},\n): Promise<ListPaymentCustomersResponse> {\n return readJson(\n await ossFetch(\n withQuery(withEnvironmentPath(environment, \"/customers\"), request),\n ),\n );\n}\n\nexport async function listPaymentHistory(\n environment: StripeEnvironment,\n request: ListPaymentHistoryQuery,\n): Promise<ListPaymentHistoryResponse> {\n return readJson(\n await ossFetch(\n withQuery(withEnvironmentPath(environment, \"/payment-history\"), request),\n ),\n );\n}\n","import type { StripeEnvironment } from \"@insforge/shared-schemas\";\nimport { getProjectConfig } from \"../../lib/config.js\";\nimport { CLIError } from \"../../lib/errors.js\";\nimport { shutdownAnalytics, trackPayments } from \"../../lib/analytics.js\";\n\nexport type PaymentCommandTelemetry = Record<\n string,\n string | number | boolean | undefined\n>;\n\nexport function parseEnvironment(value: string): StripeEnvironment {\n if (value === \"test\" || value === \"live\") return value;\n throw new CLIError('Environment must be \"test\" or \"live\".');\n}\n\nexport function parseEnvironmentOrAll(\n value: string,\n): StripeEnvironment | \"all\" {\n if (value === \"all\") return value;\n return parseEnvironment(value);\n}\n\nexport function parseBooleanOption(\n value: string | undefined,\n flagName: string,\n): boolean | undefined {\n if (value === undefined) return undefined;\n\n const normalized = value.toLowerCase();\n if (normalized === \"true\") return true;\n if (normalized === \"false\") return false;\n\n throw new CLIError(`${flagName} must be \"true\" or \"false\".`);\n}\n\nexport function parseIntegerOption(\n value: string | undefined,\n flagName: string,\n options: { min?: number; max?: number } = {},\n): number | undefined {\n if (value === undefined) return undefined;\n\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || String(parsed) !== value.trim()) {\n throw new CLIError(`${flagName} must be an integer.`);\n }\n if (options.min !== undefined && parsed < options.min) {\n throw new CLIError(`${flagName} must be at least ${options.min}.`);\n }\n if (options.max !== undefined && parsed > options.max) {\n throw new CLIError(`${flagName} must be at most ${options.max}.`);\n }\n return parsed;\n}\n\nexport function parseMetadataOption(\n value: string | undefined,\n): Record<string, string> | undefined {\n if (value === undefined) return undefined;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new CLIError(\"Invalid JSON for --metadata.\");\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new CLIError(\"--metadata must be a JSON object.\");\n }\n\n const metadata: Record<string, string> = {};\n for (const [key, raw] of Object.entries(parsed)) {\n if (typeof raw !== \"string\") {\n throw new CLIError(`Metadata value for \"${key}\" must be a string.`);\n }\n metadata[key] = raw;\n }\n\n return metadata;\n}\n\nexport function formatDate(value: string | null | undefined): string {\n if (!value) return \"-\";\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? value : date.toLocaleString();\n}\n\nexport function formatAmount(\n amount: number | null | undefined,\n currency: string | null | undefined,\n): string {\n if (amount === null || amount === undefined) return \"-\";\n const code = currency?.toUpperCase();\n let fractionDigits = 2;\n\n if (code) {\n try {\n fractionDigits =\n new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: code,\n }).resolvedOptions().maximumFractionDigits ?? 2;\n } catch {\n fractionDigits = 2;\n }\n }\n\n const divisor = 10 ** fractionDigits;\n return `${(amount / divisor).toFixed(fractionDigits)} ${code ?? \"\"}`.trim();\n}\n\nexport function formatRecurring(\n interval: string | null | undefined,\n intervalCount: number | null | undefined,\n): string {\n if (!interval) return \"one-time\";\n return `${intervalCount && intervalCount > 1 ? `${intervalCount} ` : \"\"}${interval}`;\n}\n\nexport async function trackPaymentUsage(\n subcommand: string,\n success: boolean,\n properties: PaymentCommandTelemetry = {},\n): Promise<void> {\n try {\n try {\n const config = getProjectConfig();\n if (config) {\n trackPayments(subcommand, config, {\n success,\n ...properties,\n });\n }\n } catch {\n // Telemetry should never affect command behavior.\n }\n } finally {\n await shutdownAnalytics();\n }\n}\n","import type { Command } from \"commander\";\nimport { listPaymentCatalog } from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputTable } from \"../../lib/output.js\";\nimport {\n formatAmount,\n formatRecurring,\n parseEnvironment,\n trackPaymentUsage,\n} from \"./utils.js\";\n\nexport function registerPaymentsCatalogCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command(\"catalog\")\n .description(\"List mirrored Stripe products and prices for one environment\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await listPaymentCatalog(environment);\n\n if (json) {\n outputJson(data);\n } else {\n if (data.products.length === 0 && data.prices.length === 0) {\n console.log(\"No Stripe catalog records found.\");\n await trackPaymentUsage(\"catalog\", true, { environment });\n return;\n }\n\n if (data.products.length > 0) {\n console.log(\"Products\");\n outputTable(\n [\"Env\", \"Product ID\", \"Name\", \"Active\", \"Default Price\"],\n data.products.map((product) => [\n product.environment,\n product.stripeProductId,\n product.name,\n product.active ? \"Yes\" : \"No\",\n product.defaultPriceId ?? \"-\",\n ]),\n );\n }\n\n if (data.prices.length > 0) {\n console.log(\"Prices\");\n outputTable(\n [\n \"Env\",\n \"Price ID\",\n \"Product ID\",\n \"Amount\",\n \"Type\",\n \"Active\",\n \"Recurring\",\n ],\n data.prices.map((price) => [\n price.environment,\n price.stripePriceId,\n price.stripeProductId ?? \"-\",\n formatAmount(price.unitAmount, price.currency),\n price.type,\n price.active ? \"Yes\" : \"No\",\n formatRecurring(\n price.recurringInterval,\n price.recurringIntervalCount,\n ),\n ]),\n );\n }\n }\n\n await trackPaymentUsage(\"catalog\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"catalog\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport {\n getPaymentsConfig,\n removeStripeSecretKey,\n setStripeSecretKey,\n} from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { parseEnvironment, trackPaymentUsage } from './utils.js';\n\nfunction outputConfigTable(data: Awaited<ReturnType<typeof getPaymentsConfig>>): void {\n if (data.keys.length === 0) {\n console.log('No Stripe keys configured.');\n return;\n }\n\n outputTable(\n ['Env', 'Configured', 'Key'],\n data.keys.map((key) => [\n key.environment,\n key.hasKey ? 'Yes' : 'No',\n key.maskedKey ?? '-',\n ]),\n );\n}\n\nexport function registerPaymentsConfigCommand(paymentsCmd: Command): void {\n const configCmd = paymentsCmd\n .command('config')\n .description('Manage Stripe API keys for payments')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const data = await getPaymentsConfig();\n\n if (json) {\n outputJson(data);\n } else {\n outputConfigTable(data);\n }\n\n await trackPaymentUsage('config', true);\n } catch (err) {\n await trackPaymentUsage('config', false);\n handleError(err, json);\n }\n });\n\n configCmd\n .command('set <environment> [secretKey]')\n .description('Configure a Stripe secret key for test or live payments')\n .action(async (environmentValue: string, secretKeyValue: string | undefined, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(environmentValue);\n await requireAuth();\n\n let secretKey = secretKeyValue;\n if (!secretKey) {\n if (json) {\n throw new CLIError('Provide secretKey when using --json.');\n }\n\n const input = await prompts.password({\n message: `Stripe ${environment} secret key`,\n });\n if (prompts.isCancel(input)) process.exit(0);\n secretKey = input;\n }\n\n const data = await setStripeSecretKey(environment, secretKey);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe ${environment} key configured.`);\n }\n\n await trackPaymentUsage('config.set', true, { environment });\n } catch (err) {\n await trackPaymentUsage('config.set', false, { environment: environmentValue });\n handleError(err, json);\n }\n });\n\n configCmd\n .command('remove <environment>')\n .alias('delete')\n .description('Remove a configured Stripe secret key')\n .action(async (environmentValue: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(environmentValue);\n await requireAuth();\n\n if (json && !yes) {\n throw new CLIError('Use --yes with --json to remove a Stripe key non-interactively.');\n }\n\n if (!yes) {\n const confirm = await prompts.confirm({\n message: `Remove Stripe ${environment} key? Payment sync and mutations for this environment will stop.`,\n });\n if (prompts.isCancel(confirm) || !confirm) process.exit(0);\n }\n\n const data = await removeStripeSecretKey(environment);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe ${environment} key removed.`);\n }\n\n await trackPaymentUsage('config.remove', true, { environment });\n } catch (err) {\n await trackPaymentUsage('config.remove', false, { environment: environmentValue });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { listPaymentCustomers } from \"../../lib/api/payments.js\";\nimport type { ListPaymentCustomersResponse } from \"@insforge/shared-schemas\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputTable } from \"../../lib/output.js\";\nimport {\n formatAmount,\n formatDate,\n parseEnvironment,\n parseIntegerOption,\n trackPaymentUsage,\n} from \"./utils.js\";\n\ntype PaymentCustomer = ListPaymentCustomersResponse[\"customers\"][number];\n\nfunction formatPaymentMethod(customer: PaymentCustomer): string {\n if (customer.paymentMethodBrand && customer.paymentMethodLast4) {\n return `${customer.paymentMethodBrand} **** ${customer.paymentMethodLast4}`;\n }\n if (customer.paymentMethodBrand) {\n return customer.paymentMethodBrand;\n }\n if (customer.paymentMethodLast4) {\n return `**** ${customer.paymentMethodLast4}`;\n }\n return \"-\";\n}\n\nexport function registerPaymentsCustomersCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command(\"customers\")\n .description(\"List mirrored Stripe customers\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--limit <limit>\", \"Maximum rows to return (1-100)\", \"50\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n const limit =\n parseIntegerOption(opts.limit, \"--limit\", { min: 1, max: 100 }) ?? 50;\n await requireAuth();\n\n const data = await listPaymentCustomers(environment, { limit });\n\n if (json) {\n outputJson(data);\n } else if (data.customers.length === 0) {\n console.log(\"No Stripe customers found.\");\n } else {\n outputTable(\n [\n \"Customer ID\",\n \"Email\",\n \"Name\",\n \"Payments\",\n \"Total Spend\",\n \"Last Payment\",\n \"Method\",\n \"Country\",\n ],\n data.customers.map((customer) => [\n customer.stripeCustomerId,\n customer.email ?? \"-\",\n customer.name ?? \"-\",\n String(customer.paymentsCount),\n formatAmount(customer.totalSpend, customer.totalSpendCurrency),\n formatDate(customer.lastPaymentAt),\n formatPaymentMethod(customer),\n customer.countryCode?.toUpperCase() ?? \"-\",\n ]),\n );\n }\n\n await trackPaymentUsage(\"customers\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"customers\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { listPaymentHistory } from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputTable } from \"../../lib/output.js\";\nimport {\n formatAmount,\n formatDate,\n parseEnvironment,\n parseIntegerOption,\n trackPaymentUsage,\n} from \"./utils.js\";\n\nexport function registerPaymentsHistoryCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command(\"history\")\n .description(\"List mirrored Stripe payment history\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--subject-type <type>\", \"Filter by billing subject type\")\n .option(\"--subject-id <id>\", \"Filter by billing subject id\")\n .option(\"--limit <limit>\", \"Maximum rows to return (1-100)\", \"50\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n const limit =\n parseIntegerOption(opts.limit, \"--limit\", { min: 1, max: 100 }) ?? 50;\n await requireAuth();\n\n const data = await listPaymentHistory(environment, {\n limit,\n ...(opts.subjectType !== undefined\n ? { subjectType: opts.subjectType }\n : {}),\n ...(opts.subjectId !== undefined\n ? { subjectId: opts.subjectId }\n : {}),\n });\n\n if (json) {\n outputJson(data);\n } else if (data.paymentHistory.length === 0) {\n console.log(\"No Stripe payment history found.\");\n } else {\n outputTable(\n [\n \"Type\",\n \"Status\",\n \"Subject\",\n \"Amount\",\n \"Customer\",\n \"Stripe Object\",\n \"When\",\n ],\n data.paymentHistory.map((entry) => [\n entry.type,\n entry.status,\n entry.subjectType && entry.subjectId\n ? `${entry.subjectType}:${entry.subjectId}`\n : \"-\",\n formatAmount(entry.amount, entry.currency),\n entry.stripeCustomerId ?? \"-\",\n entry.stripeCheckoutSessionId ??\n entry.stripeInvoiceId ??\n entry.stripePaymentIntentId ??\n entry.stripeRefundId ??\n \"-\",\n formatDate(\n entry.paidAt ??\n entry.failedAt ??\n entry.refundedAt ??\n entry.stripeCreatedAt,\n ),\n ]),\n );\n }\n\n await trackPaymentUsage(\"history\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"history\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport {\n archivePaymentPrice,\n createPaymentPrice,\n getPaymentPrice,\n listPaymentPrices,\n updatePaymentPrice,\n} from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { CLIError, getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputSuccess, outputTable } from \"../../lib/output.js\";\nimport type {\n CreatePaymentPriceBody,\n ListPaymentPricesResponse,\n StripePriceRecurringInterval,\n StripePriceTaxBehavior,\n UpdatePaymentPriceBody,\n} from \"@insforge/shared-schemas\";\nimport {\n formatAmount,\n formatDate,\n formatRecurring,\n parseBooleanOption,\n parseEnvironment,\n parseIntegerOption,\n parseMetadataOption,\n trackPaymentUsage,\n} from \"./utils.js\";\ntype PaymentPrice = ListPaymentPricesResponse[\"prices\"][number];\n\nfunction nullableString(value: string | undefined): string | null | undefined {\n if (value === undefined) return undefined;\n return value === \"null\" ? null : value;\n}\n\nfunction parseRecurringInterval(\n value: string | undefined,\n): StripePriceRecurringInterval | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (\n value === \"day\" ||\n value === \"week\" ||\n value === \"month\" ||\n value === \"year\"\n ) {\n return value;\n }\n throw new CLIError(\"--interval must be one of: day, week, month, year.\");\n}\n\nfunction parseTaxBehavior(\n value: string | undefined,\n): StripePriceTaxBehavior | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (\n value === \"exclusive\" ||\n value === \"inclusive\" ||\n value === \"unspecified\"\n ) {\n return value;\n }\n throw new CLIError(\n \"--tax-behavior must be one of: exclusive, inclusive, unspecified.\",\n );\n}\n\nfunction outputPricesTable(prices: PaymentPrice[]): void {\n if (prices.length === 0) {\n console.log(\"No Stripe prices found.\");\n return;\n }\n\n outputTable(\n [\n \"Env\",\n \"Price ID\",\n \"Product ID\",\n \"Amount\",\n \"Type\",\n \"Active\",\n \"Recurring\",\n \"Synced At\",\n ],\n prices.map((price) => [\n price.environment,\n price.stripePriceId,\n price.stripeProductId ?? \"-\",\n formatAmount(price.unitAmount, price.currency),\n price.type,\n price.active ? \"Yes\" : \"No\",\n formatRecurring(price.recurringInterval, price.recurringIntervalCount),\n formatDate(price.syncedAt),\n ]),\n );\n}\n\nexport function registerPaymentsPricesCommand(paymentsCmd: Command): void {\n const pricesCmd = paymentsCmd\n .command(\"prices\")\n .description(\"Manage Stripe prices\");\n\n pricesCmd\n .command(\"list\")\n .description(\"List mirrored Stripe prices\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--product <productId>\", \"Filter by Stripe product id\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await listPaymentPrices(environment, opts.product);\n\n if (json) {\n outputJson(data);\n } else {\n outputPricesTable(data.prices);\n }\n\n await trackPaymentUsage(\"prices.list\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"prices.list\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command(\"get <priceId>\")\n .description(\"Show one Stripe price\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (priceId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await getPaymentPrice(environment, priceId);\n\n if (json) {\n outputJson(data);\n } else {\n outputPricesTable([data.price]);\n }\n\n await trackPaymentUsage(\"prices.get\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"prices.get\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command(\"create\")\n .description(\"Create a Stripe one-time or recurring price\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .requiredOption(\"--product <productId>\", \"Stripe product id\")\n .requiredOption(\n \"--currency <currency>\",\n \"Three-letter currency code, e.g. usd\",\n )\n .requiredOption(\n \"--unit-amount <amount>\",\n \"Unit amount in the smallest currency unit, e.g. cents\",\n )\n .option(\n \"--interval <interval>\",\n \"Recurring interval: day, week, month, or year\",\n )\n .option(\"--interval-count <count>\", \"Recurring interval count\")\n .option(\"--lookup-key <key>\", 'Stripe lookup key, or \"null\"')\n .option(\"--active <bool>\", \"Set active status (true/false)\")\n .option(\"--tax-behavior <behavior>\", \"exclusive, inclusive, or unspecified\")\n .option(\"--metadata <json>\", \"Metadata JSON object with string values\")\n .option(\"--idempotency-key <key>\", \"Caller-stable idempotency key\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const interval = parseRecurringInterval(opts.interval);\n const intervalCount = parseIntegerOption(\n opts.intervalCount,\n \"--interval-count\",\n { min: 1 },\n );\n if (!interval && intervalCount !== undefined) {\n throw new CLIError(\"Provide --interval when using --interval-count.\");\n }\n\n const request: CreatePaymentPriceBody = {\n stripeProductId: opts.product,\n currency: opts.currency,\n unitAmount:\n parseIntegerOption(opts.unitAmount, \"--unit-amount\", { min: 0 }) ??\n 0,\n };\n const lookupKey = nullableString(opts.lookupKey);\n const active = parseBooleanOption(opts.active, \"--active\");\n const taxBehavior = parseTaxBehavior(opts.taxBehavior);\n const metadata = parseMetadataOption(opts.metadata);\n if (lookupKey !== undefined) request.lookupKey = lookupKey;\n if (active !== undefined) request.active = active;\n if (taxBehavior !== undefined) request.taxBehavior = taxBehavior;\n if (metadata !== undefined) request.metadata = metadata;\n if (opts.idempotencyKey !== undefined) {\n request.idempotencyKey = opts.idempotencyKey;\n }\n if (interval) {\n request.recurring = {\n interval,\n ...(intervalCount !== undefined ? { intervalCount } : {}),\n };\n }\n\n const data = await createPaymentPrice(environment, request);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe price created: ${data.price.stripePriceId}`);\n }\n\n await trackPaymentUsage(\"prices.create\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"prices.create\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command(\"update <priceId>\")\n .description(\"Update a Stripe price\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--active <bool>\", \"Set active status (true/false)\")\n .option(\"--lookup-key <key>\", 'Stripe lookup key, or \"null\"')\n .option(\"--tax-behavior <behavior>\", \"exclusive, inclusive, or unspecified\")\n .option(\"--metadata <json>\", \"Metadata JSON object with string values\")\n .action(async (priceId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const request: UpdatePaymentPriceBody = {};\n const active = parseBooleanOption(opts.active, \"--active\");\n const lookupKey = nullableString(opts.lookupKey);\n const taxBehavior = parseTaxBehavior(opts.taxBehavior);\n const metadata = parseMetadataOption(opts.metadata);\n if (active !== undefined) request.active = active;\n if (lookupKey !== undefined) request.lookupKey = lookupKey;\n if (taxBehavior !== undefined) request.taxBehavior = taxBehavior;\n if (metadata !== undefined) request.metadata = metadata;\n\n if (Object.keys(request).length === 0) {\n throw new CLIError(\n \"Provide at least one option to update (--active, --lookup-key, --tax-behavior, --metadata).\",\n );\n }\n\n const data = await updatePaymentPrice(environment, priceId, request);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe price updated: ${data.price.stripePriceId}`);\n }\n\n await trackPaymentUsage(\"prices.update\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"prices.update\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command(\"archive <priceId>\")\n .alias(\"delete\")\n .description(\"Archive a Stripe price\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (priceId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await archivePaymentPrice(environment, priceId);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe price archived: ${data.price.stripePriceId}`);\n }\n\n await trackPaymentUsage(\"prices.archive\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"prices.archive\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport * as prompts from \"../../lib/prompts.js\";\nimport {\n createPaymentProduct,\n deletePaymentProduct,\n getPaymentProduct,\n listPaymentProducts,\n updatePaymentProduct,\n} from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { CLIError, getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputSuccess, outputTable } from \"../../lib/output.js\";\nimport type {\n CreatePaymentProductBody,\n ListPaymentProductsResponse,\n UpdatePaymentProductBody,\n} from \"@insforge/shared-schemas\";\nimport {\n formatAmount,\n formatDate,\n parseBooleanOption,\n parseEnvironment,\n parseMetadataOption,\n trackPaymentUsage,\n} from \"./utils.js\";\ntype PaymentProduct = ListPaymentProductsResponse[\"products\"][number];\n\nfunction nullableString(value: string | undefined): string | null | undefined {\n if (value === undefined) return undefined;\n return value === \"null\" ? null : value;\n}\n\nfunction outputProductsTable(products: PaymentProduct[]): void {\n if (products.length === 0) {\n console.log(\"No Stripe products found.\");\n return;\n }\n\n outputTable(\n [\"Env\", \"Product ID\", \"Name\", \"Active\", \"Default Price\", \"Synced At\"],\n products.map((product) => [\n product.environment,\n product.stripeProductId,\n product.name,\n product.active ? \"Yes\" : \"No\",\n product.defaultPriceId ?? \"-\",\n formatDate(product.syncedAt),\n ]),\n );\n}\n\nexport function registerPaymentsProductsCommand(paymentsCmd: Command): void {\n const productsCmd = paymentsCmd\n .command(\"products\")\n .description(\"Manage Stripe products\");\n\n productsCmd\n .command(\"list\")\n .description(\"List mirrored Stripe products\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await listPaymentProducts(environment);\n\n if (json) {\n outputJson(data);\n } else {\n outputProductsTable(data.products);\n }\n\n await trackPaymentUsage(\"products.list\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"products.list\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command(\"get <productId>\")\n .description(\"Show one Stripe product and its prices\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (productId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await getPaymentProduct(environment, productId);\n\n if (json) {\n outputJson(data);\n } else {\n outputProductsTable([data.product]);\n if (data.prices.length > 0) {\n console.log(\"Prices\");\n outputTable(\n [\"Price ID\", \"Amount\", \"Type\", \"Active\", \"Lookup Key\"],\n data.prices.map((price) => [\n price.stripePriceId,\n formatAmount(price.unitAmount, price.currency),\n price.type,\n price.active ? \"Yes\" : \"No\",\n price.lookupKey ?? \"-\",\n ]),\n );\n }\n }\n\n await trackPaymentUsage(\"products.get\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"products.get\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command(\"create\")\n .description(\"Create a Stripe product\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .requiredOption(\"--name <name>\", \"Product name\")\n .option(\"--description <description>\", 'Product description, or \"null\"')\n .option(\"--active <bool>\", \"Set active status (true/false)\")\n .option(\"--metadata <json>\", \"Metadata JSON object with string values\")\n .option(\"--idempotency-key <key>\", \"Caller-stable idempotency key\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const request: CreatePaymentProductBody = { name: opts.name };\n const description = nullableString(opts.description);\n const active = parseBooleanOption(opts.active, \"--active\");\n const metadata = parseMetadataOption(opts.metadata);\n if (description !== undefined) request.description = description;\n if (active !== undefined) request.active = active;\n if (metadata !== undefined) request.metadata = metadata;\n if (opts.idempotencyKey !== undefined) {\n request.idempotencyKey = opts.idempotencyKey;\n }\n\n const data = await createPaymentProduct(environment, request);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(\n `Stripe product created: ${data.product.stripeProductId}`,\n );\n }\n\n await trackPaymentUsage(\"products.create\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"products.create\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command(\"update <productId>\")\n .description(\"Update a Stripe product\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--name <name>\", \"Product name\")\n .option(\"--description <description>\", 'Product description, or \"null\"')\n .option(\"--active <bool>\", \"Set active status (true/false)\")\n .option(\"--metadata <json>\", \"Metadata JSON object with string values\")\n .action(async (productId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const request: UpdatePaymentProductBody = {};\n const description = nullableString(opts.description);\n const active = parseBooleanOption(opts.active, \"--active\");\n const metadata = parseMetadataOption(opts.metadata);\n if (opts.name !== undefined) request.name = opts.name;\n if (description !== undefined) request.description = description;\n if (active !== undefined) request.active = active;\n if (metadata !== undefined) request.metadata = metadata;\n\n if (Object.keys(request).length === 0) {\n throw new CLIError(\n \"Provide at least one option to update (--name, --description, --active, --metadata).\",\n );\n }\n\n const data = await updatePaymentProduct(\n environment,\n productId,\n request,\n );\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(\n `Stripe product updated: ${data.product.stripeProductId}`,\n );\n }\n\n await trackPaymentUsage(\"products.update\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"products.update\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command(\"delete <productId>\")\n .description(\"Delete a Stripe product that has no prices\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (productId: string, opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n if (json && !yes) {\n throw new CLIError(\n \"Use --yes with --json to delete a Stripe product non-interactively.\",\n );\n }\n\n if (!yes) {\n const confirm = await prompts.confirm({\n message: `Delete Stripe ${environment} product \"${productId}\"?`,\n });\n if (prompts.isCancel(confirm) || !confirm) process.exit(0);\n }\n\n const data = await deletePaymentProduct(environment, productId);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe product deleted: ${data.stripeProductId}`);\n }\n\n await trackPaymentUsage(\"products.delete\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"products.delete\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getPaymentsStatus } from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { formatDate, trackPaymentUsage } from './utils.js';\n\nexport function registerPaymentsStatusCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command('status')\n .description('Show Stripe payment connection, sync, and webhook status')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const data = await getPaymentsStatus();\n\n if (json) {\n outputJson(data);\n } else if (data.connections.length === 0) {\n console.log('No Stripe payment environments found.');\n } else {\n outputTable(\n ['Env', 'Status', 'Key', 'Account', 'Webhook', 'Last Sync', 'Synced At'],\n data.connections.map((connection) => [\n connection.environment,\n connection.status,\n connection.maskedKey ?? '-',\n connection.stripeAccountId ?? '-',\n connection.webhookEndpointId ? 'Configured' : '-',\n connection.lastSyncStatus ?? '-',\n formatDate(connection.lastSyncedAt),\n ]),\n );\n }\n\n await trackPaymentUsage('status', true);\n } catch (err) {\n await trackPaymentUsage('status', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { listSubscriptions } from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputTable } from \"../../lib/output.js\";\nimport {\n formatDate,\n parseEnvironment,\n parseIntegerOption,\n trackPaymentUsage,\n} from \"./utils.js\";\n\nexport function registerPaymentsSubscriptionsCommand(\n paymentsCmd: Command,\n): void {\n paymentsCmd\n .command(\"subscriptions\")\n .description(\"List mirrored Stripe subscriptions\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--subject-type <type>\", \"Filter by billing subject type\")\n .option(\"--subject-id <id>\", \"Filter by billing subject id\")\n .option(\"--limit <limit>\", \"Maximum rows to return (1-100)\", \"50\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n const limit =\n parseIntegerOption(opts.limit, \"--limit\", { min: 1, max: 100 }) ?? 50;\n await requireAuth();\n\n const data = await listSubscriptions(environment, {\n limit,\n ...(opts.subjectType !== undefined\n ? { subjectType: opts.subjectType }\n : {}),\n ...(opts.subjectId !== undefined\n ? { subjectId: opts.subjectId }\n : {}),\n });\n\n if (json) {\n outputJson(data);\n } else if (data.subscriptions.length === 0) {\n console.log(\"No Stripe subscriptions found.\");\n } else {\n outputTable(\n [\n \"Subscription ID\",\n \"Customer\",\n \"Subject\",\n \"Status\",\n \"Items\",\n \"Period End\",\n ],\n data.subscriptions.map((subscription) => [\n subscription.stripeSubscriptionId,\n subscription.stripeCustomerId,\n subscription.subjectType && subscription.subjectId\n ? `${subscription.subjectType}:${subscription.subjectId}`\n : \"-\",\n subscription.status,\n String(subscription.items?.length ?? 0),\n formatDate(subscription.currentPeriodEnd),\n ]),\n );\n }\n\n await trackPaymentUsage(\"subscriptions\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"subscriptions\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { syncPayments } from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputSuccess, outputTable } from \"../../lib/output.js\";\nimport {\n formatDate,\n parseEnvironmentOrAll,\n trackPaymentUsage,\n} from \"./utils.js\";\n\nexport function registerPaymentsSyncCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command(\"sync\")\n .description(\n \"Sync configured Stripe products, prices, customers, and subscriptions\",\n )\n .option(\n \"--environment <environment>\",\n \"Stripe environment: test, live, or all\",\n \"all\",\n )\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironmentOrAll(opts.environment);\n await requireAuth();\n\n const data = await syncPayments(environment);\n\n if (json) {\n outputJson(data);\n } else if (data.results.length === 0) {\n console.log(\"No configured Stripe environments to sync.\");\n } else {\n outputTable(\n [\n \"Env\",\n \"Status\",\n \"Products\",\n \"Prices\",\n \"Customers\",\n \"Subscriptions\",\n \"Unmapped\",\n \"Synced At\",\n ],\n data.results.map((result) => [\n result.environment,\n result.connection.lastSyncStatus ?? result.connection.status,\n String(result.connection.lastSyncCounts.products ?? 0),\n String(result.connection.lastSyncCounts.prices ?? 0),\n String(result.connection.lastSyncCounts.customers ?? 0),\n String(result.subscriptions?.synced ?? 0),\n String(result.subscriptions?.unmapped ?? 0),\n formatDate(result.connection.lastSyncedAt),\n ]),\n );\n outputSuccess(\"Stripe payments synced.\");\n }\n\n await trackPaymentUsage(\"sync\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"sync\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { configurePaymentWebhook } from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { formatDate, parseEnvironment, trackPaymentUsage } from './utils.js';\n\nexport function registerPaymentsWebhooksCommand(paymentsCmd: Command): void {\n const webhooksCmd = paymentsCmd\n .command('webhooks')\n .description('Manage InsForge-managed Stripe webhooks');\n\n webhooksCmd\n .command('configure <environment>')\n .description('Create or recreate the managed Stripe webhook endpoint')\n .action(async (environmentValue: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(environmentValue);\n await requireAuth();\n\n const data = await configurePaymentWebhook(environment);\n\n if (json) {\n outputJson(data);\n } else {\n outputTable(\n ['Env', 'Webhook ID', 'URL', 'Configured At'],\n [[\n data.connection.environment,\n data.connection.webhookEndpointId ?? '-',\n data.connection.webhookEndpointUrl ?? '-',\n formatDate(data.connection.webhookConfiguredAt),\n ]],\n );\n outputSuccess(`Stripe ${environment} webhook configured.`);\n }\n\n await trackPaymentUsage('webhooks.configure', true, { environment });\n } catch (err) {\n await trackPaymentUsage('webhooks.configure', false, { environment: environmentValue });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { registerPaymentsCatalogCommand } from \"./catalog.js\";\nimport { registerPaymentsConfigCommand } from \"./config.js\";\nimport { registerPaymentsCustomersCommand } from \"./customers.js\";\nimport { registerPaymentsHistoryCommand } from \"./history.js\";\nimport { registerPaymentsPricesCommand } from \"./prices.js\";\nimport { registerPaymentsProductsCommand } from \"./products.js\";\nimport { registerPaymentsStatusCommand } from \"./status.js\";\nimport { registerPaymentsSubscriptionsCommand } from \"./subscriptions.js\";\nimport { registerPaymentsSyncCommand } from \"./sync.js\";\nimport { registerPaymentsWebhooksCommand } from \"./webhooks.js\";\n\nexport function registerPaymentsCommands(paymentsCmd: Command): void {\n paymentsCmd.description(\"Manage Stripe payments\");\n\n registerPaymentsStatusCommand(paymentsCmd);\n registerPaymentsConfigCommand(paymentsCmd);\n registerPaymentsSyncCommand(paymentsCmd);\n registerPaymentsWebhooksCommand(paymentsCmd);\n registerPaymentsCatalogCommand(paymentsCmd);\n registerPaymentsCustomersCommand(paymentsCmd);\n registerPaymentsProductsCommand(paymentsCmd);\n registerPaymentsPricesCommand(paymentsCmd);\n registerPaymentsSubscriptionsCommand(paymentsCmd);\n registerPaymentsHistoryCommand(paymentsCmd);\n}\n"],"mappings":"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","names":["readFileSync","join","dirname","clack","resolve","isCancel","text","select","confirm","password","clack","URL","clack","URL","resolve","clack","confirm","isCancel","path","password","program","text","isCancel","password","program","program","orgsCmd","projectsCmd","select","isCancel","existsSync","unlinkSync","existsSync","unlinkSync","branch","writeFileSync","clack","writeFileSync","clack","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","pollUntilReady","branch","clack","program","exec","promisify","fs","path","clack","pc","existsSync","readFileSync","join","clack","join","existsSync","readFileSync","promisify","randomBytes","clack","path","promisify","randomBytes","exec","execFile","tmpdir","promisify","fs","path","clack","fs","path","path","fs","createHash","clack","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","createHash","resolve","spinner","deploymentsCmd","execAsync","promisify","exec","execFileAsync","execFile","SAFE_REPO_PATTERN","SAFE_BRANCH_PATTERN","program","select","isCancel","text","confirm","tmpdir","s","stat","execAsync","promisify","exec","buildOssHost","spinner","program","projectConfig","template","text","isCancel","pc","select","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","writeFileSync","dbCmd","writeFileSync","readFileSync","basename","dbCmd","readFileSync","basename","existsSync","readFileSync","writeFileSync","join","existsSync","mkdirSync","join","join","existsSync","mkdirSync","dbCmd","join","existsSync","writeFileSync","readFileSync","dbCmd","recordsCmd","path","recordsCmd","recordsCmd","recordsCmd","functionsCmd","readFileSync","existsSync","join","functionsCmd","join","existsSync","readFileSync","functionsCmd","text","functionsCmd","clack","functionsCmd","confirm","isCancel","storageCmd","readFileSync","existsSync","basename","storageCmd","existsSync","readFileSync","basename","writeFileSync","join","basename","storageCmd","join","basename","writeFileSync","storageCmd","storageCmd","confirm","isCancel","storageCmd","program","program","deploymentsCmd","deploymentsCmd","deploymentsCmd","confirm","isCancel","deploymentsCmd","program","path","secretsCmd","secretsCmd","secretsCmd","secretsCmd","secretsCmd","confirm","isCancel","schedulesCmd","schedulesCmd","schedulesCmd","schedulesCmd","schedulesCmd","confirm","isCancel","schedulesCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","existsSync","join","resolve","readFileSync","ENV_KEY_REGEX","path","readFileSync","existsSync","writeFileSync","unlinkSync","join","path","join","existsSync","writeFileSync","unlinkSync","resolve","computeCmd","resolve","listRes","existing","updateBody","service","join","existsSync","program","program","formatSize","clack","diagnoseCmd","diagnoseCmd","diagnoseCmd","SOURCE_PATH","getLogPath","diagnoseCmd","diagnoseCmd","data","s","select","isCancel","path","paymentsCmd","paymentsCmd","password","isCancel","confirm","paymentsCmd","paymentsCmd","paymentsCmd","nullableString","paymentsCmd","confirm","isCancel","paymentsCmd","paymentsCmd","paymentsCmd","paymentsCmd","paymentsCmd","dirname","readFileSync","join","select","isCancel"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/prompts.ts","../src/lib/config.ts","../src/commands/login.ts","../src/lib/errors.ts","../src/lib/auth.ts","../src/lib/credentials.ts","../src/lib/api/platform.ts","../src/lib/output.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/orgs/list.ts","../src/commands/projects/list.ts","../src/commands/branch/create.ts","../src/lib/analytics.ts","../src/commands/branch/switch.ts","../src/commands/branch/list.ts","../src/commands/branch/merge.ts","../src/commands/branch/reset.ts","../src/commands/branch/delete.ts","../src/commands/branch/index.ts","../src/commands/projects/link.ts","../src/lib/skills.ts","../src/auth-providers/apply.ts","../src/lib/api/oss.ts","../src/commands/create.ts","../src/lib/env.ts","../src/commands/deployments/deploy.ts","../src/commands/db/query.ts","../src/commands/db/tables.ts","../src/commands/db/functions.ts","../src/commands/db/indexes.ts","../src/commands/db/policies.ts","../src/commands/db/triggers.ts","../src/commands/db/rpc.ts","../src/commands/db/export.ts","../src/commands/db/import.ts","../src/commands/db/migrations.ts","../src/lib/migrations.ts","../src/commands/db/connection-string.ts","../src/commands/records/list.ts","../src/commands/records/create.ts","../src/commands/records/update.ts","../src/commands/records/delete.ts","../src/commands/functions/list.ts","../src/commands/functions/deploy.ts","../src/commands/functions/invoke.ts","../src/commands/functions/code.ts","../src/commands/functions/delete.ts","../src/commands/storage/buckets.ts","../src/commands/storage/upload.ts","../src/commands/storage/download.ts","../src/commands/storage/create-bucket.ts","../src/commands/storage/delete-bucket.ts","../src/commands/storage/list-objects.ts","../src/commands/info.ts","../src/commands/list.ts","../src/commands/deployments/list.ts","../src/commands/deployments/status.ts","../src/commands/deployments/cancel.ts","../src/commands/deployments/env-vars.ts","../src/commands/docs.ts","../src/commands/secrets/list.ts","../src/commands/secrets/get.ts","../src/commands/secrets/add.ts","../src/commands/secrets/update.ts","../src/commands/secrets/delete.ts","../src/commands/schedules/list.ts","../src/commands/schedules/get.ts","../src/commands/schedules/create.ts","../src/commands/schedules/update.ts","../src/commands/schedules/delete.ts","../src/commands/schedules/logs.ts","../src/commands/compute/list.ts","../src/commands/compute/get.ts","../src/commands/compute/update.ts","../src/commands/compute/delete.ts","../src/commands/compute/start.ts","../src/commands/compute/stop.ts","../src/commands/compute/events.ts","../src/commands/compute/deploy.ts","../src/lib/env-file.ts","../src/lib/flyctl.ts","../src/commands/logs.ts","../src/commands/metadata.ts","../src/commands/diagnose/index.ts","../src/commands/diagnose/metrics.ts","../src/commands/diagnose/advisor.ts","../src/commands/diagnose/db.ts","../src/commands/diagnose/logs.ts","../src/lib/api/payments.ts","../src/commands/payments/utils.ts","../src/commands/payments/catalog.ts","../src/commands/payments/config.ts","../src/commands/payments/customers.ts","../src/commands/payments/history.ts","../src/commands/payments/prices.ts","../src/commands/payments/products.ts","../src/commands/payments/status.ts","../src/commands/payments/subscriptions.ts","../src/commands/payments/sync.ts","../src/commands/payments/webhooks.ts","../src/commands/payments/index.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from './lib/prompts.js';\nimport { getCredentials, getProjectConfig } from './lib/config.js';\nimport { registerLoginCommand } from './commands/login.js';\nimport { registerLogoutCommand } from './commands/logout.js';\nimport { registerWhoamiCommand } from './commands/whoami.js';\nimport { registerOrgsCommands } from './commands/orgs/list.js';\nimport { registerProjectsCommands } from './commands/projects/list.js';\nimport { registerBranchCommands } from './commands/branch/index.js';\nimport { registerProjectLinkCommand } from './commands/projects/link.js';\nimport { registerDbCommands } from './commands/db/query.js';\nimport { registerDbTablesCommand } from './commands/db/tables.js';\nimport { registerDbFunctionsCommand } from './commands/db/functions.js';\nimport { registerDbIndexesCommand } from './commands/db/indexes.js';\nimport { registerDbPoliciesCommand } from './commands/db/policies.js';\nimport { registerDbTriggersCommand } from './commands/db/triggers.js';\nimport { registerDbRpcCommand } from './commands/db/rpc.js';\nimport { registerDbExportCommand } from './commands/db/export.js';\nimport { registerDbImportCommand } from './commands/db/import.js';\nimport { registerDbMigrationsCommand } from './commands/db/migrations.js';\nimport { registerDbConnectionStringCommand } from './commands/db/connection-string.js';\nimport { registerRecordsCommands } from './commands/records/list.js';\nimport { registerRecordsCreateCommand } from './commands/records/create.js';\nimport { registerRecordsUpdateCommand } from './commands/records/update.js';\nimport { registerRecordsDeleteCommand } from './commands/records/delete.js';\nimport { registerFunctionsCommands } from './commands/functions/list.js';\nimport { registerFunctionsDeployCommand } from './commands/functions/deploy.js';\nimport { registerFunctionsInvokeCommand } from './commands/functions/invoke.js';\nimport { registerFunctionsCodeCommand } from './commands/functions/code.js';\nimport { registerFunctionsDeleteCommand } from './commands/functions/delete.js';\nimport { registerStorageBucketsCommand } from './commands/storage/buckets.js';\nimport { registerStorageUploadCommand } from './commands/storage/upload.js';\nimport { registerStorageDownloadCommand } from './commands/storage/download.js';\nimport { registerStorageCreateBucketCommand } from './commands/storage/create-bucket.js';\nimport { registerStorageDeleteBucketCommand } from './commands/storage/delete-bucket.js';\nimport { registerStorageListObjectsCommand } from './commands/storage/list-objects.js';\nimport { registerCreateCommand } from './commands/create.js';\nimport { registerContextCommand } from './commands/info.js';\nimport { registerListCommand } from './commands/list.js';\nimport { registerDeploymentsDeployCommand } from './commands/deployments/deploy.js';\nimport { registerDeploymentsListCommand } from './commands/deployments/list.js';\nimport { registerDeploymentsStatusCommand } from './commands/deployments/status.js';\nimport { registerDeploymentsCancelCommand } from './commands/deployments/cancel.js';\nimport { registerDeploymentsEnvVarsCommand } from './commands/deployments/env-vars.js';\n\nimport { registerDocsCommand } from './commands/docs.js';\nimport { registerSecretsListCommand } from './commands/secrets/list.js';\nimport { registerSecretsGetCommand } from './commands/secrets/get.js';\nimport { registerSecretsAddCommand } from './commands/secrets/add.js';\nimport { registerSecretsUpdateCommand } from './commands/secrets/update.js';\nimport { registerSecretsDeleteCommand } from './commands/secrets/delete.js';\n\nimport { registerSchedulesListCommand } from './commands/schedules/list.js';\nimport { registerSchedulesGetCommand } from './commands/schedules/get.js';\nimport { registerSchedulesCreateCommand } from './commands/schedules/create.js';\nimport { registerSchedulesUpdateCommand } from './commands/schedules/update.js';\nimport { registerSchedulesDeleteCommand } from './commands/schedules/delete.js';\nimport { registerSchedulesLogsCommand } from './commands/schedules/logs.js';\n\nimport { registerComputeListCommand } from './commands/compute/list.js';\nimport { registerComputeGetCommand } from './commands/compute/get.js';\nimport { registerComputeUpdateCommand } from './commands/compute/update.js';\nimport { registerComputeDeleteCommand } from './commands/compute/delete.js';\nimport { registerComputeStartCommand } from './commands/compute/start.js';\nimport { registerComputeStopCommand } from './commands/compute/stop.js';\nimport { registerComputeEventsCommand } from './commands/compute/events.js';\nimport { registerComputeDeployCommand } from './commands/compute/deploy.js';\n\nimport { registerLogsCommand } from './commands/logs.js';\nimport { registerMetadataCommand } from './commands/metadata.js';\nimport { registerDiagnoseCommands } from './commands/diagnose/index.js';\nimport { registerPaymentsCommands } from './commands/payments/index.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8')) as { version: string };\n\nconst INSFORGE_LOGO = `\n██╗███╗ ██╗███████╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗\n██║████╗ ██║██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝\n██║██╔██╗ ██║███████╗█████╗ ██║ ██║██████╔╝██║ ███╗█████╗\n██║██║╚██╗██║╚════██║██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝\n██║██║ ╚████║███████║██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗\n╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝\n`;\n\nconst program = new Command();\n\nprogram\n .name('insforge')\n .description('InsForge CLI - Command line tool for InsForge platform')\n .version(pkg.version);\n\n// Global options\nprogram\n .option('--json', 'Output in JSON format')\n .option('--api-url <url>', 'Override Platform API URL')\n .option('-y, --yes', 'Skip confirmation prompts');\n\n// Top-level commands\nregisterLoginCommand(program);\nregisterLogoutCommand(program);\nregisterWhoamiCommand(program);\nregisterCreateCommand(program);\nregisterContextCommand(program);\nregisterListCommand(program);\nregisterDocsCommand(program);\nregisterProjectLinkCommand(program);\n\n// Orgs commands (hidden — use `insforge list` instead)\nconst orgsCmd = program.command('orgs', { hidden: true }).description('Manage organizations');\nregisterOrgsCommands(orgsCmd);\n\n// Projects commands (hidden — use `insforge list` instead)\nconst projectsCmd = program.command('projects', { hidden: true }).description('Manage projects');\nregisterProjectsCommands(projectsCmd);\n\n// Branch commands\nregisterBranchCommands(program);\n\n// Database commands\nconst dbCmd = program.command('db').description('Database operations');\nregisterDbCommands(dbCmd);\nregisterDbTablesCommand(dbCmd);\nregisterDbFunctionsCommand(dbCmd);\nregisterDbIndexesCommand(dbCmd);\nregisterDbPoliciesCommand(dbCmd);\nregisterDbTriggersCommand(dbCmd);\nregisterDbRpcCommand(dbCmd);\nregisterDbExportCommand(dbCmd);\nregisterDbImportCommand(dbCmd);\nregisterDbMigrationsCommand(dbCmd);\nregisterDbConnectionStringCommand(dbCmd);\n\n// Records commands (hidden — do not use for now)\nconst recordsCmd = program.command('records', { hidden: true }).description('CRUD operations on table records');\nregisterRecordsCommands(recordsCmd);\nregisterRecordsCreateCommand(recordsCmd);\nregisterRecordsUpdateCommand(recordsCmd);\nregisterRecordsDeleteCommand(recordsCmd);\n\n// Functions commands\nconst functionsCmd = program.command('functions').description('Manage edge functions');\nregisterFunctionsCommands(functionsCmd);\nregisterFunctionsCodeCommand(functionsCmd);\nregisterFunctionsDeployCommand(functionsCmd);\nregisterFunctionsInvokeCommand(functionsCmd);\nregisterFunctionsDeleteCommand(functionsCmd);\n\n// Storage commands\nconst storageCmd = program.command('storage').description('Manage storage');\nregisterStorageBucketsCommand(storageCmd);\nregisterStorageCreateBucketCommand(storageCmd);\nregisterStorageDeleteBucketCommand(storageCmd);\nregisterStorageListObjectsCommand(storageCmd);\nregisterStorageUploadCommand(storageCmd);\nregisterStorageDownloadCommand(storageCmd);\n\n// Deployments commands\nconst deploymentsCmd = program.command('deployments').description('Deploy and manage frontend sites');\nregisterDeploymentsDeployCommand(deploymentsCmd);\nregisterDeploymentsListCommand(deploymentsCmd);\nregisterDeploymentsStatusCommand(deploymentsCmd);\nregisterDeploymentsCancelCommand(deploymentsCmd);\nregisterDeploymentsEnvVarsCommand(deploymentsCmd);\n// registerDeploymentsMetadataCommand(deploymentsCmd);\n// slug command doesn't work yet.\n// registerDeploymentsSlugCommand(deploymentsCmd);\n\n// Secrets commands\nconst secretsCmd = program.command('secrets').description('Manage secrets');\nregisterSecretsListCommand(secretsCmd);\nregisterSecretsGetCommand(secretsCmd);\nregisterSecretsAddCommand(secretsCmd);\nregisterSecretsUpdateCommand(secretsCmd);\nregisterSecretsDeleteCommand(secretsCmd);\n\n// Logs command\nregisterLogsCommand(program);\n\n// Metadata command\nregisterMetadataCommand(program);\n\n// Diagnose commands\nconst diagnoseCmd = program.command('diagnose');\nregisterDiagnoseCommands(diagnoseCmd);\n\n// Payments commands\nconst paymentsCmd = program.command('payments').description('Manage Stripe payments');\nregisterPaymentsCommands(paymentsCmd);\n\n// Compute commands\nconst computeCmd = program.command('compute').description('Manage compute services (Docker containers on Fly.io)');\nregisterComputeListCommand(computeCmd);\nregisterComputeGetCommand(computeCmd);\nregisterComputeDeployCommand(computeCmd);\nregisterComputeUpdateCommand(computeCmd);\nregisterComputeDeleteCommand(computeCmd);\nregisterComputeStartCommand(computeCmd);\nregisterComputeStopCommand(computeCmd);\nregisterComputeEventsCommand(computeCmd);\n\n// Schedules commands\nconst schedulesCmd = program.command('schedules').description('Manage scheduled tasks (cron jobs)');\nregisterSchedulesListCommand(schedulesCmd);\nregisterSchedulesGetCommand(schedulesCmd);\nregisterSchedulesCreateCommand(schedulesCmd);\nregisterSchedulesUpdateCommand(schedulesCmd);\nregisterSchedulesDeleteCommand(schedulesCmd);\nregisterSchedulesLogsCommand(schedulesCmd);\n\nif (process.argv.length <= 2 && process.stdout.isTTY) {\n await showInteractiveMenu();\n} else {\n program.parse();\n}\n\nasync function showInteractiveMenu(): Promise<void> {\n let isLoggedIn = false;\n let isLinked = false;\n\n try {\n isLoggedIn = !!getCredentials()?.access_token;\n } catch { /* corrupted credentials file */ }\n\n try {\n isLinked = !!getProjectConfig()?.project_id;\n } catch { /* no project config */ }\n\n console.log(INSFORGE_LOGO);\n clack.intro(`InsForge CLI v${pkg.version}`);\n\n type Action = 'login' | 'create' | 'link' | 'deploy' | 'docs' | 'help';\n const options: { value: Action; label: string; hint?: string }[] = [];\n\n if (!isLoggedIn) {\n options.push({ value: 'login', label: 'Log in to InsForge' });\n }\n\n options.push(\n { value: 'create', label: 'Create a new project', hint: isLoggedIn ? undefined : 'requires login' },\n { value: 'link', label: 'Link an existing project', hint: isLoggedIn ? undefined : 'requires login' },\n );\n\n if (isLinked) {\n options.push({ value: 'deploy', label: 'Deploy your project' });\n }\n\n options.push(\n { value: 'docs', label: 'View documentation' },\n { value: 'help', label: 'Show all commands' },\n );\n\n const action = await prompts.select<string>({\n message: 'What would you like to do?',\n options,\n });\n\n if (prompts.isCancel(action)) {\n clack.cancel('Bye!');\n process.exit(0);\n }\n\n switch (action) {\n case 'login':\n await program.parseAsync(['node', 'insforge', 'login']);\n break;\n case 'create':\n await program.parseAsync(['node', 'insforge', 'create']);\n break;\n case 'link':\n await program.parseAsync(['node', 'insforge', 'link']);\n break;\n case 'deploy':\n await program.parseAsync(['node', 'insforge', 'deployments', 'deploy']);\n break;\n case 'docs':\n await program.parseAsync(['node', 'insforge', 'docs']);\n break;\n case 'help':\n program.help();\n break;\n }\n}\n","import * as readline from 'node:readline';\nimport * as clack from '@clack/prompts';\n\nexport const isInteractive = !!(process.stdin.isTTY && process.stdout.isTTY);\n\n/**\n * A line reader that buffers parsed lines and exposes a pull-based readLine API.\n *\n * readline.promises.question() loses 'line' events that fire between question() calls,\n * and does not reject cleanly on stream close. A buffered queue handles both.\n */\nexport class LineReader {\n private queue: string[] = [];\n private waiter: ((line: string | null) => void) | null = null;\n private closed = false;\n private rl: readline.Interface;\n\n constructor(\n input: NodeJS.ReadableStream,\n private output: NodeJS.WritableStream,\n ) {\n this.rl = readline.createInterface({ input });\n this.rl.on('line', (line) => {\n if (this.waiter) {\n const w = this.waiter;\n this.waiter = null;\n w(line);\n } else {\n this.queue.push(line);\n }\n });\n this.rl.on('close', () => {\n this.closed = true;\n if (this.waiter) {\n const w = this.waiter;\n this.waiter = null;\n w(null);\n }\n });\n }\n\n async readLine(prompt: string): Promise<string | null> {\n this.output.write(prompt);\n if (this.queue.length > 0) return this.queue.shift()!;\n if (this.closed) return null;\n return new Promise((resolve) => {\n this.waiter = resolve;\n });\n }\n\n close(): void {\n this.rl.close();\n }\n}\n\nlet sharedReader: LineReader | null = null;\nfunction getReader(): LineReader {\n if (!sharedReader) {\n sharedReader = new LineReader(process.stdin, process.stdout);\n }\n return sharedReader;\n}\n\nexport const CANCEL: unique symbol = Symbol('prompt.cancel');\nexport type CancelSymbol = typeof CANCEL;\n\nexport function isCancel<T>(v: T | CancelSymbol): v is CancelSymbol {\n return v === CANCEL || clack.isCancel(v);\n}\n\nexport interface TextOptions {\n message: string;\n initialValue?: string;\n placeholder?: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport interface SelectOption<T> {\n value: T;\n label: string;\n hint?: string;\n}\n\nexport interface SelectOptions<T> {\n message: string;\n options: SelectOption<T>[];\n initialValue?: T;\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function text(opts: TextOptions): Promise<string | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.text({\n message: opts.message,\n initialValue: opts.initialValue,\n placeholder: opts.placeholder,\n validate: opts.validate,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n return nonTtyText(opts);\n}\n\nexport async function select<T>(opts: SelectOptions<T>): Promise<T | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.select({\n message: opts.message,\n options: opts.options as { value: T; label: string; hint?: string }[],\n initialValue: opts.initialValue,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result as T;\n }\n return nonTtySelect(opts);\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.confirm({\n message: opts.message,\n initialValue: opts.initialValue,\n });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n return nonTtyConfirm(opts);\n}\n\nexport async function password(opts: { message: string }): Promise<string | CancelSymbol> {\n if (isInteractive) {\n const result = await clack.password({ message: opts.message });\n if (clack.isCancel(result)) return CANCEL;\n return result;\n }\n // Non-TTY: can't mask input over a pipe, just read the line. Preserve whitespace\n // since it can be valid in passwords.\n return nonTtyText({ message: opts.message, trim: false });\n}\n\nexport async function nonTtyText(\n opts: TextOptions & { trim?: boolean },\n io: { reader?: LineReader; stderr?: NodeJS.WritableStream } = {},\n): Promise<string | CancelSymbol> {\n const reader = io.reader ?? getReader();\n const stderr = io.stderr ?? process.stderr;\n const shouldTrim = opts.trim ?? true;\n const defaultHint = opts.initialValue ? ` [${opts.initialValue}]` : '';\n for (;;) {\n const raw = await reader.readLine(`? ${opts.message}${defaultHint} `);\n if (raw === null) return CANCEL;\n const normalized = shouldTrim ? raw.trim() : raw;\n const value = normalized === '' ? (opts.initialValue ?? '') : normalized;\n if (opts.validate) {\n const err = opts.validate(value);\n if (err) {\n stderr.write(` ${err}\\n`);\n continue;\n }\n }\n return value;\n }\n}\n\nexport async function nonTtySelect<T>(\n opts: SelectOptions<T>,\n io: { reader?: LineReader; stdout?: NodeJS.WritableStream; stderr?: NodeJS.WritableStream } = {},\n): Promise<T | CancelSymbol> {\n if (opts.options.length === 0) {\n throw new Error(`No options available for prompt \"${opts.message}\".`);\n }\n const reader = io.reader ?? getReader();\n const stdout = io.stdout ?? process.stdout;\n const stderr = io.stderr ?? process.stderr;\n stdout.write(`? ${opts.message}\\n`);\n opts.options.forEach((o, i) => {\n const hint = o.hint ? ` — ${o.hint}` : '';\n stdout.write(` ${i + 1}) ${o.label}${hint}\\n`);\n });\n for (;;) {\n const raw = await reader.readLine(`Enter number [1-${opts.options.length}]: `);\n if (raw === null) return CANCEL;\n const n = Number.parseInt(raw.trim(), 10);\n if (Number.isInteger(n) && n >= 1 && n <= opts.options.length) {\n return opts.options[n - 1].value;\n }\n stderr.write(` Please enter a number between 1 and ${opts.options.length}.\\n`);\n }\n}\n\nexport async function nonTtyConfirm(\n opts: ConfirmOptions,\n io: { reader?: LineReader; stderr?: NodeJS.WritableStream } = {},\n): Promise<boolean | CancelSymbol> {\n const reader = io.reader ?? getReader();\n const stderr = io.stderr ?? process.stderr;\n const defaultHint = opts.initialValue === true ? ' [Y/n]' : opts.initialValue === false ? ' [y/N]' : ' [y/n]';\n for (;;) {\n const raw = await reader.readLine(`? ${opts.message}${defaultHint} `);\n if (raw === null) return CANCEL;\n const answer = raw.trim().toLowerCase();\n if (answer === '' && opts.initialValue !== undefined) return opts.initialValue;\n if (answer === 'y' || answer === 'yes') return true;\n if (answer === 'n' || answer === 'no') return false;\n stderr.write(` Please answer y or n.\\n`);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { GlobalConfig, ProjectConfig, StoredCredentials } from '../types.js';\n\nconst GLOBAL_DIR = join(homedir(), '.insforge');\nconst CREDENTIALS_FILE = join(GLOBAL_DIR, 'credentials.json');\nconst CONFIG_FILE = join(GLOBAL_DIR, 'config.json');\n\nconst DEFAULT_PLATFORM_URL = 'https://api.insforge.dev';\nconst DEFAULT_FRONTEND_URL = 'https://insforge.dev';\n\n/** Sentinel project ID for OSS/self-hosted linking (valid UUID, never matches a real project). */\nexport const FAKE_PROJECT_ID = 'fa4e0000-1234-5678-90ab-cd1234567890';\nexport const FAKE_ORG_ID = 'fa4e0001-1234-5678-90ab-cd1234567890';\n\nfunction ensureGlobalDir(): void {\n if (!existsSync(GLOBAL_DIR)) {\n mkdirSync(GLOBAL_DIR, { recursive: true });\n }\n}\n\n// --- Global Config ---\n\nexport function getGlobalConfig(): GlobalConfig {\n if (!existsSync(CONFIG_FILE)) {\n return { platform_api_url: DEFAULT_PLATFORM_URL };\n }\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveGlobalConfig(config: GlobalConfig): void {\n ensureGlobalDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));\n}\n\n// --- Credentials ---\n\nexport function getCredentials(): StoredCredentials | null {\n if (!existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n const raw = readFileSync(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(raw);\n}\n\nexport function saveCredentials(creds: StoredCredentials): void {\n ensureGlobalDir();\n writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n}\n\nexport function clearCredentials(): void {\n if (existsSync(CREDENTIALS_FILE)) {\n unlinkSync(CREDENTIALS_FILE);\n }\n // Clear session-related config (default_org_id) but keep platform_api_url etc.\n const config = getGlobalConfig();\n if (config.default_org_id) {\n delete config.default_org_id;\n saveGlobalConfig(config);\n }\n}\n\n// --- Project Config (local) ---\n\nfunction getLocalConfigDir(): string {\n return join(process.cwd(), '.insforge');\n}\n\nfunction getLocalConfigFile(): string {\n return join(getLocalConfigDir(), 'project.json');\n}\n\n/** Path to the backup of `.insforge/project.json` written by `branch switch`\n * the first time the directory is moved off the parent project. Restored\n * by `branch switch --parent`. Exported so switch.ts can manage the file. */\nexport function getParentBackupFile(): string {\n return join(getLocalConfigDir(), 'project.parent.json');\n}\n\n/** Exposed so command code (e.g. branch switch) can write the active\n * project file path verbatim. */\nexport function getProjectConfigFile(): string {\n return getLocalConfigFile();\n}\n\nexport function getProjectConfig(): ProjectConfig | null {\n const file = getLocalConfigFile();\n if (!existsSync(file)) {\n return null;\n }\n const raw = readFileSync(file, 'utf-8');\n const config = JSON.parse(raw) as ProjectConfig;\n // Heal legacy configs written by `branch switch` before 0.1.70 — that build\n // stored `oss_host` as a bare hostname, which `fetch()` rejects with\n // \"Failed to parse URL\". Normalize in-memory so existing links keep working;\n // the next `saveProjectConfig` call persists the fix to disk.\n if (config.oss_host && !/^https?:\\/\\//.test(config.oss_host) && config.appkey && config.region) {\n config.oss_host = buildOssHost(config.appkey, config.region);\n }\n return config;\n}\n\nexport function saveProjectConfig(config: ProjectConfig): void {\n const dir = getLocalConfigDir();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(getLocalConfigFile(), JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\n/**\n * Canonical OSS host URL for a cloud project. Always includes the `https://`\n * scheme — `oss_host` is fed straight into `fetch()`, which rejects bare\n * hostnames with \"Failed to parse URL\".\n */\nexport function buildOssHost(appkey: string, region: string): string {\n return `https://${appkey}.${region}.insforge.app`;\n}\n\n// --- Resolved values (env vars > flags > config) ---\n\nexport function getPlatformApiUrl(override?: string): string {\n return process.env.INSFORGE_API_URL ?? override ?? getGlobalConfig().platform_api_url ?? DEFAULT_PLATFORM_URL;\n}\n\nexport function getFrontendUrl(): string {\n return process.env.INSFORGE_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n}\n\nexport function getAccessToken(): string | null {\n return process.env.INSFORGE_ACCESS_TOKEN ?? getCredentials()?.access_token ?? null;\n}\n\nexport function getProjectId(override?: string): string | null {\n return process.env.INSFORGE_PROJECT_ID ?? override ?? getProjectConfig()?.project_id ?? null;\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../lib/prompts.js';\nimport { saveCredentials, getPlatformApiUrl } from '../lib/config.js';\nimport { login as platformLogin } from '../lib/api/platform.js';\nimport { performOAuthLogin } from '../lib/auth.js';\nimport { handleError, getRootOpts, CLIError, formatFetchError } from '../lib/errors.js';\nimport type { StoredCredentials, User } from '../types.js';\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command('login')\n .description('Authenticate with InsForge platform')\n .option('--email', 'Login with email and password instead of browser')\n .option('--client-id <id>', 'OAuth client ID (defaults to insforge-cli)')\n .option('--user-api-key <key>', 'Authenticate with a uak_ personal access token')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n\n try {\n if (opts.userApiKey) {\n await loginWithUserApiKey(opts.userApiKey, json, apiUrl);\n } else if (opts.email) {\n await loginWithEmail(json, apiUrl);\n } else {\n await loginWithOAuth(json, apiUrl);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('cancelled')) {\n process.exit(0);\n }\n handleError(err, json);\n }\n });\n}\n\nasync function loginWithEmail(json: boolean, apiUrl?: string): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n const email = json\n ? process.env.INSFORGE_EMAIL\n : await prompts.text({\n message: 'Email:',\n validate: (v) => (v.includes('@') ? undefined : 'Please enter a valid email'),\n });\n\n if (prompts.isCancel(email)) {\n clack.cancel('Login cancelled.');\n throw new Error('cancelled');\n }\n\n const password = json\n ? process.env.INSFORGE_PASSWORD\n : await prompts.password({\n message: 'Password:',\n });\n\n if (prompts.isCancel(password)) {\n clack.cancel('Login cancelled.');\n throw new Error('cancelled');\n }\n\n if (!email || !password) {\n throw new Error('Email and password are required. Set INSFORGE_EMAIL and INSFORGE_PASSWORD environment variables for non-interactive mode.');\n }\n\n if (!json) {\n const s = clack.spinner();\n s.start('Authenticating...');\n\n const result = await platformLogin(email as string, password as string, apiUrl);\n const creds: StoredCredentials = {\n access_token: result.token,\n refresh_token: result._refreshToken ?? '',\n user: result.user,\n };\n saveCredentials(creds);\n\n s.stop(`Authenticated as ${result.user.email}`);\n clack.outro('Done');\n } else {\n const result = await platformLogin(email as string, password as string, apiUrl);\n const creds: StoredCredentials = {\n access_token: result.token,\n refresh_token: result._refreshToken ?? '',\n user: result.user,\n };\n saveCredentials(creds);\n console.log(JSON.stringify({ success: true, user: result.user }));\n }\n}\n\nasync function loginWithOAuth(json: boolean, apiUrl?: string): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n const creds = await performOAuthLogin(apiUrl);\n\n if (!json) {\n clack.outro('Done');\n } else {\n console.log(JSON.stringify({ success: true, user: creds.user }));\n }\n}\n\nasync function loginWithUserApiKey(\n key: string,\n json: boolean,\n apiUrl?: string,\n): Promise<void> {\n if (!json) {\n clack.intro('InsForge CLI');\n }\n\n if (!key.startsWith('uak_')) {\n throw new CLIError('Invalid API key — must start with \"uak_\".');\n }\n\n const s = !json ? clack.spinner() : null;\n s?.start('Verifying API key...');\n\n let jwt: string;\n let user: User;\n try {\n const exchanged = await exchangePatForJwt(key, apiUrl);\n jwt = exchanged.token;\n user = exchanged.user;\n } catch (err) {\n s?.stop('API key verification failed');\n throw err instanceof CLIError\n ? err\n : new CLIError(err instanceof Error ? err.message : String(err));\n }\n\n // Storage: access_token holds the JWT, refresh_token holds the PAT.\n // Detect PAT login later by checking refresh_token.startsWith('uak_').\n saveCredentials({\n access_token: jwt,\n refresh_token: key,\n user,\n });\n\n if (!json) {\n s?.stop(`Authenticated as ${user.email}`);\n clack.outro('Done');\n } else {\n console.log(JSON.stringify({ success: true, user }));\n }\n}\n\n/**\n * Exchange a uak_ PAT for a short-lived JWT via the backend exchange endpoint.\n * The PAT itself is never stored as an access token — we store the JWT and\n * keep the PAT only for silent re-exchange when the JWT expires.\n */\nasync function exchangePatForJwt(\n apiKey: string,\n apiUrl?: string,\n): Promise<{ token: string; user: User }> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const fullUrl = `${baseUrl}/auth/v1/exchange-api-key`;\n\n let res: Response;\n try {\n res = await fetch(fullUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey }),\n });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n };\n const msg = body.message ?? body.error ?? `HTTP ${res.status}`;\n throw new CLIError(`API key is invalid or revoked: ${msg}`);\n }\n\n const data = (await res.json().catch(() => ({}))) as { token?: unknown };\n if (typeof data.token !== 'string' || data.token.length === 0) {\n throw new CLIError('Exchange endpoint returned an invalid response (missing token).');\n }\n const jwt = data.token;\n\n // The exchange endpoint returns only the JWT. Fetch the user via /auth/v1/profile\n // using the fresh JWT so we can persist identity in credentials.json.\n let profileRes: Response;\n try {\n profileRes = await fetch(`${baseUrl}/auth/v1/profile`, {\n headers: { Authorization: `Bearer ${jwt}` },\n });\n } catch (err) {\n throw new CLIError(formatFetchError(err, `${baseUrl}/auth/v1/profile`));\n }\n if (!profileRes.ok) {\n throw new CLIError(`Exchange succeeded but could not fetch profile: HTTP ${profileRes.status}`);\n }\n const profile = (await profileRes.json().catch(() => null)) as\n | { user?: User }\n | User\n | null;\n const user =\n profile && typeof profile === 'object' && 'user' in profile\n ? (profile as { user?: User }).user\n : ((profile as User | null) ?? undefined);\n if (!user) {\n throw new CLIError('Exchange succeeded but profile response was empty');\n }\n\n return { token: jwt, user };\n}\n","import type { Command } from 'commander';\n\nexport class CLIError extends Error {\n constructor(\n message: string,\n public exitCode: number = 1,\n public code?: string,\n ) {\n super(message);\n this.name = 'CLIError';\n }\n}\n\nexport class AuthError extends CLIError {\n constructor(message: string = 'Not authenticated. Run `npx @insforge/cli login` first.') {\n super(message, 2, 'AUTH_ERROR');\n }\n}\n\nexport class ProjectNotLinkedError extends CLIError {\n constructor() {\n super('No project linked. Run `npx @insforge/cli link` first.', 3, 'PROJECT_NOT_LINKED');\n }\n}\n\nexport class NotFoundError extends CLIError {\n constructor(resource: string) {\n super(`${resource} not found.`, 4, 'NOT_FOUND');\n }\n}\n\nexport class PermissionError extends CLIError {\n constructor(message: string = 'Permission denied.') {\n super(message, 5, 'PERMISSION_DENIED');\n }\n}\n\n/**\n * Format a Node fetch error with actionable context.\n *\n * Node's undici-based fetch throws a generic Error with `message: 'fetch failed'`\n * for any network-layer failure (DNS, connect, TLS, reset, timeout). The real\n * reason sits on `err.cause` with a `code` like ENOTFOUND / ECONNREFUSED /\n * ETIMEDOUT / UND_ERR_CONNECT_TIMEOUT / CERT_HAS_EXPIRED, etc. Unpack it so\n * users see something actionable instead of \"fetch failed\".\n */\nexport function formatFetchError(err: unknown, url: string): string {\n if (!(err instanceof Error)) return `Network request to ${url} failed: ${String(err)}`;\n if (err.message !== 'fetch failed') return err.message;\n\n const cause = (err as { cause?: unknown }).cause;\n const code =\n (cause as { code?: string } | undefined)?.code ??\n (cause as { errno?: string } | undefined)?.errno;\n const causeMsg =\n cause instanceof Error ? cause.message : typeof cause === 'string' ? cause : undefined;\n\n let host = url;\n try { host = new URL(url).host; } catch { /* url may already be a host */ }\n\n switch (code) {\n case 'ENOTFOUND':\n case 'EAI_AGAIN':\n return `Cannot resolve ${host} (DNS lookup failed: ${code}). Check your internet connection or DNS settings.`;\n case 'ECONNREFUSED':\n return `Connection to ${host} refused. The server may be down or blocked by a firewall.`;\n case 'ETIMEDOUT':\n case 'UND_ERR_CONNECT_TIMEOUT':\n return `Connection to ${host} timed out. Check your network, VPN, or proxy settings.`;\n case 'ECONNRESET':\n case 'UND_ERR_SOCKET':\n return `Connection to ${host} was reset. A proxy, VPN, or firewall may be interfering.`;\n case 'CERT_HAS_EXPIRED':\n case 'UNABLE_TO_VERIFY_LEAF_SIGNATURE':\n case 'SELF_SIGNED_CERT_IN_CHAIN':\n case 'DEPTH_ZERO_SELF_SIGNED_CERT':\n return `TLS certificate error contacting ${host} (${code}). Your network may be intercepting HTTPS (corporate proxy / VPN).`;\n }\n\n if (code) return `Network error contacting ${host}: ${code}${causeMsg ? ` — ${causeMsg}` : ''}`;\n if (causeMsg) return `Network error contacting ${host}: ${causeMsg}`;\n return `Network error contacting ${host}.`;\n}\n\n/**\n * Extract error message from a deployment's metadata field.\n * DeploymentSchema stores errors in metadata.error.errorMessage rather than a top-level field.\n */\nexport function getDeploymentError(metadata: Record<string, unknown> | null): string | null {\n if (!metadata || typeof metadata.error !== 'object' || !metadata.error) return null;\n return (metadata.error as { errorMessage?: string }).errorMessage ?? null;\n}\n\nexport function handleError(err: unknown, json: boolean): never {\n if (err instanceof CLIError) {\n if (json) {\n console.error(JSON.stringify({ error: err.message, code: err.code }));\n } else {\n console.error(`Error: ${err.message}`);\n }\n process.exit(err.exitCode);\n }\n\n const message = err instanceof Error ? err.message : String(err);\n if (json) {\n console.error(JSON.stringify({ error: message, code: 'UNKNOWN_ERROR' }));\n } else {\n console.error(`Error: ${message}`);\n }\n process.exit(1);\n}\n\nexport function getJsonFlag(cmd: Command): boolean {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n return root.opts().json ?? false;\n}\n\nexport function getRootOpts(cmd: Command): { json: boolean; apiUrl?: string; yes: boolean } {\n let root: Command = cmd;\n while (root.parent) {\n root = root.parent;\n }\n const opts = root.opts();\n return {\n json: opts.json ?? false,\n apiUrl: opts.apiUrl,\n yes: opts.yes ?? false,\n };\n}\n","import { createServer } from 'node:http';\nimport { randomBytes, createHash } from 'node:crypto';\nimport { URL } from 'node:url';\nimport * as clack from '@clack/prompts';\nimport pc from 'picocolors';\nimport { isInteractive } from './prompts.js';\nimport { getGlobalConfig, getPlatformApiUrl, saveCredentials } from './config.js';\nimport { getProfile } from './api/platform.js';\nimport { formatFetchError } from './errors.js';\nimport type { StoredCredentials } from '../types.js';\n\n// Default OAuth client for InsForge CLI (pre-registered on the platform)\nexport const DEFAULT_CLIENT_ID = 'clf_NK8cMUs41gm8ZcfdtSguVw';\nexport const OAUTH_SCOPES = 'user:read organizations:read projects:read projects:write';\n\nexport interface PKCEChallenge {\n code_verifier: string;\n code_challenge: string;\n}\n\nexport interface OAuthCallbackResult {\n code: string;\n state: string;\n}\n\n/**\n * Generate PKCE code_verifier and code_challenge (S256).\n */\nexport function generatePKCE(): PKCEChallenge {\n const code_verifier = randomBytes(32).toString('base64url');\n const code_challenge = createHash('sha256').update(code_verifier).digest('base64url');\n return { code_verifier, code_challenge };\n}\n\n/**\n * Generate a random state parameter for CSRF protection.\n */\nexport function generateState(): string {\n return randomBytes(16).toString('base64url');\n}\n\n/**\n * Build the OAuth authorization URL.\n */\nexport function buildAuthorizeUrl(params: {\n platformUrl: string;\n clientId: string;\n redirectUri: string;\n codeChallenge: string;\n state: string;\n scopes: string;\n}): string {\n const url = new URL(`${params.platformUrl}/api/oauth/v1/authorize`);\n url.searchParams.set('client_id', params.clientId);\n url.searchParams.set('redirect_uri', params.redirectUri);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('scope', params.scopes);\n url.searchParams.set('code_challenge', params.codeChallenge);\n url.searchParams.set('code_challenge_method', 'S256');\n url.searchParams.set('state', params.state);\n return url.toString();\n}\n\n/**\n * Exchange authorization code for tokens via the token endpoint.\n */\nexport async function exchangeCodeForTokens(params: {\n platformUrl: string;\n code: string;\n redirectUri: string;\n clientId: string;\n codeVerifier: string;\n}): Promise<{ access_token: string; refresh_token: string; expires_in: number; scope: string }> {\n const tokenUrl = `${params.platformUrl}/api/oauth/v1/token`;\n let res: Response;\n try {\n res = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'authorization_code',\n code: params.code,\n redirect_uri: params.redirectUri,\n client_id: params.clientId,\n code_verifier: params.codeVerifier,\n }),\n });\n } catch (err) {\n throw new Error(`Token exchange failed — ${formatFetchError(err, tokenUrl)}`, { cause: err });\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error_description?: string; error?: string };\n throw new Error(err.error_description ?? err.error ?? `Token exchange failed (HTTP ${res.status})`);\n }\n\n return await res.json() as { access_token: string; refresh_token: string; expires_in: number; scope: string };\n}\n\n/**\n * Refresh an OAuth access token using a refresh token.\n */\nexport async function refreshOAuthToken(params: {\n platformUrl: string;\n refreshToken: string;\n clientId: string;\n}): Promise<{ access_token: string; refresh_token?: string; expires_in: number }> {\n const tokenUrl = `${params.platformUrl}/api/oauth/v1/token`;\n let res: Response;\n try {\n res = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: params.refreshToken,\n client_id: params.clientId,\n }),\n });\n } catch (err) {\n throw new Error(`Token refresh failed — ${formatFetchError(err, tokenUrl)}`, { cause: err });\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error_description?: string; error?: string };\n throw new Error(err.error_description ?? err.error ?? `Token refresh failed (HTTP ${res.status})`);\n }\n\n return await res.json() as { access_token: string; refresh_token?: string; expires_in: number };\n}\n\n/**\n * Start a local HTTP server to receive the OAuth authorization code callback.\n */\nexport function startCallbackServer(): Promise<{\n port: number;\n result: Promise<OAuthCallbackResult>;\n close: () => void;\n}> {\n return new Promise((resolveServer) => {\n let resolveResult: (value: OAuthCallbackResult) => void;\n let rejectResult: (reason: Error) => void;\n\n const resultPromise = new Promise<OAuthCallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = 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 state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n const desc = url.searchParams.get('error_description') ?? error;\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<html><body><h2>Authentication failed</h2><p>${desc}</p><p>You can close this window.</p></body></html>`);\n rejectResult!(new Error(desc));\n return;\n }\n\n if (!code || !state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Invalid callback</h2><p>Missing authorization code.</p></body></html>');\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication successful!</h2><p>You can close this window and return to the terminal.</p></body></html>');\n resolveResult!({ code, state });\n } else {\n res.writeHead(404);\n res.end('Not found');\n }\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address();\n const port = typeof addr === 'object' ? addr!.port : 0;\n resolveServer({\n port,\n result: resultPromise,\n close: () => { server.close(); server.closeAllConnections(); },\n });\n });\n\n // Timeout after 5 minutes (unref so it doesn't keep the process alive)\n setTimeout(() => {\n rejectResult!(new Error('Authentication timed out. Please try again.'));\n server.close();\n }, 5 * 60 * 1000).unref();\n });\n}\n\n/**\n * Perform the full OAuth PKCE login flow:\n * generate PKCE + state, start callback server, open browser, exchange code, save credentials.\n * Returns the stored credentials on success.\n */\nexport async function performOAuthLogin(apiUrl?: string): Promise<StoredCredentials> {\n const platformUrl = getPlatformApiUrl(apiUrl);\n const config = getGlobalConfig();\n const clientId = config.oauth_client_id ?? DEFAULT_CLIENT_ID;\n\n // 1. Generate PKCE and state\n const pkce = generatePKCE();\n const state = generateState();\n\n // 2. Start local callback server\n const { port, result, close } = await startCallbackServer();\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n\n // 3. Build authorization URL\n const authUrl = buildAuthorizeUrl({\n platformUrl,\n clientId,\n redirectUri,\n codeChallenge: pkce.code_challenge,\n state,\n scopes: OAUTH_SCOPES,\n });\n\n if (isInteractive) {\n clack.log.info('Opening browser for authentication...');\n clack.log.info(`If browser doesn't open, visit:\\n${authUrl}`);\n } else {\n // Non-TTY (agent shell): surface the URL prominently via stderr so it stays out of\n // any JSON stdout stream but is still visible to agents and humans.\n process.stderr.write(`\\nTo sign in, open this URL in your browser:\\n\\n ${pc.cyan(pc.underline(authUrl))}\\n\\n`);\n }\n\n // 4. Open browser (best effort — often works even from agent shells since we're on the same machine)\n try {\n const open = (await import('open')).default;\n await open(authUrl);\n } catch {\n if (isInteractive) clack.log.warn('Could not open browser. Please visit the URL above.');\n }\n\n // 5. Wait for callback — use clack spinner only in TTY (non-TTY spinner renders garbage)\n const s = isInteractive ? clack.spinner() : null;\n s?.start('Waiting for authentication...');\n if (!isInteractive) process.stderr.write('Waiting for authentication...\\n');\n\n try {\n const callbackResult = await result;\n close();\n\n // Verify state\n if (callbackResult.state !== state) {\n s?.stop('Authentication failed');\n throw new Error('State mismatch. Possible CSRF attack.');\n }\n\n // 6. Exchange code for tokens\n s?.message('Exchanging authorization code...');\n const tokens = await exchangeCodeForTokens({\n platformUrl,\n code: callbackResult.code,\n redirectUri,\n clientId,\n codeVerifier: pkce.code_verifier,\n });\n\n // 7. Save credentials and fetch profile\n const creds: StoredCredentials = {\n access_token: tokens.access_token,\n refresh_token: tokens.refresh_token,\n user: { id: '', name: '', email: '', avatar_url: null, email_verified: true },\n };\n saveCredentials(creds);\n\n try {\n const profile = await getProfile(apiUrl);\n creds.user = profile;\n saveCredentials(creds);\n s?.stop(`Authenticated as ${profile.email}`);\n if (!isInteractive) process.stderr.write(`Authenticated as ${profile.email}\\n`);\n } catch {\n s?.stop('Authenticated successfully');\n if (!isInteractive) process.stderr.write('Authenticated successfully\\n');\n }\n\n return creds;\n } catch (err) {\n close();\n s?.stop('Authentication failed');\n if (!isInteractive) process.stderr.write('Authentication failed\\n');\n throw err;\n }\n}\n","import { getCredentials, getGlobalConfig, getPlatformApiUrl, saveCredentials, getProjectConfig, FAKE_PROJECT_ID } from './config.js';\nimport { AuthError } from './errors.js';\nimport { refreshOAuthToken, DEFAULT_CLIENT_ID, performOAuthLogin } from './auth.js';\nimport * as clack from '@clack/prompts';\nimport * as prompts from './prompts.js';\nimport type { StoredCredentials } from '../types.js';\n\n/** True if stored credentials represent a PAT-based login (refresh_token is a uak_ token). */\nexport function isPatLogin(creds: StoredCredentials | null | undefined): boolean {\n return creds?.refresh_token?.startsWith('uak_') ?? false;\n}\n\nexport async function requireAuth(apiUrl?: string, allowOssBypass = true): Promise<StoredCredentials> {\n const projConfig = getProjectConfig();\n if (allowOssBypass && projConfig?.project_id === FAKE_PROJECT_ID) {\n return {\n access_token: 'oss-token',\n refresh_token: 'oss-refresh',\n user: {\n id: 'oss-user',\n name: 'OSS User',\n email: 'oss@insforge.local',\n avatar_url: null,\n email_verified: true,\n },\n };\n }\n\n const creds = getCredentials();\n if (creds && creds.access_token) return creds;\n\n // PAT session with an expired/empty access_token: silently re-exchange\n // instead of prompting for browser OAuth.\n if (isPatLogin(creds)) {\n await refreshAccessToken(apiUrl);\n return getCredentials()!;\n }\n\n clack.log.info('You need to log in to continue.');\n\n for (;;) {\n try {\n return await performOAuthLogin(apiUrl);\n } catch (err) {\n if (!process.stdout.isTTY) throw err;\n\n const msg = err instanceof Error ? err.message : 'Unknown error';\n clack.log.error(`Login failed: ${msg}`);\n\n const retry = await prompts.confirm({ message: 'Would you like to try again?' });\n if (prompts.isCancel(retry) || !retry) {\n throw new AuthError('Authentication required. Run `npx @insforge/cli login` to authenticate.');\n }\n }\n }\n}\n\nexport async function refreshAccessToken(apiUrl?: string): Promise<string> {\n const creds = getCredentials();\n if (!creds) {\n throw new AuthError('Not logged in. Run `npx @insforge/cli login` first.');\n }\n\n const platformUrl = getPlatformApiUrl(apiUrl);\n\n // PAT branch: re-exchange the stored uak_ for a fresh JWT.\n if (isPatLogin(creds)) {\n let res: Response;\n try {\n res = await fetch(`${platformUrl}/auth/v1/exchange-api-key`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey: creds.refresh_token }),\n });\n } catch {\n // Background refresh path — surface a network error clearly.\n throw new AuthError(\n `Unable to reach auth server at ${platformUrl}. Check your network connection.`\n );\n }\n if (!res.ok) {\n // Auth failures (401/403/404) mean the PAT is actually bad — ask the user\n // to rotate. Everything else (5xx, 429, gateway errors) is transient and\n // shouldn't instruct the user to rotate a healthy key.\n if (res.status === 401 || res.status === 403 || res.status === 404) {\n throw new AuthError(\n 'API key is invalid or revoked. Run `npx @insforge/cli login --user-api-key <new-key>` again.'\n );\n }\n throw new AuthError(\n `Auth server returned HTTP ${res.status} while refreshing session. Please retry shortly.`\n );\n }\n const data = (await res.json().catch(() => ({}))) as { token?: unknown };\n if (typeof data.token !== 'string' || data.token.length === 0) {\n throw new AuthError('Exchange endpoint returned an invalid response (missing token).');\n }\n saveCredentials({ ...creds, access_token: data.token });\n return data.token;\n }\n\n if (!creds.refresh_token) {\n throw new AuthError('Refresh token not found. Run `npx @insforge/cli login` again.');\n }\n\n const config = getGlobalConfig();\n const clientId = config.oauth_client_id ?? DEFAULT_CLIENT_ID;\n\n try {\n const data = await refreshOAuthToken({\n platformUrl,\n refreshToken: creds.refresh_token,\n clientId,\n });\n\n const updated: StoredCredentials = {\n ...creds,\n access_token: data.access_token,\n // Update refresh token if rotated\n refresh_token: data.refresh_token ?? creds.refresh_token,\n };\n saveCredentials(updated);\n return data.access_token;\n } catch {\n // Token refresh failed — try re-authenticating interactively\n if (process.stdout.isTTY) {\n clack.log.warn('Session expired. Please log in again.');\n const newCreds = await performOAuthLogin(apiUrl);\n return newCreds.access_token;\n }\n throw new AuthError('Failed to refresh token. Run `npx @insforge/cli login` again.');\n }\n}\n","import { getAccessToken, getPlatformApiUrl } from '../config.js';\nimport { AuthError, CLIError, formatFetchError } from '../errors.js';\nimport { refreshAccessToken } from '../credentials.js';\nimport type {\n ApiKeyResponse,\n Branch,\n BranchMode,\n DiffResult,\n LoginResponse,\n MergeConflictResponse,\n MergeExecuteResponse,\n Organization,\n Project,\n User,\n} from '../../types.js';\n\nexport interface PlatformFetchOptions extends RequestInit {\n /**\n * HTTP status codes that should be returned to the caller instead of\n * thrown as CLIError. The 401-refresh path is unaffected. Use when the\n * caller wants to render a structured error body (e.g. merge 409).\n */\n passThroughStatuses?: number[];\n}\n\nexport async function platformFetch(\n path: string,\n options: PlatformFetchOptions = {},\n apiUrl?: string,\n): Promise<Response> {\n const { passThroughStatuses, ...fetchOptions } = options;\n const baseUrl = getPlatformApiUrl(apiUrl);\n const token = getAccessToken();\n if (!token) {\n throw new AuthError();\n }\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n ...(fetchOptions.headers as Record<string, string> ?? {}),\n };\n\n const fullUrl = `${baseUrl}${path}`;\n if (process.env.INSFORGE_DEBUG) {\n console.error(`[DEBUG] ${fetchOptions.method ?? 'GET'} ${fullUrl}`);\n console.error(`[DEBUG] Headers: ${JSON.stringify(headers, null, 2)}`);\n if (fetchOptions.body) {\n console.error(`[DEBUG] Body: ${typeof fetchOptions.body === 'string' ? fetchOptions.body : JSON.stringify(fetchOptions.body)}`);\n }\n }\n\n let res: Response;\n try {\n res = await fetch(fullUrl, { ...fetchOptions, headers });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n\n // Auto-refresh on 401\n if (res.status === 401) {\n const newToken = await refreshAccessToken(apiUrl);\n headers.Authorization = `Bearer ${newToken}`;\n let retryRes: Response;\n try {\n retryRes = await fetch(fullUrl, { ...fetchOptions, headers });\n } catch (err) {\n throw new CLIError(formatFetchError(err, fullUrl));\n }\n if (passThroughStatuses?.includes(retryRes.status)) {\n return retryRes;\n }\n if (!retryRes.ok) {\n const err = await retryRes.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Request failed: ${retryRes.status}`, retryRes.status === 403 ? 5 : 1);\n }\n return retryRes;\n }\n\n if (passThroughStatuses?.includes(res.status)) {\n return res;\n }\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string; message?: string };\n const msg = err.message ? `${err.error ?? res.status}: ${err.message}` : (err.error ?? `Request failed: ${res.status}`);\n throw new CLIError(msg, res.status === 403 ? 5 : 1);\n }\n\n return res;\n}\n\n// --- Auth ---\n\nexport async function login(email: string, password: string, apiUrl?: string): Promise<LoginResponse & { _refreshToken?: string }> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const res = await fetch(`${baseUrl}/auth/v1/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new AuthError(err.error ?? 'Login failed. Check your email and password.');\n }\n\n // Extract refresh token from Set-Cookie header\n const setCookie = res.headers.get('set-cookie') ?? '';\n const refreshTokenMatch = setCookie.match(/refreshToken=([^;]+)/);\n const data = (await res.json()) as LoginResponse;\n\n return {\n ...data,\n // Attach refresh token to the response for storage\n _refreshToken: refreshTokenMatch?.[1],\n } as LoginResponse & { _refreshToken?: string };\n}\n\nexport async function getProfile(apiUrl?: string): Promise<User> {\n const res = await platformFetch('/auth/v1/profile', {}, apiUrl);\n const data = await res.json() as { user?: User };\n return data.user ?? (data as unknown as User);\n}\n\n// --- Organizations ---\n\nexport async function listOrganizations(apiUrl?: string): Promise<Organization[]> {\n const res = await platformFetch('/organizations/v1', {}, apiUrl);\n const data = await res.json() as { organizations?: Organization[] };\n return data.organizations ?? (data as unknown as Organization[]);\n}\n\n// --- Projects ---\n\nexport async function listProjects(orgId: string, apiUrl?: string): Promise<Project[]> {\n const res = await platformFetch(`/organizations/v1/${orgId}/projects`, {}, apiUrl);\n const data = await res.json() as { projects?: Project[] };\n return data.projects ?? (data as unknown as Project[]);\n}\n\nexport async function getProject(projectId: string, apiUrl?: string): Promise<Project> {\n const res = await platformFetch(`/projects/v1/${projectId}`, {}, apiUrl);\n const data = await res.json() as { project?: Project };\n return data.project ?? (data as unknown as Project);\n}\n\nexport async function getProjectApiKey(projectId: string, apiUrl?: string): Promise<string> {\n const res = await platformFetch(`/projects/v1/${projectId}/access-api-key`, {}, apiUrl);\n const data = (await res.json()) as ApiKeyResponse;\n return data.access_api_key;\n}\n\nexport async function reportAgentConnected(\n payload: { project_id?: string; app_key?: string },\n apiUrl?: string,\n): Promise<void> {\n const baseUrl = getPlatformApiUrl(apiUrl);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n const token = getAccessToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n await fetch(`${baseUrl}/tracking/v1/agent-connected`, {\n method: 'POST',\n headers,\n body: JSON.stringify({ ...payload, client: 'cli' }),\n });\n}\n\nexport interface DiagnosticRequest {\n project_id: string;\n question: string;\n context: {\n context_version: string;\n metrics?: unknown;\n advisor?: unknown;\n db?: unknown;\n logs?: unknown;\n client_info?: {\n cli_version?: string;\n node_version?: string;\n os?: string;\n };\n };\n}\n\nexport interface DiagnosticSSEEvent {\n type: 'delta' | 'tool_call' | 'tool_result' | 'done' | 'error';\n data: Record<string, unknown>;\n}\n\nexport type DiagnosticEventHandler = (event: DiagnosticSSEEvent) => void;\n\n/**\n * Stream diagnostic analysis via SSE. Calls `onEvent` for each SSE event.\n * Returns the raw Response so the caller can handle errors before streaming.\n */\nexport async function streamDiagnosticAnalysis(\n payload: DiagnosticRequest,\n onEvent: DiagnosticEventHandler,\n apiUrl?: string,\n): Promise<void> {\n const res = await platformFetch('/diagnostic/v1/analyze', {\n method: 'POST',\n body: JSON.stringify(payload),\n }, apiUrl);\n\n const body = res.body;\n if (!body) throw new CLIError('No response body from diagnostic API.');\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let currentEvent: DiagnosticSSEEvent['type'] | null = 'delta';\n\n const VALID_EVENTS = new Set<string>(['delta', 'tool_call', 'tool_result', 'done', 'error']);\n\n const processLine = (line: string): void => {\n if (line.startsWith('event:')) {\n const evt = line.slice(6).trim();\n currentEvent = VALID_EVENTS.has(evt) ? evt as DiagnosticSSEEvent['type'] : null;\n } else if (line.startsWith('data:')) {\n if (!currentEvent) return;\n const raw = line.slice(5).trim();\n if (!raw) return;\n try {\n const data = JSON.parse(raw) as Record<string, unknown>;\n onEvent({ type: currentEvent, data });\n } catch {\n // skip malformed JSON\n }\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n processLine(line);\n }\n }\n\n // Flush remaining bytes from multi-byte sequences\n buffer += decoder.decode();\n if (buffer.trim()) {\n processLine(buffer);\n }\n}\n\nexport async function rateDiagnosticSession(\n sessionId: string,\n rating: 'helpful' | 'not_helpful' | 'incorrect',\n comment?: string,\n apiUrl?: string,\n): Promise<void> {\n const body: Record<string, string> = { rating };\n if (comment) body.comment = comment;\n await platformFetch(`/diagnostic/v1/sessions/${sessionId}/rating`, {\n method: 'POST',\n body: JSON.stringify(body),\n }, apiUrl);\n}\n\nexport async function createProject(\n orgId: string,\n name: string,\n region?: string,\n apiUrl?: string,\n): Promise<Project> {\n const body: Record<string, string> = { name };\n if (region) body.region = region;\n\n const res = await platformFetch(`/organizations/v1/${orgId}/projects`, {\n method: 'POST',\n body: JSON.stringify(body),\n }, apiUrl);\n const data = await res.json() as { project?: Project };\n return data.project ?? (data as unknown as Project);\n}\n\n// --- Branching ---\n\nexport async function createBranchApi(\n parentProjectId: string,\n body: { mode: BranchMode; name: string },\n apiUrl?: string,\n): Promise<Branch> {\n const res = await platformFetch(`/projects/v1/${parentProjectId}/branches`, {\n method: 'POST',\n body: JSON.stringify(body),\n }, apiUrl);\n const data = await res.json() as { branch: Branch };\n return data.branch;\n}\n\nexport async function listBranchesApi(parentProjectId: string, apiUrl?: string): Promise<Branch[]> {\n const res = await platformFetch(`/projects/v1/${parentProjectId}/branches`, {}, apiUrl);\n const data = await res.json() as { data?: Branch[] };\n return data.data ?? [];\n}\n\nexport async function getBranchApi(branchId: string, apiUrl?: string): Promise<Branch> {\n const res = await platformFetch(`/projects/v1/branches/${branchId}`, {}, apiUrl);\n const data = await res.json() as { branch: Branch };\n return data.branch;\n}\n\nexport async function deleteBranchApi(branchId: string, apiUrl?: string): Promise<void> {\n await platformFetch(`/projects/v1/branches/${branchId}`, { method: 'DELETE' }, apiUrl);\n}\n\n/**\n * Trigger an async branch reset. Backend transitions branch_state to\n * 'resetting', kicks off pg_restore from the T0 backup, and returns 202\n * with the post-transition row. Callers should poll getBranchApi until\n * branch_state goes back to 'ready'.\n */\nexport async function resetBranchApi(branchId: string, apiUrl?: string): Promise<Branch> {\n const res = await platformFetch(\n `/projects/v1/branches/${branchId}/reset`,\n { method: 'POST' },\n apiUrl,\n );\n const data = await res.json() as { branch: Branch };\n return data.branch;\n}\n\nexport async function mergeBranchDryRunApi(branchId: string, apiUrl?: string): Promise<DiffResult> {\n const res = await platformFetch(\n `/projects/v1/branches/${branchId}/merge?dryRun=true`,\n { method: 'POST' },\n apiUrl,\n );\n return await res.json() as DiffResult;\n}\n\n/**\n * Merge execute. Returns the success body on clean merge, or the conflict\n * body on 409. The 409 status is passed through platformFetch so callers\n * can render the diff/conflict structure directly while still inheriting\n * the auto-401-refresh and debug logging behavior.\n */\nexport async function mergeBranchExecuteApi(\n branchId: string,\n apiUrl?: string,\n): Promise<{ ok: true; result: MergeExecuteResponse } | { ok: false; conflict: MergeConflictResponse }> {\n const res = await platformFetch(\n `/projects/v1/branches/${branchId}/merge`,\n { method: 'POST', passThroughStatuses: [409] },\n apiUrl,\n );\n if (res.status === 409) {\n return { ok: false, conflict: await res.json() as MergeConflictResponse };\n }\n return { ok: true, result: await res.json() as MergeExecuteResponse };\n}\n\n","import Table from 'cli-table3';\n\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function outputTable(headers: string[], rows: string[][]): void {\n const table = new Table({\n head: headers,\n style: { head: ['cyan'] },\n });\n for (const row of rows) {\n table.push(row);\n }\n console.log(table.toString());\n}\n\nexport function outputSuccess(message: string): void {\n console.log(`✓ ${message}`);\n}\n\nexport function outputInfo(message: string): void {\n console.log(message);\n}\n","import type { Command } from 'commander';\nimport { clearCredentials } from '../lib/config.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputSuccess, outputJson } from '../lib/output.js';\n\nexport function registerLogoutCommand(program: Command): void {\n program\n .command('logout')\n .description('Log out from InsForge platform')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n clearCredentials();\n if (json) {\n outputJson({ success: true, message: 'Logged out successfully' });\n } else {\n outputSuccess('Logged out successfully.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getProfile } from '../lib/api/platform.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputInfo } from '../lib/output.js';\nimport { requireAuth } from '../lib/credentials.js';\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Show current authenticated user')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const profile = await getProfile(apiUrl);\n\n if (json) {\n outputJson(profile);\n } else {\n outputInfo(`Logged in as: ${profile.email ?? profile.name}`);\n if (profile.name) outputInfo(`Name: ${profile.name}`);\n if (profile.id) outputInfo(`ID: ${profile.id}`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listOrganizations } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerOrgsCommands(orgsCmd: Command): void {\n orgsCmd\n .command('list')\n .description('List all organizations')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const orgs = await listOrganizations(apiUrl);\n\n if (json) {\n outputJson(orgs);\n } else {\n if (!orgs.length) {\n console.log('No organizations found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Type'],\n orgs.map((o) => [\n o.id,\n o.name,\n o.type ?? '-',\n ]),\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { listOrganizations, listProjects } from '../../lib/api/platform.js';\nimport { getGlobalConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerProjectsCommands(projectsCmd: Command): void {\n projectsCmd\n .command('list')\n .description('List all projects in an organization')\n .option('--org-id <id>', 'Organization ID (uses default if not specified)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n\n let orgId = opts.orgId ?? getGlobalConfig().default_org_id;\n\n if (!orgId) {\n // Try to auto-select if user has only one org\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found. Create one on the InsForge dashboard.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n } else if (!json) {\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) {\n process.exit(0);\n }\n orgId = selected;\n } else {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n }\n\n const projects = await listProjects(orgId, apiUrl);\n\n if (json) {\n outputJson(projects);\n } else {\n if (!projects.length) {\n console.log('No projects found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Region', 'Status', 'AppKey'],\n projects.map((p) => [p.id, p.name, p.region, p.status, p.appkey]),\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport { createBranchApi, getBranchApi } from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputInfo } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\nimport { runBranchSwitch } from './switch.js';\nimport type { Branch, BranchMode } from '../../types.js';\n\nconst POLL_INTERVAL_MS = 3_000;\nconst POLL_TIMEOUT_MS = 5 * 60 * 1_000;\n\nexport function registerBranchCreateCommand(branch: Command): void {\n branch\n .command('create <name>')\n .description('Create a branch from the currently linked project')\n .option('--mode <mode>', 'full | schema-only', 'full')\n .option('--no-switch', 'Do not auto-switch context after creation')\n .action(async (name: string, opts: { mode: string; switch: boolean }, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const project = getProjectConfig();\n if (!project) {\n throw new CLIError('No project linked. Run `insforge link` first.');\n }\n // Disallow nested branching at the CLI layer (cloud-backend rejects too,\n // but a clear local error saves a round-trip).\n if (project.branched_from) {\n throw new CLIError(\n \"This directory is currently switched to a branch. Run `insforge branch switch --parent` first, then create a new branch from the parent.\",\n );\n }\n if (opts.mode !== 'full' && opts.mode !== 'schema-only') {\n throw new CLIError(`Invalid --mode: ${opts.mode} (must be \"full\" or \"schema-only\")`);\n }\n const mode = opts.mode as BranchMode;\n\n // Single spinner spans the slow POST, provisioning poll, and the\n // optional auto-switch. The user sees continuous progress instead of a\n // 2-minute silent hang, and a switch failure is rendered with the same\n // red error frame as a create failure (no misleading \"ready\" line\n // before an error). JSON mode skips the spinner — `outputJson({ branch:\n // ready })` below remains the sole authoritative output.\n const spinner = !json ? clack.spinner() : null;\n let ready: Branch;\n // Tracks whether the branch reached `ready` state in the cloud — once\n // true, any later throw is a switch failure (local), not a creation\n // failure. Lets the catch render an accurate message instead of the\n // misleading \"creation failed\" line for an already-created branch.\n let provisioned = false;\n try {\n spinner?.start(`Creating branch '${name}'...`);\n const created = await createBranchApi(project.project_id, { mode, name }, apiUrl);\n captureEvent(project.project_id, 'cli_branch_create', {\n mode,\n parent_project_id: project.project_id,\n });\n spinner?.message(`Branch '${name}' created (appkey: ${created.appkey}). Provisioning...`);\n ready = await pollUntilReady(created.id, apiUrl, spinner);\n provisioned = ready.branch_state === 'ready';\n\n if (provisioned && opts.switch) {\n spinner?.message('Branch ready. Switching context...');\n // silent: true always — the spinner owns user-facing output, and\n // runBranchSwitch's outputSuccess would otherwise interleave with\n // the active spinner frame.\n await runBranchSwitch({ name, apiUrl, json, silent: true });\n spinner?.stop(`Branch '${name}' is ready and active`);\n } else if (provisioned) {\n spinner?.stop(`Branch '${name}' is ready`);\n } else {\n spinner?.stop(`Branch '${name}' is in '${ready.branch_state}' state`);\n }\n } catch (err) {\n if (provisioned) {\n spinner?.stop(\n `Branch '${name}' is ready, but switching context failed — run \\`insforge branch switch ${name}\\` to retry`,\n 1,\n );\n } else {\n spinner?.stop(`Branch '${name}' creation failed`, 1);\n }\n throw err;\n }\n\n if (json) {\n outputJson({ branch: ready });\n } else if (ready.branch_state === 'ready') {\n if (opts.switch) {\n outputInfo(\n '⚠ Re-source your dev server env (.env) to pick up the new INSFORGE_URL / ANON_KEY.',\n );\n }\n } else {\n outputInfo(\n `Branch '${name}' is still in '${ready.branch_state}' state. Run \\`insforge branch list\\` to check.`,\n );\n }\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\nasync function pollUntilReady(\n branchId: string,\n apiUrl: string | undefined,\n spinner: ReturnType<typeof clack.spinner> | null,\n): Promise<Branch> {\n const start = Date.now();\n let lastState = '';\n while (Date.now() - start < POLL_TIMEOUT_MS) {\n const branch = await getBranchApi(branchId, apiUrl);\n if (branch.branch_state === 'ready') return branch;\n if (branch.branch_state === 'deleted' || branch.branch_state === 'conflicted') {\n throw new CLIError(`Branch creation failed (state: ${branch.branch_state})`);\n }\n if (spinner && branch.branch_state !== lastState) {\n spinner.message(`Provisioning branch (state: ${branch.branch_state})...`);\n lastState = branch.branch_state;\n }\n await new Promise(r => setTimeout(r, POLL_INTERVAL_MS));\n }\n // Timed out — re-check terminal failure states so a state flip just before\n // the deadline is not silently reported as “still in state …”.\n const branch = await getBranchApi(branchId, apiUrl);\n if (branch.branch_state === 'deleted' || branch.branch_state === 'conflicted') {\n throw new CLIError(`Branch creation failed (state: ${branch.branch_state})`);\n }\n return branch;\n}\n","import { PostHog } from 'posthog-node';\nimport type { ProjectConfig } from '../types.js';\nimport { FAKE_PROJECT_ID } from './config.js';\n\nconst POSTHOG_API_KEY = process.env.POSTHOG_API_KEY;\nconst POSTHOG_HOST = process.env.POSTHOG_HOST || 'https://us.i.posthog.com';\n\nlet client: PostHog | null = null;\n\nfunction getClient(): PostHog | null {\n if (!POSTHOG_API_KEY) return null;\n if (!client) {\n client = new PostHog(POSTHOG_API_KEY, { host: POSTHOG_HOST });\n }\n return client;\n}\n\nexport function captureEvent(\n distinctId: string,\n event: string,\n properties?: Record<string, unknown>,\n): void {\n try {\n getClient()?.capture({ distinctId, event, properties });\n } catch {\n // analytics should never break the CLI\n }\n}\n\nexport function trackCommand(command: string, distinctId: string, properties?: Record<string, unknown>): void {\n captureEvent(distinctId, 'cli_command_invoked', {\n command,\n ...properties,\n });\n}\n\nexport function trackDiagnose(subcommand: string, config: ProjectConfig): void {\n captureEvent(config.project_id, 'cli_diagnose_invoked', {\n subcommand,\n project_id: config.project_id,\n project_name: config.project_name,\n org_id: config.org_id,\n region: config.region,\n oss_mode: config.project_id === FAKE_PROJECT_ID,\n });\n}\n\nexport function trackPayments(\n subcommand: string,\n config: ProjectConfig,\n properties?: Record<string, unknown>,\n): void {\n captureEvent(config.project_id, 'cli_payments_invoked', {\n subcommand,\n project_id: config.project_id,\n project_name: config.project_name,\n org_id: config.org_id,\n region: config.region,\n oss_mode: config.project_id === FAKE_PROJECT_ID,\n ...properties,\n });\n}\n\nexport async function shutdownAnalytics(): Promise<void> {\n try {\n if (client) await client.shutdown();\n } catch {\n // ignore\n }\n}\n","import type { Command } from 'commander';\nimport { copyFileSync, existsSync, unlinkSync } from 'node:fs';\nimport {\n getProjectConfig,\n saveProjectConfig,\n getProjectConfigFile,\n getParentBackupFile,\n buildOssHost,\n} from '../../lib/config.js';\nimport { listBranchesApi, getProjectApiKey } from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\n\nexport interface RunBranchSwitchOptions {\n name?: string;\n toParent?: boolean;\n apiUrl: string | undefined;\n json: boolean;\n /**\n * Suppress the success/JSON output from this function. Set when called as a\n * sub-step of another command (e.g. `branch create --switch`) so the caller\n * can emit a single, authoritative payload.\n */\n silent?: boolean;\n}\n\n/**\n * Public entry point: lets `branch create` chain into the same context-flip\n * logic without re-parsing through Commander.\n */\nexport async function runBranchSwitch(input: RunBranchSwitchOptions): Promise<void> {\n await requireAuth(input.apiUrl);\n const current = getProjectConfig();\n if (!current) {\n throw new CLIError('No project linked. Run `insforge link` first.');\n }\n\n if (input.toParent && input.name) {\n throw new CLIError('Pass either a branch name or --parent, not both.');\n }\n\n const projectFile = getProjectConfigFile();\n const parentBackup = getParentBackupFile();\n\n if (input.toParent) {\n if (!existsSync(parentBackup)) {\n throw new CLIError(\n 'No parent backup found. Re-link the directory with `insforge link --project-id <parent>`.',\n );\n }\n copyFileSync(parentBackup, projectFile);\n unlinkSync(parentBackup);\n captureEvent(current.project_id, 'cli_branch_switch', { direction: 'to_parent' });\n if (!input.silent) {\n if (input.json) {\n outputJson({ switched: 'parent' });\n } else {\n outputSuccess('Switched back to parent.');\n }\n }\n return;\n }\n\n if (!input.name) {\n throw new CLIError('Branch name required (or pass --parent).');\n }\n\n // Resolve branch by name within the parent's branch list. If we're already on\n // a branch, list siblings of the original parent.\n const parentId = current.branched_from?.project_id ?? current.project_id;\n const branches = await listBranchesApi(parentId, input.apiUrl);\n const target = branches.find(b => b.name === input.name);\n if (!target) {\n throw new CLIError(`Branch '${input.name}' not found.`);\n }\n if (target.branch_state !== 'ready') {\n throw new CLIError(\n `Branch '${input.name}' is in state '${target.branch_state}', cannot switch.`,\n );\n }\n\n // First time leaving the parent: snapshot the current project.json so\n // `--parent` can restore it. Subsequent branch -> branch switches keep\n // the original parent backup unchanged.\n if (!existsSync(parentBackup)) {\n copyFileSync(projectFile, parentBackup);\n }\n\n const apiKey = await getProjectApiKey(target.id, input.apiUrl);\n const ossHost = buildOssHost(target.appkey, target.region);\n const branched_from = current.branched_from ?? {\n project_id: current.project_id,\n project_name: current.project_name,\n };\n\n saveProjectConfig({\n project_id: target.id,\n project_name: target.name,\n org_id: target.organization_id,\n appkey: target.appkey,\n region: target.region,\n api_key: apiKey,\n oss_host: ossHost,\n branched_from,\n });\n\n captureEvent(parentId, 'cli_branch_switch', { direction: 'to_branch' });\n\n if (!input.silent) {\n if (input.json) {\n outputJson({ switched: 'branch', branch_id: target.id });\n } else {\n outputSuccess(`Switched to branch '${target.name}'.`);\n }\n }\n}\n\nexport function registerBranchSwitchCommand(branch: Command): void {\n branch\n .command('switch [name]')\n .description(\"Switch this directory's context to a branch (or back with --parent)\")\n .option('--parent', 'Switch back to the parent project')\n .action(async (name: string | undefined, opts: { parent?: boolean }, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await runBranchSwitch({ name, toParent: opts.parent, apiUrl, json });\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listBranchesApi } from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable, outputInfo } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\n\nexport function registerBranchListCommand(branch: Command): void {\n branch\n .command('list')\n .description('List branches of the currently linked project')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const project = getProjectConfig();\n if (!project) {\n throw new CLIError('No project linked. Run `insforge link` first.');\n }\n // If currently switched onto a branch, list siblings of its parent.\n const parentId = project.branched_from?.project_id ?? project.project_id;\n const branches = await listBranchesApi(parentId, apiUrl);\n captureEvent(parentId, 'cli_branch_list', { count: branches.length });\n\n if (json) {\n outputJson({ data: branches });\n return;\n }\n if (branches.length === 0) {\n outputInfo('No branches.');\n return;\n }\n const currentBranchId = project.branched_from ? project.project_id : null;\n const rows = branches.map(b => [\n b.id === currentBranchId ? '*' : ' ',\n b.name,\n b.branch_state,\n b.branch_metadata?.mode ?? '?',\n new Date(b.branch_created_at).toLocaleString(),\n ]);\n outputTable(['', 'Name', 'State', 'Mode', 'Created'], rows);\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { writeFileSync } from 'node:fs';\nimport * as clack from '@clack/prompts';\nimport {\n listBranchesApi,\n mergeBranchDryRunApi,\n mergeBranchExecuteApi,\n} from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\n\ninterface MergeOptions {\n dryRun?: boolean;\n saveSql?: string;\n}\n\nexport function registerBranchMergeCommand(branch: Command): void {\n branch\n .command('merge <name>')\n .description('Merge a branch back to its parent project')\n .option('--dry-run', 'Compute the diff and print rendered SQL; do not apply')\n .option('--save-sql <path>', 'Write rendered SQL preview to a file')\n .action(async (name: string, opts: MergeOptions, cmd) => {\n const { json, apiUrl, yes } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const project = getProjectConfig();\n if (!project) throw new CLIError('No project linked. Run `insforge link` first.');\n\n // Resolve branch by name. parent_id flips depending on whether the\n // directory is currently on a branch.\n const parentId = project.branched_from?.project_id ?? project.project_id;\n const branches = await listBranchesApi(parentId, apiUrl);\n const target = branches.find(b => b.name === name);\n if (!target) throw new CLIError(`Branch '${name}' not found.`);\n\n // Always compute diff first (cheap, gives the user a preview).\n const diff = await mergeBranchDryRunApi(target.id, apiUrl);\n\n if (opts.saveSql) {\n writeFileSync(opts.saveSql, diff.rendered_sql);\n if (!json) outputInfo(`SQL preview saved to ${opts.saveSql}`);\n }\n\n if (!json) {\n console.log(diff.rendered_sql);\n console.log();\n outputInfo(\n `${diff.summary.added} added, ${diff.summary.modified} modified, ${diff.summary.conflicts} conflict(s).`,\n );\n }\n\n if (diff.summary.conflicts > 0) {\n captureEvent(parentId, 'cli_branch_merge_conflict', {\n conflicts: diff.summary.conflicts,\n });\n if (json) {\n outputJson({\n diff,\n applied: false,\n dryRun: !!opts.dryRun,\n error: 'merge_conflict',\n });\n } else {\n outputInfo('');\n outputInfo('Merge blocked: resolve conflicts before retrying.');\n for (const c of diff.conflicts) {\n outputInfo(` - ${c.schema}.${c.object} [${c.type}] — ${c.hint}`);\n }\n }\n process.exit(2);\n }\n\n if (opts.dryRun) {\n captureEvent(parentId, 'cli_branch_merge', {\n dry_run: true,\n conflicts: 0,\n applied: false,\n });\n if (json) {\n outputJson({ diff, applied: false, dryRun: true });\n }\n return;\n }\n\n // Confirm before executing (unless --yes or --json).\n if (!yes && !json) {\n const parentLabel = project.branched_from?.project_name ?? project.project_name;\n const confirmed = await clack.confirm({\n message: `Apply this merge to parent project '${parentLabel}'?`,\n });\n if (clack.isCancel(confirmed) || !confirmed) {\n outputInfo('Merge cancelled.');\n return;\n }\n }\n\n const result = await mergeBranchExecuteApi(target.id, apiUrl);\n if (!result.ok) {\n // Race: dry-run was clean but execute saw conflicts (parent moved).\n captureEvent(parentId, 'cli_branch_merge_conflict', {\n conflicts: result.conflict.diff.summary.conflicts,\n });\n if (json) {\n outputJson({\n diff: result.conflict.diff,\n applied: false,\n dryRun: false,\n error: 'merge_conflict',\n });\n } else {\n outputInfo('Merge blocked by a conflict that appeared between dry-run and apply:');\n for (const c of result.conflict.diff.conflicts) {\n outputInfo(` - ${c.schema}.${c.object} [${c.type}] — ${c.hint}`);\n }\n }\n process.exit(2);\n }\n\n captureEvent(parentId, 'cli_branch_merge', {\n dry_run: false,\n conflicts: 0,\n applied: true,\n });\n\n if (json) {\n outputJson({ ...result.result, diff, applied: true, dryRun: false });\n } else {\n outputSuccess(`Merged. Branch '${name}' is now in 'merged' state.`);\n outputInfo('⚠ Reminder: redeploy edge functions, website, and compute as needed.');\n }\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport { listBranchesApi, resetBranchApi, getBranchApi } from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\nimport type { Branch } from '../../types.js';\n\nconst POLL_INTERVAL_MS = 3_000;\n// Reset re-runs pg_restore in-place, plus (for schema-only) the truncate\n// finalize. Same order of magnitude as create — minutes for a small DB,\n// longer for a populated one. Match create's 5-min budget.\nconst POLL_TIMEOUT_MS = 5 * 60 * 1_000;\n\nexport function registerBranchResetCommand(branch: Command): void {\n branch\n .command('reset <name>')\n .description(\"Reset a branch's database back to T0 (the parent snapshot at branch creation)\")\n .action(async (name: string, _opts: Record<string, never>, cmd) => {\n const { json, apiUrl, yes } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const project = getProjectConfig();\n if (!project) throw new CLIError('No project linked. Run `insforge link` first.');\n\n // Resolve branch by name. parent_id flips depending on whether the\n // directory is currently switched onto a branch.\n const parentId = project.branched_from?.project_id ?? project.project_id;\n const branches = await listBranchesApi(parentId, apiUrl);\n const target = branches.find(b => b.name === name);\n if (!target) throw new CLIError(`Branch '${name}' not found.`);\n\n if (target.branch_state !== 'ready' && target.branch_state !== 'merged') {\n throw new CLIError(\n `Branch '${name}' is in '${target.branch_state}' state; reset requires 'ready' or 'merged'.`,\n );\n }\n const entryState = target.branch_state;\n\n if (!yes && !json) {\n const confirmed = await clack.confirm({\n message:\n `Reset branch '${name}' back to T0? This wipes all schema/data/policy/function/migration changes made on the branch since creation.` +\n (entryState === 'merged'\n ? ' (Branch is currently merged — reset will reopen it for further work.)'\n : ''),\n });\n if (clack.isCancel(confirmed) || !confirmed) {\n outputInfo('Cancelled.');\n return;\n }\n }\n\n const initial = await resetBranchApi(target.id, apiUrl);\n captureEvent(parentId, 'cli_branch_reset', {\n entry_state: entryState,\n mode: target.branch_metadata?.mode,\n });\n\n if (!json) {\n outputSuccess(`Reset enqueued for branch '${name}'. Restoring T0…`);\n }\n\n const final = await pollUntilReady(target.id, apiUrl, !json, initial.branch_state);\n\n if (json) {\n outputJson({ branch: final });\n } else if (final.branch_state === 'ready') {\n outputSuccess(`Branch '${name}' is back to T0 and ready.`);\n outputInfo('⚠ Reminder: edge functions, website, and compute aren’t touched by reset; redeploy if needed.');\n } else {\n outputInfo(\n `Branch '${name}' is still in '${final.branch_state}' state. Run \\`insforge branch list\\` to check.`,\n );\n }\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\nasync function pollUntilReady(\n branchId: string,\n apiUrl: string | undefined,\n showProgress: boolean,\n startingState: string,\n): Promise<Branch> {\n const start = Date.now();\n let lastState = startingState;\n if (showProgress) outputInfo(` state: ${startingState}…`);\n while (Date.now() - start < POLL_TIMEOUT_MS) {\n const branch = await getBranchApi(branchId, apiUrl);\n // Reset always lands at ready (even when entry was merged) — see\n // backend BranchQueue.processResetFinalize. A bounce back to ready\n // OR merged is the rollback path; treat both as terminal so the user\n // sees the final state without a 5-minute wait.\n if (branch.branch_state === 'ready') return branch;\n if (branch.branch_state === 'merged') return branch;\n if (branch.branch_state === 'deleted' || branch.branch_state === 'conflicted') {\n throw new CLIError(`Branch reset failed (state: ${branch.branch_state})`);\n }\n if (showProgress && branch.branch_state !== lastState) {\n outputInfo(` state: ${branch.branch_state}…`);\n lastState = branch.branch_state;\n }\n await new Promise(r => setTimeout(r, POLL_INTERVAL_MS));\n }\n // Timed out — re-check terminal failure states so a state flip just before\n // the deadline is not silently reported as “still in state …”.\n const branch = await getBranchApi(branchId, apiUrl);\n if (branch.branch_state === 'deleted' || branch.branch_state === 'conflicted') {\n throw new CLIError(`Branch reset failed (state: ${branch.branch_state})`);\n }\n return branch;\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport { listBranchesApi, deleteBranchApi } from '../../lib/api/platform.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { captureEvent, shutdownAnalytics } from '../../lib/analytics.js';\nimport { runBranchSwitch } from './switch.js';\n\nexport function registerBranchDeleteCommand(branch: Command): void {\n branch\n .command('delete <name>')\n .description('Delete a branch')\n .action(async (name: string, _opts: Record<string, never>, cmd) => {\n const { json, apiUrl, yes } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const project = getProjectConfig();\n if (!project) throw new CLIError('No project linked. Run `insforge link` first.');\n\n const parentId = project.branched_from?.project_id ?? project.project_id;\n const branches = await listBranchesApi(parentId, apiUrl);\n const target = branches.find(b => b.name === name);\n if (!target) throw new CLIError(`Branch '${name}' not found.`);\n\n if (!yes && !json) {\n const confirmed = await clack.confirm({\n message: `Delete branch '${name}'? This terminates its EC2 instance.`,\n });\n if (clack.isCancel(confirmed) || !confirmed) {\n outputInfo('Cancelled.');\n return;\n }\n }\n\n await deleteBranchApi(target.id, apiUrl);\n captureEvent(parentId, 'cli_branch_delete', {});\n\n // If the directory is currently switched onto the deleted branch,\n // flip back to parent so subsequent commands don't operate on a\n // dead instance.\n const currentlyOnDeleted = project.project_id === target.id;\n if (currentlyOnDeleted) {\n try {\n // silent in JSON mode so we don't emit two JSON documents — the\n // single `outputJson({ deleted, ... })` below is authoritative.\n await runBranchSwitch({ toParent: true, apiUrl, json, silent: json });\n } catch (err) {\n // Non-fatal: the branch is gone, but we can at least tell the user.\n outputInfo(\n `Switched-to-parent failed (${(err as Error).message}). Run \\`insforge branch switch --parent\\` manually.`,\n );\n }\n }\n\n if (json) {\n outputJson({ deleted: true, branch_id: target.id, switched_back: currentlyOnDeleted });\n } else {\n outputSuccess(`Branch '${name}' deletion enqueued.`);\n if (currentlyOnDeleted) outputInfo('Switched back to parent.');\n }\n } catch (err) {\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { registerBranchCreateCommand } from './create.js';\nimport { registerBranchListCommand } from './list.js';\nimport { registerBranchSwitchCommand } from './switch.js';\nimport { registerBranchMergeCommand } from './merge.js';\nimport { registerBranchResetCommand } from './reset.js';\nimport { registerBranchDeleteCommand } from './delete.js';\n\nexport function registerBranchCommands(program: Command): void {\n const branch = program.command('branch').description('Manage backend branches');\n registerBranchCreateCommand(branch);\n registerBranchListCommand(branch);\n registerBranchSwitchCommand(branch);\n registerBranchMergeCommand(branch);\n registerBranchResetCommand(branch);\n registerBranchDeleteCommand(branch);\n}\n","import type { Command } from 'commander';\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport pc from 'picocolors';\nimport * as prompts from '../../lib/prompts.js';\nimport {\n listOrganizations,\n listProjects,\n getProject,\n getProjectApiKey,\n reportAgentConnected,\n} from '../../lib/api/platform.js';\nimport { getGlobalConfig, saveGlobalConfig, saveProjectConfig, getFrontendUrl, buildOssHost, FAKE_PROJECT_ID, FAKE_ORG_ID } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { installSkills, reportCliUsage } from '../../lib/skills.js';\nimport { applyAuthProvider, VALID_AUTH_PROVIDERS, type AuthProvider } from '../../auth-providers/apply.js';\nimport { captureEvent, trackCommand, shutdownAnalytics } from '../../lib/analytics.js';\nimport { downloadGitHubTemplate } from '../create.js';\nimport type { ProjectConfig } from '../../types.js';\n\nconst execAsync = promisify(exec);\n\nasync function runNpmInstall(startMessage = 'Installing dependencies...'): Promise<void> {\n const spinner = clack.spinner();\n spinner.start(startMessage);\n try {\n await execAsync('npm install', { cwd: process.cwd(), maxBuffer: 10 * 1024 * 1024 });\n spinner.stop('Dependencies installed');\n } catch (err) {\n spinner.stop('Failed to install dependencies');\n clack.log.warn(`npm install failed: ${(err as Error).message}`);\n clack.log.info('Run `npm install` manually to install dependencies.');\n }\n}\n\nexport function registerProjectLinkCommand(program: Command): void {\n program\n .command('link')\n .description('Link current directory to an InsForge project')\n .option('--project-id <id>', 'Project ID to link')\n .option('--org-id <id>', 'Organization ID')\n .option('--template <template>', 'Download a template after linking: react, nextjs, chatbot, crm, e-commerce, todo')\n .option('--auth <provider>', 'Wire a third-party auth provider into the chosen template (currently: better-auth)')\n .option('--api-base-url <url>', 'API Base URL for direct linking (OSS/Self-hosted)')\n .option('--api-key <key>', 'API Key for direct linking (OSS/Self-hosted)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n\n // Every template value accepted here is a directory in the InsForge\n // templates repo, so validation and the download call reference the\n // same single list.\n const validTemplates = ['react', 'nextjs', 'chatbot', 'crm', 'e-commerce', 'todo'];\n\n // --auth is a flag-only escape hatch (not in the interactive picker). It\n // composes onto whatever the link/template flow produces by overlaying\n // an auth-provider scaffold from CLI's bundled assets — no templates-repo\n // directory required.\n if (opts.auth && !VALID_AUTH_PROVIDERS.includes(opts.auth)) {\n throw new CLIError(`Invalid --auth \"${opts.auth}\". Valid: ${VALID_AUTH_PROVIDERS.join(', ')}`);\n }\n\n try {\n if (opts.template && !validTemplates.includes(opts.template)) {\n throw new CLIError(`Invalid template \"${opts.template}\". Valid options: ${validTemplates.join(', ')}`);\n }\n\n if (opts.apiBaseUrl || opts.apiKey) {\n try {\n if (!opts.apiBaseUrl || !opts.apiKey) {\n throw new CLIError('Both --api-base-url and --api-key must be provided together for direct linking.');\n }\n\n try {\n new URL(opts.apiBaseUrl);\n } catch {\n throw new CLIError('Invalid --api-base-url. Please provide a valid URL.');\n }\n\n // Direct OSS/Self-hosted linking bypasses OAuth\n const projectConfig: ProjectConfig = {\n project_id: FAKE_PROJECT_ID,\n project_name: 'oss-project',\n org_id: FAKE_ORG_ID,\n appkey: 'ossfkey',\n region: 'us-test',\n api_key: opts.apiKey,\n oss_host: opts.apiBaseUrl.replace(/\\/$/, ''), // remove trailing slash if any\n };\n\n const template = opts.template as string | undefined;\n\n // Template path: create a subdirectory, link inside it, download template,\n // install deps. Mirrors the OAuth template flow below.\n if (template) {\n const defaultDir = `insforge-${template}`;\n let dirName = defaultDir;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: defaultDir,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n const templateDir = path.resolve(process.cwd(), dirName);\n const dirExists = await fs.stat(templateDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(templateDir);\n process.chdir(templateDir);\n\n saveProjectConfig(projectConfig);\n\n if (json) {\n outputJson({\n success: true,\n project: { id: projectConfig.project_id, name: projectConfig.project_name, region: projectConfig.region },\n directory: dirName,\n template,\n });\n } else {\n outputSuccess(`Linked to direct project at ${projectConfig.oss_host}`);\n }\n\n captureEvent(FAKE_ORG_ID, 'template_selected', { template, source: 'link_direct' });\n\n await downloadGitHubTemplate(template, projectConfig, json);\n\n const templateDownloaded = await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null);\n\n // Overlay --auth scaffold BEFORE npm install so the overlay's\n // packageJsonPatch is in package.json by install time — otherwise\n // its new deps (better-auth, pg, jsonwebtoken, …) are listed but\n // never actually installed.\n if (opts.auth) {\n try {\n const result = await applyAuthProvider(opts.auth as AuthProvider, process.cwd(), projectConfig, json);\n if (!json) clack.log.success(`Wired in ${opts.auth}: ${result.written.length} new, ${result.overwritten.length} replaced`);\n } catch (err) {\n const msg = `Failed to apply --auth ${opts.auth}: ${(err as Error).message}`;\n if (json) console.error(JSON.stringify({ warning: msg }));\n else clack.log.warn(msg);\n }\n }\n\n if (templateDownloaded && !json) {\n await runNpmInstall();\n }\n\n await installSkills(json);\n trackCommand('link', 'oss-org', { direct: true, template });\n await reportCliUsage('cli.link_direct', true, 6, projectConfig);\n\n // Report agent-connected event (best-effort)\n try {\n const urlMatch = opts.apiBaseUrl.match(/^https?:\\/\\/([^.]+)\\.[^.]+\\.insforge\\.app/);\n if (urlMatch) {\n await reportAgentConnected({ app_key: urlMatch[1] }, apiUrl);\n }\n } catch { /* ignore */ }\n\n if (!json) {\n if (templateDownloaded) {\n const runCommand = `${pc.cyan('cd')} ${pc.green(dirName)} ${pc.dim('&&')} ${pc.cyan('npm run dev')}`;\n const steps = [\n `${pc.bold('1.')} ${runCommand}`,\n `${pc.bold('2.')} Open ${pc.cyan('Claude Code')} or ${pc.cyan('Cursor')} and prompt your agent to add more features`,\n ];\n clack.note(steps.join('\\n'), \"What's next\");\n } else {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n }\n }\n return;\n }\n\n // Non-template direct-link: save config in cwd and return.\n saveProjectConfig(projectConfig);\n\n if (json) {\n outputJson({ success: true, project: { id: projectConfig.project_id, name: projectConfig.project_name, region: projectConfig.region } });\n } else {\n outputSuccess(`Linked to direct project at ${projectConfig.oss_host}`);\n }\n\n // --auth without --template: overlay scaffold straight into cwd.\n // This is the \"add Better Auth to my existing project\" flow.\n if (opts.auth) {\n try {\n const result = await applyAuthProvider(opts.auth as AuthProvider, process.cwd(), projectConfig, json);\n if (!json) {\n clack.log.success(`Wired in ${opts.auth}: ${result.written.length} new, ${result.overwritten.length} replaced`);\n }\n // Re-install when the overlay patched package.json — otherwise\n // its new deps (better-auth, pg, jsonwebtoken, …) are listed\n // but never installed and `npm run setup` fails with\n // \"Cannot find package 'pg'\".\n if (result.packageJsonPatched && !json) {\n await runNpmInstall('Installing new dependencies...');\n }\n if (!json) clack.note(result.nextSteps, \"What's next\");\n } catch (err) {\n const msg = `Failed to apply --auth ${opts.auth}: ${(err as Error).message}`;\n if (json) console.error(JSON.stringify({ warning: msg }));\n else clack.log.warn(msg);\n }\n }\n\n trackCommand('link', 'oss-org', { direct: true });\n\n // Install agent skills\n await installSkills(json);\n await reportCliUsage('cli.link_direct', true, 6, projectConfig);\n\n // Report agent-connected event (best-effort)\n try {\n const urlMatch = opts.apiBaseUrl.match(/^https?:\\/\\/([^.]+)\\.[^.]+\\.insforge\\.app/);\n if (urlMatch) {\n await reportAgentConnected({ app_key: urlMatch[1] }, apiUrl);\n }\n } catch { /* ignore */ }\n return;\n } catch (err) {\n await reportCliUsage('cli.link_direct', false);\n await shutdownAnalytics();\n handleError(err, json);\n }\n }\n\n const creds = await requireAuth(apiUrl, false);\n\n let orgId = opts.orgId;\n let projectId = opts.projectId;\n\n // Show organization selection (auto-select if only one)\n if (!orgId && !projectId) {\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n if (!json) clack.log.info(`Using organization: ${orgs[0].name}`);\n } else {\n if (json) {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n orgId = selected;\n }\n }\n\n // Save default org\n const config = getGlobalConfig();\n config.default_org_id = orgId;\n saveGlobalConfig(config);\n\n // Select project if not specified\n if (!projectId) {\n const projects = await listProjects(orgId, apiUrl);\n if (projects.length === 0) {\n throw new CLIError('No projects found in this organization.');\n }\n if (json) {\n throw new CLIError('Specify --project-id in JSON mode.');\n }\n const selected = await prompts.select<string>({\n message: 'Select a project to link:',\n options: projects.map((p) => ({\n value: p.id,\n label: `${p.name} (${p.region}, ${p.status})`,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n projectId = selected;\n }\n\n // Fetch project details and API key\n let project;\n let apiKey;\n try {\n [project, apiKey] = await Promise.all([\n getProject(projectId, apiUrl),\n getProjectApiKey(projectId, apiUrl),\n ]);\n } catch (err) {\n if (err instanceof CLIError && (err.exitCode === 5 || err.exitCode === 4 || err.message.includes('not found'))) {\n const identity = creds.user?.email ?? creds.user?.name ?? 'unknown user';\n throw new CLIError(\n `No access to project ${projectId} as ${identity}. Double-check the project ID, or run \\`npx @insforge/cli logout\\` to switch accounts.`,\n 5,\n 'PERMISSION_DENIED',\n );\n }\n throw err;\n }\n\n const projectConfig: ProjectConfig = {\n project_id: project.id,\n project_name: project.name,\n org_id: project.organization_id,\n appkey: project.appkey,\n region: project.region,\n api_key: apiKey,\n oss_host: buildOssHost(project.appkey, project.region),\n };\n\n // Save config in cwd only if not using --template (template flow saves in subdirectory)\n if (!opts.template) {\n saveProjectConfig(projectConfig);\n }\n\n trackCommand('link', project.organization_id);\n\n if (json) {\n outputJson({ success: true, project: { id: project.id, name: project.name, region: project.region } });\n } else {\n outputSuccess(`Linked to project \"${project.name}\" (${project.appkey}.${project.region})`);\n }\n\n // Report agent-connected event (best-effort)\n try {\n await reportAgentConnected({ project_id: project.id }, apiUrl);\n } catch { /* ignore */ }\n\n // Template download (only when --template flag is passed).\n // Validation already ran at the top of the action.\n const template = opts.template as string | undefined;\n if (template) {\n // Ask for directory name\n let dirName = project.name;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: project.name,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n const templateDir = path.resolve(process.cwd(), dirName);\n const dirExists = await fs.stat(templateDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(templateDir);\n process.chdir(templateDir);\n\n // Save project config in the new directory\n saveProjectConfig(projectConfig);\n\n captureEvent(orgId ?? project.organization_id, 'template_selected', { template, source: 'link' });\n\n await downloadGitHubTemplate(template, projectConfig, json);\n\n // Only proceed with install/next steps if template actually downloaded\n const templateDownloaded = await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null);\n\n // Overlay --auth scaffold (after template, before install).\n if (opts.auth) {\n try {\n const result = await applyAuthProvider(opts.auth as AuthProvider, process.cwd(), projectConfig, json);\n if (!json) clack.log.success(`Wired in ${opts.auth}: ${result.written.length} new, ${result.overwritten.length} replaced`);\n } catch (err) {\n const msg = `Failed to apply --auth ${opts.auth}: ${(err as Error).message}`;\n if (json) console.error(JSON.stringify({ warning: msg }));\n else clack.log.warn(msg);\n }\n }\n\n if (templateDownloaded && !json) {\n await runNpmInstall();\n }\n\n // Install agent skills inside the project directory\n await installSkills(json);\n await reportCliUsage('cli.link', true, 6, projectConfig);\n\n if (!json) {\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n clack.log.step(`Dashboard: ${pc.underline(dashboardUrl)}`);\n if (templateDownloaded) {\n const runCommand = `${pc.cyan('cd')} ${pc.green(dirName)} ${pc.dim('&&')} ${pc.cyan('npm run dev')}`;\n const steps = [\n `${pc.bold('1.')} ${runCommand}`,\n `${pc.bold('2.')} Open ${pc.cyan('Claude Code')} or ${pc.cyan('Cursor')} and prompt your agent to add more features`,\n ];\n clack.note(steps.join('\\n'), \"What's next\");\n } else {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n }\n }\n } else {\n // No template path. If --auth was passed, overlay the auth scaffold\n // straight into cwd (the \"add Better Auth to my existing project\"\n // flow). Otherwise we just save config in cwd and exit.\n if (opts.auth) {\n try {\n const result = await applyAuthProvider(opts.auth as AuthProvider, process.cwd(), projectConfig, json);\n if (!json) {\n clack.log.success(`Wired in ${opts.auth}: ${result.written.length} new, ${result.overwritten.length} replaced`);\n }\n\n // Re-install when the overlay patched package.json — same as\n // the direct-OSS bare-overlay path above.\n if (result.packageJsonPatched && !json) {\n await runNpmInstall('Installing new dependencies...');\n }\n\n if (!json) clack.note(result.nextSteps, \"What's next\");\n } catch (err) {\n const msg = `Failed to apply --auth ${opts.auth}: ${(err as Error).message}`;\n if (json) console.error(JSON.stringify({ warning: msg }));\n else clack.log.warn(msg);\n }\n }\n\n // No template — install agent skills in the current directory\n await installSkills(json);\n await reportCliUsage('cli.link', true, 6, projectConfig);\n\n if (!json) {\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n clack.log.step(`Dashboard: ${dashboardUrl}`);\n\n const prompts = [\n 'Build a todo app with Google OAuth sign-in',\n 'Build an Instagram clone where users can upload photos, like, and comment',\n 'Build an AI chatbot with conversation history and deploy it to a live URL',\n ];\n clack.note(\n `Open your coding agent (Claude Code, Codex, Cursor, etc.) and try:\\n\\n${prompts.map((p) => `• \"${p}\"`).join('\\n')}`,\n 'Start building',\n );\n }\n }\n } catch (err) {\n await reportCliUsage('cli.link', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\n\n","import { exec } from 'node:child_process';\nimport { existsSync, readFileSync, appendFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { promisify } from 'node:util';\nimport * as clack from '@clack/prompts';\nimport { getProjectConfig } from './config.js';\n\nconst execAsync = promisify(exec);\n\nconst SKILL_INSTALL_TIMEOUT_MS = 60_000;\n\nexport function describeExecError(err: unknown): string {\n const e = err as {\n killed?: boolean;\n signal?: string;\n code?: number | string;\n stderr?: string | Buffer;\n message?: string;\n };\n\n if (e.killed && (e.signal === 'SIGTERM' || e.signal === 'SIGKILL')) {\n return `timed out after ${SKILL_INSTALL_TIMEOUT_MS / 1000}s — the npm registry may be slow or blocked by your network`;\n }\n if (e.code === 'ENOENT') {\n return '`npx` is not on your PATH — install Node.js 18+ and reopen your shell';\n }\n\n const stderr = (typeof e.stderr === 'string' ? e.stderr : e.stderr?.toString()) ?? '';\n if (/ENOTFOUND|EAI_AGAIN|getaddrinfo/i.test(stderr)) return 'cannot reach the npm registry (DNS lookup failed) — check your internet connection';\n if (/ECONNREFUSED/i.test(stderr)) return 'connection to the npm registry was refused — a proxy or firewall is likely blocking it';\n if (/ETIMEDOUT|ESOCKETTIMEDOUT|network timeout/i.test(stderr)) return 'the npm registry timed out — check your VPN, proxy, or corporate network';\n if (/CERT_HAS_EXPIRED|UNABLE_TO_VERIFY_LEAF_SIGNATURE|SELF_SIGNED_CERT/i.test(stderr)) return 'TLS error reaching the npm registry — a corporate proxy may be intercepting HTTPS';\n if (/\\bE404\\b|404 Not Found/i.test(stderr)) return 'npm returned 404 — the `skills` package or a dependency could not be found (check your npm registry config)';\n if (/EACCES|permission denied/i.test(stderr)) return 'permission denied writing files — run from a directory you own, without sudo';\n if (/ENOSPC|no space left/i.test(stderr)) return 'no disk space left to install the package';\n if (/\\b401\\b|EAUTH|authentication/i.test(stderr)) return 'npm authentication failed — check ~/.npmrc';\n\n if (typeof e.code === 'number') return `npx exited with code ${e.code}`;\n if (typeof e.code === 'string') return e.code;\n return e.message ?? 'unknown error';\n}\n\nconst GITIGNORE_ENTRIES = [\n '.insforge',\n '.agent',\n '.agents',\n '.augment',\n '.claude',\n '.cline',\n '.github/copilot*',\n '.kilocode',\n '.qoder',\n '.qwen',\n '.roo',\n '.trae',\n '.windsurf',\n];\n\nfunction updateGitignore(): void {\n const gitignorePath = join(process.cwd(), '.gitignore');\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : '';\n const lines = new Set(existing.split('\\n').map((l) => l.trim()));\n\n const missing = GITIGNORE_ENTRIES.filter((entry) => !lines.has(entry));\n if (!missing.length) return;\n\n const block = `\\n# InsForge & AI agent skills\\n${missing.join('\\n')}\\n`;\n appendFileSync(gitignorePath, block);\n}\n\nexport async function installSkills(json: boolean): Promise<void> {\n try {\n if (!json) clack.log.info('Installing InsForge agent skills (global)...');\n await execAsync('npx skills add insforge/agent-skills -g -y -a antigravity -a augment -a claude-code -a cline -a codex -a cursor -a gemini-cli -a github-copilot -a kilo -a qoder -a qwen-code -a roo -a trae -a windsurf', {\n cwd: process.cwd(),\n timeout: SKILL_INSTALL_TIMEOUT_MS,\n });\n if (!json) clack.log.success('InsForge agent skills installed.');\n } catch (err) {\n if (!json) {\n clack.log.warn(`Could not install agent skills: ${describeExecError(err)}`);\n clack.log.info('Run `npx skills add insforge/agent-skills` once resolved to see the full output.');\n }\n }\n\n // Install find-skills from vercel-labs for skill discovery\n try {\n if (!json) clack.log.info('Installing find-skills (global)...');\n await execAsync('npx skills add https://github.com/vercel-labs/skills --skill find-skills -g -y', {\n cwd: process.cwd(),\n timeout: SKILL_INSTALL_TIMEOUT_MS,\n });\n if (!json) clack.log.success('find-skills installed.');\n } catch (err) {\n if (!json) {\n clack.log.warn(`Could not install find-skills: ${describeExecError(err)}`);\n clack.log.info('Run `npx skills add https://github.com/vercel-labs/skills --skill find-skills` once resolved.');\n }\n }\n\n try {\n updateGitignore();\n } catch {\n // non-critical, silently ignore\n }\n}\n\nexport async function reportCliUsage(\n toolName: string,\n success: boolean,\n maxRetries = 1,\n explicitConfig?: { oss_host: string; api_key: string },\n): Promise<void> {\n let config: { oss_host: string; api_key: string } | null | undefined = explicitConfig;\n if (!config) {\n try {\n config = getProjectConfig();\n } catch {\n return;\n }\n }\n if (!config) return;\n\n const payload = JSON.stringify({\n tool_name: toolName,\n success,\n timestamp: new Date().toISOString(),\n });\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 3_000);\n try {\n const res = await fetch(`${config.oss_host}/api/usage/mcp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': config.api_key,\n },\n body: payload,\n signal: controller.signal,\n });\n\n if (res.status < 500) return;\n // 5xx — server may not be ready yet, retry\n } finally {\n clearTimeout(timer);\n }\n } catch {\n // network/abort error — server may not be ready yet, retry\n }\n\n if (attempt < maxRetries - 1) {\n await new Promise((r) => setTimeout(r, 5_000));\n }\n }\n}\n","// Apply an auth provider's scaffold to a directory. Overlay-safe: files that\n// already exist are left untouched (warned), package.json is deep-merged, and\n// .env.example is appended rather than replaced.\n//\n// Auth-provider scaffolds live in the InsForge templates repo under\n// `auth-providers/<provider>/` — they are NOT regular templates and never\n// appear in the CLI's `create` template picker. This function shallow-clones\n// the templates repo to a tempdir, reads `manifest.json` from the provider\n// directory, then runs the overlay engine (file copy, package.json deep-merge,\n// .env.example/.env.local collision-resolved append). Cleans up tempdir on\n// completion.\n\nimport { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { randomBytes } from 'node:crypto';\nimport * as clack from '@clack/prompts';\n\nimport { getAnonKey, getDatabaseConnectionString, getJwtSecret } from '../lib/api/oss.js';\nimport type { ProjectConfig } from '../types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const VALID_AUTH_PROVIDERS = ['better-auth'] as const;\nexport type AuthProvider = (typeof VALID_AUTH_PROVIDERS)[number];\n\n// Shape of the manifest.json shipped alongside each provider's files in the\n// templates repo. Keep this in sync with auth-providers/<name>/manifest.json\n// schema there.\ninterface AuthProviderManifest {\n name: string;\n description?: string;\n files: string[];\n packageJsonPatch: {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n };\n envExampleAppend: string;\n nextSteps: string;\n}\n\nfunction pathExists(p: string): Promise<boolean> {\n return fs.stat(p).then(() => true, () => false);\n}\n\n// Deep-merge two plain objects. The base wins on key collisions for primitive\n// values — i.e. if the user already has \"better-auth\": \"^1.5.0\" in their deps,\n// we don't downgrade them to \"^1.6.0\" from our manifest. Nested objects\n// recurse. Arrays are not deep-merged (auth provider patches don't use them).\nfunction deepMergeKeepBase<T extends Record<string, unknown>>(base: T, patch: Record<string, unknown>): T {\n const out: Record<string, unknown> = { ...base };\n for (const [k, v] of Object.entries(patch)) {\n if (\n v && typeof v === 'object' && !Array.isArray(v) &&\n out[k] && typeof out[k] === 'object' && !Array.isArray(out[k])\n ) {\n out[k] = deepMergeKeepBase(out[k] as Record<string, unknown>, v as Record<string, unknown>);\n } else if (out[k] === undefined) {\n out[k] = v;\n }\n // else: base has a primitive at this key — preserve it\n }\n return out as T;\n}\n\ninterface ApplyResult {\n written: string[];\n skipped: string[];\n overwritten: string[];\n packageJsonPatched: boolean;\n envExampleAppended: boolean;\n envLocalWritten: boolean;\n envKeysSkipped: string[];\n envKeysRefreshed: string[];\n nextSteps: string;\n}\n\n// Parse `KEY=...` lines from a dotenv blob and return the set of defined keys.\n// Comments and blank lines are ignored. Quoted values, leading `export `, and\n// inline `#` comments don't matter — we only care about the LHS.\n// Exported for unit testing.\nexport function extractEnvKeys(content: string): Set<string> {\n const keys = new Set<string>();\n for (const line of content.split('\\n')) {\n const trimmed = line.replace(/^\\s*export\\s+/, '').trimStart();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const m = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=/);\n if (m) keys.add(m[1]);\n }\n return keys;\n}\n\n// Parse `KEY=value` lines into a Map. Comments and blank lines are ignored.\n// We use this to compare the user's .env.local values against the manifest's\n// literal defaults so we can distinguish \"user customized\" from \"user has\n// the stale default\".\n// Exported for unit testing.\nexport function extractEnvPairs(content: string): Map<string, string> {\n const out = new Map<string, string>();\n for (const line of content.split('\\n')) {\n const trimmed = line.replace(/^\\s*export\\s+/, '').trimStart();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const m = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=(.*)$/);\n if (m) out.set(m[1], m[2]);\n }\n return out;\n}\n\n// Refresh stale platform defaults in the user's .env.local. If the user's\n// value matches the manifest's literal default AND the platform now has a\n// real value (e.g., cloud DATABASE_URL), overwrite the line. User-customized\n// values (anything that differs from the manifest default) are preserved.\n// Exported for unit testing.\nexport function refreshStaleEnvDefaults(\n existing: string,\n manifestDefaults: Map<string, string>,\n platformValues: Map<string, string>,\n): { updated: string; refreshed: string[] } {\n const refreshed: string[] = [];\n const lines = existing.split('\\n').map((line) => {\n const m = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=(.*)$/);\n if (!m) return line;\n const key = m[1];\n const userValue = m[2];\n const def = manifestDefaults.get(key);\n const real = platformValues.get(key);\n if (def !== undefined && real !== undefined && userValue === def && real !== def) {\n refreshed.push(key);\n return `${key}=${real}`;\n }\n return line;\n });\n return { updated: lines.join('\\n'), refreshed };\n}\n\n// Remove any `KEY=value` lines from `append` whose KEY already appears in\n// `existingKeys`. Comments and blank lines are kept verbatim so the section\n// header survives even if every var below it collides. Returns the filtered\n// blob plus the list of keys we dropped (for telemetry / user warning).\n// Exported for unit testing.\nexport function filterCollidingEnvLines(append: string, existingKeys: Set<string>): { filtered: string; dropped: string[] } {\n const dropped: string[] = [];\n const out: string[] = [];\n for (const line of append.split('\\n')) {\n const m = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=/);\n if (m && existingKeys.has(m[1])) {\n dropped.push(m[1]);\n continue;\n }\n out.push(line);\n }\n return { filtered: out.join('\\n'), dropped };\n}\n\nasync function walkFiles(dir: string, base = dir): Promise<string[]> {\n const out: string[] = [];\n for (const entry of await fs.readdir(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) out.push(...(await walkFiles(full, base)));\n else out.push(path.relative(base, full));\n }\n return out;\n}\n\n// Files in the cloned auth-providers/<name>/ directory that are NOT part of\n// the scaffold — they describe the overlay rather than belonging in the\n// user's project.\nconst PROVIDER_META_FILES = new Set(['manifest.json', 'README.md']);\n\n// INSFORGE_TEMPLATES_REPO and INSFORGE_TEMPLATES_BRANCH are escape hatches for\n// development against unmerged template branches. They are passed to git via\n// execFile's argv (no shell), but we still validate them so an env var can't\n// inject a `--upload-pack` or other git option that consumes the next argv.\nconst SAFE_REPO_PATTERN = /^(https?:\\/\\/|git@)[A-Za-z0-9._:/@~+-]+(\\.git)?$/;\nconst SAFE_BRANCH_PATTERN = /^[A-Za-z0-9._/-]+$/;\n\n// Shallow-clone the templates repo and return the path to\n// `auth-providers/<provider>/`.\nasync function fetchProviderTree(provider: AuthProvider): Promise<{ dir: string; cleanup: () => Promise<void> }> {\n const tempDir = path.join(tmpdir(), `insforge-auth-${provider}-${Date.now()}`);\n await fs.mkdir(tempDir, { recursive: true });\n const cleanup = () => fs.rm(tempDir, { recursive: true, force: true }).catch(() => undefined);\n\n try {\n const repo = process.env.INSFORGE_TEMPLATES_REPO ?? 'https://github.com/InsForge/insforge-templates.git';\n if (!SAFE_REPO_PATTERN.test(repo)) {\n throw new Error(`INSFORGE_TEMPLATES_REPO has unsupported characters: ${repo}`);\n }\n const branch = process.env.INSFORGE_TEMPLATES_BRANCH;\n if (branch !== undefined && !SAFE_BRANCH_PATTERN.test(branch)) {\n throw new Error(`INSFORGE_TEMPLATES_BRANCH has unsupported characters: ${branch}`);\n }\n\n const args = ['clone', '--depth', '1'];\n if (branch) args.push('-b', branch);\n args.push('--', repo, '.');\n await execFileAsync('git', args, {\n cwd: tempDir,\n maxBuffer: 10 * 1024 * 1024,\n timeout: 60_000,\n });\n\n const providerDir = path.join(tempDir, 'auth-providers', provider);\n if (!(await pathExists(providerDir))) {\n await cleanup();\n throw new Error(\n `Auth provider \"${provider}\" not found in templates repo. ` +\n `Looked for auth-providers/${provider}/ in ${repo}${branch ? ` (branch: ${branch})` : ''}.`,\n );\n }\n return { dir: providerDir, cleanup };\n } catch (err) {\n await cleanup();\n throw err;\n }\n}\n\nasync function loadManifest(providerDir: string): Promise<AuthProviderManifest> {\n const manifestPath = path.join(providerDir, 'manifest.json');\n if (!(await pathExists(manifestPath))) {\n throw new Error(`Missing manifest.json in ${providerDir}`);\n }\n const parsed = JSON.parse(await fs.readFile(manifestPath, 'utf-8')) as Partial<AuthProviderManifest>;\n // Sanity-check the shape so a malformed templates manifest fails with a\n // helpful message instead of a downstream `Cannot read properties of undefined`.\n const missing: string[] = [];\n if (typeof parsed.name !== 'string') missing.push('name');\n if (!Array.isArray(parsed.files)) missing.push('files (array)');\n if (!parsed.packageJsonPatch || typeof parsed.packageJsonPatch !== 'object') missing.push('packageJsonPatch (object)');\n if (typeof parsed.envExampleAppend !== 'string') missing.push('envExampleAppend (string)');\n if (typeof parsed.nextSteps !== 'string') missing.push('nextSteps (string)');\n if (missing.length > 0) {\n throw new Error(`Malformed manifest.json in ${providerDir} — missing or wrong-typed fields: ${missing.join(', ')}`);\n }\n return parsed as AuthProviderManifest;\n}\n\nexport async function applyAuthProvider(\n provider: AuthProvider,\n cwd: string,\n projectConfig: ProjectConfig,\n json: boolean,\n): Promise<ApplyResult> {\n if (!VALID_AUTH_PROVIDERS.includes(provider)) {\n throw new Error(`Unknown auth provider: ${provider}`);\n }\n\n const fetchSpinner = !json ? clack.spinner() : null;\n fetchSpinner?.start(`Fetching ${provider} scaffold from templates repo...`);\n const { dir: providerDir, cleanup } = await fetchProviderTree(provider);\n fetchSpinner?.stop(`${provider} scaffold ready`);\n\n try {\n const manifest = await loadManifest(providerDir);\n\n const result: ApplyResult = {\n written: [], skipped: [], overwritten: [],\n packageJsonPatched: false, envExampleAppended: false, envLocalWritten: false,\n envKeysSkipped: [],\n envKeysRefreshed: [],\n nextSteps: manifest.nextSteps,\n };\n\n // 1. Copy files. Auth-provider overlays REPLACE on collision — the user\n // opted into `--auth <provider>` expressing intent that the provider's\n // auth primitives win over whatever the base template ships. Without\n // this, base templates that pre-populate src/lib/insforge.ts (with a\n // different export shape) silently shadow the overlay version and the\n // overlay's pages crash at runtime. Track overwrites so we can warn.\n // Walk the provider tree and exclude overlay-meta files\n // (manifest.json, README.md).\n const allFiles = (await walkFiles(providerDir)).filter((rel) => !PROVIDER_META_FILES.has(rel));\n for (const rel of allFiles) {\n const src = path.join(providerDir, rel);\n const dest = path.join(cwd, rel);\n const existed = await pathExists(dest);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n await fs.copyFile(src, dest);\n if (existed) result.overwritten.push(rel);\n else result.written.push(rel);\n }\n\n // 2. Deep-merge package.json (preserve user's existing values).\n const pkgPath = path.join(cwd, 'package.json');\n if (await pathExists(pkgPath)) {\n const existing = JSON.parse(await fs.readFile(pkgPath, 'utf-8')) as Record<string, unknown>;\n const merged = deepMergeKeepBase(existing, manifest.packageJsonPatch);\n await fs.writeFile(pkgPath, JSON.stringify(merged, null, 2) + '\\n');\n result.packageJsonPatched = true;\n } else {\n // Fresh project (no package.json yet): create a minimal one.\n const fresh: Record<string, unknown> = {\n name: path.basename(cwd),\n version: '0.0.1',\n private: true,\n ...manifest.packageJsonPatch,\n };\n await fs.writeFile(pkgPath, JSON.stringify(fresh, null, 2) + '\\n');\n result.packageJsonPatched = true;\n }\n\n // 3. Append to .env.example (or create if absent). On collision, the\n // user's existing key wins — drop our line silently and report it\n // via envKeysSkipped so the caller can warn.\n const envExamplePath = path.join(cwd, '.env.example');\n if (await pathExists(envExamplePath)) {\n const existing = await fs.readFile(envExamplePath, 'utf-8');\n if (!existing.includes('# ─── Better Auth + InsForge bridge')) {\n const existingKeys = extractEnvKeys(existing);\n const { filtered, dropped } = filterCollidingEnvLines(manifest.envExampleAppend, existingKeys);\n result.envKeysSkipped = dropped;\n await fs.writeFile(envExamplePath, existing.replace(/\\n*$/, '\\n\\n') + filtered + '\\n');\n result.envExampleAppended = true;\n }\n } else {\n await fs.writeFile(envExamplePath, manifest.envExampleAppend + '\\n');\n result.envExampleAppended = true;\n }\n\n // 4. Write/extend .env.local with auto-filled values. Substitution rules:\n // INSFORGE_*_URL, INSFORGE_*_ANON_KEY, NEXT_PUBLIC_APP_URL, *_JWT_SECRET,\n // BETTER_AUTH_SECRET. If .env.local already exists we APPEND only the\n // keys it doesn't already define — same base-wins rule as .env.example.\n const envLocalPath = path.join(cwd, '.env.local');\n const envLocalExists = await pathExists(envLocalPath);\n const existingLocal = envLocalExists ? await fs.readFile(envLocalPath, 'utf-8') : '';\n const existingLocalKeys = envLocalExists ? extractEnvKeys(existingLocal) : new Set<string>();\n\n const [anonKey, jwtSecret, databaseUrl] = await Promise.all([\n getAnonKey(),\n getJwtSecret(),\n getDatabaseConnectionString(),\n ]);\n const filled = manifest.envExampleAppend.replace(\n /^([A-Z][A-Z0-9_]*=)(.*)$/gm,\n (_, prefix: string, value: string) => {\n const key = prefix.slice(0, -1);\n if (/INSFORGE.*(URL|BASE_URL)$/.test(key)) return `${prefix}${projectConfig.oss_host}`;\n if (/INSFORGE.*ANON_KEY$/.test(key)) return `${prefix}${anonKey}`;\n if (key === 'NEXT_PUBLIC_APP_URL') return `${prefix}https://${projectConfig.appkey}.insforge.site`;\n if (/JWT_SECRET$/.test(key)) return `${prefix}${jwtSecret ?? value}`;\n if (key === 'BETTER_AUTH_SECRET') return `${prefix}${randomBytes(32).toString('hex')}`;\n if (key === 'DATABASE_URL') return `${prefix}${databaseUrl ?? value}`;\n return `${prefix}${value}`;\n },\n );\n\n if (!envLocalExists) {\n await fs.writeFile(envLocalPath, filled + '\\n');\n result.envLocalWritten = true;\n } else {\n // Two passes:\n // 1. Refresh stale platform defaults in-place. If the user's existing\n // value matches the manifest's literal default AND we now have a\n // real platform value (e.g., they re-linked against a cloud project\n // after the CLI started fetching DATABASE_URL), update the line.\n // User-customized values are preserved untouched.\n // 2. Append any genuinely new keys at the end.\n const manifestDefaults = extractEnvPairs(manifest.envExampleAppend);\n const platformValues = extractEnvPairs(filled);\n const { updated, refreshed } = refreshStaleEnvDefaults(existingLocal, manifestDefaults, platformValues);\n\n const refreshedSet = new Set(refreshed);\n const keysAfterRefresh = new Set([...existingLocalKeys, ...refreshedSet]);\n const { filtered, dropped } = filterCollidingEnvLines(filled, keysAfterRefresh);\n const hasNewKey = filtered.split('\\n').some((l) => /^[A-Z][A-Z0-9_]*=/.test(l));\n\n if (refreshed.length > 0 || hasNewKey) {\n const base = hasNewKey ? updated.replace(/\\n*$/, '\\n\\n') + filtered + '\\n' : updated;\n await fs.writeFile(envLocalPath, base);\n result.envLocalWritten = true;\n }\n result.envKeysSkipped = Array.from(new Set([...result.envKeysSkipped, ...dropped]));\n result.envKeysRefreshed = Array.from(new Set([...result.envKeysRefreshed, ...refreshed]));\n }\n\n if (!jwtSecret && !json) {\n clack.log.warn('Could not auto-fill JWT_SECRET — run `npx @insforge/cli secrets get JWT_SECRET` and paste it into .env.local.');\n }\n\n if (result.envKeysSkipped.length > 0 && !json) {\n clack.log.warn(\n `Kept your existing values for: ${result.envKeysSkipped.join(', ')}. ` +\n `If any of these need the auth-provider's defaults, see .env.example for reference.`,\n );\n }\n\n if (result.envKeysRefreshed.length > 0 && !json) {\n clack.log.info(\n `Refreshed stale platform defaults: ${result.envKeysRefreshed.join(', ')}. ` +\n `Your value matched the manifest's default, so we replaced it with the live one.`,\n );\n }\n\n return result;\n } finally {\n await cleanup();\n }\n}\n","import { getProjectConfig } from '../config.js';\nimport { CLIError, ProjectNotLinkedError } from '../errors.js';\nimport type { ProjectConfig } from '../../types.js';\n\nfunction requireProjectConfig(): ProjectConfig {\n const config = getProjectConfig();\n if (!config) {\n throw new ProjectNotLinkedError();\n }\n return config;\n}\n\n/**\n * Unified OSS API fetch. Uses API key as Bearer token for all requests,\n * which grants superadmin access (SQL execution, bucket management, etc.).\n */\nexport interface RawSqlResult {\n rows: Record<string, unknown>[];\n raw: Record<string, unknown>;\n}\n\nexport async function runRawSql(sql: string, unrestricted = false): Promise<RawSqlResult> {\n const endpoint = unrestricted\n ? '/api/database/advance/rawsql/unrestricted'\n : '/api/database/advance/rawsql';\n const res = await ossFetch(endpoint, {\n method: 'POST',\n body: JSON.stringify({ query: sql }),\n });\n const raw = await res.json() as Record<string, unknown>;\n const rows = (raw.rows ?? raw.data ?? []) as Record<string, unknown>[];\n return { rows, raw };\n}\n\nexport async function getAnonKey(): Promise<string> {\n const res = await ossFetch('/api/auth/tokens/anon', { method: 'POST' });\n const data = await res.json() as { accessToken: string };\n return data.accessToken;\n}\n\nexport async function getJwtSecret(): Promise<string | null> {\n // Returns null if the project doesn't expose JWT_SECRET — caller falls back\n // to leaving the env var as-is so the user can fill it manually.\n try {\n const res = await ossFetch('/api/secrets/JWT_SECRET');\n const data = await res.json() as { value?: string };\n return typeof data.value === 'string' && data.value.length > 0 ? data.value : null;\n } catch {\n return null;\n }\n}\n\nexport async function getDatabaseConnectionString(): Promise<string | null> {\n // Cloud-only: returns the project's Postgres URL (with sslmode). Self-hosted\n // returns null so callers leave DATABASE_URL at the localhost default —\n // self-hosters know their own connection string.\n try {\n const res = await ossFetch('/api/metadata/database-connection-string');\n const data = await res.json() as { connectionURL?: string };\n return typeof data.connectionURL === 'string' && data.connectionURL.length > 0\n ? data.connectionURL\n : null;\n } catch {\n return null;\n }\n}\n\nexport async function ossFetch(\n path: string,\n options: RequestInit = {},\n): Promise<Response> {\n const config = requireProjectConfig();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n ...(options.headers as Record<string, string> ?? {}),\n };\n\n const res = await fetch(`${config.oss_host}${path}`, { ...options, headers });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as {\n error?: string;\n message?: string;\n nextActions?: string;\n statusCode?: number;\n };\n\n let message = err.message ?? err.error ?? `OSS request failed: ${res.status}`;\n if (err.nextActions) {\n message += `\\n${err.nextActions}`;\n }\n\n // Feature not available on this backend version — ONLY when the 404 is a\n // route-level miss (no structured error code), not a resource-level miss\n // like COMPUTE_SERVICE_NOT_FOUND. Otherwise we'd hide real \"service doesn't\n // exist\" errors behind a misleading \"feature not enabled\" message.\n const isRouteLevel404 = !err.error || err.error === 'NOT_FOUND';\n if (res.status === 404 && isRouteLevel404 && path.startsWith('/api/compute')) {\n message = 'Compute services are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud: contact your InsForge admin to enable compute.';\n }\n\n if (res.status === 404 && isRouteLevel404 && path.startsWith('/api/payments')) {\n message = 'Payments are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud/private preview: contact your InsForge admin to enable payments.';\n }\n\n if (res.status === 404 && isRouteLevel404 && path === '/api/database/migrations') {\n message = 'Database migrations are not available on this backend.\\nSelf-hosted: upgrade your InsForge instance. Cloud: contact your InsForge admin about database migration support.';\n }\n\n throw new CLIError(message);\n }\n\n return res;\n}\n","import type { Command } from 'commander';\nimport { exec, execFile } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { promisify } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../lib/prompts.js';\nimport {\n listOrganizations,\n createProject,\n getProject,\n getProjectApiKey,\n} from '../lib/api/platform.js';\nimport { getAnonKey, runRawSql } from '../lib/api/oss.js';\nimport { applyAuthProvider, VALID_AUTH_PROVIDERS, type AuthProvider } from '../auth-providers/apply.js';\nimport { getGlobalConfig, saveGlobalConfig, saveProjectConfig, getFrontendUrl, buildOssHost } from '../lib/config.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\nimport { readEnvFile } from '../lib/env.js';\nimport { installSkills, reportCliUsage } from '../lib/skills.js';\nimport { captureEvent, trackCommand, shutdownAnalytics } from '../lib/analytics.js';\nimport { deployProject } from './deployments/deploy.js';\nimport type { ProjectConfig } from '../types.js';\n\nconst execAsync = promisify(exec);\nconst execFileAsync = promisify(execFile);\n\n// Same safety guard fetchProviderTree uses in apply.ts. INSFORGE_TEMPLATES_REPO\n// and INSFORGE_TEMPLATES_BRANCH are escape hatches for development against\n// unmerged branches; they are passed to git's argv (no shell), but we still\n// validate the values so a hostile env var can't slip in extra git options.\nconst SAFE_REPO_PATTERN = /^(https?:\\/\\/|git@)[A-Za-z0-9._:/@~+-]+(\\.git)?$/;\nconst SAFE_BRANCH_PATTERN = /^[A-Za-z0-9._/-]+$/;\n\nexport type Framework = 'react' | 'nextjs';\n\nasync function waitForProjectActive(projectId: string, apiUrl?: string, timeoutMs = 120_000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n const project = await getProject(projectId, apiUrl);\n if (project.status === 'active') return;\n await new Promise((r) => setTimeout(r, 3000));\n }\n throw new CLIError('Project creation timed out. Check the dashboard for status.');\n}\n\nconst INSFORGE_BANNER = [\n '██╗███╗ ██╗███████╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗',\n '██║████╗ ██║██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██╔════╝',\n '██║██╔██╗ ██║███████╗█████╗ ██║ ██║██████╔╝██║ ███╗█████╗ ',\n '██║██║╚██╗██║╚════██║██╔══╝ ██║ ██║██╔══██╗██║ ██║██╔══╝ ',\n '██║██║ ╚████║███████║██║ ╚██████╔╝██║ ██║╚██████╔╝███████╗',\n '╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝',\n];\n\nasync function animateBanner(): Promise<void> {\n const isTTY = process.stderr.isTTY;\n if (!isTTY || process.env.CI) {\n // Non-interactive: just print static banner\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`${line}\\n`);\n }\n process.stderr.write('\\n');\n return;\n }\n\n const totalLines = INSFORGE_BANNER.length;\n const maxLen = Math.max(...INSFORGE_BANNER.map((l) => l.length));\n const cols = process.stderr.columns ?? 0;\n\n // Narrow terminal: skip animation to avoid garbled output from line wrapping\n if (cols > 0 && cols < maxLen) {\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`\\x1b[97m${line}\\x1b[0m\\n`);\n }\n process.stderr.write('\\n');\n return;\n }\n\n // Phase 1: Line-by-line reveal with cursor sweep\n const REVEAL_STEPS = 10;\n const REVEAL_DELAY = 30;\n for (let lineIdx = 0; lineIdx < totalLines; lineIdx++) {\n const line = INSFORGE_BANNER[lineIdx];\n for (let step = 0; step <= REVEAL_STEPS; step++) {\n const pos = Math.floor((step / REVEAL_STEPS) * line.length);\n let rendered = '';\n for (let i = 0; i < line.length; i++) {\n if (i < pos) {\n rendered += `\\x1b[97m${line[i]}\\x1b[0m`; // bright white (revealed)\n } else if (i === pos) {\n rendered += `\\x1b[1;37m${line[i]}\\x1b[0m`; // bold white (cursor)\n } else {\n rendered += `\\x1b[90m${line[i]}\\x1b[0m`; // dim gray (hidden)\n }\n }\n process.stderr.write(`\\r${rendered}`);\n await new Promise((r) => setTimeout(r, REVEAL_DELAY));\n }\n process.stderr.write('\\n');\n }\n\n // Phase 2: Shimmer pass across the full banner\n const SHIMMER_STEPS = 16;\n const SHIMMER_DELAY = 40;\n const SHIMMER_WIDTH = 4;\n for (let step = 0; step < SHIMMER_STEPS; step++) {\n const shimmerPos = Math.floor((step / SHIMMER_STEPS) * (maxLen + SHIMMER_WIDTH));\n // Move cursor up to start of banner\n process.stderr.write(`\\x1b[${totalLines}A`);\n for (const line of INSFORGE_BANNER) {\n let rendered = '';\n for (let i = 0; i < line.length; i++) {\n const dist = Math.abs(i - shimmerPos);\n if (dist === 0) {\n rendered += `\\x1b[1;97m${line[i]}\\x1b[0m`; // bold bright white (shimmer peak)\n } else if (dist <= SHIMMER_WIDTH) {\n rendered += `\\x1b[37m${line[i]}\\x1b[0m`; // white (shimmer edge)\n } else {\n rendered += `\\x1b[90m${line[i]}\\x1b[0m`; // dim (base)\n }\n }\n process.stderr.write(`${rendered}\\n`);\n }\n await new Promise((r) => setTimeout(r, SHIMMER_DELAY));\n }\n\n // Final: show banner in steady bright white\n process.stderr.write(`\\x1b[${totalLines}A`);\n for (const line of INSFORGE_BANNER) {\n process.stderr.write(`\\x1b[97m${line}\\x1b[0m\\n`);\n }\n process.stderr.write('\\n');\n}\n\nfunction getDefaultProjectName(): string {\n const dirName = path.basename(process.cwd());\n const sanitized = dirName.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n return sanitized.length >= 2 ? sanitized : '';\n}\n\nexport async function copyDir(src: string, dest: string): Promise<void> {\n const entries = await fs.readdir(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n if (entry.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true });\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\nexport function registerCreateCommand(program: Command): void {\n program\n .command('create')\n .description('Create a new InsForge project')\n .option('--name <name>', 'Project name')\n .option('--org-id <id>', 'Organization ID')\n .option('--region <region>', 'Deployment region (us-east, us-west, eu-central, ap-southeast)')\n .option('--template <template>', 'Template to use: react, nextjs, chatbot, crm, e-commerce, todo, or empty')\n .option('--auth <provider>', 'Wire a third-party auth provider into the chosen template (currently: better-auth)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl, false);\n\n if (!json) {\n await animateBanner();\n clack.intro(\"Let's build something great\");\n }\n\n // 1. Select organization (auto-select if only one)\n let orgId = opts.orgId;\n if (!orgId) {\n const orgs = await listOrganizations(apiUrl);\n if (orgs.length === 0) {\n throw new CLIError('No organizations found.');\n }\n if (orgs.length === 1) {\n orgId = orgs[0].id;\n if (!json) clack.log.info(`Using organization: ${orgs[0].name}`);\n } else {\n if (json) {\n throw new CLIError('Multiple organizations found. Specify --org-id.');\n }\n const selected = await prompts.select<string>({\n message: 'Select an organization:',\n options: orgs.map((o) => ({\n value: o.id,\n label: o.name,\n })),\n });\n if (prompts.isCancel(selected)) process.exit(0);\n orgId = selected;\n }\n }\n\n // Save default org\n const globalConfig = getGlobalConfig();\n globalConfig.default_org_id = orgId;\n saveGlobalConfig(globalConfig);\n\n // 2. Project name (pre-filled from directory name)\n let projectName = opts.name;\n if (!projectName) {\n if (json) throw new CLIError('--name is required in JSON mode.');\n const defaultName = getDefaultProjectName();\n const name = await prompts.text({\n message: 'Project name:',\n ...(defaultName ? { initialValue: defaultName } : {}),\n validate: (v) => (v.length >= 2 ? undefined : 'Name must be at least 2 characters'),\n });\n if (prompts.isCancel(name)) process.exit(0);\n projectName = name;\n }\n\n // Sanitize project name to prevent path traversal\n projectName = path.basename(projectName).replace(/[^a-zA-Z0-9._-]/g, '-').replace(/\\.+/g, '.');\n if (projectName.length < 2 || projectName === '.' || projectName === '..') {\n throw new CLIError('Project name must be at least 2 safe characters (letters, numbers, hyphens).');\n }\n\n // 3. Select template (two-step: blank vs template, then pick template)\n const validTemplates = ['react', 'nextjs', 'chatbot', 'crm', 'e-commerce', 'todo', 'empty'];\n let template = opts.template as string | undefined;\n\n // --auth is FLAG-ONLY; not in the interactive picker. It composes onto\n // any base template by overlaying scaffolded files after the template\n // download. With no --template, it overlays straight into cwd.\n if (opts.auth && !VALID_AUTH_PROVIDERS.includes(opts.auth)) {\n throw new CLIError(`Invalid --auth \"${opts.auth}\". Valid: ${VALID_AUTH_PROVIDERS.join(', ')}`);\n }\n\n if (template && !validTemplates.includes(template)) {\n throw new CLIError(`Invalid template \"${template}\". Valid options: ${validTemplates.join(', ')}`);\n }\n if (!template) {\n if (json) {\n template = 'empty';\n } else {\n const approach = await prompts.select<string>({\n message: 'How would you like to start?',\n options: [\n { value: 'blank', label: 'Blank project', hint: 'Start from scratch with .env.local ready' },\n { value: 'template', label: 'Start from a template', hint: 'Pre-built starter apps' },\n ],\n });\n if (prompts.isCancel(approach)) process.exit(0);\n\n captureEvent(orgId, 'create_approach_selected', {\n approach,\n });\n\n if (approach === 'blank') {\n template = 'empty';\n } else {\n const selected = await prompts.select<string>({\n message: 'Choose a starter template:',\n options: [\n { value: 'react', label: 'Web app template with React' },\n { value: 'nextjs', label: 'Web app template with Next.js' },\n { value: 'chatbot', label: 'AI Chatbot with Next.js' },\n { value: 'crm', label: 'CRM with Next.js' },\n { value: 'e-commerce', label: 'E-Commerce store with Next.js' },\n { value: 'todo', label: 'Todo app with Next.js' },\n ],\n });\n if (prompts.isCancel(selected)) process.exit(0);\n template = selected;\n }\n }\n }\n\n captureEvent(orgId, 'template_selected', {\n template,\n approach: template === 'empty' ? 'blank' : 'template',\n });\n\n // 4. Choose directory (templates need a subdirectory, blank uses cwd)\n const hasTemplate = template !== 'empty';\n let dirName: string | null = null;\n const originalCwd = process.cwd();\n let projectDir = originalCwd;\n\n if (hasTemplate) {\n dirName = projectName;\n if (!json) {\n const inputDir = await prompts.text({\n message: 'Directory name:',\n initialValue: projectName,\n validate: (v) => {\n if (v.length < 1) return 'Directory name is required';\n const normalized = path.basename(v).replace(/[^a-zA-Z0-9._-]/g, '-');\n if (!normalized || normalized === '.' || normalized === '..') return 'Invalid directory name';\n return undefined;\n },\n });\n if (prompts.isCancel(inputDir)) process.exit(0);\n dirName = path.basename(inputDir).replace(/[^a-zA-Z0-9._-]/g, '-');\n }\n\n // Validate normalized dirName\n if (!dirName || dirName === '.' || dirName === '..') {\n throw new CLIError('Invalid directory name.');\n }\n\n // Create the project directory and switch into it\n projectDir = path.resolve(originalCwd, dirName);\n const dirExists = await fs.stat(projectDir).catch(() => null);\n if (dirExists) {\n throw new CLIError(`Directory \"${dirName}\" already exists.`);\n }\n await fs.mkdir(projectDir);\n process.chdir(projectDir);\n }\n\n // 5. Create project via Platform API\n let projectLinked = false;\n const s = !json ? clack.spinner() : null;\n try {\n s?.start('Creating project...');\n\n const project = await createProject(orgId, projectName, opts.region, apiUrl);\n\n s?.message('Waiting for project to become active...');\n await waitForProjectActive(project.id, apiUrl);\n\n // 6. Fetch API key and link project\n const apiKey = await getProjectApiKey(project.id, apiUrl);\n const projectConfig: ProjectConfig = {\n project_id: project.id,\n project_name: project.name,\n org_id: project.organization_id,\n appkey: project.appkey,\n region: project.region,\n api_key: apiKey,\n oss_host: buildOssHost(project.appkey, project.region),\n };\n saveProjectConfig(projectConfig);\n projectLinked = true;\n\n s?.stop(`Project \"${project.name}\" created and linked`);\n\n // 7. Download template or seed env for blank projects\n const githubTemplates = ['chatbot', 'crm', 'e-commerce', 'nextjs', 'react', 'todo'];\n if (githubTemplates.includes(template!)) {\n await downloadGitHubTemplate(template!, projectConfig, json);\n } else if (hasTemplate) {\n await downloadTemplate(template as Framework, projectConfig, projectName, json, apiUrl);\n } else {\n // Blank project: seed .env.local with InsForge credentials (non-fatal)\n try {\n const anonKey = await getAnonKey();\n if (!anonKey) {\n if (!json) clack.log.warn('Could not retrieve anon key. You can add it to .env.local manually.');\n } else {\n const envPath = path.join(process.cwd(), '.env.local');\n const envContent = [\n '# InsForge',\n `NEXT_PUBLIC_INSFORGE_URL=${projectConfig.oss_host}`,\n `NEXT_PUBLIC_INSFORGE_ANON_KEY=${anonKey}`,\n '',\n ].join('\\n');\n await fs.writeFile(envPath, envContent, { flag: 'wx' });\n if (!json) {\n clack.log.success('Created .env.local with your InsForge credentials');\n }\n }\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (!json) {\n if (error.code === 'EEXIST') {\n clack.log.warn('.env.local already exists; skipping InsForge key seeding.');\n } else {\n clack.log.warn(`Failed to create .env.local: ${error.message}`);\n }\n }\n }\n }\n\n // 7b. If --auth was passed, overlay the auth-provider scaffold onto\n // whatever the template (or blank project) produced. Auth-provider\n // scaffolds are fetched from the InsForge templates repo at runtime\n // (auth-providers/<name>/), not bundled with the CLI.\n if (opts.auth) {\n try {\n const result = await applyAuthProvider(opts.auth as AuthProvider, process.cwd(), projectConfig, json);\n if (!json) {\n clack.log.success(`Wired in ${opts.auth}: ${result.written.length} new, ${result.overwritten.length} replaced`);\n }\n } catch (err) {\n const msg = `Failed to apply --auth ${opts.auth}: ${(err as Error).message}`;\n if (json) console.error(JSON.stringify({ warning: msg }));\n else clack.log.warn(msg);\n }\n }\n\n // Install agent skills\n await installSkills(json);\n trackCommand('create', orgId);\n await reportCliUsage('cli.create', true, 6);\n\n // 8. Install npm dependencies (template projects only, if download succeeded)\n const templateDownloaded = hasTemplate\n ? await fs.stat(path.join(process.cwd(), 'package.json')).catch(() => null)\n : null;\n\n if (templateDownloaded) {\n const installSpinner = !json ? clack.spinner() : null;\n installSpinner?.start('Installing dependencies...');\n try {\n await execAsync('npm install', { cwd: process.cwd(), maxBuffer: 10 * 1024 * 1024 });\n installSpinner?.stop('Dependencies installed');\n } catch (err) {\n installSpinner?.stop('Failed to install dependencies');\n if (!json) {\n clack.log.warn(`npm install failed: ${(err as Error).message}`);\n clack.log.info('Run `npm install` manually to install dependencies.');\n }\n }\n }\n\n // 9. Offer to deploy (template projects, interactive mode only)\n let liveUrl: string | null = null;\n if (templateDownloaded && !json) {\n const shouldDeploy = await prompts.confirm({\n message: 'Would you like to deploy now?',\n });\n\n if (!prompts.isCancel(shouldDeploy) && shouldDeploy) {\n try {\n // Read env vars from .env.local or .env to pass to deployment\n const envVars = await readEnvFile(process.cwd());\n const startBody: { envVars?: Array<{ key: string; value: string }> } = {};\n if (envVars.length > 0) {\n startBody.envVars = envVars;\n }\n\n const deploySpinner = clack.spinner();\n const result = await deployProject({\n sourceDir: process.cwd(),\n startBody,\n spinner: deploySpinner,\n });\n\n if (result.isReady) {\n deploySpinner.stop('Deployment complete');\n liveUrl = result.liveUrl;\n } else {\n deploySpinner.stop('Deployment is still building');\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n clack.log.warn('Deployment did not finish within 2 minutes.');\n clack.log.info(`Check status with: npx @insforge/cli deployments status ${result.deploymentId}`);\n }\n } catch (err) {\n clack.log.warn(`Deploy failed: ${(err as Error).message}`);\n }\n }\n }\n\n // 10. Show links and next steps\n const dashboardUrl = `${getFrontendUrl()}/dashboard/project/${project.id}`;\n\n if (json) {\n outputJson({\n success: true,\n project: { id: project.id, name: project.name, appkey: project.appkey, region: project.region },\n template,\n ...(dirName ? { directory: dirName } : {}),\n urls: {\n dashboard: dashboardUrl,\n ...(liveUrl ? { liveSite: liveUrl } : {}),\n },\n });\n } else {\n clack.log.step(`Dashboard: ${dashboardUrl}`);\n if (liveUrl) {\n clack.log.success(`Live site: ${liveUrl}`);\n }\n\n // Next steps\n if (templateDownloaded) {\n const steps = [\n `cd ${dirName}`,\n 'npm run dev',\n ];\n clack.note(steps.join('\\n'), 'Next steps');\n clack.note('Open your coding agent (Claude Code, Codex, Cursor, etc.) to add new features.', 'Keep building');\n } else if (hasTemplate && !templateDownloaded) {\n clack.log.warn('Template download failed. You can retry or set up manually.');\n } else {\n const prompts = [\n 'Build a todo app with Google OAuth sign-in',\n 'Build an Instagram clone where users can upload photos, like, and comment',\n 'Build an AI chatbot with conversation history',\n ];\n clack.note(\n `Open your coding agent (Claude Code, Codex, Cursor, etc.) and try:\\n\\n${prompts.map((p) => `• \"${p}\"`).join('\\n')}`,\n 'Start building',\n );\n }\n clack.outro('Done!');\n }\n } catch (err) {\n // Clean up the project directory if it was created but linking failed\n if (!projectLinked && hasTemplate && projectDir !== originalCwd) {\n process.chdir(originalCwd);\n await fs.rm(projectDir, { recursive: true, force: true }).catch(() => {});\n }\n throw err;\n }\n } catch (err) {\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n\nexport async function downloadTemplate(\n framework: Framework,\n projectConfig: ProjectConfig,\n projectName: string,\n json: boolean,\n _apiUrl?: string,\n): Promise<void> {\n const s = !json ? clack.spinner() : null;\n s?.start('Downloading template...');\n\n try {\n // Get the anon key from the OSS backend\n const anonKey = await getAnonKey();\n if (!anonKey) {\n throw new Error('Failed to retrieve anon key from backend');\n }\n\n // Create temp directory for download\n const tempDir = tmpdir();\n const targetDir = projectName;\n const templatePath = path.join(tempDir, targetDir);\n\n // Remove existing temp directory if it exists\n try {\n await fs.rm(templatePath, { recursive: true, force: true });\n } catch {\n // Directory doesn't exist, which is fine\n }\n\n const frame = framework === 'nextjs' ? 'nextjs' : 'react';\n const esc = (s: string) => process.platform === 'win32' ? `\"${s.replace(/\"/g, '\\\\\"')}\"` : `'${s.replace(/'/g, \"'\\\\''\")}'`;\n const command = `npx --yes create-insforge-app@latest ${esc(targetDir)} --frame ${frame} --base-url ${esc(projectConfig.oss_host)} --anon-key ${esc(anonKey)} --skip-install`;\n\n s?.message(`Running create-insforge-app (${frame})...`);\n\n await execAsync(command, {\n maxBuffer: 10 * 1024 * 1024,\n cwd: tempDir,\n });\n\n // Copy template files to current directory\n s?.message('Copying template files...');\n const cwd = process.cwd();\n await copyDir(templatePath, cwd);\n\n // Cleanup temp directory\n await fs.rm(templatePath, { recursive: true, force: true }).catch(() => {});\n\n s?.stop('Template files downloaded');\n } catch (err) {\n s?.stop('Template download failed');\n if (!json) {\n clack.log.warn(`Failed to download template: ${(err as Error).message}`);\n clack.log.info('You can manually set up the template later.');\n }\n }\n}\n\nexport async function downloadGitHubTemplate(\n templateName: string,\n projectConfig: ProjectConfig,\n json: boolean,\n): Promise<void> {\n const s = !json ? clack.spinner() : null;\n s?.start(`Downloading ${templateName} template...`);\n\n const tempDir = path.join(tmpdir(), `insforge-template-${Date.now()}`);\n\n try {\n await fs.mkdir(tempDir, { recursive: true });\n\n // Shallow clone the templates repo. INSFORGE_TEMPLATES_REPO + INSFORGE_TEMPLATES_BRANCH\n // are escape hatches for development against unmerged template branches.\n // Validated against safe-character patterns and passed via argv (execFile),\n // not a shell string, so a hostile env var can't inject extra git options.\n const templatesRepo = process.env.INSFORGE_TEMPLATES_REPO ?? 'https://github.com/InsForge/insforge-templates.git';\n if (!SAFE_REPO_PATTERN.test(templatesRepo)) {\n throw new Error(`INSFORGE_TEMPLATES_REPO has unsupported characters: ${templatesRepo}`);\n }\n const templatesBranch = process.env.INSFORGE_TEMPLATES_BRANCH;\n if (templatesBranch !== undefined && !SAFE_BRANCH_PATTERN.test(templatesBranch)) {\n throw new Error(`INSFORGE_TEMPLATES_BRANCH has unsupported characters: ${templatesBranch}`);\n }\n const cloneArgs = ['clone', '--depth', '1'];\n if (templatesBranch) cloneArgs.push('-b', templatesBranch);\n cloneArgs.push('--', templatesRepo, '.');\n await execFileAsync('git', cloneArgs, {\n cwd: tempDir,\n maxBuffer: 10 * 1024 * 1024,\n timeout: 60_000,\n });\n\n const templateDir = path.join(tempDir, templateName);\n const stat = await fs.stat(templateDir).catch(() => null);\n if (!stat?.isDirectory()) {\n throw new Error(`Template \"${templateName}\" not found in repository`);\n }\n\n // Copy template files to cwd\n s?.message('Copying template files...');\n const cwd = process.cwd();\n await copyDir(templateDir, cwd);\n\n // Write .env.local from .env.example with InsForge credentials filled in\n const envExamplePath = path.join(cwd, '.env.example');\n const envExampleExists = await fs.stat(envExamplePath).catch(() => null);\n if (envExampleExists) {\n const anonKey = await getAnonKey();\n const envExample = await fs.readFile(envExamplePath, 'utf-8');\n const envFinal = envExample.replace(\n /^([A-Z][A-Z0-9_]*=)(.*)$/gm,\n (_, prefix: string, _value: string) => {\n const key = prefix.slice(0, -1); // remove trailing '='\n if (/INSFORGE.*(URL|BASE_URL)$/.test(key)) return `${prefix}${projectConfig.oss_host}`;\n if (/INSFORGE.*ANON_KEY$/.test(key)) return `${prefix}${anonKey}`;\n if (key === 'NEXT_PUBLIC_APP_URL') return `${prefix}https://${projectConfig.appkey}.insforge.site`;\n return `${prefix}${_value}`;\n },\n );\n // (Auth-provider scaffolds handle their own env vars via applyAuthProvider.)\n const envLocalPath = path.join(cwd, '.env.local');\n try {\n await fs.writeFile(envLocalPath, envFinal, { flag: 'wx' });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'EEXIST') {\n if (!json) clack.log.warn('.env.local already exists; skipping env seeding.');\n } else {\n throw e;\n }\n }\n }\n\n s?.stop(`${templateName} template downloaded`);\n\n // Auto-run database migrations if db_init.sql exists\n const migrationPath = path.join(cwd, 'migrations', 'db_init.sql');\n const migrationExists = await fs.stat(migrationPath).catch(() => null);\n if (migrationExists) {\n const dbSpinner = !json ? clack.spinner() : null;\n dbSpinner?.start('Running database migrations...');\n try {\n const sql = await fs.readFile(migrationPath, 'utf-8');\n await runRawSql(sql, true);\n dbSpinner?.stop('Database migrations applied');\n } catch (err) {\n dbSpinner?.stop('Database migration failed');\n if (!json) {\n clack.log.warn(`Migration failed: ${(err as Error).message}`);\n clack.log.info('You can run the migration manually: npx @insforge/cli db query --unrestricted \"$(cat migrations/db_init.sql)\"');\n } else {\n throw err;\n }\n }\n }\n } catch (err) {\n s?.stop(`${templateName} template download failed`);\n const msg = `Failed to download ${templateName} template: ${(err as Error).message}`;\n if (json) {\n console.error(JSON.stringify({ warning: msg }));\n } else {\n clack.log.warn(msg);\n clack.log.info('You can manually clone from: https://github.com/InsForge/insforge-templates');\n }\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n}\n\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n/**\n * Read environment variables from the first env file found in the directory.\n * Priority: .env.local > .env.production > .env\n */\nexport async function readEnvFile(cwd: string): Promise<Array<{ key: string; value: string }>> {\n const candidates = ['.env.local', '.env.production', '.env'];\n for (const name of candidates) {\n const filePath = path.join(cwd, name);\n const exists = await fs.stat(filePath).catch(() => null);\n if (!exists) continue;\n\n const content = await fs.readFile(filePath, 'utf-8');\n const vars: Array<{ key: string; value: string }> = [];\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n // Strip surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n if (key) vars.push({ key, value });\n }\n return vars;\n }\n return [];\n}\n","import type { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { createReadStream } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport * as clack from '@clack/prompts';\nimport archiver from 'archiver';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError, getDeploymentError, formatFetchError } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type {\n CreateDeploymentResponse,\n CreateDirectDeploymentRequest,\n CreateDirectDeploymentResponse,\n DeploymentManifestFile,\n DeploymentManifestFileEntry,\n DeploymentSchema,\n ProjectConfig,\n StartDeploymentRequest,\n} from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nconst POLL_INTERVAL_MS = 5_000;\nconst POLL_TIMEOUT_MS = 300_000;\nconst DIRECT_UPLOAD_CONCURRENCY = 8;\n\nconst EXCLUDE_PATTERNS = [\n 'node_modules',\n '.git',\n '.next',\n '.env',\n '.env.local',\n 'dist',\n 'build',\n '.DS_Store',\n '.insforge',\n // IDE and AI agent configs\n '.claude',\n '.agents',\n '.augment',\n '.kilocode',\n '.kiro',\n '.qoder',\n '.qwen',\n '.roo',\n '.trae',\n '.windsurf',\n '.vercel',\n '.turbo',\n '.cache',\n 'skills',\n 'coverage',\n];\n\ntype LocalDeploymentFile = DeploymentManifestFileEntry & {\n absolutePath: string;\n};\n\nclass DirectDeploymentUnsupportedError extends Error {\n constructor() {\n super('Direct deployment endpoints are not available on this backend');\n this.name = 'DirectDeploymentUnsupportedError';\n }\n}\n\nfunction shouldExclude(name: string): boolean {\n const normalized = name.replace(/\\\\/g, '/');\n for (const pattern of EXCLUDE_PATTERNS) {\n if (\n normalized === pattern ||\n normalized.startsWith(pattern + '/') ||\n normalized.endsWith('/' + pattern) ||\n normalized.includes('/' + pattern + '/')\n ) {\n return true;\n }\n }\n if (normalized.endsWith('.log')) return true;\n return false;\n}\n\nfunction isInsforgeCloudOssHost(ossHost: string): boolean {\n try {\n return new URL(ossHost).hostname.endsWith('.insforge.app');\n } catch {\n return false;\n }\n}\n\nfunction normalizeRelativePath(sourceDir: string, absolutePath: string): string {\n return path.relative(sourceDir, absolutePath).split(path.sep).join('/').replace(/\\\\/g, '/');\n}\n\nasync function hashFile(filePath: string): Promise<{ sha: string; size: number }> {\n const hash = createHash('sha1');\n let size = 0;\n\n for await (const chunk of createReadStream(filePath)) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n hash.update(buffer);\n }\n\n return { sha: hash.digest('hex'), size };\n}\n\nasync function collectDeploymentFiles(sourceDir: string): Promise<LocalDeploymentFile[]> {\n const files: LocalDeploymentFile[] = [];\n\n async function walk(currentDir: string): Promise<void> {\n const entries = await fs.readdir(currentDir, { withFileTypes: true });\n entries.sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const absolutePath = path.join(currentDir, entry.name);\n const normalizedPath = normalizeRelativePath(sourceDir, absolutePath);\n\n if (!normalizedPath || shouldExclude(normalizedPath)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await walk(absolutePath);\n continue;\n }\n\n if (!entry.isFile()) {\n continue;\n }\n\n const { sha, size } = await hashFile(absolutePath);\n files.push({\n absolutePath,\n path: normalizedPath,\n sha,\n size,\n });\n }\n }\n\n await walk(sourceDir);\n return files;\n}\n\nasync function createZipBuffer(sourceDir: string): Promise<Buffer> {\n return new Promise<Buffer>((resolve, reject) => {\n const archive = archiver('zip', { zlib: { level: 9 } });\n const chunks: Buffer[] = [];\n\n archive.on('data', (chunk: Buffer) => chunks.push(chunk));\n archive.on('end', () => resolve(Buffer.concat(chunks)));\n archive.on('error', (err: Error) => reject(err));\n\n archive.directory(sourceDir, false, (entry) => {\n if (shouldExclude(entry.name)) return false;\n return entry;\n });\n\n void archive.finalize();\n });\n}\n\nasync function runWithConcurrency<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n let nextIndex = 0;\n\n async function runWorker(): Promise<void> {\n while (nextIndex < items.length) {\n const index = nextIndex;\n nextIndex += 1;\n await worker(items[index], index);\n }\n }\n\n const workerCount = Math.min(concurrency, items.length);\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n}\n\nasync function createDirectDeploymentSession(\n config: ProjectConfig,\n files: CreateDirectDeploymentRequest['files'],\n): Promise<CreateDirectDeploymentResponse> {\n const url = `${config.oss_host}/api/deployments/direct`;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n },\n body: JSON.stringify({ files }),\n });\n } catch (error) {\n throw new CLIError(formatFetchError(error, url));\n }\n\n if (response.status === 404) {\n throw new DirectDeploymentUnsupportedError();\n }\n\n if (!response.ok) {\n const err = (await response.json().catch(() => ({}))) as {\n error?: string;\n message?: string;\n nextActions?: string;\n };\n\n let message = err.message ?? err.error ?? `OSS request failed: ${response.status}`;\n if (err.nextActions) {\n message += `\\n${err.nextActions}`;\n }\n\n throw new CLIError(message);\n }\n\n const payload = (await response.json()) as Partial<CreateDirectDeploymentResponse>;\n if (!payload.id || !Array.isArray(payload.files)) {\n throw new CLIError('Unexpected response from direct deployment create endpoint.');\n }\n\n return payload as CreateDirectDeploymentResponse;\n}\n\nasync function uploadDirectDeploymentFile(\n deploymentId: string,\n manifestFile: DeploymentManifestFile,\n localFile: LocalDeploymentFile,\n): Promise<void> {\n const requestInit = {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'Content-Length': String(localFile.size),\n },\n body: createReadStream(localFile.absolutePath),\n duplex: 'half',\n } as RequestInit & { duplex: 'half' };\n\n await ossFetch(\n `/api/deployments/${encodeURIComponent(deploymentId)}/files/${encodeURIComponent(manifestFile.fileId)}/content`,\n requestInit,\n );\n}\n\nasync function startDirectDeployment(\n deploymentId: string,\n startBody: StartDeploymentRequest,\n): Promise<void> {\n const response = await ossFetch(`/api/deployments/${encodeURIComponent(deploymentId)}/start`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(startBody),\n });\n\n await response.json();\n}\n\nasync function pollDeployment(\n deploymentId: string,\n spinner: ReturnType<typeof clack.spinner> | null | undefined,\n syncBeforeRead: boolean,\n): Promise<DeployProjectResult> {\n spinner?.message('Building and deploying...');\n const startTime = Date.now();\n let deployment: DeploymentSchema | null = null;\n\n while (Date.now() - startTime < POLL_TIMEOUT_MS) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n try {\n if (syncBeforeRead) {\n await ossFetch(`/api/deployments/${deploymentId}/sync`, { method: 'POST' });\n }\n\n const statusRes = await ossFetch(`/api/deployments/${deploymentId}`);\n deployment = (await statusRes.json()) as DeploymentSchema;\n const status = deployment.status.toUpperCase();\n\n if (status === 'READY') {\n break;\n }\n if (status === 'ERROR' || status === 'CANCELED') {\n spinner?.stop('Deployment failed');\n throw new CLIError(\n getDeploymentError(deployment.metadata) ?? `Deployment failed with status: ${deployment.status}`,\n );\n }\n\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n spinner?.message(`Building and deploying... (${elapsed}s, status: ${deployment.status})`);\n } catch (err) {\n if (err instanceof CLIError) throw err;\n // Ignore transient fetch errors during polling\n }\n }\n\n const isReady = deployment?.status.toUpperCase() === 'READY';\n const liveUrl = isReady ? (deployment?.url ?? null) : null;\n\n return { deploymentId, deployment, isReady, liveUrl };\n}\n\nasync function deployProjectDirect(\n opts: DeployProjectOptions,\n config: ProjectConfig,\n): Promise<DeployProjectResult> {\n const { sourceDir, startBody = {}, spinner } = opts;\n\n spinner?.start('Scanning source files...');\n const localFiles = await collectDeploymentFiles(sourceDir);\n if (localFiles.length === 0) {\n throw new CLIError('No deployable files found in the source directory.');\n }\n\n spinner?.message('Creating deployment...');\n const createResult = await createDirectDeploymentSession(\n config,\n localFiles.map(({ path: relativePath, sha, size }) => ({ path: relativePath, sha, size })),\n );\n\n const localFileByPath = new Map(localFiles.map((file) => [file.path, file]));\n\n const pendingFiles = createResult.files.filter((file) => !file.uploadedAt);\n\n spinner?.message(`Uploading ${pendingFiles.length} file${pendingFiles.length === 1 ? '' : 's'}...`);\n await runWithConcurrency(pendingFiles, DIRECT_UPLOAD_CONCURRENCY, async (manifestFile) => {\n const localFile = localFileByPath.get(manifestFile.path);\n if (!localFile) {\n throw new CLIError(`Backend returned an unknown file path: ${manifestFile.path}`);\n }\n if (localFile.sha !== manifestFile.sha || localFile.size !== manifestFile.size) {\n throw new CLIError(`Backend file metadata mismatch for: ${manifestFile.path}`);\n }\n\n await uploadDirectDeploymentFile(createResult.id, manifestFile, localFile);\n });\n\n spinner?.message('Starting deployment...');\n await startDirectDeployment(createResult.id, startBody);\n\n return await pollDeployment(createResult.id, spinner, !isInsforgeCloudOssHost(config.oss_host));\n}\n\nasync function deployProjectLegacy(\n opts: DeployProjectOptions,\n): Promise<DeployProjectResult> {\n const { sourceDir, startBody = {}, spinner } = opts;\n\n spinner?.message('Creating deployment...');\n const createRes = await ossFetch('/api/deployments', { method: 'POST' });\n const { id: deploymentId, uploadUrl, uploadFields } =\n (await createRes.json()) as CreateDeploymentResponse;\n\n spinner?.message('Compressing source files...');\n const zipBuffer = await createZipBuffer(sourceDir);\n\n spinner?.message('Uploading...');\n const formData = new FormData();\n for (const [key, value] of Object.entries(uploadFields)) {\n formData.append(key, value);\n }\n formData.append('file', new Blob([zipBuffer], { type: 'application/zip' }), 'deployment.zip');\n\n const uploadRes = await fetch(uploadUrl, { method: 'POST', body: formData });\n if (!uploadRes.ok) {\n const uploadErr = await uploadRes.text();\n throw new CLIError(`Failed to upload: ${uploadErr}`);\n }\n\n spinner?.message('Starting deployment...');\n const startRes = await ossFetch(`/api/deployments/${deploymentId}/start`, {\n method: 'POST',\n body: JSON.stringify(startBody),\n });\n await startRes.json();\n\n return await pollDeployment(deploymentId, spinner, false);\n}\n\nexport interface DeployProjectOptions {\n sourceDir: string;\n startBody?: StartDeploymentRequest;\n spinner?: ReturnType<typeof clack.spinner> | null;\n}\n\nexport interface DeployProjectResult {\n deploymentId: string;\n deployment: DeploymentSchema | null;\n isReady: boolean;\n liveUrl: string | null;\n}\n\n/**\n * Core deploy logic: direct upload -> start -> poll.\n * Falls back to the legacy zip upload flow when the backend does not expose\n * the direct deployment endpoints yet.\n */\nexport async function deployProject(opts: DeployProjectOptions): Promise<DeployProjectResult> {\n const config = getProjectConfig();\n if (!config) {\n throw new ProjectNotLinkedError();\n }\n\n try {\n return await deployProjectDirect(opts, config);\n } catch (error) {\n if (!(error instanceof DirectDeploymentUnsupportedError)) {\n throw error;\n }\n\n opts.spinner?.message('Direct deployment is not available on this backend. Falling back to the legacy zip upload flow...');\n return await deployProjectLegacy(opts);\n }\n}\n\nexport function registerDeploymentsDeployCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('deploy [directory]')\n .description('Deploy a frontend project to Vercel')\n .option('--env <vars>', 'Environment variables as JSON (e.g. {\"KEY\":\"value\"})')\n .option('--meta <meta>', 'Deployment metadata as JSON')\n .action(async (directory: string | undefined, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n // Resolve source directory\n const sourceDir = path.resolve(directory ?? '.');\n const stats = await fs.stat(sourceDir).catch(() => null);\n if (!stats?.isDirectory()) {\n throw new CLIError(`\"${sourceDir}\" is not a valid directory.`);\n }\n\n // Reject excluded directories as deploy source\n const dirName = path.basename(sourceDir);\n if (EXCLUDE_PATTERNS.includes(dirName)) {\n throw new CLIError(\n `\"${dirName}\" is an excluded directory and cannot be used as a deploy source. Please specify your project root or output directory instead.`,\n );\n }\n\n const spinner = !json ? clack.spinner() : null;\n\n // Parse env/meta from CLI flags\n const startBody: StartDeploymentRequest = {};\n if (opts.env) {\n try {\n const parsed = JSON.parse(opts.env) as unknown;\n if (Array.isArray(parsed)) {\n startBody.envVars = parsed as Array<{ key: string; value: string }>;\n } else if (parsed && typeof parsed === 'object') {\n startBody.envVars = Object.entries(parsed as Record<string, unknown>).map(([key, value]) => ({\n key,\n value: String(value),\n }));\n } else {\n throw new CLIError('Invalid --env JSON. Expected an object or array.');\n }\n } catch {\n throw new CLIError('Invalid --env JSON.');\n }\n }\n if (opts.meta) {\n try {\n startBody.meta = JSON.parse(opts.meta);\n } catch {\n throw new CLIError('Invalid --meta JSON.');\n }\n }\n\n const result = await deployProject({ sourceDir, startBody, spinner });\n\n if (result.isReady) {\n spinner?.stop('Deployment complete');\n if (json) {\n outputJson(result.deployment);\n } else {\n if (result.liveUrl) {\n clack.log.success(`Live at: ${result.liveUrl}`);\n }\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n }\n } else {\n spinner?.stop('Deployment is still building');\n if (json) {\n outputJson({\n id: result.deploymentId,\n status: result.deployment?.status ?? 'building',\n timedOut: true,\n });\n } else {\n clack.log.info(`Deployment ID: ${result.deploymentId}`);\n clack.log.warn('Deployment did not finish within 5 minutes.');\n clack.log.info(`Check status with: npx @insforge/cli deployments status ${result.deploymentId}`);\n }\n }\n await reportCliUsage('cli.deployments.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.deploy', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { runRawSql } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbCommands(dbCmd: Command): void {\n dbCmd\n .command('query <sql>')\n .description('Execute a SQL query against the database')\n .option('--unrestricted', 'Use unrestricted mode (allows system table access)')\n .action(async (sql: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const { rows, raw } = await runRawSql(sql, !!opts.unrestricted);\n\n if (json) {\n outputJson(raw);\n } else {\n if (rows.length > 0) {\n const headers = Object.keys(rows[0]);\n outputTable(\n headers,\n rows.map((row) => headers.map((h) => String(row[h] ?? ''))),\n );\n console.log(`${rows.length} row(s) returned.`);\n } else {\n console.log('Query executed successfully.');\n if (rows.length === 0) {\n console.log('No rows returned.');\n }\n }\n }\n await reportCliUsage('cli.db.query', true);\n } catch (err) {\n await reportCliUsage('cli.db.query', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbTablesCommand(dbCmd: Command): void {\n dbCmd\n .command('tables')\n .description('List all database tables')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/tables');\n const tables = await res.json() as string[];\n\n if (json) {\n outputJson(tables);\n } else {\n if (tables.length === 0) {\n console.log('No tables found.');\n return;\n }\n outputTable(\n ['Table Name'],\n tables.map((t) => [t]),\n );\n }\n await reportCliUsage('cli.db.tables', true);\n } catch (err) {\n await reportCliUsage('cli.db.tables', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseFunctionsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbFunctionsCommand(dbCmd: Command): void {\n dbCmd\n .command('functions')\n .description('List all database functions')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/functions');\n const raw = await res.json();\n const functions: DatabaseFunctionsResponse['functions'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseFunctionsResponse).functions ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (functions.length === 0) {\n console.log('No database functions found.');\n return;\n }\n outputTable(\n ['Name', 'Definition', 'Kind'],\n functions.map((f) => [f.functionName, f.functionDef, f.kind]),\n );\n }\n await reportCliUsage('cli.db.functions', true);\n } catch (err) {\n await reportCliUsage('cli.db.functions', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseIndexesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbIndexesCommand(dbCmd: Command): void {\n dbCmd\n .command('indexes')\n .description('List all database indexes')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/indexes');\n const raw = await res.json();\n const indexes: DatabaseIndexesResponse['indexes'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseIndexesResponse).indexes ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (indexes.length === 0) {\n console.log('No database indexes found.');\n return;\n }\n outputTable(\n ['Table', 'Index Name', 'Definition', 'Unique', 'Primary'],\n indexes.map((i) => [\n i.tableName,\n i.indexName,\n i.indexDef,\n i.isUnique ? 'Yes' : 'No',\n i.isPrimary ? 'Yes' : 'No',\n ]),\n );\n }\n await reportCliUsage('cli.db.indexes', true);\n } catch (err) {\n await reportCliUsage('cli.db.indexes', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabasePoliciesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbPoliciesCommand(dbCmd: Command): void {\n dbCmd\n .command('policies')\n .description('List all RLS policies')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/policies');\n const raw = await res.json();\n const policies: DatabasePoliciesResponse['policies'] = Array.isArray(raw)\n ? raw\n : (raw as DatabasePoliciesResponse).policies ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (policies.length === 0) {\n console.log('No RLS policies found.');\n return;\n }\n outputTable(\n ['Table', 'Policy Name', 'Command', 'Roles', 'Qual', 'With Check'],\n policies.map((p) => [\n String(p.tableName ?? '-'),\n String(p.policyName ?? '-'),\n String(p.cmd ?? '-'),\n Array.isArray(p.roles) ? p.roles.join(', ') : String(p.roles ?? '-'),\n String(p.qual ?? '-'),\n String(p.withCheck ?? '-'),\n ]),\n );\n }\n await reportCliUsage('cli.db.policies', true);\n } catch (err) {\n await reportCliUsage('cli.db.policies', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DatabaseTriggersResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbTriggersCommand(dbCmd: Command): void {\n dbCmd\n .command('triggers')\n .description('List all database triggers')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/database/triggers');\n const raw = await res.json();\n const triggers: DatabaseTriggersResponse['triggers'] = Array.isArray(raw)\n ? raw\n : (raw as DatabaseTriggersResponse).triggers ?? [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (triggers.length === 0) {\n console.log('No database triggers found.');\n return;\n }\n outputTable(\n ['Name', 'Table', 'Timing', 'Events', 'ActionOrientation', 'ActionCondition', 'ActionStatement'],\n triggers.map((t) => [\n t.triggerName,\n t.tableName,\n t.actionTiming,\n t.eventManipulation,\n t.actionOrientation,\n t.actionCondition ?? '-',\n t.actionStatement,\n ]),\n );\n }\n await reportCliUsage('cli.db.triggers', true);\n } catch (err) {\n await reportCliUsage('cli.db.triggers', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDbRpcCommand(dbCmd: Command): void {\n dbCmd\n .command('rpc <functionName>')\n .description('Call a database function via RPC')\n .option('--data <json>', 'JSON body to pass as function parameters')\n .action(async (functionName: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body = opts.data ? JSON.stringify(JSON.parse(opts.data) as unknown) : undefined;\n\n const res = await ossFetch(`/api/database/rpc/${encodeURIComponent(functionName)}`, {\n method: body ? 'POST' : 'GET',\n ...(body ? { body } : {}),\n });\n\n const result = await res.json() as unknown;\n\n if (json) {\n outputJson(result);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n await reportCliUsage('cli.db.rpc', true);\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDbExportCommand(dbCmd: Command): void {\n dbCmd\n .command('export')\n .description('Export database schema and/or data')\n .option('--format <format>', 'Export format: sql or json', 'sql')\n .option('--tables <tables>', 'Comma-separated list of tables to export (default: all)')\n .option('--no-data', 'Exclude table data (schema only)')\n .option('--include-functions', 'Include database functions')\n .option('--include-sequences', 'Include sequences')\n .option('--include-views', 'Include views')\n .option('--row-limit <n>', 'Maximum rows per table')\n .option('-o, --output <file>', 'Output file path (default: stdout)')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {\n format: opts.format,\n includeData: opts.data !== false,\n };\n\n if (opts.tables) {\n body.tables = (opts.tables as string).split(',').map((t: string) => t.trim());\n }\n if (opts.includeFunctions) body.includeFunctions = true;\n if (opts.includeSequences) body.includeSequences = true;\n if (opts.includeViews) body.includeViews = true;\n if (opts.rowLimit) body.rowLimit = parseInt(opts.rowLimit as string, 10);\n\n const res = await ossFetch('/api/database/advance/export', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const raw = await res.text();\n\n // API may return JSON wrapper { format, content, tables } or raw SQL/JSON text\n let content: string;\n let meta: { format?: string; tables?: string[] } | null = null;\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed.content === 'string') {\n content = parsed.content;\n meta = { format: parsed.format as string, tables: parsed.tables as string[] };\n } else {\n content = raw;\n }\n } catch {\n content = raw;\n }\n\n if (json) {\n outputJson(meta ?? { content });\n return;\n }\n\n if (opts.output) {\n writeFileSync(opts.output as string, content);\n const tableCount = meta?.tables?.length;\n const suffix = tableCount ? ` (${tableCount} tables, format: ${meta?.format ?? opts.format})` : '';\n outputSuccess(`Exported to ${opts.output}${suffix}`);\n } else {\n console.log(content);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDbImportCommand(dbCmd: Command): void {\n dbCmd\n .command('import <file>')\n .description('Import database from a local SQL file')\n .option('--truncate', 'Truncate existing tables before import')\n .action(async (file: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const fileContent = readFileSync(file);\n const fileName = basename(file);\n\n const formData = new FormData();\n formData.append('file', new Blob([fileContent]), fileName);\n if (opts.truncate) {\n formData.append('truncate', 'true');\n }\n\n const res = await fetch(`${config.oss_host}/api/database/advance/import`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n body: formData,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Import failed: ${res.status}`);\n }\n\n const data = await res.json() as { filename: string; fileSize: number; tables: string[]; rowsImported: number };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Imported ${data.filename} (${data.tables.length} tables, ${data.rowsImported} rows)`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport {\n canonicalMigrationVersion,\n compareMigrationVersions,\n ensureMigrationsDir,\n findOlderThanHeadLocalMigrations,\n formatMigrationSql,\n getMigrationsDir,\n getNextLocalMigrationVersion,\n getRemoteMigrationVersionStatus,\n listLocalMigrationFilenames,\n parseMigrationFilename,\n parseStrictLocalMigrations,\n resolveMigrationTarget,\n} from '../../lib/migrations.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type {\n CreateMigrationRequest,\n CreateMigrationResponse,\n DatabaseMigrationsResponse,\n Migration,\n} from '../../types.js';\n\nfunction getLatestRemoteVersion(migrations: Migration[]): string | null {\n return migrations.reduce(\n (latestVersion, migration) =>\n !latestVersion || compareMigrationVersions(migration.version, latestVersion) > 0\n ? migration.version\n : latestVersion,\n null as string | null,\n );\n}\n\nfunction buildMigrationFilename(version: string, name: string): string {\n return `${version}_${name}.sql`;\n}\n\nfunction buildOlderThanHeadError(\n migrationLabel: string,\n latestRemoteVersion: string,\n): CLIError {\n return new CLIError(\n `Migration ${migrationLabel} is older than the current remote head (${latestRemoteVersion}) and is not applied remotely. Rename it with a newer timestamp, or delete it locally if it is stale.`,\n );\n}\n\nfunction formatCreatedAt(createdAt: string): string {\n const date = new Date(createdAt);\n return Number.isNaN(date.getTime()) ? createdAt : date.toLocaleString();\n}\n\nasync function fetchRemoteMigrations(): Promise<Migration[]> {\n const res = await ossFetch('/api/database/migrations');\n const raw = (await res.json()) as DatabaseMigrationsResponse;\n const migrations = Array.isArray(raw.migrations) ? raw.migrations : [];\n\n for (const migration of migrations) {\n migration.version = canonicalMigrationVersion(migration.version);\n }\n\n return migrations;\n}\n\nfunction assertValidMigrationName(name: string): void {\n if (!/^[a-z0-9-]+$/u.test(name)) {\n throw new CLIError('Migration name must use lowercase letters, numbers, and hyphens only.');\n }\n}\n\nasync function applyMigration(\n targetMigration: Pick<Migration, 'version' | 'name'>,\n sql: string,\n): Promise<CreateMigrationResponse> {\n const body: CreateMigrationRequest = {\n version: targetMigration.version,\n name: targetMigration.name,\n sql,\n };\n\n const res = await ossFetch('/api/database/migrations', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const createdMigration = (await res.json()) as CreateMigrationResponse;\n\n if (createdMigration.version !== targetMigration.version) {\n throw new CLIError(\n `Applied migration version mismatch. Expected ${targetMigration.version}, received ${createdMigration.version}.`,\n );\n }\n\n return createdMigration;\n}\n\nexport function registerDbMigrationsCommand(dbCmd: Command): void {\n const migrationsCmd = dbCmd.command('migrations').description('Manage database migration files');\n\n migrationsCmd\n .command('list')\n .description('List applied remote database migrations')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n\n if (json) {\n outputJson({ migrations });\n } else if (migrations.length === 0) {\n console.log('No database migrations found.');\n } else {\n outputTable(\n ['Version', 'Name', 'Created At'],\n migrations.map((migration) => [\n migration.version,\n migration.name,\n formatCreatedAt(migration.createdAt),\n ]),\n );\n }\n\n await reportCliUsage('cli.db.migrations.list', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.list', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('fetch')\n .description('Fetch applied remote migrations into migrations/')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n const migrationsDir = ensureMigrationsDir();\n // Skip by canonical version, not just filepath: a local `0001_foo.sql`\n // and a remote `1_foo.sql` refer to the same migration, and writing\n // both would fail parseStrictLocalMigrations' duplicate-version check.\n const existingLocalVersions = new Set(\n listLocalMigrationFilenames()\n .map((filename) => parseMigrationFilename(filename))\n .filter((migration): migration is NonNullable<typeof migration> => migration !== null)\n .map((migration) => migration.version),\n );\n const createdFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n for (const migration of [...migrations].sort(\n (left, right) => compareMigrationVersions(left.version, right.version),\n )) {\n assertValidMigrationName(migration.name);\n\n const filename = buildMigrationFilename(\n migration.version,\n migration.name,\n );\n const filePath = join(migrationsDir, filename);\n\n if (existingLocalVersions.has(migration.version) || existsSync(filePath)) {\n skippedFiles.push(filename);\n continue;\n }\n\n writeFileSync(filePath, formatMigrationSql(migration.statements));\n createdFiles.push(filename);\n existingLocalVersions.add(migration.version);\n }\n\n if (json) {\n outputJson({\n directory: migrationsDir,\n totalRemoteMigrations: migrations.length,\n createdFiles,\n skippedFiles,\n });\n } else {\n outputSuccess(\n `Fetched ${migrations.length} remote migration(s) into ${migrationsDir}.`,\n );\n console.log(`Created: ${createdFiles.length}`);\n console.log(`Skipped: ${skippedFiles.length}`);\n }\n\n await reportCliUsage('cli.db.migrations.fetch', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.fetch', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('new <migration-name>')\n .description('Create a new local migration file')\n .action(async (migrationName: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n assertValidMigrationName(migrationName);\n\n const migrations = await fetchRemoteMigrations();\n const latestRemoteVersion = getLatestRemoteVersion(migrations);\n const localMigrations = parseStrictLocalMigrations(listLocalMigrationFilenames());\n const nextVersion = getNextLocalMigrationVersion(\n localMigrations,\n latestRemoteVersion,\n );\n\n const filename = buildMigrationFilename(nextVersion, migrationName);\n const migrationsDir = ensureMigrationsDir();\n const filePath = join(migrationsDir, filename);\n\n try {\n writeFileSync(filePath, '', { flag: 'wx' });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new CLIError(`Migration file already exists: ${filename}`);\n }\n throw error;\n }\n\n if (json) {\n outputJson({ filename, path: filePath, version: nextVersion });\n } else {\n outputSuccess(`Created migration file ${filename}`);\n }\n\n await reportCliUsage('cli.db.migrations.new', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.new', false);\n handleError(err, json);\n }\n });\n\n migrationsCmd\n .command('up [target]')\n .description('Apply one or more local migration files')\n .option('--all', 'Apply all pending local migration files')\n .option('--to <version-or-filename>', 'Apply pending local migrations up to a version or file')\n .action(async (target: string | undefined, options, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const migrations = await fetchRemoteMigrations();\n const latestRemoteVersion = getLatestRemoteVersion(migrations);\n const appliedRemoteVersions = new Set(\n migrations.map((migration) => migration.version),\n );\n const filenames = listLocalMigrationFilenames();\n\n const requestedModes = [Boolean(target), Boolean(options.all), Boolean(options.to)].filter(Boolean);\n if (requestedModes.length !== 1) {\n throw new CLIError(\n 'Use exactly one apply mode: `up <target>`, `up --to <version-or-filename>`, or `up --all`.',\n );\n }\n\n const applySingleTarget = async (targetMigrationFilenameOrVersion: string) => {\n const targetMigration = resolveMigrationTarget(targetMigrationFilenameOrVersion, filenames);\n const validLocalMigrations = filenames\n .map((filename) => parseMigrationFilename(filename))\n .filter((migration): migration is NonNullable<typeof migration> => migration !== null)\n .sort((left, right) => compareMigrationVersions(left.version, right.version));\n\n const targetRemoteStatus = getRemoteMigrationVersionStatus(\n targetMigration.version,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n\n if (targetRemoteStatus === 'already-applied') {\n throw new CLIError(`Migration ${targetMigration.filename} is already applied remotely.`);\n }\n\n if (targetRemoteStatus === 'older-than-head' && latestRemoteVersion) {\n throw buildOlderThanHeadError(targetMigration.filename, latestRemoteVersion);\n }\n\n const earlierPendingMigration = validLocalMigrations.find(\n (migration) =>\n migration.version !== targetMigration.version &&\n (!latestRemoteVersion ||\n compareMigrationVersions(migration.version, latestRemoteVersion) > 0) &&\n compareMigrationVersions(migration.version, targetMigration.version) < 0,\n );\n\n if (earlierPendingMigration) {\n throw new CLIError(\n `Migration ${targetMigration.filename} is not the next pending local migration. Apply ${earlierPendingMigration.filename} first, or fix/delete it locally if it is invalid or no longer needed.`,\n );\n }\n\n const filePath = join(getMigrationsDir(), targetMigration.filename);\n if (!existsSync(filePath)) {\n throw new CLIError(`Local migration file not found: ${targetMigration.filename}`);\n }\n\n const sql = readFileSync(filePath, 'utf-8');\n if (!sql.trim()) {\n throw new CLIError(`Migration file is empty: ${targetMigration.filename}`);\n }\n\n return applyMigration(targetMigration, sql);\n };\n\n let appliedMigrations: CreateMigrationResponse[] = [];\n\n if (target) {\n appliedMigrations = [await applySingleTarget(target)];\n } else {\n const localMigrations = parseStrictLocalMigrations(filenames);\n const olderThanHeadMigrations = findOlderThanHeadLocalMigrations(\n localMigrations,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n const pendingMigrations = localMigrations.filter(\n (migration) =>\n getRemoteMigrationVersionStatus(\n migration.version,\n appliedRemoteVersions,\n latestRemoteVersion,\n ) === 'pending',\n );\n\n if (olderThanHeadMigrations.length > 0 && latestRemoteVersion) {\n throw buildOlderThanHeadError(\n olderThanHeadMigrations[0].filename,\n latestRemoteVersion,\n );\n }\n\n if (pendingMigrations.length === 0) {\n if (json) {\n outputJson({ appliedMigrations: [] });\n } else {\n outputSuccess('No pending local migrations to apply.');\n }\n\n await reportCliUsage('cli.db.migrations.up', true);\n return;\n }\n\n let migrationsToApply = pendingMigrations;\n\n if (options.to) {\n const targetVersion = /^\\d{14}$/u.test(options.to)\n ? options.to\n : resolveMigrationTarget(options.to, filenames).version;\n\n const targetRemoteStatus = getRemoteMigrationVersionStatus(\n targetVersion,\n appliedRemoteVersions,\n latestRemoteVersion,\n );\n\n if (targetRemoteStatus === 'already-applied') {\n throw new CLIError(`Migration ${options.to} is already applied remotely.`);\n }\n\n if (targetRemoteStatus === 'older-than-head' && latestRemoteVersion) {\n throw buildOlderThanHeadError(options.to, latestRemoteVersion);\n }\n\n migrationsToApply = pendingMigrations.filter(\n (migration) => compareMigrationVersions(migration.version, targetVersion) <= 0,\n );\n\n if (\n migrationsToApply.length === 0 ||\n migrationsToApply[migrationsToApply.length - 1]?.version !== targetVersion\n ) {\n throw new CLIError(\n `Pending local migration not found for target ${options.to}.`,\n );\n }\n }\n\n for (const migration of migrationsToApply) {\n const filePath = join(getMigrationsDir(), migration.filename);\n if (!existsSync(filePath)) {\n throw new CLIError(`Local migration file not found: ${migration.filename}`);\n }\n\n const sql = readFileSync(filePath, 'utf-8');\n if (!sql.trim()) {\n throw new CLIError(`Migration file is empty: ${migration.filename}`);\n }\n\n appliedMigrations.push(await applyMigration(migration, sql));\n }\n }\n\n if (json) {\n outputJson({ appliedMigrations });\n } else {\n outputSuccess(`Applied ${appliedMigrations.length} migration file(s).`);\n for (const migration of appliedMigrations) {\n console.log(`- ${buildMigrationFilename(migration.version, migration.name)}`);\n }\n }\n\n await reportCliUsage('cli.db.migrations.up', true);\n } catch (err) {\n await reportCliUsage('cli.db.migrations.up', false);\n handleError(err, json);\n }\n });\n}\n","import { existsSync, mkdirSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { CLIError } from './errors.js';\n\nexport interface ParsedMigrationFile {\n filename: string;\n version: string;\n name: string;\n}\n\nexport type RemoteMigrationVersionStatus = 'already-applied' | 'older-than-head' | 'pending';\n\n// Cap at 64 digits so unbounded input can't DoS BigInt conversions or\n// the backend's `version::numeric` casts. 64 comfortably fits 4-digit\n// Drizzle sequences, 14-digit YYYYMMDDHHmmss timestamps, and anything\n// realistic in between.\nconst MIGRATION_VERSION_REGEX = /^\\d{1,64}$/u;\nconst MIGRATION_FILENAME_REGEX = /^(\\d{1,64})_([a-z0-9-]+)\\.sql$/u;\n\nexport function assertValidMigrationVersion(version: string): void {\n if (!MIGRATION_VERSION_REGEX.test(version)) {\n throw new CLIError(`Invalid migration version: ${version}. Expected a numeric string of at most 64 digits (e.g. 0001 or 20260418091500).`);\n }\n}\n\n// Numeric prefixes like \"0001\" and \"1\" refer to the same migration. Strip\n// leading zeros so Set lookups, equality checks, and duplicate detection all\n// agree with the numeric ordering in compareMigrationVersions.\nexport function canonicalMigrationVersion(version: string): string {\n assertValidMigrationVersion(version);\n return BigInt(version).toString();\n}\n\nexport function parseMigrationFilename(filename: string): ParsedMigrationFile | null {\n const match = MIGRATION_FILENAME_REGEX.exec(filename);\n if (!match) {\n return null;\n }\n\n return {\n filename,\n version: canonicalMigrationVersion(match[1]),\n name: match[2],\n };\n}\n\nexport function compareMigrationVersions(left: string, right: string): number {\n if (MIGRATION_VERSION_REGEX.test(left) && MIGRATION_VERSION_REGEX.test(right)) {\n const a = BigInt(left);\n const b = BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n }\n return left.localeCompare(right);\n}\n\nexport function getRemoteMigrationVersionStatus(\n version: string,\n appliedVersions: ReadonlySet<string>,\n latestRemoteVersion: string | null,\n): RemoteMigrationVersionStatus {\n if (appliedVersions.has(version)) {\n return 'already-applied';\n }\n\n if (\n latestRemoteVersion &&\n compareMigrationVersions(version, latestRemoteVersion) < 0\n ) {\n return 'older-than-head';\n }\n\n return 'pending';\n}\n\nfunction formatMigrationVersion(date: Date): string {\n const year = String(date.getUTCFullYear());\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const day = String(date.getUTCDate()).padStart(2, '0');\n const hour = String(date.getUTCHours()).padStart(2, '0');\n const minute = String(date.getUTCMinutes()).padStart(2, '0');\n const second = String(date.getUTCSeconds()).padStart(2, '0');\n\n return `${year}${month}${day}${hour}${minute}${second}`;\n}\n\nexport function incrementMigrationVersion(version: string): string {\n assertValidMigrationVersion(version);\n if (!/^\\d{14}$/u.test(version)) {\n return String(BigInt(version) + 1n);\n }\n const year = Number(version.slice(0, 4));\n const month = Number(version.slice(4, 6)) - 1;\n const day = Number(version.slice(6, 8));\n const hour = Number(version.slice(8, 10));\n const minute = Number(version.slice(10, 12));\n const second = Number(version.slice(12, 14));\n const nextTimestamp = Date.UTC(year, month, day, hour, minute, second + 1);\n\n return formatMigrationVersion(new Date(nextTimestamp));\n}\n\nexport function getMigrationsDir(cwd: string = process.cwd()): string {\n return join(cwd, 'migrations');\n}\n\nexport function ensureMigrationsDir(cwd: string = process.cwd()): string {\n const migrationsDir = getMigrationsDir(cwd);\n if (!existsSync(migrationsDir)) {\n mkdirSync(migrationsDir, { recursive: true });\n }\n return migrationsDir;\n}\n\nexport function listLocalMigrationFilenames(cwd: string = process.cwd()): string[] {\n const migrationsDir = getMigrationsDir(cwd);\n if (!existsSync(migrationsDir)) {\n return [];\n }\n\n return readdirSync(migrationsDir).sort((left, right) => left.localeCompare(right));\n}\n\nexport function parseStrictLocalMigrations(filenames: string[]): ParsedMigrationFile[] {\n const migrations = filenames.map((filename) => {\n const parsedMigration = parseMigrationFilename(filename);\n if (!parsedMigration) {\n throw new CLIError(\n `Invalid migration filename: ${filename}. Expected <migration_version>_<migration-name>.sql.`,\n );\n }\n return parsedMigration;\n });\n\n assertNoDuplicateMigrationVersions(migrations);\n return migrations.sort((left, right) => compareMigrationVersions(left.version, right.version));\n}\n\nexport function assertNoDuplicateMigrationVersions(migrations: ParsedMigrationFile[]): void {\n const seen = new Set<string>();\n\n for (const migration of migrations) {\n if (seen.has(migration.version)) {\n throw new CLIError(`Duplicate local migration version found: ${migration.version}`);\n }\n seen.add(migration.version);\n }\n}\n\nexport function getNextLocalMigrationVersion(\n migrations: ParsedMigrationFile[],\n latestRemoteVersion: string | null,\n now: Date = new Date(),\n): string {\n const orderedMigrations = [...migrations].sort((left, right) =>\n compareMigrationVersions(left.version, right.version),\n );\n assertNoDuplicateMigrationVersions(orderedMigrations);\n\n const latestKnownVersion = orderedMigrations.reduce<string | null>(\n (latestVersion, migration) => {\n if (!latestVersion || compareMigrationVersions(migration.version, latestVersion) > 0) {\n return migration.version;\n }\n return latestVersion;\n },\n latestRemoteVersion,\n );\n\n const currentVersion = formatMigrationVersion(now);\n if (!latestKnownVersion || compareMigrationVersions(currentVersion, latestKnownVersion) > 0) {\n return currentVersion;\n }\n\n return incrementMigrationVersion(latestKnownVersion);\n}\n\nexport function formatMigrationSql(statements: string[]): string {\n const normalizedStatements = statements\n .map((statement) => statement.trim().replace(/;\\s*$/u, ''))\n .filter(Boolean);\n\n return normalizedStatements\n .join(';\\n\\n')\n .concat(normalizedStatements.length > 0 ? ';\\n' : '');\n}\n\nexport function findOlderThanHeadLocalMigrations(\n migrations: ParsedMigrationFile[],\n appliedVersions: ReadonlySet<string>,\n latestRemoteVersion: string | null,\n): ParsedMigrationFile[] {\n return migrations.filter(\n (migration) =>\n getRemoteMigrationVersionStatus(\n migration.version,\n appliedVersions,\n latestRemoteVersion,\n ) === 'older-than-head',\n );\n}\n\nexport function findLocalMigrationByVersion(\n version: string,\n filenames: string[],\n): ParsedMigrationFile {\n const canonicalVersion = canonicalMigrationVersion(version);\n const matches = filenames\n .map((filename) => parseMigrationFilename(filename))\n .filter(\n (migration): migration is ParsedMigrationFile =>\n migration !== null && migration.version === canonicalVersion,\n );\n\n if (matches.length === 0) {\n throw new CLIError(`Local migration for version ${version} not found.`);\n }\n\n if (matches.length > 1) {\n throw new CLIError(\n `Multiple local migration files found for version ${version}.`,\n );\n }\n\n return matches[0];\n}\n\nexport function resolveMigrationTarget(\n target: string,\n filenames: string[],\n): ParsedMigrationFile {\n if (/^\\d{1,64}$/u.test(target)) {\n return findLocalMigrationByVersion(target, filenames);\n }\n\n const parsedTarget = parseMigrationFilename(target);\n if (!parsedTarget) {\n throw new CLIError(\n 'Migration file names must match <migration_version>_<migration-name>.sql.',\n );\n }\n\n if (!filenames.includes(target)) {\n throw new CLIError(`Local migration file not found: ${target}`);\n }\n\n return parsedTarget;\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type { ConnectionStringResponse } from '../../types.js';\n\nexport function registerDbConnectionStringCommand(dbCmd: Command): void {\n dbCmd\n .command('connection-string')\n .description('Print the project Postgres connection URL (cloud projects only)')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const res = await ossFetch('/api/metadata/database-connection-string');\n const body = (await res.json()) as ConnectionStringResponse;\n if (json) {\n outputJson(body);\n } else {\n console.log(body.connectionURL);\n }\n await reportCliUsage('cli.db.connection-string', true);\n } catch (err) {\n await reportCliUsage('cli.db.connection-string', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\n\nexport function registerRecordsCommands(recordsCmd: Command): void {\n recordsCmd\n .command('list <table>')\n .description('List records from a table')\n .option('--select <columns>', 'Columns to select (comma-separated)')\n .option('--filter <filter>', 'Filter expression (e.g. \"name=eq.John\")')\n .option('--order <order>', 'Order by (e.g. \"created_at.desc\")')\n .option('--limit <n>', 'Limit number of records', parseInt)\n .option('--offset <n>', 'Offset for pagination', parseInt)\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const params = new URLSearchParams();\n if (opts.select) params.set('select', opts.select);\n if (opts.filter) params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n if (opts.order) params.set('order', opts.order);\n if (opts.limit) params.set('limit', String(opts.limit));\n if (opts.offset) params.set('offset', String(opts.offset));\n\n const query = params.toString();\n const path = `/api/database/records/${encodeURIComponent(table)}${query ? `?${query}` : ''}`;\n const res = await ossFetch(path);\n const data = await res.json() as { data?: Record<string, unknown>[] };\n const records = data.data ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (records.length === 0) {\n console.log('No records found.');\n return;\n }\n const headers = Object.keys(records[0]);\n outputTable(\n headers,\n records.map((r) => headers.map((h) => {\n const val = r[h];\n if (val === null || val === undefined) return '';\n if (typeof val === 'object') return JSON.stringify(val);\n return String(val);\n })),\n );\n console.log(`${records.length} record(s).`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsCreateCommand(recordsCmd: Command): void {\n recordsCmd\n .command('create <table>')\n .description('Create record(s) in a table')\n .option('--data <json>', 'JSON data to insert (object or array of objects)')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.data) {\n throw new CLIError('--data is required. Example: --data \\'{\"name\":\"John\"}\\'');\n }\n\n let records: unknown[];\n try {\n const parsed = JSON.parse(opts.data) as unknown;\n records = Array.isArray(parsed) ? parsed : [parsed];\n } catch {\n throw new CLIError('Invalid JSON in --data. Provide a JSON object or array.');\n }\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?return=representation`,\n {\n method: 'POST',\n body: JSON.stringify(records),\n },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const created = data.data ?? [];\n outputSuccess(`Created ${created.length || records.length} record(s) in \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsUpdateCommand(recordsCmd: Command): void {\n recordsCmd\n .command('update <table>')\n .description('Update records in a table matching a filter')\n .option('--filter <filter>', 'Filter expression (e.g. \"id=eq.123\")')\n .option('--data <json>', 'JSON data to update')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.filter) {\n throw new CLIError('--filter is required to prevent accidental updates to all rows.');\n }\n if (!opts.data) {\n throw new CLIError('--data is required. Example: --data \\'{\"name\":\"Jane\"}\\'');\n }\n\n let body: unknown;\n try {\n body = JSON.parse(opts.data) as unknown;\n } catch {\n throw new CLIError('Invalid JSON in --data.');\n }\n\n const params = new URLSearchParams();\n params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n params.set('return', 'representation');\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?${params}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const updated = data.data ?? [];\n outputSuccess(`Updated ${updated.length} record(s) in \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerRecordsDeleteCommand(recordsCmd: Command): void {\n recordsCmd\n .command('delete <table>')\n .description('Delete records from a table matching a filter')\n .option('--filter <filter>', 'Filter expression (e.g. \"id=eq.123\")')\n .action(async (table: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!opts.filter) {\n throw new CLIError('--filter is required to prevent accidental deletion of all rows.');\n }\n\n const params = new URLSearchParams();\n params.set(opts.filter.split('=')[0], opts.filter.split('=').slice(1).join('='));\n params.set('return', 'representation');\n\n const res = await ossFetch(\n `/api/database/records/${encodeURIComponent(table)}?${params}`,\n { method: 'DELETE' },\n );\n\n const data = await res.json() as { data?: unknown[] };\n\n if (json) {\n outputJson(data);\n } else {\n const deleted = data.data ?? [];\n outputSuccess(`Deleted ${deleted.length} record(s) from \"${table}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListFunctionsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerFunctionsCommands(functionsCmd: Command): void {\n functionsCmd\n .command('list')\n .description('List all edge functions')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/functions');\n const raw = await res.json();\n // API may return array directly or { functions: [...] }\n const functions: ListFunctionsResponse['functions'] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'functions' in raw\n ? (raw as ListFunctionsResponse).functions ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (functions.length === 0) {\n console.log('No functions found.');\n return;\n }\n outputTable(\n ['Slug', 'Name', 'Status', 'Created At'],\n functions.map((f) => [\n f.slug,\n f.name ?? '-',\n f.status ?? '-',\n f.createdAt ? new Date(f.createdAt).toLocaleString() : '-',\n ]),\n );\n }\n await reportCliUsage('cli.functions.list', true);\n } catch (err) {\n await reportCliUsage('cli.functions.list', false);\n handleError(err, json);\n }\n });\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type { FunctionResponse } from '../../types.js';\n\nexport function registerFunctionsDeployCommand(functionsCmd: Command): void {\n functionsCmd\n .command('deploy <slug>')\n .description('Deploy an edge function (create or update)')\n .option('--file <path>', 'Path to the function source file')\n .option('--name <name>', 'Function display name')\n .option('--description <desc>', 'Function description')\n .action(async (slug: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n // Resolve source file\n const filePath = opts.file ?? join(process.cwd(), 'insforge', 'functions', slug, 'index.ts');\n if (!existsSync(filePath)) {\n throw new CLIError(\n `Source file not found: ${filePath}\\n` +\n `Specify --file <path> or create ${join('insforge', 'functions', slug, 'index.ts')}`,\n );\n }\n\n const code = readFileSync(filePath, 'utf-8');\n const name = opts.name ?? slug;\n const description = opts.description ?? '';\n\n // Check if function exists\n let exists = false;\n try {\n await ossFetch(`/api/functions/${encodeURIComponent(slug)}`);\n exists = true;\n } catch {\n exists = false;\n }\n\n let res: Response;\n if (exists) {\n res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`, {\n method: 'PUT',\n body: JSON.stringify({ name, description, code }),\n });\n } else {\n res = await ossFetch('/api/functions', {\n method: 'POST',\n body: JSON.stringify({ slug, name, description, code }),\n });\n }\n\n const result = await res.json() as FunctionResponse;\n\n const deployFailed = result.deployment?.status === 'failed';\n\n if (json) {\n outputJson(result);\n } else {\n const action = exists ? 'updation' : 'creation';\n const resultStatus = result.success ? 'success' : 'failed';\n outputSuccess(`Function \"${result.function.slug}\" ${action} ${resultStatus}.`);\n if (result.deployment) {\n if (result.deployment.status === 'success') {\n console.log(` Deployment: ${result.deployment.status}${result.deployment.url ? ` → ${result.deployment.url}` : ''}`);\n } else {\n console.log(` Deployment: ${result.deployment.status}`);\n if (result.deployment.buildLogs?.length) {\n console.log(' Build logs:');\n for (const line of result.deployment.buildLogs) {\n console.log(` ${line}`);\n }\n }\n }\n }\n }\n if (deployFailed) throw new CLIError('Function deployment failed');\n await reportCliUsage('cli.functions.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.functions.deploy', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError, CLIError } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\n\nexport function registerFunctionsInvokeCommand(functionsCmd: Command): void {\n functionsCmd\n .command('invoke <slug>')\n .description('Invoke an edge function')\n .option('--data <json>', 'JSON body to send to the function')\n .option('--method <method>', 'HTTP method (GET, POST, PUT, PATCH, DELETE)', 'POST')\n .action(async (slug: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const method = opts.method.toUpperCase();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.api_key}`,\n };\n\n const fetchOpts: RequestInit = { method, headers };\n\n if (opts.data && ['POST', 'PUT', 'PATCH'].includes(method)) {\n fetchOpts.body = opts.data;\n }\n\n // Functions client endpoint is at /functions/{slug} (not /api/functions/{slug})\n // Use direct fetch so we always show the function's full response,\n // even on non-200 status codes (function errors are part of the output).\n const res = await fetch(\n `${config.oss_host}/functions/${encodeURIComponent(slug)}`,\n fetchOpts,\n );\n\n const contentType = res.headers.get('content-type') ?? '';\n const status = res.status;\n\n if (contentType.includes('application/json')) {\n const data = await res.json();\n if (json) {\n outputJson({ status, body: data });\n } else {\n console.log(JSON.stringify(data, null, 2));\n }\n } else {\n const text = await res.text();\n console.log(text);\n }\n\n // Exit with non-zero code on function errors\n if (status >= 400) {\n throw new CLIError(`HTTP ${status}`, 1, 'HTTP_ERROR');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\n\ninterface FunctionDetails {\n id: string;\n slug: string;\n name: string;\n description: string | null;\n code: string;\n status: string;\n created_at: string;\n updated_at: string;\n deployed_at: string | null;\n}\n\nexport function registerFunctionsCodeCommand(functionsCmd: Command): void {\n functionsCmd\n .command('code <slug>')\n .description('Fetch and display the source code of an edge function')\n .action(async (slug: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`);\n const fn = await res.json() as FunctionDetails;\n\n if (json) {\n outputJson(fn);\n } else {\n console.log(`Function: ${fn.name} (${fn.slug})`);\n console.log(`Status: ${fn.status}`);\n if (fn.description) console.log(`Desc: ${fn.description}`);\n if (fn.deployed_at) console.log(`Deployed: ${fn.deployed_at}`);\n console.log('---');\n console.log(fn.code);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport type { FunctionResponse } from '../../types.js';\n\nexport function registerFunctionsDeleteCommand(functionsCmd: Command): void {\n functionsCmd\n .command('delete <slug>')\n .description('Delete an edge function')\n .action(async (slug: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirmed = await prompts.confirm({\n message: `Delete function \"${slug}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirmed) || !confirmed) {\n clack.log.info('Cancelled.');\n return;\n }\n }\n\n const res = await ossFetch(`/api/functions/${encodeURIComponent(slug)}`, {\n method: 'DELETE',\n });\n const result = await res.json() as FunctionResponse;\n\n if (json) {\n outputJson(result);\n } else {\n if (result.success) {\n outputSuccess(`Function \"${slug}\" deleted successfully.`);\n } else {\n outputSuccess(`Failed to delete function \"${slug}\".`);\n }\n }\n await reportCliUsage('cli.functions.delete', true);\n } catch (err) {\n await reportCliUsage('cli.functions.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { StorageBucketSchema } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerStorageBucketsCommand(storageCmd: Command): void {\n storageCmd\n .command('buckets')\n .description('List all storage buckets')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/storage/buckets');\n const raw = await res.json();\n // API may return array directly or { buckets: [...] }\n const buckets: StorageBucketSchema[] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'buckets' in raw\n ? (raw as { buckets?: StorageBucketSchema[] }).buckets ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (buckets.length === 0) {\n console.log('No buckets found.');\n return;\n }\n outputTable(\n ['Bucket Name', 'Public'],\n buckets.map((b) => [b.name, b.public ? 'Yes' : 'No']),\n );\n }\n await reportCliUsage('cli.storage.buckets', true);\n } catch (err) {\n await reportCliUsage('cli.storage.buckets', false);\n handleError(err, json);\n }\n });\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageUploadCommand(storageCmd: Command): void {\n storageCmd\n .command('upload <file>')\n .description('Upload a file to a storage bucket')\n .requiredOption('--bucket <name>', 'Target bucket name')\n .option('--key <objectKey>', 'Object key (defaults to filename)')\n .action(async (file: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n if (!existsSync(file)) {\n throw new CLIError(`File not found: ${file}`);\n }\n\n const fileContent = readFileSync(file);\n const objectKey = opts.key ?? basename(file);\n const bucketName = opts.bucket;\n\n // Build multipart form data\n const formData = new FormData();\n const blob = new Blob([fileContent]);\n formData.append('file', blob, objectKey);\n\n // PUT /api/storage/buckets/{bucket}/objects/{key} for named upload\n const url = `${config.oss_host}/api/storage/buckets/${encodeURIComponent(bucketName)}/objects/${encodeURIComponent(objectKey)}`;\n\n const res = await fetch(url, {\n method: 'PUT',\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n body: formData,\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Upload failed: ${res.status}`);\n }\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Uploaded \"${basename(file)}\" to bucket \"${bucketName}\".`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import { writeFileSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport type { Command } from 'commander';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageDownloadCommand(storageCmd: Command): void {\n storageCmd\n .command('download <objectKey>')\n .description('Download a file from a storage bucket')\n .requiredOption('--bucket <name>', 'Source bucket name')\n .option('--output <path>', 'Output file path (defaults to current directory)')\n .action(async (objectKey: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const bucketName = opts.bucket;\n const url = `${config.oss_host}/api/storage/buckets/${encodeURIComponent(bucketName)}/objects/${encodeURIComponent(objectKey)}`;\n\n const res = await fetch(url, {\n headers: {\n Authorization: `Bearer ${config.api_key}`,\n },\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n throw new CLIError(err.error ?? `Download failed: ${res.status}`);\n }\n\n const buffer = Buffer.from(await res.arrayBuffer());\n const outputPath = opts.output ?? join(process.cwd(), basename(objectKey));\n writeFileSync(outputPath, buffer);\n\n if (json) {\n outputJson({ success: true, path: outputPath, size: buffer.length });\n } else {\n outputSuccess(`Downloaded \"${objectKey}\" to ${outputPath} (${buffer.length} bytes).`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerStorageCreateBucketCommand(storageCmd: Command): void {\n storageCmd\n .command('create-bucket <name>')\n .description('Create a new storage bucket')\n .option('--public', 'Make the bucket publicly accessible (default)')\n .option('--private', 'Make the bucket private')\n .action(async (name: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const isPublic = !opts.private;\n\n const res = await ossFetch('/api/storage/buckets', {\n method: 'POST',\n body: JSON.stringify({ bucketName: name, isPublic }),\n });\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Bucket \"${name}\" created (${isPublic ? 'public' : 'private'}).`);\n }\n await reportCliUsage('cli.storage.create-bucket', true);\n } catch (err) {\n await reportCliUsage('cli.storage.create-bucket', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerStorageDeleteBucketCommand(storageCmd: Command): void {\n storageCmd\n .command('delete-bucket <name>')\n .description('Delete a storage bucket and all its objects')\n .action(async (name: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete bucket \"${name}\" and all its objects? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/storage/buckets/${encodeURIComponent(name)}`, {\n method: 'DELETE',\n });\n\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Bucket \"${name}\" deleted.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\ninterface StoredFile {\n key: string;\n size: number;\n mimeType?: string;\n uploadedAt: string;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function registerStorageListObjectsCommand(storageCmd: Command): void {\n storageCmd\n .command('list-objects <bucket>')\n .description('List objects in a storage bucket')\n .option('--limit <n>', 'Maximum number of objects to return', '100')\n .option('--offset <n>', 'Number of objects to skip', '0')\n .option('--prefix <prefix>', 'Filter objects by key prefix')\n .option('--search <term>', 'Search objects by key (partial match)')\n .option('--sort <field>', 'Sort by field: key, size, uploadedAt (default: key)')\n .action(async (bucket: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const params = new URLSearchParams();\n params.set('limit', opts.limit);\n params.set('offset', opts.offset);\n if (opts.prefix) params.set('prefix', opts.prefix);\n if (opts.search) params.set('search', opts.search);\n\n const res = await ossFetch(\n `/api/storage/buckets/${encodeURIComponent(bucket)}/objects?${params.toString()}`,\n );\n const raw = await res.json() as { data?: StoredFile[]; pagination?: { total?: number } };\n\n const objects: StoredFile[] = Array.isArray(raw)\n ? raw as StoredFile[]\n : (raw.data ?? []);\n\n // Client-side sort\n const sortField = opts.sort ?? 'key';\n objects.sort((a, b) => {\n if (sortField === 'size') return a.size - b.size;\n if (sortField === 'uploadedAt') return a.uploadedAt.localeCompare(b.uploadedAt);\n return a.key.localeCompare(b.key);\n });\n\n if (json) {\n outputJson(raw);\n } else {\n if (objects.length === 0) {\n console.log(`No objects found in bucket \"${bucket}\".`);\n return;\n }\n const total = raw.pagination?.total;\n if (total !== undefined) {\n console.log(`Showing ${objects.length} of ${total} objects:\\n`);\n }\n outputTable(\n ['Key', 'Size', 'Type', 'Uploaded At'],\n objects.map((o) => [\n o.key,\n formatSize(o.size),\n o.mimeType ?? '-',\n o.uploadedAt,\n ]),\n );\n }\n await reportCliUsage('cli.storage.list-objects', true);\n } catch (err) {\n await reportCliUsage('cli.storage.list-objects', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getCredentials, getGlobalConfig, getProjectConfig } from '../lib/config.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\n\nexport function registerContextCommand(program: Command): void {\n program\n .command('current')\n .description('Show current CLI context (user, org, project)')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const creds = getCredentials();\n const globalConfig = getGlobalConfig();\n const projectConfig = getProjectConfig();\n\n if (json) {\n outputJson({\n authenticated: !!creds,\n user: creds?.user ?? null,\n default_org_id: globalConfig.default_org_id ?? null,\n project: projectConfig,\n });\n return;\n }\n\n console.log('\\n InsForge CLI Context\\n');\n\n // Auth status\n if (creds) {\n console.log(` User: ${creds.user.name} <${creds.user.email}>`);\n } else {\n console.log(' User: (not logged in)');\n }\n\n // Org (only relevant when logged in)\n if (creds && globalConfig.default_org_id) {\n console.log(` Default Org: ${globalConfig.default_org_id}`);\n } else if (creds) {\n console.log(' Default Org: (none)');\n }\n\n // Project\n if (projectConfig) {\n console.log('');\n console.log(` Project: ${projectConfig.project_name} (${projectConfig.project_id})`);\n console.log(` App Key: ${projectConfig.appkey}`);\n console.log(` Region: ${projectConfig.region}`);\n console.log(` OSS Host: ${projectConfig.oss_host}`);\n } else {\n console.log('\\n Project: (not linked — run `npx @insforge/cli link`)');\n }\n\n console.log('');\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { listOrganizations, listProjects } from '../lib/api/platform.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all organizations and their projects')\n .action(async (_opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const orgs = await listOrganizations(apiUrl);\n\n if (orgs.length === 0) {\n if (json) {\n outputJson([]);\n } else {\n console.log('No organizations found.');\n }\n return;\n }\n\n // Fetch projects for all orgs in parallel\n const orgProjects = await Promise.all(\n orgs.map(async (org) => ({\n org,\n projects: await listProjects(org.id, apiUrl),\n })),\n );\n\n if (json) {\n outputJson(\n orgProjects.map(({ org, projects }) => ({\n id: org.id,\n name: org.name,\n type: org.type ?? null,\n projects: projects.map((p) => ({\n id: p.id,\n name: p.name,\n region: p.region,\n status: p.status,\n appkey: p.appkey,\n })),\n })),\n );\n return;\n }\n\n // Human-readable: grouped table\n const rows: string[][] = [];\n for (const { org, projects } of orgProjects) {\n if (projects.length === 0) {\n rows.push([org.name, '-', '-', '-', '-']);\n } else {\n for (let i = 0; i < projects.length; i++) {\n const p = projects[i];\n rows.push([\n i === 0 ? org.name : '',\n p.name,\n p.region,\n p.status,\n p.appkey,\n ]);\n }\n }\n }\n\n outputTable(['Organization', 'Project', 'Region', 'Status', 'AppKey'], rows);\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListDeploymentsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerDeploymentsListCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('list')\n .description('List all deployments')\n .option('--limit <n>', 'Limit number of results', '20')\n .option('--offset <n>', 'Offset for pagination', '0')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch(`/api/deployments?limit=${opts.limit}&offset=${opts.offset}`);\n const raw = await res.json();\n // API may return array directly or { data: [...] }\n const deployments: ListDeploymentsResponse['data'] = Array.isArray(raw)\n ? raw\n : raw && typeof raw === 'object' && 'data' in raw\n ? (raw as ListDeploymentsResponse).data ?? []\n : [];\n\n if (json) {\n outputJson(raw);\n } else {\n if (!deployments.length) {\n console.log('No deployments found.');\n return;\n }\n outputTable(\n ['ID', 'Status', 'Provider', 'URL', 'Created'],\n deployments.map((d) => [\n d.id,\n d.status,\n d.provider,\n d.url ?? '-',\n new Date(d.createdAt).toLocaleString(),\n ]),\n );\n }\n await reportCliUsage('cli.deployments.list', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError, getDeploymentError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { DeploymentSchema } from '../../types.js';\n\nexport function registerDeploymentsStatusCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('status <id>')\n .description('Get deployment details and sync status from Vercel')\n .option('--sync', 'Sync status from Vercel before showing')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n // Optionally sync status from Vercel first\n if (opts.sync) {\n await ossFetch(`/api/deployments/${id}/sync`, { method: 'POST' });\n }\n\n const res = await ossFetch(`/api/deployments/${id}`);\n const d = (await res.json()) as DeploymentSchema;\n\n if (json) {\n outputJson(d);\n } else {\n const errorMessage = getDeploymentError(d.metadata);\n outputTable(\n ['Field', 'Value'],\n [\n ['ID', d.id],\n ['Status', d.status],\n ['Provider', d.provider ?? '-'],\n ['Provider ID', d.providerDeploymentId ?? '-'],\n ['URL', d.url ?? '-'],\n ['Created', new Date(d.createdAt).toLocaleString()],\n ['Updated', new Date(d.updatedAt).toLocaleString()],\n ...(errorMessage ? [['Error', errorMessage]] : []),\n ],\n );\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerDeploymentsCancelCommand(deploymentsCmd: Command): void {\n deploymentsCmd\n .command('cancel <id>')\n .description('Cancel a deployment')\n .action(async (id: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n if (!yes && !json) {\n const confirmed = await prompts.confirm({\n message: `Cancel deployment ${id}?`,\n });\n if (prompts.isCancel(confirmed) || !confirmed) process.exit(0);\n }\n\n const res = await ossFetch(`/api/deployments/${id}/cancel`, { method: 'POST' });\n const result = await res.json();\n\n if (json) {\n outputJson(result);\n } else {\n outputSuccess(`Deployment ${id} cancelled.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\ninterface EnvVar {\n id: string;\n key: string;\n type: string;\n updatedAt: number;\n}\n\nexport function registerDeploymentsEnvVarsCommand(deploymentsCmd: Command): void {\n const envCmd = deploymentsCmd.command('env').description('Manage deployment environment variables');\n\n // list\n envCmd\n .command('list')\n .description('List all deployment environment variables')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch('/api/deployments/env-vars');\n const data = (await res.json()) as { envVars: EnvVar[] };\n const envVars = data.envVars ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (!envVars.length) {\n console.log('No environment variables found.');\n return;\n }\n outputTable(\n ['ID', 'Key', 'Type', 'Updated At'],\n envVars.map((v) => [\n v.id,\n v.key,\n v.type,\n new Date(v.updatedAt).toLocaleString(),\n ]),\n );\n }\n await reportCliUsage('cli.deployments.env.list', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.list', false);\n handleError(err, json);\n }\n });\n\n // create / update\n envCmd\n .command('set <key> <value>')\n .description('Create or update a deployment environment variable')\n .action(async (key: string, value: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch('/api/deployments/env-vars', {\n method: 'POST',\n body: JSON.stringify({ envVars: [{ key, value }] }),\n });\n const data = (await res.json()) as { success: boolean; message: string; count: number };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message);\n }\n await reportCliUsage('cli.deployments.env.set', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.set', false);\n handleError(err, json);\n }\n });\n\n // delete\n envCmd\n .command('delete <id>')\n .description('Delete a deployment environment variable by ID')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n if (!getProjectConfig()) throw new ProjectNotLinkedError();\n\n const res = await ossFetch(`/api/deployments/env-vars/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = (await res.json()) as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message);\n }\n await reportCliUsage('cli.deployments.env.delete', true);\n } catch (err) {\n await reportCliUsage('cli.deployments.env.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\nimport { reportCliUsage } from '../lib/skills.js';\n\nconst FEATURES = ['db', 'storage', 'functions', 'auth', 'ai', 'realtime'] as const;\nconst LANGUAGES = ['typescript', 'swift', 'kotlin', 'rest-api'] as const;\n\nexport function registerDocsCommand(program: Command): void {\n program\n .command('docs [feature] [language]')\n .description('Browse InsForge SDK documentation')\n .addHelpText('after', `\nFeatures: ${FEATURES.join(', ')}\nLanguages: ${LANGUAGES.join(', ')}\n\nExamples:\n npx @insforge/cli docs List all available docs\n npx @insforge/cli docs instructions Show setup instructions\n npx @insforge/cli docs db typescript Show TypeScript database SDK docs\n npx @insforge/cli docs auth swift Show Swift auth SDK docs\n npx @insforge/cli docs storage rest-api Show REST API storage docs`)\n .action(async (feature: string | undefined, language: string | undefined, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n await reportCliUsage('cli.docs', true);\n // No args → list all docs\n if (!feature) {\n await listDocs(json);\n return;\n }\n\n // Single arg → legacy doc type (e.g. \"instructions\")\n if (!language) {\n await fetchDoc(`/api/docs/${encodeURIComponent(feature)}`, feature, json);\n return;\n }\n\n // Two args → feature + language\n await fetchDoc(\n `/api/docs/${encodeURIComponent(feature)}/${encodeURIComponent(language)}`,\n `${feature}/${language}`,\n json,\n );\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n\nasync function listDocs(json: boolean): Promise<void> {\n const res = await ossFetch('/api/docs');\n const data = await res.json() as { data?: DocEntry[] } | DocEntry[];\n const docs = Array.isArray(data) ? data : (data.data ?? []);\n\n if (json) {\n outputJson(docs);\n } else {\n if (!docs.length) {\n console.log('No documentation available.');\n return;\n }\n outputTable(\n ['Type', 'Endpoint'],\n docs.map((d) => [String(d.type ?? '-'), String(d.endpoint ?? '-')]),\n );\n }\n}\n\nasync function fetchDoc(path: string, label: string, json: boolean): Promise<void> {\n const res = await ossFetch(path);\n const data = await res.json() as { data?: { type?: string; content?: string }; type?: string; content?: string };\n const doc = data.data ?? data;\n\n if (json) {\n outputJson(doc);\n } else {\n if (doc.content) {\n console.log(doc.content);\n } else {\n console.log(`No content returned for \"${label}\".`);\n }\n }\n}\n\ninterface DocEntry {\n type?: string;\n filename?: string;\n endpoint?: string;\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListSecretsResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSecretsListCommand(secretsCmd: Command): void {\n secretsCmd\n .command('list')\n .description('List secrets (metadata only, values are hidden)')\n .option('--all', 'Include inactive (deleted) secrets')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/secrets');\n const data = await res.json() as ListSecretsResponse;\n let secrets = data.secrets ?? [];\n\n if (!opts.all) {\n secrets = secrets.filter((s) => s.isActive !== false);\n }\n\n if (json) {\n outputJson(opts.all ? data : { secrets });\n } else {\n if (!secrets.length) {\n console.log('No secrets found.');\n return;\n }\n const headers = opts.all\n ? ['Key', 'Active', 'Reserved', 'Expires', 'Updated']\n : ['Key', 'Reserved', 'Expires', 'Updated'];\n outputTable(\n headers,\n secrets.map((s) => {\n const row = [\n String(s.key ?? '-'),\n ...(opts.all ? [s.isActive ? 'Yes' : 'No'] : []),\n s.isReserved ? 'Yes' : 'No',\n s.expiresAt ? new Date(String(s.expiresAt)).toLocaleString() : '-',\n s.updatedAt ? new Date(String(s.updatedAt)).toLocaleString() : '-',\n ];\n return row;\n }),\n );\n }\n await reportCliUsage('cli.secrets.list', true);\n } catch (err) {\n await reportCliUsage('cli.secrets.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type { GetSecretValueResponse } from '../../types.js';\n\nexport function registerSecretsGetCommand(secretsCmd: Command): void {\n secretsCmd\n .command('get <key>')\n .description('Get the decrypted value of a secret')\n .action(async (key: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`);\n const data = await res.json();\n const secret = data as GetSecretValueResponse;\n\n if (json) {\n outputJson(data);\n } else {\n console.log(`${secret.key} = ${secret.value}`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { CreateSecretResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSecretsAddCommand(secretsCmd: Command): void {\n secretsCmd\n .command('add <key> <value>')\n .description('Create a new secret')\n .option('--reserved', 'Mark secret as protected from deletion')\n .option('--expires <date>', 'Expiration date (ISO 8601 format)')\n .action(async (key: string, value: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = { key, value };\n if (opts.reserved) body.isReserved = true;\n if (opts.expires) body.expiresAt = opts.expires;\n\n const res = await ossFetch('/api/secrets', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json() as CreateSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} created.`);\n }\n await reportCliUsage('cli.secrets.add', true);\n } catch (err) {\n await reportCliUsage('cli.secrets.add', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { UpdateSecretResponse } from '../../types.js';\n\nexport function registerSecretsUpdateCommand(secretsCmd: Command): void {\n secretsCmd\n .command('update <key>')\n .description('Update an existing secret')\n .option('--value <value>', 'New secret value')\n .option('--active <bool>', 'Set active status (true/false)')\n .option('--reserved <bool>', 'Set reserved status (true/false)')\n .option('--expires <date>', 'Expiration date (ISO 8601, or \"null\" to remove)')\n .action(async (key: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.value !== undefined) body.value = opts.value;\n if (opts.active !== undefined) body.isActive = opts.active === 'true';\n if (opts.reserved !== undefined) body.isReserved = opts.reserved === 'true';\n if (opts.expires !== undefined) body.expiresAt = opts.expires === 'null' ? null : opts.expires;\n\n if (Object.keys(body).length === 0) {\n throw new CLIError('Provide at least one option to update (--value, --active, --reserved, --expires).');\n }\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n const data = await res.json() as UpdateSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} updated.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { DeleteSecretResponse } from '../../types.js';\n\nexport function registerSecretsDeleteCommand(secretsCmd: Command): void {\n secretsCmd\n .command('delete <key>')\n .description('Delete a secret')\n .action(async (key: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete secret \"${key}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/secrets/${encodeURIComponent(key)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as DeleteSecretResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? `Secret ${key} deleted.`);\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListSchedulesResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSchedulesListCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('list')\n .description('List all schedules')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/schedules');\n const data = await res.json();\n const schedules: ListSchedulesResponse = data as ListSchedulesResponse;\n\n if (json) {\n outputJson(schedules);\n } else {\n if (!schedules.length) {\n console.log('No schedules found.');\n return;\n }\n outputTable(\n ['ID', 'Name', 'Cron', 'URL', 'Method', 'Active', 'Next Run'],\n schedules.map((s) => [\n String(s.id ?? '-'),\n String(s.name ?? '-'),\n String(s.cronSchedule ?? '-'),\n String(s.functionUrl ?? '-'),\n String(s.httpMethod ?? '-'),\n s.isActive === false ? 'No' : 'Yes',\n s.nextRun ? new Date(String(s.nextRun)).toLocaleString() : '-',\n ]),\n );\n }\n await reportCliUsage('cli.schedules.list', true);\n } catch (err) {\n await reportCliUsage('cli.schedules.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport type { GetScheduleResponse } from '../../types.js';\n\nexport function registerSchedulesGetCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('get <id>')\n .description('Get schedule details')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`);\n const data = await res.json() as GetScheduleResponse;\n\n if (json) {\n outputJson(data);\n } else {\n console.log(`\\n Name: ${data.name ?? '-'}`);\n console.log(` ID: ${data.id ?? '-'}`);\n console.log(` Cron: ${data.cronSchedule ?? '-'}`);\n console.log(` URL: ${data.functionUrl ?? '-'}`);\n console.log(` Method: ${data.httpMethod ?? '-'}`);\n console.log(` Active: ${data.isActive === false ? 'No' : 'Yes'}`);\n if (data.headers) console.log(` Headers: ${JSON.stringify(data.headers)}`);\n if (data.body) console.log(` Body: ${JSON.stringify(data.body)}`);\n console.log(` Next Run: ${data.nextRun ? new Date(String(data.nextRun)).toLocaleString() : '-'}`);\n console.log(` Created: ${data.createdAt ? new Date(String(data.createdAt)).toLocaleString() : '-'}`);\n console.log('');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport type { CreateScheduleResponse } from '../../types.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerSchedulesCreateCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('create')\n .description('Create a new schedule')\n .requiredOption('--name <name>', 'Schedule name')\n .requiredOption(\n '--cron <expression>',\n 'Cron expression. 5-field cron (e.g. \"*/5 * * * *\", \"0 9 * * 1-5\") or pg_cron interval syntax for sub-minute cadence (e.g. \"30 seconds\", \"5 minutes\").'\n )\n .requiredOption('--url <url>', 'URL to invoke')\n .requiredOption('--method <method>', 'HTTP method (GET, POST, PUT, PATCH, DELETE)')\n .option('--headers <json>', 'HTTP headers as JSON')\n .option('--body <json>', 'Request body as JSON')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {\n name: opts.name,\n cronSchedule: opts.cron,\n functionUrl: opts.url,\n httpMethod: opts.method.toUpperCase(),\n };\n\n if (opts.headers) {\n try {\n body.headers = JSON.parse(opts.headers);\n } catch {\n throw new CLIError('Invalid JSON for --headers');\n }\n }\n if (opts.body) {\n try {\n body.body = JSON.parse(opts.body);\n } catch {\n throw new CLIError('Invalid JSON for --body');\n }\n }\n\n const res = await ossFetch('/api/schedules', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json() as CreateScheduleResponse;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Schedule \"${opts.name}\" created (ID: ${data.id ?? 'unknown'}).`);\n }\n await reportCliUsage('cli.schedules.create', true);\n } catch (err) {\n await reportCliUsage('cli.schedules.create', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerSchedulesUpdateCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('update <id>')\n .description('Update a schedule')\n .option('--name <name>', 'New schedule name')\n .option(\n '--cron <expression>',\n 'New cron expression. 5-field cron or pg_cron interval syntax (e.g. \"30 seconds\").'\n )\n .option('--url <url>', 'New URL to invoke')\n .option('--method <method>', 'New HTTP method')\n .option('--headers <json>', 'New HTTP headers as JSON')\n .option('--body <json>', 'New request body as JSON')\n .option('--active <bool>', 'Enable/disable schedule (true/false)')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.name !== undefined) body.name = opts.name;\n if (opts.cron !== undefined) body.cronSchedule = opts.cron;\n if (opts.url !== undefined) body.functionUrl = opts.url;\n if (opts.method !== undefined) body.httpMethod = opts.method.toUpperCase();\n if (opts.active !== undefined) body.isActive = opts.active === 'true';\n\n if (opts.headers !== undefined) {\n try {\n body.headers = JSON.parse(opts.headers);\n } catch {\n throw new CLIError('Invalid JSON for --headers');\n }\n }\n if (opts.body !== undefined) {\n try {\n body.body = JSON.parse(opts.body);\n } catch {\n throw new CLIError('Invalid JSON for --body');\n }\n }\n\n if (Object.keys(body).length === 0) {\n throw new CLIError('Provide at least one option to update (--name, --cron, --url, --method, --headers, --body, --active).');\n }\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n const data = await res.json() as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? 'Schedule updated.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\n\nexport function registerSchedulesDeleteCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('delete <id>')\n .description('Delete a schedule')\n .action(async (id: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (!yes && !json) {\n const confirm = await prompts.confirm({\n message: `Delete schedule \"${id}\"? This cannot be undone.`,\n });\n if (prompts.isCancel(confirm) || !confirm) {\n process.exit(0);\n }\n }\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as { success: boolean; message: string };\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(data.message ?? 'Schedule deleted.');\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport type { ListExecutionLogsResponse } from '../../types.js';\n\nexport function registerSchedulesLogsCommand(schedulesCmd: Command): void {\n schedulesCmd\n .command('logs <id>')\n .description('Get execution logs for a schedule')\n .option('--limit <n>', 'Max logs to return (default: 50, max: 100)', '50')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const limit = parseInt(opts.limit, 10) || 50;\n const offset = parseInt(opts.offset, 10) || 0;\n\n const res = await ossFetch(`/api/schedules/${encodeURIComponent(id)}/logs?limit=${limit}&offset=${offset}`);\n const data = await res.json() as ListExecutionLogsResponse;\n const logs = data.logs ?? [];\n\n if (json) {\n outputJson(data);\n } else {\n if (!logs.length) {\n console.log('No execution logs found.');\n return;\n }\n outputTable(\n ['Executed At', 'Status', 'Success', 'Duration (ms)'],\n logs.map((l) => [\n l.executedAt ? new Date(String(l.executedAt)).toLocaleString() : '-',\n String(l.statusCode ?? '-'),\n l.success ? 'Yes' : 'No',\n String(l.durationMs ?? '-'),\n ]),\n );\n if (data.totalCount > offset + logs.length) {\n console.log(`\\n Showing ${offset + 1}-${offset + logs.length} of ${data.totalCount}. Use --offset to paginate.`);\n }\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeListCommand(computeCmd: Command): void {\n computeCmd\n .command('list')\n .description('List all compute services')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/compute/services');\n const raw = await res.json();\n const services: Record<string, unknown>[] = Array.isArray(raw) ? raw : [];\n\n if (json) {\n outputJson(services);\n } else {\n if (services.length === 0) {\n console.log('No compute services found.');\n await reportCliUsage('cli.compute.list', true);\n return;\n }\n outputTable(\n ['Name', 'Status', 'Image', 'CPU', 'Memory', 'Endpoint'],\n services.map((s) => [\n String(s.name ?? '-'),\n String(s.status ?? '-'),\n String(s.imageUrl ?? '-'),\n String(s.cpu ?? '-'),\n s.memory ? `${s.memory}MB` : '-',\n String(s.endpointUrl ?? '-'),\n ]),\n );\n }\n await reportCliUsage('cli.compute.list', true);\n } catch (err) {\n await reportCliUsage('cli.compute.list', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputInfo } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeGetCommand(computeCmd: Command): void {\n computeCmd\n .command('get <id>')\n .description('Get details of a compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`);\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputInfo(`Name: ${service.name}`);\n outputInfo(`ID: ${service.id}`);\n outputInfo(`Status: ${service.status}`);\n outputInfo(`Image: ${service.imageUrl}`);\n outputInfo(`CPU: ${service.cpu}`);\n outputInfo(`Memory: ${service.memory}MB`);\n outputInfo(`Region: ${service.region}`);\n outputInfo(`Endpoint: ${service.endpointUrl ?? 'n/a'}`);\n outputInfo(`Created: ${service.createdAt}`);\n }\n await reportCliUsage('cli.compute.get', true);\n } catch (err) {\n await reportCliUsage('cli.compute.get', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nconst ENV_KEY_REGEX = /^[A-Z_][A-Z0-9_]*$/;\n\n// Commander collector for repeatable flags. Each invocation appends to the\n// running list rather than overwriting.\nfunction collect(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n// Parse a \"KEY=VALUE\" string into a tuple, validating the key shape against\n// the same regex the OSS schema enforces. Values may contain '=' and are\n// preserved verbatim — only the first '=' separates key from value.\nfunction parseKeyValue(raw: string): [string, string] {\n const eq = raw.indexOf('=');\n if (eq <= 0) {\n throw new CLIError(\n `Invalid --env-set \"${raw}\": expected KEY=VALUE (key first, then '=', then value)`\n );\n }\n const key = raw.slice(0, eq);\n const value = raw.slice(eq + 1);\n if (!ENV_KEY_REGEX.test(key)) {\n throw new CLIError(`Invalid env var key \"${key}\": must match [A-Z_][A-Z0-9_]*`);\n }\n return [key, value];\n}\n\nfunction assertValidKey(key: string): void {\n if (!ENV_KEY_REGEX.test(key)) {\n throw new CLIError(`Invalid env var key \"${key}\": must match [A-Z_][A-Z0-9_]*`);\n }\n}\n\nexport function registerComputeUpdateCommand(computeCmd: Command): void {\n computeCmd\n .command('update <id>')\n .description('Update a compute service')\n .option('--image <image>', 'Docker image URL')\n .option('--port <port>', 'Container port')\n .option('--cpu <tier>', 'CPU tier')\n .option('--memory <mb>', 'Memory in MB')\n .option('--region <region>', 'Fly.io region')\n .option(\n '--env <json>',\n 'Replace ALL env vars with this JSON object. To rotate one secret without restating the others, use --env-set instead.'\n )\n .option(\n '--env-set <KEY=VALUE>',\n 'Set or update one env var (repeatable). Merges with existing — does not clear other vars.',\n collect,\n []\n )\n .option(\n '--env-unset <KEY>',\n 'Remove one env var (repeatable). Merges with existing — leaves other vars in place.',\n collect,\n []\n )\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const body: Record<string, unknown> = {};\n if (opts.image) body.imageUrl = opts.image;\n if (opts.port) {\n if (!Number.isFinite(Number(opts.port))) {\n throw new CLIError('Invalid value for --port: must be a number');\n }\n body.port = Number(opts.port);\n }\n if (opts.cpu) body.cpu = opts.cpu;\n if (opts.memory) {\n if (!Number.isFinite(Number(opts.memory))) {\n throw new CLIError('Invalid value for --memory: must be a number');\n }\n body.memory = Number(opts.memory);\n }\n if (opts.region) body.region = opts.region;\n\n const envSetArgs = opts.envSet as string[];\n const envUnsetArgs = opts.envUnset as string[];\n const hasPatch = envSetArgs.length > 0 || envUnsetArgs.length > 0;\n\n if (opts.env && hasPatch) {\n throw new CLIError(\n '--env (wholesale replace) and --env-set/--env-unset (partial merge) are mutually exclusive — pick one.'\n );\n }\n\n if (opts.env) {\n try {\n body.envVars = JSON.parse(opts.env);\n } catch {\n throw new CLIError('Invalid JSON for --env');\n }\n }\n\n if (hasPatch) {\n const setMap: Record<string, string> = {};\n for (const arg of envSetArgs) {\n const [k, v] = parseKeyValue(arg);\n setMap[k] = v;\n }\n for (const k of envUnsetArgs) assertValidKey(k);\n body.envVarsPatch = {\n ...(envSetArgs.length > 0 && { set: setMap }),\n ...(envUnsetArgs.length > 0 && { unset: envUnsetArgs }),\n };\n }\n\n if (Object.keys(body).length === 0) {\n throw new CLIError(\n 'No update fields provided. Use --image, --port, --cpu, --memory, --region, --env, --env-set, or --env-unset.'\n );\n }\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" updated [${service.status}]`);\n }\n await reportCliUsage('cli.compute.update', true);\n } catch (err) {\n await reportCliUsage('cli.compute.update', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeDeleteCommand(computeCmd: Command): void {\n computeCmd\n .command('delete <id>')\n .description('Delete a compute service and its Fly.io resources')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n const data = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess('Service deleted.');\n }\n await reportCliUsage('cli.compute.delete', true);\n } catch (err) {\n await reportCliUsage('cli.compute.delete', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeStartCommand(computeCmd: Command): void {\n computeCmd\n .command('start <id>')\n .description('Start a stopped compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}/start`, {\n method: 'POST',\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" started [${service.status}]`);\n if (service.endpointUrl) {\n console.log(` Endpoint: ${service.endpointUrl}`);\n }\n }\n await reportCliUsage('cli.compute.start', true);\n } catch (err) {\n await reportCliUsage('cli.compute.start', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson, outputSuccess } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\nexport function registerComputeStopCommand(computeCmd: Command): void {\n computeCmd\n .command('stop <id>')\n .description('Stop a running compute service')\n .action(async (id: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch(`/api/compute/services/${encodeURIComponent(id)}/stop`, {\n method: 'POST',\n });\n const service = await res.json() as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n outputSuccess(`Service \"${service.name}\" stopped.`);\n }\n await reportCliUsage('cli.compute.stop', true);\n } catch (err) {\n await reportCliUsage('cli.compute.stop', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts } from '../../lib/errors.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\n\n// `compute events <id>` returns Fly machine lifecycle events (start/stop/exit/\n// restart) — not container stdout/stderr. The previous name `compute logs`\n// was misleading; container log streaming is roadmap work and will reuse the\n// freshly-vacated `logs` command name when it lands.\nexport function registerComputeEventsCommand(computeCmd: Command): void {\n computeCmd\n .command('events <id>')\n .description('Get compute service machine events (start/stop/exit/restart)')\n .option('--limit <n>', 'Max number of event entries', '50')\n .action(async (id: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const limit = Math.max(1, Math.min(Number(opts.limit) || 50, 1000));\n const res = await ossFetch(\n `/api/compute/services/${encodeURIComponent(id)}/events?limit=${limit}`,\n );\n const events = await res.json() as { timestamp: number; message: string }[];\n\n if (json) {\n outputJson(events);\n } else {\n if (!Array.isArray(events) || events.length === 0) {\n console.log('No events found.');\n await reportCliUsage('cli.compute.events', true);\n return;\n }\n for (const entry of events) {\n const ts = new Date(entry.timestamp).toISOString();\n console.log(`${ts} ${entry.message}`);\n }\n }\n await reportCliUsage('cli.compute.events', true);\n } catch (err) {\n await reportCliUsage('cli.compute.events', false);\n handleError(err, json);\n }\n });\n}\n","import { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputInfo } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { parseEnvFile } from '../../lib/env-file.js';\nimport {\n ensureFlyctlAvailable,\n flyctlBuildAndPush,\n} from '../../lib/flyctl.js';\n\n// `compute deploy` has two modes:\n//\n// 1. Image mode (--image <url>):\n// Deploy a pre-built image from any registry. No flyctl/Docker needed.\n//\n// 2. Source mode ([dir]) — Path A (compute v3.2):\n// CLI runs `flyctl deploy --remote-only --build-only` against the user's\n// source directory using a per-app, attenuated deploy token minted by\n// the cloud. The remote builder runs on Fly's infrastructure and pushes\n// the image straight to registry.fly.io/<app>:<tag>. The cloud then\n// launches the machine pointing at the freshly-pushed image.\n// Requires `flyctl` on PATH (no Docker daemon needed).\n// The deploy token is scoped to one app + builder/wg, with `else: deny`\n// — it cannot deploy or read anything else in the InsForge Fly org.\nexport function registerComputeDeployCommand(computeCmd: Command): void {\n computeCmd\n .command('deploy [dir]')\n .description(\n 'Deploy a compute service. Two modes:\\n' +\n ' compute deploy <dir> --name <name> (source mode — flyctl remote build + push, requires flyctl on PATH; no Docker needed)\\n' +\n ' compute deploy --image <url> --name <name> (image mode — deploys pre-built image, no flyctl/Docker required)'\n )\n .requiredOption('--name <name>', 'Service name (DNS-safe, e.g. my-api)')\n .option('--image <url>', 'Pre-built image URL (image mode)')\n .option('--port <port>', 'Container port', '8080')\n .option(\n '--cpu <tier>',\n 'CPU tier in <kind>-<N>x format (e.g. shared-1x, performance-2x)',\n 'shared-1x'\n )\n .option('--memory <mb>', 'Memory in MB', '512')\n .option('--region <region>', 'Fly.io region', 'iad')\n .option('--env <json>', 'Env vars as JSON object')\n .option(\n '--env-file <path>',\n 'Path to a .env file (KEY=VALUE per line, #-comments + blank lines ok). Mutually exclusive with --env.'\n )\n .action(async (dir: string | undefined, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n if (dir && opts.image) {\n throw new CLIError('Cannot use both [dir] and --image — pick one mode.');\n }\n if (!dir && !opts.image) {\n throw new CLIError(\n 'Must provide either [dir] (source mode) or --image <url> (image mode).'\n );\n }\n\n // Shared validation\n const port = Number(opts.port);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new CLIError(`Invalid --port: ${opts.port}`);\n }\n const memory = Number(opts.memory);\n if (!Number.isInteger(memory) || memory <= 0) {\n throw new CLIError(`Invalid --memory: ${opts.memory}`);\n }\n if (opts.env && opts.envFile) {\n throw new CLIError(\n '--env and --env-file are mutually exclusive — pick one source for the env vars.'\n );\n }\n let envVars: Record<string, string> | undefined;\n if (opts.env) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(opts.env);\n } catch {\n throw new CLIError('Invalid JSON for --env');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new CLIError('--env must be a JSON object like {\"KEY\":\"value\"}');\n }\n for (const [k, v] of Object.entries(parsed)) {\n if (typeof v !== 'string') {\n throw new CLIError(\n `--env values must be strings — got ${typeof v} for key \"${k}\"`\n );\n }\n }\n envVars = parsed as Record<string, string>;\n } else if (opts.envFile) {\n envVars = parseEnvFile(resolve(opts.envFile));\n }\n\n const baseBody: Record<string, unknown> = {\n name: opts.name,\n port,\n cpu: opts.cpu,\n memory,\n region: opts.region,\n };\n if (envVars) baseBody.envVars = envVars;\n\n // ─── Image mode ─────────────────────────────────────────────────\n if (!dir) {\n const body: Record<string, unknown> = { ...baseBody, imageUrl: opts.image };\n\n // List → find by name → POST or PATCH\n const listRes = await ossFetch('/api/compute/services');\n const existing = ((await listRes.json()) as Array<{ id: string; name: string }>).find(\n (s) => s.name === opts.name\n );\n\n let res;\n if (existing) {\n if (!json) outputInfo(`Found existing service \"${opts.name}\", updating...`);\n const updateBody: Record<string, unknown> = { ...body };\n delete updateBody.name;\n res = await ossFetch(`/api/compute/services/${encodeURIComponent(existing.id)}`, {\n method: 'PATCH',\n body: JSON.stringify(updateBody),\n });\n } else {\n res = await ossFetch('/api/compute/services', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n const service = (await res.json()) as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n const verb = existing ? 'updated' : 'deployed';\n outputSuccess(`Service \"${service.name}\" ${verb} [${service.status}]`);\n if (service.endpointUrl) console.log(` Endpoint: ${service.endpointUrl}`);\n }\n await reportCliUsage('cli.compute.deploy', true);\n return;\n }\n\n // ─── Source mode (Path A) ───────────────────────────────────────\n const absDir = resolve(dir);\n const dockerfilePath = join(absDir, 'Dockerfile');\n if (!existsSync(dockerfilePath)) {\n throw new CLIError(\n `No Dockerfile at ${dockerfilePath}.\\n` +\n ` Either:\\n` +\n ` • Create one (ask your AI agent — see the insforge-cli skill)\\n` +\n ` • Use --image <url> to deploy a pre-built image instead`\n );\n }\n ensureFlyctlAvailable();\n\n if (!json) outputInfo(`Detected Dockerfile at ${dockerfilePath}`);\n\n // 1. Resolve service: list → find by name → /deploy if missing\n const listRes = await ossFetch('/api/compute/services');\n const existing = ((await listRes.json()) as Array<{\n id: string;\n name: string;\n flyAppId?: string | null;\n }>).find((s) => s.name === opts.name);\n\n let serviceId: string;\n let flyAppId: string;\n if (existing) {\n if (!existing.flyAppId) {\n throw new CLIError(\n `Service \"${opts.name}\" exists but has no Fly app yet. Delete it and redeploy.`\n );\n }\n serviceId = existing.id;\n flyAppId = existing.flyAppId;\n if (!json) outputInfo(`Found existing service \"${opts.name}\" (${flyAppId}), updating...`);\n } else {\n if (!json) outputInfo(`Creating service \"${opts.name}\"...`);\n const prepareRes = await ossFetch('/api/compute/services/deploy', {\n method: 'POST',\n body: JSON.stringify(baseBody),\n });\n const prepared = (await prepareRes.json()) as {\n id: string;\n flyAppId: string;\n };\n serviceId = prepared.id;\n flyAppId = prepared.flyAppId;\n if (!json) outputInfo(`Created Fly app ${flyAppId}`);\n }\n\n // 2. Mint per-app deploy token (20-min TTL, scoped to this app only)\n if (!json) outputInfo('Requesting deploy token...');\n const tokenRes = await ossFetch(\n `/api/compute/services/${encodeURIComponent(serviceId)}/deploy-token`,\n { method: 'POST' }\n );\n const tokenJson = (await tokenRes.json()) as { token: string; expirySeconds: number };\n\n // 3. Remote build + push (no local Docker daemon needed).\n // flyctl ships the build context to Fly's remote builder, builds\n // there, and pushes to registry.fly.io/<app>:<tag> using the\n // attenuated FLY_API_TOKEN we just received.\n // If the build fails on a freshly-created service, roll back the\n // cloud row + Fly app so the user can retry without a manual\n // `compute delete`. Don't roll back on update of an existing\n // service — the running machine should survive transient build\n // errors.\n const imageLabel = `cli-${Date.now()}`;\n if (!json) outputInfo(`Building & pushing on Fly remote builder...`);\n let imageRef: string;\n try {\n ({ imageRef } = await flyctlBuildAndPush({\n dir: absDir,\n appId: flyAppId,\n imageLabel,\n token: tokenJson.token,\n region: opts.region,\n port,\n }));\n } catch (buildErr) {\n if (!existing) {\n try {\n await ossFetch(`/api/compute/services/${encodeURIComponent(serviceId)}`, {\n method: 'DELETE',\n });\n if (!json) outputInfo(`Rolled back service \"${opts.name}\" after build failure.`);\n } catch {\n if (!json) {\n outputInfo(\n `Build failed and rollback also failed. ` +\n `Run: npx @insforge/cli compute delete ${serviceId}`\n );\n }\n }\n }\n throw buildErr;\n }\n\n // 4. Tell cloud the image is ready — launches new machine or\n // updates existing one. PATCH includes any deploy-affecting\n // field changes (port/cpu/memory/envVars/region) too.\n if (!json) outputInfo('Launching machine...');\n const updateBody: Record<string, unknown> = {\n imageUrl: imageRef,\n port,\n cpu: opts.cpu,\n memory,\n region: opts.region,\n };\n if (envVars) updateBody.envVars = envVars;\n\n const finalRes = await ossFetch(\n `/api/compute/services/${encodeURIComponent(serviceId)}`,\n { method: 'PATCH', body: JSON.stringify(updateBody) }\n );\n const service = (await finalRes.json()) as Record<string, unknown>;\n\n if (json) {\n outputJson(service);\n } else {\n const verb = existing ? 'updated' : 'deployed';\n outputSuccess(`Service \"${service.name}\" ${verb} [${service.status}]`);\n if (service.endpointUrl) console.log(` Endpoint: ${service.endpointUrl}`);\n console.log(` Image: ${imageRef} (built remotely; no local image to clean up)`);\n }\n\n await reportCliUsage('cli.compute.deploy', true);\n } catch (err) {\n await reportCliUsage('cli.compute.deploy', false);\n handleError(err, json);\n }\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { CLIError } from './errors.js';\n\nconst ENV_KEY_REGEX = /^[A-Z_][A-Z0-9_]*$/;\n\n// Minimal dotenv parser. Handles:\n// • KEY=VALUE lines\n// • Blank lines and # comment lines\n// • Optional surrounding quotes (\"...\" or '...') stripped from VALUE\n// • Inline trailing comments after unquoted values: KEY=val # note\n//\n// Keeps escape-sequence handling deliberately out of scope — anything fancy\n// (multiline strings, $VAR expansion) belongs in a real dotenv library; for\n// `compute deploy --env-file` the goal is feature-parity with `--env <json>`\n// for the 95% case, not full dotenv semantics.\nexport function parseEnvFile(path: string): Record<string, string> {\n let raw: string;\n try {\n raw = readFileSync(path, 'utf-8');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new CLIError(`Could not read --env-file at ${path}: ${msg}`);\n }\n\n const result: Record<string, string> = {};\n const lines = raw.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === '' || line.startsWith('#')) continue;\n\n const eq = line.indexOf('=');\n if (eq <= 0) {\n throw new CLIError(\n `${path}:${i + 1}: expected KEY=VALUE, got \"${line}\"`\n );\n }\n const key = line.slice(0, eq).trim();\n if (!ENV_KEY_REGEX.test(key)) {\n throw new CLIError(\n `${path}:${i + 1}: invalid env var key \"${key}\" (must match [A-Z_][A-Z0-9_]*)`\n );\n }\n\n let value = line.slice(eq + 1).trim();\n\n // Surrounding quotes (matching pair) — strip them and use the inner\n // string verbatim. Anything inside quotes is preserved including '#'.\n if (\n (value.startsWith('\"') && value.endsWith('\"') && value.length >= 2) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\") && value.length >= 2)\n ) {\n value = value.slice(1, -1);\n } else {\n // Unquoted value — strip a trailing inline comment (`KEY=val # note`).\n const hash = value.indexOf(' #');\n if (hash >= 0) value = value.slice(0, hash).trimEnd();\n }\n\n result[key] = value;\n }\n return result;\n}\n","// flyctl helpers for compute v3.2 source-deploy. Path A — refined:\n// the CLI shells out to `flyctl deploy --remote-only --build-only --push`\n// using a per-app deploy token minted by the cloud. Build runs on Fly's\n// remote builder; the resulting image is pushed straight to registry.fly.io.\n// No local Docker daemon required — the user only needs the single flyctl\n// binary on their PATH.\n//\n// Token shape: short-lived (~20 min) macaroon attenuated to one app +\n// builder/wg features, with `else: deny`. It can deploy to that one app and\n// nothing else, even within the InsForge Fly org.\n\nimport { spawn, spawnSync } from 'node:child_process';\nimport { existsSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { CLIError } from './errors.js';\n\nexport function ensureFlyctlAvailable(): void {\n const r = spawnSync('flyctl', ['version'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n if (r.error || r.status !== 0) {\n throw new CLIError(\n 'flyctl is required for source-mode deploy.\\n' +\n ' • Install: curl -L https://fly.io/install.sh | sh\\n' +\n ' • Or use --image <pre-built-image> instead.\\n' +\n (r.stderr ? ` Detail: ${r.stderr.trim().slice(0, 200)}` : '')\n );\n }\n}\n\nexport interface FlyctlBuildPushOptions {\n dir: string;\n appId: string; // Fly app name, e.g. \"my-svc-<projectId>\"\n imageLabel: string; // tag suffix; only used as buildkit's --image-label.\n token: string; // attenuated FlyV1 deploy token from cloud /deploy-token\n region: string; // Fly region — written into the stub fly.toml\n port: number; // container internal port — written into the stub fly.toml\n}\n\n/**\n * Write a minimal stub fly.toml in the user's directory so `flyctl deploy\n * --remote-only` has app config. On a freshly-created Fly app with zero\n * machines, flyctl errors with \"could not create a fly.toml from any\n * machines\" — it tries to derive config from existing machines and there\n * are none yet. The comment claiming \"flyctl will invent a fly.toml\" was\n * wrong: it does so only if the app already has machines to introspect.\n *\n * If the user already has a fly.toml, leave it alone — they're either\n * customising or driving a non-trivial setup (multi-process, volumes, etc.).\n *\n * Returns a cleanup callback the caller MUST run in a finally block to\n * delete the stub if (and only if) we created it.\n */\nfunction ensureFlyTomlStub(opts: { dir: string; appId: string; region: string; port: number }): () => void {\n const path = join(opts.dir, 'fly.toml');\n if (existsSync(path)) {\n return () => {\n /* user owns the file — leave as-is */\n };\n }\n const stub =\n `# Auto-generated by @insforge/cli for compute deploy. Safe to delete.\\n` +\n `app = \"${opts.appId}\"\\n` +\n `primary_region = \"${opts.region}\"\\n` +\n `\\n` +\n `[build]\\n` +\n `\\n` +\n `[http_service]\\n` +\n ` internal_port = ${opts.port}\\n` +\n ` force_https = true\\n` +\n ` auto_stop_machines = false\\n` +\n ` auto_start_machines = true\\n` +\n ` min_machines_running = 0\\n`;\n writeFileSync(path, stub, 'utf8');\n return () => {\n try {\n unlinkSync(path);\n } catch {\n /* best-effort */\n }\n };\n}\n\n/**\n * Run `flyctl deploy --remote-only --build-only --push` against the user's\n * source directory. Builds on Fly's remote builder, pushes to registry.fly.io,\n * and returns the resulting image ref. Does NOT launch a machine — the cloud\n * backend handles that step (it owns DB state and quota enforcement).\n *\n * IMPORTANT: returns the **digest-pinned** ref `<app>@sha256:<digest>`, not\n * the tag-based `<app>:<label>` ref. buildkit's `--build-only --push` lands\n * the manifest in the remote builder's namespace, and Fly's registry then\n * aliases the user-app namespace to it by content digest. The bare tag does\n * not always resolve (and racily fails on Fly's side as MANIFEST_UNKNOWN),\n * but the digest always does. The cloud's launchMachine accepts either form.\n *\n * If the user's directory has no fly.toml, we write a stub before invoking\n * flyctl and remove it after. flyctl needs the stub on a fresh app with no\n * machines — the comment claiming otherwise was wrong.\n */\nexport function flyctlBuildAndPush(\n opts: FlyctlBuildPushOptions\n): Promise<{ imageRef: string }> {\n return new Promise<{ imageRef: string }>((resolve, reject) => {\n const cleanupStub = ensureFlyTomlStub({\n dir: opts.dir,\n appId: opts.appId,\n region: opts.region,\n port: opts.port,\n });\n const child = spawn(\n 'flyctl',\n [\n 'deploy',\n '--remote-only',\n '--build-only',\n '--push',\n '--app',\n opts.appId,\n '--image-label',\n opts.imageLabel,\n '--no-cache',\n ],\n {\n cwd: opts.dir,\n env: { ...process.env, FLY_API_TOKEN: opts.token },\n stdio: ['inherit', 'pipe', 'pipe'],\n }\n );\n\n // Tee child's stdout+stderr to our own (so the user sees buildkit\n // progress in real time) AND capture them so we can parse the digest.\n let captured = '';\n child.stdout?.on('data', (b) => {\n const s = b.toString();\n captured += s;\n process.stdout.write(s);\n });\n child.stderr?.on('data', (b) => {\n const s = b.toString();\n captured += s;\n process.stderr.write(s);\n });\n child.on('error', (err) => {\n cleanupStub();\n reject(new CLIError(`flyctl deploy could not start: ${err.message}`));\n });\n child.on('exit', (code) => {\n cleanupStub();\n if (code !== 0) {\n return reject(\n new CLIError(`flyctl deploy --build-only failed (exit ${code}). See output above.`)\n );\n }\n // buildkit emits \"pushing manifest for registry.fly.io/<app>:<label>@sha256:<digest>\"\n // when the upload lands. Pin to that digest so the cloud's machine API\n // can resolve unambiguously regardless of registry tag-aliasing races.\n const m = captured.match(/pushing manifest for registry\\.fly\\.io\\/[^\\s]+@(sha256:[0-9a-f]+)/);\n if (!m) {\n return reject(\n new CLIError(\n 'flyctl deploy succeeded but the buildkit \"pushing manifest\" line was not found. ' +\n 'Cannot determine image digest — please re-run with FLY_LOG_LEVEL=debug and report.'\n )\n );\n }\n resolve({ imageRef: `registry.fly.io/${opts.appId}@${m[1]}` });\n });\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError } from '../lib/errors.js';\nimport { outputJson } from '../lib/output.js';\n\nconst VALID_SOURCES = ['insforge.logs', 'postgREST.logs', 'postgres.logs', 'function.logs', 'function-deploy.logs'] as const;\nconst SOURCE_LOOKUP = new Map(VALID_SOURCES.map((s) => [s.toLowerCase(), s]));\n\n/** Maps source names to their API paths. Most use /api/logs/{source}, but some have custom paths. */\nconst SOURCE_PATH: Record<string, string> = {\n 'function-deploy.logs': '/api/logs/functions/build-logs',\n};\n\nfunction getLogPath(source: string, limit: number): string {\n const custom = SOURCE_PATH[source];\n if (custom) return `${custom}?limit=${limit}`;\n return `/api/logs/${encodeURIComponent(source)}?limit=${limit}`;\n}\n\nexport function registerLogsCommand(program: Command): void {\n program\n .command('logs <source>')\n .description('Fetch backend container logs (insforge.logs | postgREST.logs | postgres.logs | function.logs | function-deploy.logs)')\n .option('--limit <n>', 'Number of log entries to return', '20')\n .action(async (source: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const resolved = SOURCE_LOOKUP.get(source.toLowerCase());\n if (!resolved) {\n throw new CLIError(`Invalid log source \"${source}\". Valid sources: ${VALID_SOURCES.join(', ')}`);\n }\n\n const limit = parseInt(opts.limit, 10) || 20;\n const res = await ossFetch(getLogPath(resolved, limit));\n const data = await res.json();\n\n if (json) {\n outputJson(data);\n } else {\n const logs = Array.isArray(data) ? data : (data as Record<string, unknown>).logs;\n if (!Array.isArray(logs) || !logs.length) {\n console.log('No logs found.');\n return;\n }\n for (const entry of logs) {\n if (typeof entry === 'string') {\n console.log(entry);\n } else {\n const e = entry as Record<string, unknown>;\n const ts = e.timestamp ?? e.time ?? '';\n const msg = e.message ?? e.msg ?? e.log ?? JSON.stringify(e);\n console.log(`${ts} ${msg}`);\n }\n }\n }\n } catch (err) {\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { AppMetadataSchema } from '@insforge/shared-schemas';\nimport { ossFetch } from '../lib/api/oss.js';\nimport { requireAuth } from '../lib/credentials.js';\nimport { handleError, getRootOpts } from '../lib/errors.js';\nimport { outputJson, outputTable } from '../lib/output.js';\nimport { reportCliUsage } from '../lib/skills.js';\n\nexport function registerMetadataCommand(program: Command): void {\n program\n .command('metadata')\n .description('Show backend metadata (auth, database, buckets, edge functions, realtime, AI models)')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const res = await ossFetch('/api/metadata');\n const data = await res.json() as AppMetadataSchema;\n\n if (json) {\n outputJson(data);\n return;\n }\n\n // Auth\n console.log('\\n Auth');\n console.log(` OAuth Providers: ${data.auth.oAuthProviders.length ? data.auth.oAuthProviders.join(', ') : '(none)'}`);\n console.log(` Email Verification: ${data.auth.requireEmailVerification ? 'Yes' : 'No'}`);\n console.log(` Password Policy:`);\n console.log(` Min Length: ${data.auth.passwordMinLength}, requireLowercase: ${data.auth.requireLowercase}, requireNumber: ${data.auth.requireNumber}, requireSpecialChar: ${data.auth.requireSpecialChar}, requireUppercase: ${data.auth.requireUppercase}`);\n console.log(` Verify Email Method: ${data.auth.verifyEmailMethod}`);\n console.log(` Reset Password Method: ${data.auth.resetPasswordMethod}`);\n\n // Database\n console.log('\\n Database');\n console.log(` Size: ${formatSize(data.database.totalSizeInGB)}`);\n if (data.database.tables.length) {\n outputTable(\n ['Table', 'Records'],\n data.database.tables.map((t) => [t.tableName, String(t.recordCount)]),\n );\n } else {\n console.log(' No tables.');\n }\n\n // Storage\n console.log('\\n Storage');\n console.log(` Size: ${formatSize(data.storage.totalSizeInGB)}`);\n if (data.storage.buckets.length) {\n outputTable(\n ['Bucket', 'Public', 'Objects'],\n data.storage.buckets.map((b) => [b.name, b.public ? 'Yes' : 'No', String(b.objectCount ?? '-')]),\n );\n } else {\n console.log(' No buckets.');\n }\n\n // Functions\n console.log('\\n Functions');\n if (data.functions.length) {\n outputTable(\n ['Slug', 'Name', 'Status', 'Description'],\n data.functions.map((f) => [f.slug, f.name, f.status, f.description || '-']),\n );\n } else {\n console.log(' No functions deployed.');\n }\n\n // AI\n if (data.aiIntegration?.models?.length) {\n console.log('\\n AI Models');\n outputTable(\n ['Model', 'Input', 'Output'],\n data.aiIntegration.models.map((m) => [\n m.modelId,\n m.inputModality.join(', '),\n m.outputModality.join(', '),\n ]),\n );\n }\n\n // Realtime\n if (data.realtime?.channels && Array.isArray(data.realtime.channels) && data.realtime.channels.length) {\n console.log(`\\n Realtime: ${data.realtime.channels.length} channel(s)`);\n outputTable(\n ['Id', 'Pattern', 'Webhook URLs', 'Enabled', 'Description'],\n data.realtime.channels.map((c) => [c.id, c.pattern, c.webhookUrls?.join(', ') || '-', c.enabled ? 'Yes' : 'No', c.description || '-']),\n );\n }\n\n // Version\n if (data.version) {\n console.log(`\\n Version: ${data.version}`);\n }\n\n console.log('');\n await reportCliUsage('cli.metadata', true);\n } catch (err) {\n await reportCliUsage('cli.metadata', false);\n handleError(err, json);\n }\n });\n}\n\nfunction formatSize(gb: number): string {\n if (gb < 0.001) return `${(gb * 1024 * 1024).toFixed(1)} KB`;\n if (gb < 1) return `${(gb * 1024).toFixed(2)} MB`;\n return `${gb.toFixed(2)} GB`;\n}\n","import type { Command } from 'commander';\nimport * as os from 'node:os';\nimport * as clack from '@clack/prompts';\nimport * as prompts from '../../lib/prompts.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\nimport { streamDiagnosticAnalysis, rateDiagnosticSession } from '../../lib/api/platform.js';\n\nimport { fetchMetricsSummary, registerDiagnoseMetricsCommand } from './metrics.js';\nimport { fetchAdvisorSummary, registerDiagnoseAdvisorCommand } from './advisor.js';\nimport { runDbChecks, registerDiagnoseDbCommand } from './db.js';\nimport { fetchLogsSummary, registerDiagnoseLogsCommand } from './logs.js';\n\nfunction sectionHeader(title: string): string {\n return `── ${title} ${'─'.repeat(Math.max(0, 44 - title.length))}`;\n}\n\ninterface DiagnosticContext {\n metrics: unknown | null;\n advisor: unknown | null;\n db: unknown | null;\n logs: unknown | null;\n errors: string[];\n}\n\nasync function collectDiagnosticData(\n projectId: string,\n ossMode: boolean,\n apiUrl?: string,\n): Promise<DiagnosticContext> {\n const metricsPromise = ossMode\n ? Promise.reject(new Error('Platform login required (linked via --api-key)'))\n : fetchMetricsSummary(projectId, apiUrl);\n const advisorPromise = ossMode\n ? Promise.reject(new Error('Platform login required (linked via --api-key)'))\n : fetchAdvisorSummary(projectId, apiUrl);\n\n const [metricsResult, advisorResult, dbResult, logsResult] = await Promise.allSettled([\n metricsPromise,\n advisorPromise,\n runDbChecks(),\n fetchLogsSummary(100),\n ]);\n\n const errors: string[] = [];\n let metrics: unknown | null = null;\n let advisor: unknown | null = null;\n let db: unknown | null = null;\n let logs: unknown | null = null;\n\n if (metricsResult.status === 'fulfilled') {\n const data = metricsResult.value;\n metrics = data.metrics\n .filter((m) => m.data.length > 0)\n .map((m) => {\n let sum = 0;\n let max = -Infinity;\n for (const d of m.data) {\n sum += d.value;\n if (d.value > max) max = d.value;\n }\n return {\n metric: m.metric,\n latest: m.data[m.data.length - 1].value,\n avg: sum / m.data.length,\n max,\n };\n });\n } else {\n errors.push(metricsResult.reason?.message ?? 'Metrics unavailable');\n }\n\n if (advisorResult.status === 'fulfilled') {\n advisor = advisorResult.value;\n } else {\n errors.push(advisorResult.reason?.message ?? 'Advisor unavailable');\n }\n\n if (dbResult.status === 'fulfilled') {\n db = dbResult.value;\n } else {\n errors.push(dbResult.reason?.message ?? 'DB checks unavailable');\n }\n\n if (logsResult.status === 'fulfilled') {\n logs = logsResult.value;\n } else {\n errors.push(logsResult.reason?.message ?? 'Logs unavailable');\n }\n\n return { metrics, advisor, db, logs, errors };\n}\n\nexport function registerDiagnoseCommands(diagnoseCmd: Command): void {\n // Comprehensive report (no subcommand)\n diagnoseCmd\n .description('Backend diagnostics — run with no subcommand for a full health report')\n .option('--ai <question>', 'Ask AI to analyze your diagnostic data (1-2000 chars)')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n const usageEvent = opts.ai ? 'cli.diagnose.ai' : 'cli.diagnose';\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n\n const projectId = config.project_id;\n const projectName = config.project_name;\n const ossMode = config.project_id === FAKE_PROJECT_ID;\n trackDiagnose(opts.ai ? 'ai' : 'report', config);\n\n // AI analysis mode\n if (opts.ai) {\n const question = String(opts.ai).trim();\n if (question.length === 0 || question.length > 2000) {\n throw new CLIError('Question must be between 1 and 2000 characters.');\n }\n\n const s = !json ? clack.spinner() : null;\n s?.start('Collecting diagnostic data...');\n\n const data = await collectDiagnosticData(projectId, ossMode, apiUrl);\n\n const cliVersion = process.env.CLI_VERSION || 'unknown';\n\n s?.stop('Data collected');\n\n if (!json) {\n console.log(`\\n AI Diagnosis — ${projectName}\\n`);\n console.log(sectionHeader('Question'));\n console.log(` ${question}\\n`);\n console.log(sectionHeader('Analysis'));\n }\n\n let sessionId: string | undefined;\n let fullText = '';\n const jsonEvents: Record<string, unknown>[] = [];\n let streamError: CLIError | undefined;\n\n // Build context — transform collected data to match backend schema exactly\n const context: Record<string, unknown> = {\n context_version: 'diagnostic-v1',\n client_info: {\n cli_version: cliVersion,\n node_version: process.version,\n os: `${os.platform()} ${os.release()}`,\n },\n };\n if (Array.isArray(data.metrics) && data.metrics.length > 0) {\n context.metrics = data.metrics;\n }\n if (data.advisor) {\n // Spec only accepts: { summary, collectorErrors: string[] }\n const adv = data.advisor as Record<string, unknown>;\n const summary = adv.summary as Record<string, number> | undefined;\n const rawErrors = adv.collectorErrors as unknown[] | undefined;\n if (summary) {\n context.advisor = {\n summary: {\n total: summary.total ?? 0,\n critical: summary.critical ?? 0,\n warning: summary.warning ?? 0,\n info: summary.info ?? 0,\n },\n collectorErrors: rawErrors?.map((e) =>\n typeof e === 'string' ? e : JSON.stringify(e),\n ) ?? [],\n };\n }\n }\n if (data.db) {\n // Stringify all values to match spec (active: string, dead_tuples: string, etc.)\n const rawDb = data.db as Record<string, Record<string, unknown>[]>;\n const safeDb: Record<string, Record<string, unknown>[]> = {};\n for (const [key, rows] of Object.entries(rawDb)) {\n safeDb[key] = rows.map((row) => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(row)) {\n out[k] = (v === null || v === undefined) ? '' : String(v);\n }\n return out;\n });\n }\n if (Object.keys(safeDb).length > 0) {\n context.db = safeDb;\n }\n }\n if (Array.isArray(data.logs) && data.logs.length > 0) {\n // Spec: { source: string, total: integer, errors: [{timestamp, message, source}] }\n context.logs = (data.logs as { source: string; total: number; errors: { timestamp: string; message: string; source: string }[] }[])\n .map((s) => ({\n source: s.source,\n total: s.total,\n errors: s.errors.map((e) => ({\n timestamp: e.timestamp ?? '',\n message: e.message ?? '',\n source: e.source ?? '',\n })),\n }));\n }\n\n await streamDiagnosticAnalysis({\n project_id: projectId,\n question,\n context,\n } as Parameters<typeof streamDiagnosticAnalysis>[0], (event) => {\n // Capture sessionId and errors before any early return\n if (event.type === 'done') {\n sessionId = event.data.session_id as string | undefined;\n }\n if (event.type === 'error') {\n streamError = new CLIError(String(event.data.message ?? 'Unknown diagnostic error'));\n }\n\n if (json) {\n jsonEvents.push({ type: event.type, ...event.data });\n return;\n }\n\n switch (event.type) {\n case 'delta':\n process.stdout.write(String(event.data.text ?? ''));\n fullText += String(event.data.text ?? '');\n break;\n case 'tool_call':\n console.log(`\\n [calling ${event.data.tool_name}...]`);\n break;\n case 'tool_result':\n // silently consume tool results\n break;\n case 'done':\n break;\n case 'error':\n console.error(`\\n Error: ${streamError?.message ?? 'Unknown error'}`);\n break;\n }\n }, apiUrl);\n\n if (streamError) {\n throw streamError;\n }\n\n if (!json) {\n // Ensure newline after streamed text\n if (fullText && !fullText.endsWith('\\n')) console.log('');\n console.log('');\n }\n\n if (json) {\n outputJson({ sessionId, events: jsonEvents });\n }\n\n // Optional rating prompt (interactive only)\n if (!json && sessionId) {\n const ratingChoice = await prompts.select<string>({\n message: 'Was this analysis helpful?',\n options: [\n { value: 'skip', label: 'Skip', hint: 'no rating' },\n { value: 'helpful', label: 'Helpful', hint: 'solved or pointed in right direction' },\n { value: 'not_helpful', label: 'Not helpful', hint: 'didn\\'t apply to the problem' },\n { value: 'incorrect', label: 'Incorrect', hint: 'diagnosis was wrong or misleading' },\n ],\n });\n\n if (!prompts.isCancel(ratingChoice) && ratingChoice !== 'skip') {\n try {\n await rateDiagnosticSession(\n sessionId,\n ratingChoice as 'helpful' | 'not_helpful' | 'incorrect',\n undefined,\n apiUrl,\n );\n clack.log.success('Thanks for your feedback!');\n } catch {\n clack.log.warn('Failed to submit rating.');\n }\n }\n }\n\n await reportCliUsage(usageEvent, true);\n return;\n }\n\n // Standard report mode\n const data = await collectDiagnosticData(projectId, ossMode, apiUrl);\n\n if (json) {\n outputJson({ project: projectName, ...data });\n } else {\n console.log(`\\n InsForge Health Report — ${projectName}\\n`);\n\n // Metrics section\n console.log(sectionHeader('System Metrics (last 1h)'));\n if (data.metrics) {\n const metricsArr = data.metrics as { metric: string; latest: number }[];\n if (metricsArr.length === 0) {\n console.log(' No metrics data available.');\n } else {\n const vals: Record<string, number> = {};\n for (const m of metricsArr) {\n vals[m.metric] = m.latest;\n }\n const cpu = vals.cpu_usage !== undefined ? `${vals.cpu_usage.toFixed(1)}%` : 'N/A';\n const mem = vals.memory_usage !== undefined ? `${vals.memory_usage.toFixed(1)}%` : 'N/A';\n const disk = vals.disk_usage !== undefined ? `${vals.disk_usage.toFixed(1)}%` : 'N/A';\n const netIn = vals.network_in !== undefined ? formatBytesCompact(vals.network_in) + '/s' : 'N/A';\n const netOut = vals.network_out !== undefined ? formatBytesCompact(vals.network_out) + '/s' : 'N/A';\n console.log(` CPU: ${cpu} Memory: ${mem}`);\n console.log(` Disk: ${disk} Network: ↓${netIn} ↑${netOut}`);\n }\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Metrics') || e.includes('Platform')) ?? 'unavailable'}`);\n }\n\n // Advisor section\n console.log('\\n' + sectionHeader('Advisor Scan'));\n if (data.advisor) {\n const scan = data.advisor as { scannedAt: string; status: string; summary: { critical: number; warning: number; info: number } };\n const date = new Date(scan.scannedAt).toLocaleDateString();\n console.log(` ${date} (${scan.status}) — ${scan.summary.critical} critical · ${scan.summary.warning} warning · ${scan.summary.info} info`);\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Advisor') || e.includes('Platform')) ?? 'unavailable'}`);\n }\n\n // DB section\n console.log('\\n' + sectionHeader('Database'));\n if (data.db) {\n const db = data.db as Record<string, Record<string, unknown>[]>;\n const conn = db.connections?.[0];\n const cache = db['cache-hit']?.[0];\n const deadTuples = (db.bloat ?? []).reduce(\n (sum: number, r: Record<string, unknown>) => sum + (Number(r.dead_tuples) || 0),\n 0,\n );\n const lockCount = (db.locks ?? []).length;\n\n console.log(\n ` Connections: ${conn?.active ?? '?'}/${conn?.max ?? '?'} Cache Hit: ${cache?.ratio ?? '?'}%`,\n );\n console.log(\n ` Dead tuples: ${deadTuples.toLocaleString()} Locks waiting: ${lockCount}`,\n );\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('DB')) ?? 'unavailable'}`);\n }\n\n // Logs section\n console.log('\\n' + sectionHeader('Recent Errors (last 100 logs/source)'));\n if (data.logs) {\n const summaries = data.logs as { source: string; errors: unknown[] }[];\n const parts = summaries.map((s) => `${s.source}: ${s.errors.length}`);\n console.log(` ${parts.join(' ')}`);\n } else {\n console.log(` N/A — ${data.errors.find((e) => e.includes('Logs')) ?? 'unavailable'}`);\n }\n\n console.log('');\n }\n await reportCliUsage(usageEvent, true);\n } catch (err) {\n await reportCliUsage(usageEvent, false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n\n // Register subcommands\n registerDiagnoseMetricsCommand(diagnoseCmd);\n registerDiagnoseAdvisorCommand(diagnoseCmd);\n registerDiagnoseDbCommand(diagnoseCmd);\n registerDiagnoseLogsCommand(diagnoseCmd);\n}\n\nfunction formatBytesCompact(bytes: number): string {\n if (bytes < 1024) return `${bytes.toFixed(0)}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n","import type { Command } from 'commander';\nimport { platformFetch } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\ninterface MetricDataPoint {\n timestamp: number;\n value: number;\n}\n\ninterface MetricSeries {\n metric: string;\n instance_id: string;\n data: MetricDataPoint[];\n}\n\ninterface MetricsResponse {\n project_id: string;\n range: string;\n metrics: MetricSeries[];\n _meta?: { requested_at: string; query_time_ms: number; cached: boolean };\n}\n\nconst METRIC_LABELS: Record<string, string> = {\n cpu_usage: 'CPU Usage',\n memory_usage: 'Memory Usage',\n disk_usage: 'Disk Usage',\n network_in: 'Network In',\n network_out: 'Network Out',\n};\n\nconst NETWORK_METRICS = new Set(['network_in', 'network_out']);\n\nfunction formatValue(metric: string, value: number): string {\n if (NETWORK_METRICS.has(metric)) {\n return formatBytes(value) + '/s';\n }\n return `${value.toFixed(1)}%`;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes.toFixed(1)} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction computeStats(data: MetricDataPoint[]): { latest: number; avg: number; max: number } {\n if (data.length === 0) return { latest: 0, avg: 0, max: 0 };\n const latest = data[data.length - 1].value;\n let sum = 0;\n let max = -Infinity;\n for (const d of data) {\n sum += d.value;\n if (d.value > max) max = d.value;\n }\n return { latest, avg: sum / data.length, max };\n}\n\n/**\n * Aggregate multiple series of the same metric (e.g. multiple network interfaces)\n * into a single series per metric name. Network metrics are summed; others take the first series.\n */\nfunction aggregateByMetric(series: MetricSeries[]): MetricSeries[] {\n const grouped = new Map<string, MetricSeries[]>();\n for (const s of series) {\n const existing = grouped.get(s.metric);\n if (existing) existing.push(s);\n else grouped.set(s.metric, [s]);\n }\n\n const result: MetricSeries[] = [];\n for (const [metric, group] of grouped) {\n if (group.length === 1 || !NETWORK_METRICS.has(metric)) {\n result.push(group[0]);\n continue;\n }\n // Sum network metrics across interfaces by matching timestamps\n const tsMap = new Map<number, number>();\n for (const s of group) {\n for (const d of s.data) {\n tsMap.set(d.timestamp, (tsMap.get(d.timestamp) ?? 0) + d.value);\n }\n }\n const merged: MetricDataPoint[] = [...tsMap.entries()]\n .sort((a, b) => a[0] - b[0])\n .map(([timestamp, value]) => ({ timestamp, value }));\n result.push({ metric, instance_id: 'aggregate', data: merged });\n }\n return result;\n}\n\nexport async function fetchMetricsSummary(\n projectId: string,\n apiUrl?: string,\n): Promise<MetricsResponse> {\n const res = await platformFetch(`/projects/v1/${projectId}/metrics?range=1h`, {}, apiUrl);\n return (await res.json()) as MetricsResponse;\n}\n\nexport function registerDiagnoseMetricsCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('metrics')\n .description('Display EC2 instance metrics (CPU, memory, disk, network)')\n .option('--range <range>', 'Time range: 1h, 6h, 24h, 7d', '1h')\n .option('--metrics <list>', 'Comma-separated metrics to query')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n if (config.project_id === FAKE_PROJECT_ID) {\n throw new CLIError(\n 'Metrics requires InsForge Platform login. Not available when linked via --api-key.',\n );\n }\n trackDiagnose('metrics', config);\n\n const params = new URLSearchParams({ range: opts.range });\n if (opts.metrics) params.set('metrics', opts.metrics);\n\n const res = await platformFetch(\n `/projects/v1/${config.project_id}/metrics?${params.toString()}`,\n {},\n apiUrl,\n );\n const data = (await res.json()) as MetricsResponse;\n\n const aggregated = aggregateByMetric(data.metrics);\n\n if (json) {\n const enriched = {\n ...data,\n metrics: aggregated.map((m) => {\n const stats = computeStats(m.data);\n return { ...m, latest: stats.latest, avg: stats.avg, max: stats.max };\n }),\n };\n outputJson(enriched);\n } else {\n if (!aggregated.length) {\n console.log('No metrics data available.');\n return;\n }\n const headers = ['Metric', 'Latest', 'Avg', 'Max', 'Range'];\n const rows = aggregated.map((m) => {\n const stats = computeStats(m.data);\n return [\n METRIC_LABELS[m.metric] ?? m.metric,\n formatValue(m.metric, stats.latest),\n formatValue(m.metric, stats.avg),\n formatValue(m.metric, stats.max),\n data.range,\n ];\n });\n outputTable(headers, rows);\n }\n await reportCliUsage('cli.diagnose.metrics', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.metrics', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { platformFetch } from '../../lib/api/platform.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, CLIError, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig, FAKE_PROJECT_ID } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\n\ninterface AdvisorScanSummary {\n scanId: string;\n status: string;\n scanType: string;\n scannedAt: string;\n summary: { total: number; critical: number; warning: number; info: number };\n collectorErrors: { collector: string; error: string; timestamp: string }[];\n}\n\ninterface AdvisorIssue {\n id: string;\n ruleId: string;\n severity: string;\n category: string;\n title: string;\n description: string;\n affectedObject: string;\n recommendation: string;\n isResolved: boolean;\n}\n\ninterface AdvisorIssuesResponse {\n issues: AdvisorIssue[];\n total: number;\n}\n\nexport async function fetchAdvisorSummary(\n projectId: string,\n apiUrl?: string,\n): Promise<AdvisorScanSummary> {\n const res = await platformFetch(`/projects/v1/${projectId}/advisor/latest`, {}, apiUrl);\n return (await res.json()) as AdvisorScanSummary;\n}\n\nexport function registerDiagnoseAdvisorCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('advisor')\n .description('Display latest advisor scan results and issues')\n .option('--severity <level>', 'Filter by severity: critical, warning, info')\n .option('--category <cat>', 'Filter by category: security, performance, health')\n .option('--limit <n>', 'Maximum number of issues to return', '50')\n .action(async (opts, cmd) => {\n const { json, apiUrl } = getRootOpts(cmd);\n try {\n await requireAuth(apiUrl);\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n if (config.project_id === FAKE_PROJECT_ID) {\n throw new CLIError(\n 'Advisor requires InsForge Platform login. Not available when linked via --api-key.',\n );\n }\n trackDiagnose('advisor', config);\n\n const projectId = config.project_id;\n\n // Fetch scan summary\n const scanRes = await platformFetch(\n `/projects/v1/${projectId}/advisor/latest`,\n {},\n apiUrl,\n );\n const scan = (await scanRes.json()) as AdvisorScanSummary;\n\n // Fetch issues\n const issueParams = new URLSearchParams();\n if (opts.severity) issueParams.set('severity', opts.severity);\n if (opts.category) issueParams.set('category', opts.category);\n issueParams.set('limit', opts.limit);\n\n const issuesRes = await platformFetch(\n `/projects/v1/${projectId}/advisor/latest/issues?${issueParams.toString()}`,\n {},\n apiUrl,\n );\n const issuesData = (await issuesRes.json()) as AdvisorIssuesResponse;\n\n if (json) {\n outputJson({ scan, issues: issuesData.issues });\n } else {\n // Scan summary line\n const date = new Date(scan.scannedAt).toLocaleDateString();\n const s = scan.summary;\n console.log(\n `Scan: ${date} (${scan.status}) — ${s.critical} critical, ${s.warning} warning, ${s.info} info\\n`,\n );\n\n if (!issuesData.issues || issuesData.issues.length === 0) {\n console.log('No issues found.');\n return;\n }\n\n const headers = ['Severity', 'Category', 'Affected Object', 'Title'];\n const rows = issuesData.issues.map((issue) => [\n issue.severity,\n issue.category,\n issue.affectedObject,\n issue.title,\n ]);\n outputTable(headers, rows);\n }\n await reportCliUsage('cli.diagnose.advisor', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.advisor', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { runRawSql } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\ninterface DbCheck {\n label: string;\n sql: string;\n format: (rows: Record<string, unknown>[]) => void;\n}\n\nconst DB_CHECKS: Record<string, DbCheck> = {\n connections: {\n label: 'Connections',\n sql: `SELECT\n (SELECT count(*) FROM pg_stat_activity WHERE state IS NOT NULL) AS active,\n (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') AS max`,\n format(rows) {\n const r = rows[0] ?? {};\n console.log(` Active: ${r.active} / ${r.max}`);\n },\n },\n 'slow-queries': {\n label: 'Slow Queries (>5s)',\n sql: `SELECT pid, now() - query_start AS duration, substring(query for 80) AS query\n FROM pg_stat_activity\n WHERE state = 'active' AND now() - query_start > interval '5 seconds'\n ORDER BY query_start ASC`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' None');\n return;\n }\n const headers = ['PID', 'Duration', 'Query'];\n const tableRows = rows.map((r) => [\n String(r.pid ?? ''),\n String(r.duration ?? ''),\n String(r.query ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n bloat: {\n label: 'Table Bloat (top 10)',\n sql: `SELECT schemaname || '.' || relname AS table, n_dead_tup AS dead_tuples\n FROM pg_stat_user_tables\n ORDER BY n_dead_tup DESC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No user tables found.');\n return;\n }\n const headers = ['Table', 'Dead Tuples'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.dead_tuples ?? 0),\n ]);\n outputTable(headers, tableRows);\n },\n },\n size: {\n label: 'Table Sizes (top 10)',\n sql: `SELECT schemaname || '.' || relname AS table,\n pg_size_pretty(pg_total_relation_size(relid)) AS size\n FROM pg_stat_user_tables\n ORDER BY pg_total_relation_size(relid) DESC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No user tables found.');\n return;\n }\n const headers = ['Table', 'Size'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.size ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n 'index-usage': {\n label: 'Index Usage (worst 10)',\n sql: `SELECT schemaname || '.' || relname AS table, idx_scan, seq_scan,\n CASE WHEN (idx_scan + seq_scan) > 0\n THEN round(100.0 * idx_scan / (idx_scan + seq_scan), 1)\n ELSE 0 END AS idx_ratio\n FROM pg_stat_user_tables\n WHERE (idx_scan + seq_scan) > 0\n ORDER BY idx_ratio ASC\n LIMIT 10`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' No scan data available.');\n return;\n }\n const headers = ['Table', 'Index Scans', 'Seq Scans', 'Index Ratio'];\n const tableRows = rows.map((r) => [\n String(r.table ?? ''),\n String(r.idx_scan ?? 0),\n String(r.seq_scan ?? 0),\n `${r.idx_ratio ?? 0}%`,\n ]);\n outputTable(headers, tableRows);\n },\n },\n locks: {\n label: 'Waiting Locks',\n sql: `SELECT pid, mode, relation::regclass AS relation, granted\n FROM pg_locks\n WHERE NOT granted`,\n format(rows) {\n if (rows.length === 0) {\n console.log(' None');\n return;\n }\n const headers = ['PID', 'Mode', 'Relation', 'Granted'];\n const tableRows = rows.map((r) => [\n String(r.pid ?? ''),\n String(r.mode ?? ''),\n String(r.relation ?? ''),\n String(r.granted ?? ''),\n ]);\n outputTable(headers, tableRows);\n },\n },\n 'cache-hit': {\n label: 'Cache Hit Ratio',\n sql: `SELECT CASE WHEN sum(heap_blks_hit + heap_blks_read) > 0\n THEN round(100.0 * sum(heap_blks_hit) / sum(heap_blks_hit + heap_blks_read), 1)\n ELSE 0 END AS ratio\n FROM pg_statio_user_tables`,\n format(rows) {\n const ratio = rows[0]?.ratio ?? 0;\n console.log(` ${ratio}%`);\n },\n },\n};\n\nconst ALL_CHECKS = Object.keys(DB_CHECKS);\n\nexport async function runDbChecks(): Promise<Record<string, Record<string, unknown>[]>> {\n const results: Record<string, Record<string, unknown>[]> = {};\n for (const key of ALL_CHECKS) {\n try {\n const { rows } = await runRawSql(DB_CHECKS[key].sql, true);\n results[key] = rows;\n } catch {\n results[key] = [];\n }\n }\n return results;\n}\n\nexport function registerDiagnoseDbCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('db')\n .description('Run database health checks (connections, bloat, index usage, etc.)')\n .option('--check <checks>', 'Comma-separated checks: ' + ALL_CHECKS.join(', '), 'all')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n trackDiagnose('db', config);\n\n const checkNames =\n opts.check === 'all'\n ? ALL_CHECKS\n : (opts.check as string).split(',').map((s: string) => s.trim());\n\n const results: Record<string, Record<string, unknown>[]> = {};\n\n for (const name of checkNames) {\n const check = DB_CHECKS[name];\n if (!check) {\n console.error(`Unknown check: ${name}. Available: ${ALL_CHECKS.join(', ')}`);\n continue;\n }\n try {\n const { rows } = await runRawSql(check.sql, true);\n results[name] = rows;\n } catch (err) {\n results[name] = [];\n if (!json) {\n console.error(` Failed to run ${name}: ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n if (json) {\n outputJson(results);\n } else {\n for (const name of checkNames) {\n const check = DB_CHECKS[name];\n if (!check) continue;\n console.log(`\\n── ${check.label} ${'─'.repeat(Math.max(0, 40 - check.label.length))}`);\n check.format(results[name] ?? []);\n }\n console.log('');\n }\n await reportCliUsage('cli.diagnose.db', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.db', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ossFetch } from '../../lib/api/oss.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { handleError, getRootOpts, ProjectNotLinkedError } from '../../lib/errors.js';\nimport { getProjectConfig } from '../../lib/config.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { reportCliUsage } from '../../lib/skills.js';\nimport { trackDiagnose, shutdownAnalytics } from '../../lib/analytics.js';\n\nconst LOG_SOURCES = ['insforge.logs', 'postgREST.logs', 'postgres.logs', 'function.logs', 'function-deploy.logs'] as const;\n\nconst ERROR_PATTERN = /\\b(error|fatal|panic)\\b/i;\n\n/** Maps source names to their API paths. Most use /api/logs/{source}, but some have custom paths. */\nconst SOURCE_PATH: Record<string, string> = {\n 'function-deploy.logs': '/api/logs/functions/build-logs',\n};\n\ninterface LogEntry {\n timestamp: string;\n message: string;\n source: string;\n}\n\ninterface SourceSummary {\n source: string;\n total: number;\n errors: LogEntry[];\n}\n\nfunction parseLogEntry(entry: unknown): { ts: string; msg: string } {\n if (typeof entry === 'string') {\n return { ts: '', msg: entry };\n }\n const e = entry as Record<string, unknown>;\n const ts = String(e.timestamp ?? e.time ?? '');\n const msg = String(e.message ?? e.msg ?? e.log ?? JSON.stringify(e));\n return { ts, msg };\n}\n\nfunction getLogPath(source: string, limit: number): string {\n const custom = SOURCE_PATH[source];\n if (custom) return `${custom}?limit=${limit}`;\n return `/api/logs/${encodeURIComponent(source)}?limit=${limit}`;\n}\n\nasync function fetchSourceLogs(source: string, limit: number): Promise<SourceSummary> {\n const res = await ossFetch(getLogPath(source, limit));\n const data = await res.json();\n const logs = Array.isArray(data) ? data : ((data as Record<string, unknown>).logs as unknown[]) ?? [];\n\n const errors: LogEntry[] = [];\n for (const entry of logs) {\n const { ts, msg } = parseLogEntry(entry);\n if (ERROR_PATTERN.test(msg)) {\n errors.push({ timestamp: ts, message: msg, source });\n }\n }\n\n return { source, total: logs.length, errors };\n}\n\nexport async function fetchLogsSummary(limit = 100): Promise<SourceSummary[]> {\n const results: SourceSummary[] = [];\n for (const source of LOG_SOURCES) {\n try {\n results.push(await fetchSourceLogs(source, limit));\n } catch {\n results.push({ source, total: 0, errors: [] });\n }\n }\n return results;\n}\n\nexport function registerDiagnoseLogsCommand(diagnoseCmd: Command): void {\n diagnoseCmd\n .command('logs')\n .description('Aggregate error-level logs from all backend sources')\n .option('--source <name>', 'Specific log source to check')\n .option('--limit <n>', 'Number of log entries per source', '100')\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n const config = getProjectConfig();\n if (!config) throw new ProjectNotLinkedError();\n trackDiagnose('logs', config);\n\n const limit = parseInt(opts.limit, 10) || 100;\n const sources = opts.source ? [opts.source as string] : [...LOG_SOURCES];\n\n const summaries: SourceSummary[] = [];\n for (const source of sources) {\n try {\n summaries.push(await fetchSourceLogs(source, limit));\n } catch {\n summaries.push({ source, total: 0, errors: [] });\n }\n }\n\n if (json) {\n outputJson({ sources: summaries });\n } else {\n // Summary table\n const headers = ['Source', 'Total', 'Errors'];\n const rows = summaries.map((s) => [s.source, String(s.total), String(s.errors.length)]);\n outputTable(headers, rows);\n\n // Error details\n const allErrors = summaries.flatMap((s) => s.errors);\n if (allErrors.length > 0) {\n console.log('\\n── Error Details ' + '─'.repeat(30));\n for (const err of allErrors) {\n const prefix = err.timestamp ? `[${err.source}] ${err.timestamp}` : `[${err.source}]`;\n console.log(`\\n ${prefix}`);\n console.log(` ${err.message}`);\n }\n console.log('');\n }\n }\n await reportCliUsage('cli.diagnose.logs', true);\n } catch (err) {\n await reportCliUsage('cli.diagnose.logs', false);\n await shutdownAnalytics();\n handleError(err, json);\n } finally {\n await shutdownAnalytics();\n }\n });\n}\n","import { ossFetch } from \"./oss.js\";\nimport type {\n ArchivePaymentPriceResponse,\n ConfigurePaymentWebhookResponse,\n CreatePaymentPriceBody,\n CreatePaymentProductBody,\n DeletePaymentProductResponse,\n GetPaymentPriceResponse,\n GetPaymentProductResponse,\n GetPaymentsConfigResponse,\n GetPaymentsStatusResponse,\n ListPaymentCatalogResponse,\n ListPaymentCustomersRequest,\n ListPaymentCustomersResponse,\n ListPaymentHistoryQuery,\n ListPaymentHistoryResponse,\n ListPaymentPricesResponse,\n ListPaymentProductsResponse,\n ListSubscriptionsQuery,\n ListSubscriptionsResponse,\n MutatePaymentPriceResponse,\n MutatePaymentProductResponse,\n StripeEnvironment,\n SyncPaymentsRequest,\n SyncPaymentsResponse,\n UpdatePaymentPriceBody,\n UpdatePaymentProductBody,\n} from \"@insforge/shared-schemas\";\ntype ListPaymentCustomersQuery = Partial<\n Omit<ListPaymentCustomersRequest, \"environment\">\n>;\n\nfunction withQuery(\n path: string,\n params: Record<string, string | number | undefined>,\n): string {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) query.set(key, String(value));\n }\n const suffix = query.toString();\n return suffix ? `${path}?${suffix}` : path;\n}\n\nasync function readJson<T>(res: Response): Promise<T> {\n return (await res.json()) as T;\n}\n\nfunction withEnvironmentPath(\n environment: StripeEnvironment,\n suffix: string,\n): string {\n return `/api/payments/${encodeURIComponent(environment)}${suffix}`;\n}\n\nexport async function getPaymentsStatus(): Promise<GetPaymentsStatusResponse> {\n return readJson(await ossFetch(\"/api/payments/status\"));\n}\n\nexport async function getPaymentsConfig(): Promise<GetPaymentsConfigResponse> {\n return readJson(await ossFetch(\"/api/payments/config\"));\n}\n\nexport async function setStripeSecretKey(\n environment: StripeEnvironment,\n secretKey: string,\n): Promise<GetPaymentsConfigResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/config\"), {\n method: \"PUT\",\n body: JSON.stringify({ secretKey }),\n }),\n );\n}\n\nexport async function removeStripeSecretKey(\n environment: StripeEnvironment,\n): Promise<GetPaymentsConfigResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/config\"), {\n method: \"DELETE\",\n }),\n );\n}\n\nexport async function syncPayments(\n environment: SyncPaymentsRequest[\"environment\"] = \"all\",\n): Promise<SyncPaymentsResponse> {\n return readJson(\n await ossFetch(\n environment === \"all\"\n ? \"/api/payments/sync\"\n : withEnvironmentPath(environment, \"/sync\"),\n { method: \"POST\" },\n ),\n );\n}\n\nexport async function configurePaymentWebhook(\n environment: StripeEnvironment,\n): Promise<ConfigurePaymentWebhookResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/webhook\"), {\n method: \"POST\",\n }),\n );\n}\n\nexport async function listPaymentCatalog(\n environment: StripeEnvironment,\n): Promise<ListPaymentCatalogResponse> {\n return readJson(await ossFetch(withEnvironmentPath(environment, \"/catalog\")));\n}\n\nexport async function listPaymentProducts(\n environment: StripeEnvironment,\n): Promise<ListPaymentProductsResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/catalog/products\")),\n );\n}\n\nexport async function getPaymentProduct(\n environment: StripeEnvironment,\n productId: string,\n): Promise<GetPaymentProductResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/products/${encodeURIComponent(productId)}`,\n ),\n ),\n );\n}\n\nexport async function createPaymentProduct(\n environment: StripeEnvironment,\n request: CreatePaymentProductBody,\n): Promise<MutatePaymentProductResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/catalog/products\"), {\n method: \"POST\",\n body: JSON.stringify(request),\n }),\n );\n}\n\nexport async function updatePaymentProduct(\n environment: StripeEnvironment,\n productId: string,\n request: UpdatePaymentProductBody,\n): Promise<MutatePaymentProductResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/products/${encodeURIComponent(productId)}`,\n ),\n {\n method: \"PATCH\",\n body: JSON.stringify(request),\n },\n ),\n );\n}\n\nexport async function deletePaymentProduct(\n environment: StripeEnvironment,\n productId: string,\n): Promise<DeletePaymentProductResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/products/${encodeURIComponent(productId)}`,\n ),\n { method: \"DELETE\" },\n ),\n );\n}\n\nexport async function listPaymentPrices(\n environment: StripeEnvironment,\n stripeProductId?: string,\n): Promise<ListPaymentPricesResponse> {\n return readJson(\n await ossFetch(\n withQuery(withEnvironmentPath(environment, \"/catalog/prices\"), {\n stripeProductId,\n }),\n ),\n );\n}\n\nexport async function getPaymentPrice(\n environment: StripeEnvironment,\n priceId: string,\n): Promise<GetPaymentPriceResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/prices/${encodeURIComponent(priceId)}`,\n ),\n ),\n );\n}\n\nexport async function createPaymentPrice(\n environment: StripeEnvironment,\n request: CreatePaymentPriceBody,\n): Promise<MutatePaymentPriceResponse> {\n return readJson(\n await ossFetch(withEnvironmentPath(environment, \"/catalog/prices\"), {\n method: \"POST\",\n body: JSON.stringify(request),\n }),\n );\n}\n\nexport async function updatePaymentPrice(\n environment: StripeEnvironment,\n priceId: string,\n request: UpdatePaymentPriceBody,\n): Promise<MutatePaymentPriceResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/prices/${encodeURIComponent(priceId)}`,\n ),\n {\n method: \"PATCH\",\n body: JSON.stringify(request),\n },\n ),\n );\n}\n\nexport async function archivePaymentPrice(\n environment: StripeEnvironment,\n priceId: string,\n): Promise<ArchivePaymentPriceResponse> {\n return readJson(\n await ossFetch(\n withEnvironmentPath(\n environment,\n `/catalog/prices/${encodeURIComponent(priceId)}`,\n ),\n { method: \"DELETE\" },\n ),\n );\n}\n\nexport async function listSubscriptions(\n environment: StripeEnvironment,\n request: ListSubscriptionsQuery,\n): Promise<ListSubscriptionsResponse> {\n return readJson(\n await ossFetch(\n withQuery(withEnvironmentPath(environment, \"/subscriptions\"), request),\n ),\n );\n}\n\nexport async function listPaymentCustomers(\n environment: StripeEnvironment,\n request: ListPaymentCustomersQuery = {},\n): Promise<ListPaymentCustomersResponse> {\n return readJson(\n await ossFetch(\n withQuery(withEnvironmentPath(environment, \"/customers\"), request),\n ),\n );\n}\n\nexport async function listPaymentHistory(\n environment: StripeEnvironment,\n request: ListPaymentHistoryQuery,\n): Promise<ListPaymentHistoryResponse> {\n return readJson(\n await ossFetch(\n withQuery(withEnvironmentPath(environment, \"/payment-history\"), request),\n ),\n );\n}\n","import type { StripeEnvironment } from \"@insforge/shared-schemas\";\nimport { getProjectConfig } from \"../../lib/config.js\";\nimport { CLIError } from \"../../lib/errors.js\";\nimport { shutdownAnalytics, trackPayments } from \"../../lib/analytics.js\";\n\nexport type PaymentCommandTelemetry = Record<\n string,\n string | number | boolean | undefined\n>;\n\nexport function parseEnvironment(value: string): StripeEnvironment {\n if (value === \"test\" || value === \"live\") return value;\n throw new CLIError('Environment must be \"test\" or \"live\".');\n}\n\nexport function parseEnvironmentOrAll(\n value: string,\n): StripeEnvironment | \"all\" {\n if (value === \"all\") return value;\n return parseEnvironment(value);\n}\n\nexport function parseBooleanOption(\n value: string | undefined,\n flagName: string,\n): boolean | undefined {\n if (value === undefined) return undefined;\n\n const normalized = value.toLowerCase();\n if (normalized === \"true\") return true;\n if (normalized === \"false\") return false;\n\n throw new CLIError(`${flagName} must be \"true\" or \"false\".`);\n}\n\nexport function parseIntegerOption(\n value: string | undefined,\n flagName: string,\n options: { min?: number; max?: number } = {},\n): number | undefined {\n if (value === undefined) return undefined;\n\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || String(parsed) !== value.trim()) {\n throw new CLIError(`${flagName} must be an integer.`);\n }\n if (options.min !== undefined && parsed < options.min) {\n throw new CLIError(`${flagName} must be at least ${options.min}.`);\n }\n if (options.max !== undefined && parsed > options.max) {\n throw new CLIError(`${flagName} must be at most ${options.max}.`);\n }\n return parsed;\n}\n\nexport function parseMetadataOption(\n value: string | undefined,\n): Record<string, string> | undefined {\n if (value === undefined) return undefined;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new CLIError(\"Invalid JSON for --metadata.\");\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new CLIError(\"--metadata must be a JSON object.\");\n }\n\n const metadata: Record<string, string> = {};\n for (const [key, raw] of Object.entries(parsed)) {\n if (typeof raw !== \"string\") {\n throw new CLIError(`Metadata value for \"${key}\" must be a string.`);\n }\n metadata[key] = raw;\n }\n\n return metadata;\n}\n\nexport function formatDate(value: string | null | undefined): string {\n if (!value) return \"-\";\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? value : date.toLocaleString();\n}\n\nexport function formatAmount(\n amount: number | null | undefined,\n currency: string | null | undefined,\n): string {\n if (amount === null || amount === undefined) return \"-\";\n const code = currency?.toUpperCase();\n let fractionDigits = 2;\n\n if (code) {\n try {\n fractionDigits =\n new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: code,\n }).resolvedOptions().maximumFractionDigits ?? 2;\n } catch {\n fractionDigits = 2;\n }\n }\n\n const divisor = 10 ** fractionDigits;\n return `${(amount / divisor).toFixed(fractionDigits)} ${code ?? \"\"}`.trim();\n}\n\nexport function formatRecurring(\n interval: string | null | undefined,\n intervalCount: number | null | undefined,\n): string {\n if (!interval) return \"one-time\";\n return `${intervalCount && intervalCount > 1 ? `${intervalCount} ` : \"\"}${interval}`;\n}\n\nexport async function trackPaymentUsage(\n subcommand: string,\n success: boolean,\n properties: PaymentCommandTelemetry = {},\n): Promise<void> {\n try {\n try {\n const config = getProjectConfig();\n if (config) {\n trackPayments(subcommand, config, {\n success,\n ...properties,\n });\n }\n } catch {\n // Telemetry should never affect command behavior.\n }\n } finally {\n await shutdownAnalytics();\n }\n}\n","import type { Command } from \"commander\";\nimport { listPaymentCatalog } from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputTable } from \"../../lib/output.js\";\nimport {\n formatAmount,\n formatRecurring,\n parseEnvironment,\n trackPaymentUsage,\n} from \"./utils.js\";\n\nexport function registerPaymentsCatalogCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command(\"catalog\")\n .description(\"List mirrored Stripe products and prices for one environment\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await listPaymentCatalog(environment);\n\n if (json) {\n outputJson(data);\n } else {\n if (data.products.length === 0 && data.prices.length === 0) {\n console.log(\"No Stripe catalog records found.\");\n await trackPaymentUsage(\"catalog\", true, { environment });\n return;\n }\n\n if (data.products.length > 0) {\n console.log(\"Products\");\n outputTable(\n [\"Env\", \"Product ID\", \"Name\", \"Active\", \"Default Price\"],\n data.products.map((product) => [\n product.environment,\n product.stripeProductId,\n product.name,\n product.active ? \"Yes\" : \"No\",\n product.defaultPriceId ?? \"-\",\n ]),\n );\n }\n\n if (data.prices.length > 0) {\n console.log(\"Prices\");\n outputTable(\n [\n \"Env\",\n \"Price ID\",\n \"Product ID\",\n \"Amount\",\n \"Type\",\n \"Active\",\n \"Recurring\",\n ],\n data.prices.map((price) => [\n price.environment,\n price.stripePriceId,\n price.stripeProductId ?? \"-\",\n formatAmount(price.unitAmount, price.currency),\n price.type,\n price.active ? \"Yes\" : \"No\",\n formatRecurring(\n price.recurringInterval,\n price.recurringIntervalCount,\n ),\n ]),\n );\n }\n }\n\n await trackPaymentUsage(\"catalog\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"catalog\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport * as prompts from '../../lib/prompts.js';\nimport {\n getPaymentsConfig,\n removeStripeSecretKey,\n setStripeSecretKey,\n} from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { CLIError, getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { parseEnvironment, trackPaymentUsage } from './utils.js';\n\nfunction outputConfigTable(data: Awaited<ReturnType<typeof getPaymentsConfig>>): void {\n if (data.keys.length === 0) {\n console.log('No Stripe keys configured.');\n return;\n }\n\n outputTable(\n ['Env', 'Configured', 'Key'],\n data.keys.map((key) => [\n key.environment,\n key.hasKey ? 'Yes' : 'No',\n key.maskedKey ?? '-',\n ]),\n );\n}\n\nexport function registerPaymentsConfigCommand(paymentsCmd: Command): void {\n const configCmd = paymentsCmd\n .command('config')\n .description('Manage Stripe API keys for payments')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const data = await getPaymentsConfig();\n\n if (json) {\n outputJson(data);\n } else {\n outputConfigTable(data);\n }\n\n await trackPaymentUsage('config', true);\n } catch (err) {\n await trackPaymentUsage('config', false);\n handleError(err, json);\n }\n });\n\n configCmd\n .command('set <environment> [secretKey]')\n .description('Configure a Stripe secret key for test or live payments')\n .action(async (environmentValue: string, secretKeyValue: string | undefined, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(environmentValue);\n await requireAuth();\n\n let secretKey = secretKeyValue;\n if (!secretKey) {\n if (json) {\n throw new CLIError('Provide secretKey when using --json.');\n }\n\n const input = await prompts.password({\n message: `Stripe ${environment} secret key`,\n });\n if (prompts.isCancel(input)) process.exit(0);\n secretKey = input;\n }\n\n const data = await setStripeSecretKey(environment, secretKey);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe ${environment} key configured.`);\n }\n\n await trackPaymentUsage('config.set', true, { environment });\n } catch (err) {\n await trackPaymentUsage('config.set', false, { environment: environmentValue });\n handleError(err, json);\n }\n });\n\n configCmd\n .command('remove <environment>')\n .alias('delete')\n .description('Remove a configured Stripe secret key')\n .action(async (environmentValue: string, _opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(environmentValue);\n await requireAuth();\n\n if (json && !yes) {\n throw new CLIError('Use --yes with --json to remove a Stripe key non-interactively.');\n }\n\n if (!yes) {\n const confirm = await prompts.confirm({\n message: `Remove Stripe ${environment} key? Payment sync and mutations for this environment will stop.`,\n });\n if (prompts.isCancel(confirm) || !confirm) process.exit(0);\n }\n\n const data = await removeStripeSecretKey(environment);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe ${environment} key removed.`);\n }\n\n await trackPaymentUsage('config.remove', true, { environment });\n } catch (err) {\n await trackPaymentUsage('config.remove', false, { environment: environmentValue });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { listPaymentCustomers } from \"../../lib/api/payments.js\";\nimport type { ListPaymentCustomersResponse } from \"@insforge/shared-schemas\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputTable } from \"../../lib/output.js\";\nimport {\n formatAmount,\n formatDate,\n parseEnvironment,\n parseIntegerOption,\n trackPaymentUsage,\n} from \"./utils.js\";\n\ntype PaymentCustomer = ListPaymentCustomersResponse[\"customers\"][number];\n\nfunction formatPaymentMethod(customer: PaymentCustomer): string {\n if (customer.paymentMethodBrand && customer.paymentMethodLast4) {\n return `${customer.paymentMethodBrand} **** ${customer.paymentMethodLast4}`;\n }\n if (customer.paymentMethodBrand) {\n return customer.paymentMethodBrand;\n }\n if (customer.paymentMethodLast4) {\n return `**** ${customer.paymentMethodLast4}`;\n }\n return \"-\";\n}\n\nexport function registerPaymentsCustomersCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command(\"customers\")\n .description(\"List mirrored Stripe customers\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--limit <limit>\", \"Maximum rows to return (1-100)\", \"50\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n const limit =\n parseIntegerOption(opts.limit, \"--limit\", { min: 1, max: 100 }) ?? 50;\n await requireAuth();\n\n const data = await listPaymentCustomers(environment, { limit });\n\n if (json) {\n outputJson(data);\n } else if (data.customers.length === 0) {\n console.log(\"No Stripe customers found.\");\n } else {\n outputTable(\n [\n \"Customer ID\",\n \"Email\",\n \"Name\",\n \"Payments\",\n \"Total Spend\",\n \"Last Payment\",\n \"Method\",\n \"Country\",\n ],\n data.customers.map((customer) => [\n customer.stripeCustomerId,\n customer.email ?? \"-\",\n customer.name ?? \"-\",\n String(customer.paymentsCount),\n formatAmount(customer.totalSpend, customer.totalSpendCurrency),\n formatDate(customer.lastPaymentAt),\n formatPaymentMethod(customer),\n customer.countryCode?.toUpperCase() ?? \"-\",\n ]),\n );\n }\n\n await trackPaymentUsage(\"customers\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"customers\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { listPaymentHistory } from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputTable } from \"../../lib/output.js\";\nimport {\n formatAmount,\n formatDate,\n parseEnvironment,\n parseIntegerOption,\n trackPaymentUsage,\n} from \"./utils.js\";\n\nexport function registerPaymentsHistoryCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command(\"history\")\n .description(\"List mirrored Stripe payment history\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--subject-type <type>\", \"Filter by billing subject type\")\n .option(\"--subject-id <id>\", \"Filter by billing subject id\")\n .option(\"--limit <limit>\", \"Maximum rows to return (1-100)\", \"50\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n const limit =\n parseIntegerOption(opts.limit, \"--limit\", { min: 1, max: 100 }) ?? 50;\n await requireAuth();\n\n const data = await listPaymentHistory(environment, {\n limit,\n ...(opts.subjectType !== undefined\n ? { subjectType: opts.subjectType }\n : {}),\n ...(opts.subjectId !== undefined\n ? { subjectId: opts.subjectId }\n : {}),\n });\n\n if (json) {\n outputJson(data);\n } else if (data.paymentHistory.length === 0) {\n console.log(\"No Stripe payment history found.\");\n } else {\n outputTable(\n [\n \"Type\",\n \"Status\",\n \"Subject\",\n \"Amount\",\n \"Customer\",\n \"Stripe Object\",\n \"When\",\n ],\n data.paymentHistory.map((entry) => [\n entry.type,\n entry.status,\n entry.subjectType && entry.subjectId\n ? `${entry.subjectType}:${entry.subjectId}`\n : \"-\",\n formatAmount(entry.amount, entry.currency),\n entry.stripeCustomerId ?? \"-\",\n entry.stripeCheckoutSessionId ??\n entry.stripeInvoiceId ??\n entry.stripePaymentIntentId ??\n entry.stripeRefundId ??\n \"-\",\n formatDate(\n entry.paidAt ??\n entry.failedAt ??\n entry.refundedAt ??\n entry.stripeCreatedAt,\n ),\n ]),\n );\n }\n\n await trackPaymentUsage(\"history\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"history\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport {\n archivePaymentPrice,\n createPaymentPrice,\n getPaymentPrice,\n listPaymentPrices,\n updatePaymentPrice,\n} from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { CLIError, getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputSuccess, outputTable } from \"../../lib/output.js\";\nimport type {\n CreatePaymentPriceBody,\n ListPaymentPricesResponse,\n StripePriceRecurringInterval,\n StripePriceTaxBehavior,\n UpdatePaymentPriceBody,\n} from \"@insforge/shared-schemas\";\nimport {\n formatAmount,\n formatDate,\n formatRecurring,\n parseBooleanOption,\n parseEnvironment,\n parseIntegerOption,\n parseMetadataOption,\n trackPaymentUsage,\n} from \"./utils.js\";\ntype PaymentPrice = ListPaymentPricesResponse[\"prices\"][number];\n\nfunction nullableString(value: string | undefined): string | null | undefined {\n if (value === undefined) return undefined;\n return value === \"null\" ? null : value;\n}\n\nfunction parseRecurringInterval(\n value: string | undefined,\n): StripePriceRecurringInterval | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (\n value === \"day\" ||\n value === \"week\" ||\n value === \"month\" ||\n value === \"year\"\n ) {\n return value;\n }\n throw new CLIError(\"--interval must be one of: day, week, month, year.\");\n}\n\nfunction parseTaxBehavior(\n value: string | undefined,\n): StripePriceTaxBehavior | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (\n value === \"exclusive\" ||\n value === \"inclusive\" ||\n value === \"unspecified\"\n ) {\n return value;\n }\n throw new CLIError(\n \"--tax-behavior must be one of: exclusive, inclusive, unspecified.\",\n );\n}\n\nfunction outputPricesTable(prices: PaymentPrice[]): void {\n if (prices.length === 0) {\n console.log(\"No Stripe prices found.\");\n return;\n }\n\n outputTable(\n [\n \"Env\",\n \"Price ID\",\n \"Product ID\",\n \"Amount\",\n \"Type\",\n \"Active\",\n \"Recurring\",\n \"Synced At\",\n ],\n prices.map((price) => [\n price.environment,\n price.stripePriceId,\n price.stripeProductId ?? \"-\",\n formatAmount(price.unitAmount, price.currency),\n price.type,\n price.active ? \"Yes\" : \"No\",\n formatRecurring(price.recurringInterval, price.recurringIntervalCount),\n formatDate(price.syncedAt),\n ]),\n );\n}\n\nexport function registerPaymentsPricesCommand(paymentsCmd: Command): void {\n const pricesCmd = paymentsCmd\n .command(\"prices\")\n .description(\"Manage Stripe prices\");\n\n pricesCmd\n .command(\"list\")\n .description(\"List mirrored Stripe prices\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--product <productId>\", \"Filter by Stripe product id\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await listPaymentPrices(environment, opts.product);\n\n if (json) {\n outputJson(data);\n } else {\n outputPricesTable(data.prices);\n }\n\n await trackPaymentUsage(\"prices.list\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"prices.list\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command(\"get <priceId>\")\n .description(\"Show one Stripe price\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (priceId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await getPaymentPrice(environment, priceId);\n\n if (json) {\n outputJson(data);\n } else {\n outputPricesTable([data.price]);\n }\n\n await trackPaymentUsage(\"prices.get\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"prices.get\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command(\"create\")\n .description(\"Create a Stripe one-time or recurring price\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .requiredOption(\"--product <productId>\", \"Stripe product id\")\n .requiredOption(\n \"--currency <currency>\",\n \"Three-letter currency code, e.g. usd\",\n )\n .requiredOption(\n \"--unit-amount <amount>\",\n \"Unit amount in the smallest currency unit, e.g. cents\",\n )\n .option(\n \"--interval <interval>\",\n \"Recurring interval: day, week, month, or year\",\n )\n .option(\"--interval-count <count>\", \"Recurring interval count\")\n .option(\"--lookup-key <key>\", 'Stripe lookup key, or \"null\"')\n .option(\"--active <bool>\", \"Set active status (true/false)\")\n .option(\"--tax-behavior <behavior>\", \"exclusive, inclusive, or unspecified\")\n .option(\"--metadata <json>\", \"Metadata JSON object with string values\")\n .option(\"--idempotency-key <key>\", \"Caller-stable idempotency key\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const interval = parseRecurringInterval(opts.interval);\n const intervalCount = parseIntegerOption(\n opts.intervalCount,\n \"--interval-count\",\n { min: 1 },\n );\n if (!interval && intervalCount !== undefined) {\n throw new CLIError(\"Provide --interval when using --interval-count.\");\n }\n\n const request: CreatePaymentPriceBody = {\n stripeProductId: opts.product,\n currency: opts.currency,\n unitAmount:\n parseIntegerOption(opts.unitAmount, \"--unit-amount\", { min: 0 }) ??\n 0,\n };\n const lookupKey = nullableString(opts.lookupKey);\n const active = parseBooleanOption(opts.active, \"--active\");\n const taxBehavior = parseTaxBehavior(opts.taxBehavior);\n const metadata = parseMetadataOption(opts.metadata);\n if (lookupKey !== undefined) request.lookupKey = lookupKey;\n if (active !== undefined) request.active = active;\n if (taxBehavior !== undefined) request.taxBehavior = taxBehavior;\n if (metadata !== undefined) request.metadata = metadata;\n if (opts.idempotencyKey !== undefined) {\n request.idempotencyKey = opts.idempotencyKey;\n }\n if (interval) {\n request.recurring = {\n interval,\n ...(intervalCount !== undefined ? { intervalCount } : {}),\n };\n }\n\n const data = await createPaymentPrice(environment, request);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe price created: ${data.price.stripePriceId}`);\n }\n\n await trackPaymentUsage(\"prices.create\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"prices.create\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command(\"update <priceId>\")\n .description(\"Update a Stripe price\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--active <bool>\", \"Set active status (true/false)\")\n .option(\"--lookup-key <key>\", 'Stripe lookup key, or \"null\"')\n .option(\"--tax-behavior <behavior>\", \"exclusive, inclusive, or unspecified\")\n .option(\"--metadata <json>\", \"Metadata JSON object with string values\")\n .action(async (priceId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const request: UpdatePaymentPriceBody = {};\n const active = parseBooleanOption(opts.active, \"--active\");\n const lookupKey = nullableString(opts.lookupKey);\n const taxBehavior = parseTaxBehavior(opts.taxBehavior);\n const metadata = parseMetadataOption(opts.metadata);\n if (active !== undefined) request.active = active;\n if (lookupKey !== undefined) request.lookupKey = lookupKey;\n if (taxBehavior !== undefined) request.taxBehavior = taxBehavior;\n if (metadata !== undefined) request.metadata = metadata;\n\n if (Object.keys(request).length === 0) {\n throw new CLIError(\n \"Provide at least one option to update (--active, --lookup-key, --tax-behavior, --metadata).\",\n );\n }\n\n const data = await updatePaymentPrice(environment, priceId, request);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe price updated: ${data.price.stripePriceId}`);\n }\n\n await trackPaymentUsage(\"prices.update\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"prices.update\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n pricesCmd\n .command(\"archive <priceId>\")\n .alias(\"delete\")\n .description(\"Archive a Stripe price\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (priceId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await archivePaymentPrice(environment, priceId);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe price archived: ${data.price.stripePriceId}`);\n }\n\n await trackPaymentUsage(\"prices.archive\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"prices.archive\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport * as prompts from \"../../lib/prompts.js\";\nimport {\n createPaymentProduct,\n deletePaymentProduct,\n getPaymentProduct,\n listPaymentProducts,\n updatePaymentProduct,\n} from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { CLIError, getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputSuccess, outputTable } from \"../../lib/output.js\";\nimport type {\n CreatePaymentProductBody,\n ListPaymentProductsResponse,\n UpdatePaymentProductBody,\n} from \"@insforge/shared-schemas\";\nimport {\n formatAmount,\n formatDate,\n parseBooleanOption,\n parseEnvironment,\n parseMetadataOption,\n trackPaymentUsage,\n} from \"./utils.js\";\ntype PaymentProduct = ListPaymentProductsResponse[\"products\"][number];\n\nfunction nullableString(value: string | undefined): string | null | undefined {\n if (value === undefined) return undefined;\n return value === \"null\" ? null : value;\n}\n\nfunction outputProductsTable(products: PaymentProduct[]): void {\n if (products.length === 0) {\n console.log(\"No Stripe products found.\");\n return;\n }\n\n outputTable(\n [\"Env\", \"Product ID\", \"Name\", \"Active\", \"Default Price\", \"Synced At\"],\n products.map((product) => [\n product.environment,\n product.stripeProductId,\n product.name,\n product.active ? \"Yes\" : \"No\",\n product.defaultPriceId ?? \"-\",\n formatDate(product.syncedAt),\n ]),\n );\n}\n\nexport function registerPaymentsProductsCommand(paymentsCmd: Command): void {\n const productsCmd = paymentsCmd\n .command(\"products\")\n .description(\"Manage Stripe products\");\n\n productsCmd\n .command(\"list\")\n .description(\"List mirrored Stripe products\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await listPaymentProducts(environment);\n\n if (json) {\n outputJson(data);\n } else {\n outputProductsTable(data.products);\n }\n\n await trackPaymentUsage(\"products.list\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"products.list\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command(\"get <productId>\")\n .description(\"Show one Stripe product and its prices\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (productId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const data = await getPaymentProduct(environment, productId);\n\n if (json) {\n outputJson(data);\n } else {\n outputProductsTable([data.product]);\n if (data.prices.length > 0) {\n console.log(\"Prices\");\n outputTable(\n [\"Price ID\", \"Amount\", \"Type\", \"Active\", \"Lookup Key\"],\n data.prices.map((price) => [\n price.stripePriceId,\n formatAmount(price.unitAmount, price.currency),\n price.type,\n price.active ? \"Yes\" : \"No\",\n price.lookupKey ?? \"-\",\n ]),\n );\n }\n }\n\n await trackPaymentUsage(\"products.get\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"products.get\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command(\"create\")\n .description(\"Create a Stripe product\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .requiredOption(\"--name <name>\", \"Product name\")\n .option(\"--description <description>\", 'Product description, or \"null\"')\n .option(\"--active <bool>\", \"Set active status (true/false)\")\n .option(\"--metadata <json>\", \"Metadata JSON object with string values\")\n .option(\"--idempotency-key <key>\", \"Caller-stable idempotency key\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const request: CreatePaymentProductBody = { name: opts.name };\n const description = nullableString(opts.description);\n const active = parseBooleanOption(opts.active, \"--active\");\n const metadata = parseMetadataOption(opts.metadata);\n if (description !== undefined) request.description = description;\n if (active !== undefined) request.active = active;\n if (metadata !== undefined) request.metadata = metadata;\n if (opts.idempotencyKey !== undefined) {\n request.idempotencyKey = opts.idempotencyKey;\n }\n\n const data = await createPaymentProduct(environment, request);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(\n `Stripe product created: ${data.product.stripeProductId}`,\n );\n }\n\n await trackPaymentUsage(\"products.create\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"products.create\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command(\"update <productId>\")\n .description(\"Update a Stripe product\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--name <name>\", \"Product name\")\n .option(\"--description <description>\", 'Product description, or \"null\"')\n .option(\"--active <bool>\", \"Set active status (true/false)\")\n .option(\"--metadata <json>\", \"Metadata JSON object with string values\")\n .action(async (productId: string, opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n const request: UpdatePaymentProductBody = {};\n const description = nullableString(opts.description);\n const active = parseBooleanOption(opts.active, \"--active\");\n const metadata = parseMetadataOption(opts.metadata);\n if (opts.name !== undefined) request.name = opts.name;\n if (description !== undefined) request.description = description;\n if (active !== undefined) request.active = active;\n if (metadata !== undefined) request.metadata = metadata;\n\n if (Object.keys(request).length === 0) {\n throw new CLIError(\n \"Provide at least one option to update (--name, --description, --active, --metadata).\",\n );\n }\n\n const data = await updatePaymentProduct(\n environment,\n productId,\n request,\n );\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(\n `Stripe product updated: ${data.product.stripeProductId}`,\n );\n }\n\n await trackPaymentUsage(\"products.update\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"products.update\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n\n productsCmd\n .command(\"delete <productId>\")\n .description(\"Delete a Stripe product that has no prices\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .action(async (productId: string, opts, cmd) => {\n const { json, yes } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n await requireAuth();\n\n if (json && !yes) {\n throw new CLIError(\n \"Use --yes with --json to delete a Stripe product non-interactively.\",\n );\n }\n\n if (!yes) {\n const confirm = await prompts.confirm({\n message: `Delete Stripe ${environment} product \"${productId}\"?`,\n });\n if (prompts.isCancel(confirm) || !confirm) process.exit(0);\n }\n\n const data = await deletePaymentProduct(environment, productId);\n\n if (json) {\n outputJson(data);\n } else {\n outputSuccess(`Stripe product deleted: ${data.stripeProductId}`);\n }\n\n await trackPaymentUsage(\"products.delete\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"products.delete\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { getPaymentsStatus } from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputTable } from '../../lib/output.js';\nimport { formatDate, trackPaymentUsage } from './utils.js';\n\nexport function registerPaymentsStatusCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command('status')\n .description('Show Stripe payment connection, sync, and webhook status')\n .action(async (_opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n await requireAuth();\n\n const data = await getPaymentsStatus();\n\n if (json) {\n outputJson(data);\n } else if (data.connections.length === 0) {\n console.log('No Stripe payment environments found.');\n } else {\n outputTable(\n ['Env', 'Status', 'Key', 'Account', 'Webhook', 'Last Sync', 'Synced At'],\n data.connections.map((connection) => [\n connection.environment,\n connection.status,\n connection.maskedKey ?? '-',\n connection.stripeAccountId ?? '-',\n connection.webhookEndpointId ? 'Configured' : '-',\n connection.lastSyncStatus ?? '-',\n formatDate(connection.lastSyncedAt),\n ]),\n );\n }\n\n await trackPaymentUsage('status', true);\n } catch (err) {\n await trackPaymentUsage('status', false);\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { listSubscriptions } from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputTable } from \"../../lib/output.js\";\nimport {\n formatDate,\n parseEnvironment,\n parseIntegerOption,\n trackPaymentUsage,\n} from \"./utils.js\";\n\nexport function registerPaymentsSubscriptionsCommand(\n paymentsCmd: Command,\n): void {\n paymentsCmd\n .command(\"subscriptions\")\n .description(\"List mirrored Stripe subscriptions\")\n .requiredOption(\n \"--environment <environment>\",\n \"Stripe environment: test or live\",\n )\n .option(\"--subject-type <type>\", \"Filter by billing subject type\")\n .option(\"--subject-id <id>\", \"Filter by billing subject id\")\n .option(\"--limit <limit>\", \"Maximum rows to return (1-100)\", \"50\")\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(opts.environment);\n const limit =\n parseIntegerOption(opts.limit, \"--limit\", { min: 1, max: 100 }) ?? 50;\n await requireAuth();\n\n const data = await listSubscriptions(environment, {\n limit,\n ...(opts.subjectType !== undefined\n ? { subjectType: opts.subjectType }\n : {}),\n ...(opts.subjectId !== undefined\n ? { subjectId: opts.subjectId }\n : {}),\n });\n\n if (json) {\n outputJson(data);\n } else if (data.subscriptions.length === 0) {\n console.log(\"No Stripe subscriptions found.\");\n } else {\n outputTable(\n [\n \"Subscription ID\",\n \"Customer\",\n \"Subject\",\n \"Status\",\n \"Items\",\n \"Period End\",\n ],\n data.subscriptions.map((subscription) => [\n subscription.stripeSubscriptionId,\n subscription.stripeCustomerId,\n subscription.subjectType && subscription.subjectId\n ? `${subscription.subjectType}:${subscription.subjectId}`\n : \"-\",\n subscription.status,\n String(subscription.items?.length ?? 0),\n formatDate(subscription.currentPeriodEnd),\n ]),\n );\n }\n\n await trackPaymentUsage(\"subscriptions\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"subscriptions\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { syncPayments } from \"../../lib/api/payments.js\";\nimport { requireAuth } from \"../../lib/credentials.js\";\nimport { getRootOpts, handleError } from \"../../lib/errors.js\";\nimport { outputJson, outputSuccess, outputTable } from \"../../lib/output.js\";\nimport {\n formatDate,\n parseEnvironmentOrAll,\n trackPaymentUsage,\n} from \"./utils.js\";\n\nexport function registerPaymentsSyncCommand(paymentsCmd: Command): void {\n paymentsCmd\n .command(\"sync\")\n .description(\n \"Sync configured Stripe products, prices, customers, and subscriptions\",\n )\n .option(\n \"--environment <environment>\",\n \"Stripe environment: test, live, or all\",\n \"all\",\n )\n .action(async (opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironmentOrAll(opts.environment);\n await requireAuth();\n\n const data = await syncPayments(environment);\n\n if (json) {\n outputJson(data);\n } else if (data.results.length === 0) {\n console.log(\"No configured Stripe environments to sync.\");\n } else {\n outputTable(\n [\n \"Env\",\n \"Status\",\n \"Products\",\n \"Prices\",\n \"Customers\",\n \"Subscriptions\",\n \"Unmapped\",\n \"Synced At\",\n ],\n data.results.map((result) => [\n result.environment,\n result.connection.lastSyncStatus ?? result.connection.status,\n String(result.connection.lastSyncCounts.products ?? 0),\n String(result.connection.lastSyncCounts.prices ?? 0),\n String(result.connection.lastSyncCounts.customers ?? 0),\n String(result.subscriptions?.synced ?? 0),\n String(result.subscriptions?.unmapped ?? 0),\n formatDate(result.connection.lastSyncedAt),\n ]),\n );\n outputSuccess(\"Stripe payments synced.\");\n }\n\n await trackPaymentUsage(\"sync\", true, { environment });\n } catch (err) {\n await trackPaymentUsage(\"sync\", false, {\n environment: opts.environment,\n });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { configurePaymentWebhook } from '../../lib/api/payments.js';\nimport { requireAuth } from '../../lib/credentials.js';\nimport { getRootOpts, handleError } from '../../lib/errors.js';\nimport { outputJson, outputSuccess, outputTable } from '../../lib/output.js';\nimport { formatDate, parseEnvironment, trackPaymentUsage } from './utils.js';\n\nexport function registerPaymentsWebhooksCommand(paymentsCmd: Command): void {\n const webhooksCmd = paymentsCmd\n .command('webhooks')\n .description('Manage InsForge-managed Stripe webhooks');\n\n webhooksCmd\n .command('configure <environment>')\n .description('Create or recreate the managed Stripe webhook endpoint')\n .action(async (environmentValue: string, _opts, cmd) => {\n const { json } = getRootOpts(cmd);\n try {\n const environment = parseEnvironment(environmentValue);\n await requireAuth();\n\n const data = await configurePaymentWebhook(environment);\n\n if (json) {\n outputJson(data);\n } else {\n outputTable(\n ['Env', 'Webhook ID', 'URL', 'Configured At'],\n [[\n data.connection.environment,\n data.connection.webhookEndpointId ?? '-',\n data.connection.webhookEndpointUrl ?? '-',\n formatDate(data.connection.webhookConfiguredAt),\n ]],\n );\n outputSuccess(`Stripe ${environment} webhook configured.`);\n }\n\n await trackPaymentUsage('webhooks.configure', true, { environment });\n } catch (err) {\n await trackPaymentUsage('webhooks.configure', false, { environment: environmentValue });\n handleError(err, json);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { registerPaymentsCatalogCommand } from \"./catalog.js\";\nimport { registerPaymentsConfigCommand } from \"./config.js\";\nimport { registerPaymentsCustomersCommand } from \"./customers.js\";\nimport { registerPaymentsHistoryCommand } from \"./history.js\";\nimport { registerPaymentsPricesCommand } from \"./prices.js\";\nimport { registerPaymentsProductsCommand } from \"./products.js\";\nimport { registerPaymentsStatusCommand } from \"./status.js\";\nimport { registerPaymentsSubscriptionsCommand } from \"./subscriptions.js\";\nimport { registerPaymentsSyncCommand } from \"./sync.js\";\nimport { registerPaymentsWebhooksCommand } from \"./webhooks.js\";\n\nexport function registerPaymentsCommands(paymentsCmd: Command): void {\n paymentsCmd.description(\"Manage Stripe payments\");\n\n registerPaymentsStatusCommand(paymentsCmd);\n registerPaymentsConfigCommand(paymentsCmd);\n registerPaymentsSyncCommand(paymentsCmd);\n registerPaymentsWebhooksCommand(paymentsCmd);\n registerPaymentsCatalogCommand(paymentsCmd);\n registerPaymentsCustomersCommand(paymentsCmd);\n registerPaymentsProductsCommand(paymentsCmd);\n registerPaymentsPricesCommand(paymentsCmd);\n registerPaymentsSubscriptionsCommand(paymentsCmd);\n registerPaymentsHistoryCommand(paymentsCmd);\n}\n"],"mappings":"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","names":["readFileSync","join","dirname","clack","resolve","isCancel","text","select","confirm","password","clack","URL","clack","URL","resolve","clack","confirm","isCancel","path","password","program","text","isCancel","password","program","program","orgsCmd","projectsCmd","select","isCancel","clack","existsSync","unlinkSync","existsSync","unlinkSync","spinner","branch","writeFileSync","clack","writeFileSync","clack","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","pollUntilReady","branch","clack","program","exec","promisify","fs","path","clack","pc","existsSync","readFileSync","join","clack","join","existsSync","readFileSync","promisify","randomBytes","clack","path","promisify","randomBytes","exec","execFile","tmpdir","promisify","fs","path","clack","fs","path","path","fs","createHash","clack","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","createHash","resolve","spinner","deploymentsCmd","execAsync","promisify","exec","execFileAsync","execFile","SAFE_REPO_PATTERN","SAFE_BRANCH_PATTERN","program","select","isCancel","text","confirm","tmpdir","s","stat","execAsync","promisify","exec","spinner","program","projectConfig","template","text","isCancel","pc","select","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","dbCmd","writeFileSync","dbCmd","writeFileSync","readFileSync","basename","dbCmd","readFileSync","basename","existsSync","readFileSync","writeFileSync","join","existsSync","mkdirSync","join","join","existsSync","mkdirSync","dbCmd","join","existsSync","writeFileSync","readFileSync","dbCmd","recordsCmd","path","recordsCmd","recordsCmd","recordsCmd","functionsCmd","readFileSync","existsSync","join","functionsCmd","join","existsSync","readFileSync","functionsCmd","text","functionsCmd","clack","functionsCmd","confirm","isCancel","storageCmd","readFileSync","existsSync","basename","storageCmd","existsSync","readFileSync","basename","writeFileSync","join","basename","storageCmd","join","basename","writeFileSync","storageCmd","storageCmd","confirm","isCancel","storageCmd","program","program","deploymentsCmd","deploymentsCmd","deploymentsCmd","confirm","isCancel","deploymentsCmd","program","path","secretsCmd","secretsCmd","secretsCmd","secretsCmd","secretsCmd","confirm","isCancel","schedulesCmd","schedulesCmd","schedulesCmd","schedulesCmd","schedulesCmd","confirm","isCancel","schedulesCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","computeCmd","existsSync","join","resolve","readFileSync","ENV_KEY_REGEX","path","readFileSync","existsSync","writeFileSync","unlinkSync","join","path","join","existsSync","writeFileSync","unlinkSync","resolve","computeCmd","resolve","listRes","existing","updateBody","service","join","existsSync","program","program","formatSize","clack","diagnoseCmd","diagnoseCmd","diagnoseCmd","SOURCE_PATH","getLogPath","diagnoseCmd","diagnoseCmd","data","s","select","isCancel","path","paymentsCmd","paymentsCmd","password","isCancel","confirm","paymentsCmd","paymentsCmd","paymentsCmd","nullableString","paymentsCmd","confirm","isCancel","paymentsCmd","paymentsCmd","paymentsCmd","paymentsCmd","paymentsCmd","dirname","readFileSync","join","select","isCancel"]}