everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
1 lines • 89.7 kB
Source Map (JSON)
{"version":3,"file":"cli.mjs","names":["bosPlugin"],"sources":["../src/cli.ts"],"sourcesContent":["import { existsSync, watch } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { installBundleFetchFromEnv } from \"./bundle-fs-resolve\";\nimport { findCommandDescriptor } from \"./cli/catalog\";\nimport { resolveFrameworkPackage } from \"./cli/framework-version\";\nimport { printHelp } from \"./cli/help\";\nimport { runDockerComposeUp } from \"./cli/init\";\nimport { parseCommandInput } from \"./cli/parse\";\nimport { promptInitBasic, promptInitOverrides } from \"./cli/prompts\";\nimport { compareSemver } from \"./cli/status\";\nimport { formatDuration, sumPhaseDurations } from \"./cli/timing\";\nimport { fetchInitParent } from \"./commands/init\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE, readAuthoredConfigInput } from \"./config\";\nimport type {\n DevOptions,\n DevResult,\n InitOptions,\n InitResult,\n KeyPublishOptions,\n KillOptions,\n KillResult,\n LogsOptions,\n LogsResult,\n OverrideSection,\n PsResult,\n StartOptions,\n StartResult,\n TypecheckWorkspaceResult,\n} from \"./contract\";\nimport type { StartSummary } from \"./dev-program\";\nimport { getRegistryNamespaceForAccount } from \"./fastkv\";\nimport { listPublishKeys } from \"./near-cli\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport bosPlugin from \"./plugin\";\nimport { type ProgressEvent, pluginEvents } from \"./progress\";\nimport { createPluginRuntime } from \"./sdk\";\nimport { printBanner } from \"./utils/banner\";\nimport { colors, frames, gradients, icons } from \"./utils/theme\";\n\nfunction printConfigView(result: {\n account: string;\n domain?: string;\n staging?: { domain: string };\n app?: {\n host: { name?: string; development: string; production?: string };\n ui: { name?: string; development?: string; production?: string; ssr?: string };\n api: { name?: string; development?: string; production?: string; proxy?: string };\n };\n}) {\n console.log();\n console.log(colors.cyan(frames.top(52)));\n console.log(` ${icons.app} ${gradients.cyber(\"CONFIG\")}`);\n console.log(colors.cyan(frames.bottom(52)));\n console.log();\n\n console.log(` ${colors.dim(\"Account\")} ${colors.cyan(result.account)}`);\n console.log(` ${colors.dim(\"Domain\")} ${colors.white(result.domain ?? \"not configured\")}`);\n if (result.staging) {\n console.log(` ${colors.dim(\"Staging\")} ${colors.magenta(result.staging.domain)}`);\n }\n console.log();\n}\n\nfunction formatTimeAgo(isoTimestamp: string): string {\n const now = Date.now();\n const then = new Date(isoTimestamp).getTime();\n const diffMs = now - then;\n const diffMins = Math.floor(diffMs / 60_000);\n if (diffMins < 1) return \"just now\";\n if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? \"s\" : \"\"} ago`;\n const diffHours = Math.floor(diffMins / 60);\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? \"s\" : \"\"} ago`;\n const diffDays = Math.floor(diffHours / 24);\n if (diffDays < 30) return `${diffDays} day${diffDays > 1 ? \"s\" : \"\"} ago`;\n return isoTimestamp.split(\"T\")[0] ?? isoTimestamp;\n}\n\nconst RETIRED_BOOTSTRAP_STUBS = [\n \"ui/src/entry.ts\",\n \"ui/src/hydrate.tsx\",\n \"ui/src/router.server.tsx\",\n \"ui/src/compose.ts\",\n];\n\n/**\n * Hand-modified bootstrap stubs retire as conflicted (backed up, then\n * deleted) — print the mechanical port into the authored seams (ADR 0023).\n */\nfunction printStubMigrationGuide(retiredConflicted: string[] | undefined) {\n const handModified = (retiredConflicted ?? []).filter((f) => RETIRED_BOOTSTRAP_STUBS.includes(f));\n if (handModified.length === 0) return;\n console.log(` ${colors.yellow(\"Port your stub customizations into the authored seams:\")}`);\n console.log(\n ` ${colors.dim(\"- defaultErrorComponent / defaultPendingComponent / defaultNotFoundComponent\")}`,\n );\n console.log(\n ` ${colors.dim(\" → set them inside the createRouter factory in ui/src/router.tsx (after ...opts)\")}`,\n );\n console.log(\n ` ${colors.dim(\"- apiConnectionError copy + SSR locale config (locales, defaultLocale, cookieName)\")}`,\n );\n console.log(\n ` ${colors.dim(\" → export apiConnectionError / appLocale from ui/src/app.ts (see the scaffold template)\")}`,\n );\n console.log(` ${colors.dim(\" backed-up originals: .bos/sync-backup/<timestamp>/\")}`);\n}\n\nfunction printTimingSummary(timings: Array<{ name: string; durationMs: number }> | undefined) {\n if (!timings || timings.length === 0) return;\n\n console.log(` ${colors.dim(\"Timings:\")}`);\n for (const timing of timings) {\n console.log(` ${colors.dim(timing.name.padEnd(22))} ${formatDuration(timing.durationMs)}`);\n }\n console.log(\n ` ${colors.dim(\"total\".padEnd(22))} ${formatDuration(sumPhaseDurations(timings))}`,\n );\n}\n\nfunction printStartSummary(summary: StartSummary) {\n console.log();\n console.log(` ${colors.dim(\"Config Source:\")} ${summary.configSource}`);\n if (summary.configSourceHttp) {\n console.log(` ${colors.dim(summary.configSourceHttp)}`);\n }\n console.log(` ${colors.dim(\"Account:\")} ${summary.account}`);\n console.log(` ${colors.dim(\"Domain:\")} ${summary.domain ?? \"not configured\"}`);\n console.log();\n console.log(` ${colors.dim(\"Modules:\")}`);\n console.log(` ${colors.dim(\"HOST\")} → ${summary.modules.host ?? \"local\"}`);\n console.log(` ${colors.dim(\"UI\")} → ${summary.modules.ui ?? \"local\"}`);\n console.log(` ${colors.dim(\"API\")} → ${summary.modules.api ?? \"local\"}`);\n if (summary.modules.auth) {\n console.log(` ${colors.dim(\"AUTH\")} → ${summary.modules.auth}`);\n }\n if (summary.warnings.length > 0) {\n console.log();\n for (const w of summary.warnings) {\n console.log(` ${colors.yellow(w)}`);\n }\n }\n console.log();\n}\n\nfunction clearSpinnerStopLine() {\n if (!process.stdout.isTTY) return;\n process.stdout.write(\"\\u001B[1A\\u001B[2K\\u001B[1G\");\n}\n\nasync function warnIfOutdated(client: any, command: string): Promise<void> {\n if (![\"dev\", \"build\", \"start\"].includes(command)) return;\n\n try {\n const status = await client.status();\n if (status.status === \"error\" || !status.packages) return;\n\n const frameworkPackages = [\"everything-dev\", \"every-plugin\"];\n\n const linked = status.packages.filter((p: { isLinked?: boolean }) => p.isLinked);\n const outdated = status.packages.filter(\n (p: { name: string; installed?: string; latest?: string; isLinked?: boolean }) =>\n !p.isLinked &&\n p.installed &&\n p.latest &&\n compareSemver(p.installed, p.latest) < 0 &&\n frameworkPackages.includes(p.name),\n );\n\n if (linked.length > 0) {\n for (const pkg of linked) {\n console.log(colors.dim(` ${pkg.name} is linked locally (v${pkg.installed})`));\n }\n }\n\n if (outdated.length === 0) return;\n\n const warn = (line: string) => {\n if (command === \"dev\" || command === \"start\") process.stderr.write(`${line}\\n`);\n else console.log(line);\n };\n warn(\"\");\n warn(colors.yellow(` ! Outdated packages detected:`));\n for (const pkg of outdated) {\n warn(colors.dim(` ${pkg.name} ${pkg.installed} → ${pkg.latest}`));\n }\n warn(\n colors.dim(\n ` Run ${colors.cyan(\"bos upgrade\")} to update packages and sync template files.`,\n ),\n );\n warn(\"\");\n } catch {\n // silently ignore if status check fails\n }\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n printHelp();\n return;\n }\n\n const invocationArgs = args.length > 0 ? args : [\"dev\"];\n const command = invocationArgs[0] ?? \"dev\";\n\n const commandMatch = findCommandDescriptor(invocationArgs);\n if (!commandMatch) {\n console.error(`Unknown command: ${command}`);\n process.exit(1);\n }\n\n const { descriptor, consumed } = commandMatch;\n const commandArgs = invocationArgs.slice(consumed);\n\n // Parse before the plugin boot: `start --config-path` steers the whole CLI,\n // not just the stack — the plugin initialize resolves and pin-validates the\n // boot config, so it must be the config the command will actually run.\n let parsedInput: unknown;\n try {\n parsedInput = parseCommandInput(descriptor, commandArgs);\n } catch (error) {\n console.error(`[CLI] ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n const bootInput = parsedInput as { configPath?: string };\n\n const cwdConfigPath = findConfigPath();\n const configPath = bootInput.configPath ?? cwdConfigPath;\n installBundleFetchFromEnv({ configPath });\n\n const projectDir = cwdConfigPath ? dirname(cwdConfigPath) : undefined;\n const edResolved = projectDir ? resolveFrameworkPackage(projectDir, \"everything-dev\") : undefined;\n const displayVersion = edResolved?.installedVersion\n ? `${edResolved.installedVersion}${edResolved.isLinked ? \" (linked)\" : \"\"}`\n : undefined;\n if (!process.env.BOS_NO_BANNER) {\n printBanner(\"everything-dev\", displayVersion);\n }\n\n const runtime = createPluginRuntime({\n registry: {\n bos: { module: bosPlugin },\n },\n secrets: {},\n });\n\n const pluginRuntime: any = runtime;\n const loadPlugin = pluginRuntime.usePlugin.bind(pluginRuntime);\n const plugin = await loadPlugin(\"bos\", {\n variables: {\n configPath: configPath ?? undefined,\n configDir: cwdConfigPath ? dirname(cwdConfigPath) : undefined,\n },\n secrets: {},\n });\n\n const client = plugin.createClient();\n\n const outdatedWarning = warnIfOutdated(client, command);\n\n try {\n const input = parsedInput;\n\n const rollbackInput = input as {\n listOnly?: boolean;\n version?: string;\n previous?: boolean;\n [key: string]: unknown;\n };\n if (\n descriptor.key === \"rollback\" &&\n !rollbackInput.listOnly &&\n !rollbackInput.version &&\n !rollbackInput.previous\n ) {\n const listing = await (client as any).rollback({ ...rollbackInput, listOnly: true });\n if (listing.status !== \"list\" || !listing.history?.length) {\n console.error(listing.error ?? \"No publish history found\");\n process.exit(1);\n }\n console.log();\n const selection = await p.select({\n message: \"Roll back to which publish?\",\n options: listing.history.map(\n (entry: {\n blockHeight: number;\n blockTimestamp: string;\n txHash?: string;\n summary: string;\n }) => ({\n value: String(entry.blockHeight),\n label: `${entry.blockTimestamp} (block ${entry.blockHeight})`,\n hint: entry.summary,\n }),\n ),\n });\n if (p.isCancel(selection)) {\n return;\n }\n rollbackInput.version = selection as string;\n }\n\n if (descriptor.key === \"keyPublish\") {\n const keyPublishInput = input as KeyPublishOptions;\n if (keyPublishInput.removeOldKeys === undefined) {\n if (process.stdin.isTTY) {\n const authored = configPath ? await readAuthoredConfigInput(dirname(configPath)) : null;\n const account =\n keyPublishInput.env === \"staging\"\n ? (authored?.staging?.account ?? authored?.account)\n : authored?.account;\n let listed: string[] | null = null;\n if (account) {\n const network = getNetworkIdForAccount(account);\n const contract = getRegistryNamespaceForAccount(account, keyPublishInput.registry);\n try {\n listed = await listPublishKeys({ account, contract, network });\n } catch {\n listed = null;\n }\n }\n if (listed?.length) {\n const removeOldKeys = await p.confirm({\n message: `Remove ${listed.length} existing publish key${listed.length > 1 ? \"s\" : \"\"}?`,\n initialValue: true,\n });\n if (p.isCancel(removeOldKeys)) {\n return;\n }\n keyPublishInput.removeOldKeys = removeOldKeys;\n } else {\n keyPublishInput.removeOldKeys = true;\n }\n } else {\n keyPublishInput.removeOldKeys = true;\n }\n }\n }\n\n if (descriptor.key === \"dev\") {\n const devSpinner = p.spinner();\n devSpinner.start(\"Starting dev environment\");\n\n const devPhaseLabels: Record<string, string> = {\n \"shared deps\": \"Preparing config...\",\n install: \"Installing dependencies...\",\n build: \"Building...\",\n \"resolve config\": \"Resolving config...\",\n ports: \"Finding available ports...\",\n \"docker compose up\": \"Starting local Postgres...\",\n \"generate artifacts\": \"Generating code artifacts...\",\n };\n\n const onDevProgress = (event: ProgressEvent) => {\n const label = devPhaseLabels[event.phase] ?? event.phase;\n if (event.status === \"running\") {\n devSpinner.message(label);\n }\n };\n pluginEvents.on(\"progress\", onDevProgress);\n\n let result: DevResult;\n try {\n result = await client.dev(input as DevOptions);\n } finally {\n pluginEvents.off(\"progress\", onDevProgress);\n }\n\n if (result.status === \"error\") {\n devSpinner.stop(\"Failed\");\n console.error(`[CLI] ${result.description}`);\n process.exit(1);\n }\n\n devSpinner.stop();\n clearSpinnerStopLine();\n\n const session = result.session;\n void outdatedWarning;\n if (session) {\n const { devApp } = await import(\"./dev-session\");\n devApp(\n projectDir ?? process.cwd(),\n session.orchestrator,\n session.services,\n session.runtimeConfig,\n session.envGenerated,\n session.shellEnv,\n );\n }\n return;\n }\n\n if (descriptor.key === \"start\") {\n const startSpinner = p.spinner();\n startSpinner.start(\"Starting production environment\");\n\n const startPhaseLabels: Record<string, string> = {\n config: \"Preparing config...\",\n \"generate artifacts\": \"Generating code artifacts...\",\n };\n\n const onStartProgress = (event: ProgressEvent) => {\n const label = startPhaseLabels[event.phase] ?? event.phase;\n if (event.status === \"running\") {\n startSpinner.message(label);\n }\n };\n pluginEvents.on(\"progress\", onStartProgress);\n\n let result: StartResult;\n try {\n result = await client.start(input as StartOptions);\n } finally {\n pluginEvents.off(\"progress\", onStartProgress);\n }\n\n if (result.status === \"error\") {\n startSpinner.stop(\"Failed\");\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n\n startSpinner.stop(\"Ready\");\n\n const session = result.session;\n const summary = result.summary;\n void outdatedWarning;\n if (session) {\n if (summary) {\n printStartSummary(summary);\n }\n const { startApp } = await import(\"./dev-session\");\n startApp(\n projectDir ?? process.cwd(),\n session.orchestrator,\n session.services,\n session.runtimeConfig,\n session.envGenerated,\n session.shellEnv,\n );\n }\n return;\n }\n\n if (descriptor.key === \"init\") {\n let initInput: InitOptions = { ...(input as InitOptions) };\n\n if (!initInput.noInteractive) {\n const basic = await promptInitBasic({\n extends: initInput.extends,\n account: initInput.account,\n domain: initInput.domain,\n });\n\n let parentPluginKeys: string[] = [];\n let parentConfig: {\n title?: string;\n description?: string;\n plugins?: Record<string, unknown>;\n } | null = null;\n\n const fetchSpinner = p.spinner();\n fetchSpinner.start(\"Fetching parent config\");\n try {\n const parent = await fetchInitParent(basic.extendsAccount, basic.extendsGateway);\n parentConfig = parent.parentConfig;\n parentPluginKeys = parent.parentPluginKeys;\n } catch {\n fetchSpinner.stop(\"Config not found\");\n console.error(\n `[CLI] No config found at bos://${basic.extendsAccount}/${basic.extendsGateway}`,\n );\n process.exit(1);\n }\n fetchSpinner.stop(\"Config fetched\");\n\n if (\n typeof parentConfig?.title === \"string\" &&\n parentConfig.title.trim() &&\n typeof parentConfig?.description === \"string\" &&\n parentConfig.description.trim()\n ) {\n const shouldContinue = await p.confirm({\n message: `You will be extending ${parentConfig.title} - ${parentConfig.description}. Continue?`,\n initialValue: true,\n });\n\n if (p.isCancel(shouldContinue) || !shouldContinue) {\n process.exit(0);\n }\n }\n\n const overrides = await promptInitOverrides({\n parentPluginKeys,\n plugins: initInput.plugins,\n overrides: initInput.overrides as OverrideSection[] | undefined,\n level: initInput.level,\n });\n\n const directory = initInput.directory || basic.domain || basic.extendsGateway;\n\n initInput = {\n ...initInput,\n extends: `bos://${basic.extendsAccount}/${basic.extendsGateway}`,\n directory,\n account: basic.account,\n domain: basic.domain || undefined,\n plugins: overrides.plugins,\n overrides: overrides.overrides,\n level: overrides.level ?? initInput.level,\n noInteractive: true,\n };\n }\n\n const initSpinner = p.spinner();\n initSpinner.start(\"Initializing project\");\n\n const phaseLabels: Record<string, string> = {\n \"parent config\": \"Fetching parent config...\",\n \"template source\": \"Resolving template source...\",\n \"scaffold project\": \"Creating project scaffold...\",\n \"copy files\": \"Copying template files...\",\n \"personalize config\": \"Personalizing config...\",\n \"write snapshot\": \"Writing snapshot...\",\n \"resolve config\": \"Resolving config...\",\n \"generate env/docker\": \"Generating environment config...\",\n \"create env file\": \"Creating .env file...\",\n \"install dependencies\": \"Installing dependencies...\",\n \"generate types\": \"Generating types...\",\n \"generate migrations\": \"Generating database migrations...\",\n \"generate code artifacts\": \"Generating code artifacts...\",\n };\n\n const onProgress = (event: ProgressEvent) => {\n const label = phaseLabels[event.phase] ?? event.phase;\n if (event.status === \"running\") {\n initSpinner.message(label);\n }\n };\n pluginEvents.on(\"progress\", onProgress);\n\n let result: InitResult;\n try {\n result = await client.init(initInput);\n } finally {\n pluginEvents.off(\"progress\", onProgress);\n }\n\n if (result.status === \"error\") {\n initSpinner.stop(\"Failed\");\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n\n initSpinner.stop(\"Project initialized\");\n\n console.log(` ${colors.dim(\"Extends:\")} ${result.extends}`);\n console.log(` ${colors.dim(\"Directory:\")} ${result.directory}`);\n if (result.account) console.log(` ${colors.dim(\"Account:\")} ${result.account}`);\n if (result.domain) console.log(` ${colors.dim(\"Domain:\")} ${result.domain}`);\n if (result.overrides && result.overrides.length > 0)\n console.log(` ${colors.dim(\"Overrides:\")} ${result.overrides.join(\", \")}`);\n if (result.plugins && result.plugins.length > 0)\n console.log(` ${colors.dim(\"Plugins:\")} ${result.plugins.join(\", \")}`);\n console.log(` ${colors.dim(\"Files copied:\")} ${result.filesCopied}`);\n printTimingSummary(result.timings);\n console.log();\n console.log(colors.dim(\" Next steps:\"));\n console.log(colors.dim(` cd ${result.directory}`));\n if (!initInput.noInstall) {\n console.log(colors.dim(\" pnpm run dev\"));\n } else {\n console.log(colors.dim(\" pnpm install\"));\n console.log(colors.dim(\" pnpm run dev\"));\n }\n console.log();\n\n if (initInput.noInteractive !== true && !initInput.noInstall && result.targetDir) {\n const shouldStartDocker = await p.confirm({\n message: \"Run docker compose up -d --wait?\",\n initialValue: true,\n });\n\n if (shouldStartDocker === true) {\n const dockerSpinner = p.spinner();\n dockerSpinner.start(\"Starting Docker services\");\n const compose = await runDockerComposeUp(result.targetDir);\n if (compose.ok) {\n dockerSpinner.stop(\"Docker services ready\");\n } else {\n dockerSpinner.stop(\"Docker services not started\");\n p.log.warn(\n `docker compose up -d --wait failed${compose.tail ? `:\\n${compose.tail}` : \"\"}`,\n );\n }\n }\n }\n\n return;\n }\n\n const result = await (client as any)[descriptor.key](input);\n\n if (descriptor.key === \"dbStudio\") {\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n\n return;\n }\n\n if (descriptor.key === \"dbDoctor\") {\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Diagnosis failed\"}`);\n process.exit(1);\n }\n\n const statusIcon = (() => {\n switch (result.diagnosis) {\n case \"healthy\":\n return \"✓\";\n case \"empty\":\n return \"○\";\n case \"unapplied\":\n return \"○\";\n case \"untracked-existing-schema\":\n return \"○\";\n case \"drift-safe-repair\":\n return \"⚠\";\n case \"drift-manual\":\n return \"✗\";\n default:\n return \"?\";\n }\n })();\n\n console.log(`\\n${statusIcon} ${result.plugin}`);\n console.log(` ${colors.dim(`Journal:`)} ${result.journalSchema}.${result.journalTable}`);\n console.log(` ${colors.dim(`Local migrations:`)} ${result.localMigrationCount}`);\n console.log(` ${colors.dim(`Applied hashes:`)} ${result.appliedHashCount}`);\n if (result.expectedTables.length > 0) {\n console.log(` ${colors.dim(`Expected tables:`)} ${result.expectedTables.join(\", \")}`);\n }\n if (result.missingTables.length > 0) {\n console.log(` ${colors.yellow(`Missing tables:`)} ${result.missingTables.join(\", \")}`);\n }\n console.log(` ${colors.dim(`Diagnosis:`)} ${result.diagnosis}`);\n if (result.workspaceDir) {\n console.log(` ${colors.dim(`Workspace:`)} ${result.workspaceDir}`);\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"dbRepair\") {\n if (result.status === \"refused\") {\n console.log(\n `\\n${colors.yellow(\"!\")} Repair refused for ${result.diagnosis?.plugin ?? result.message}`,\n );\n console.log(` ${result.message}`);\n console.log();\n process.exit(0);\n }\n\n if (result.status === \"error\") {\n console.error(`\\n${colors.error(\"✗\")} Repair failed`);\n console.error(` ${result.message}`);\n console.error();\n process.exit(1);\n }\n\n console.log(`\\n${colors.green(\"✓\")} Repair complete`);\n console.log(` ${result.message}`);\n console.log();\n return;\n }\n\n if (descriptor.key === \"config\") {\n if (!result.config) {\n console.error(MISSING_CONFIG_MESSAGE);\n process.exit(1);\n }\n\n printConfigView(result.config);\n process.stdout.write(`${JSON.stringify(result.config, null, 2)}\\n`);\n return;\n }\n\n if (descriptor.key === \"sync\") {\n if ((input as any).json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n console.log();\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n if (result.status === \"dry-run\") {\n console.log(colors.cyan(`${icons.ok} Dry run — no files written`));\n } else {\n console.log(colors.green(`${icons.ok} Synced`));\n }\n const hasRetirement =\n (result.retired?.length ?? 0) > 0 || (result.retiredConflicted?.length ?? 0) > 0;\n if (\n result.updated.length > 0 ||\n result.added.length > 0 ||\n result.conflicted.length > 0 ||\n hasRetirement\n ) {\n console.log(\n ` ${colors.dim(\"Sync results:\")} ${result.updated.length} updated, ${result.added.length} added, ${result.conflicted.length} conflicted`,\n );\n if (result.updated.length > 0) {\n for (const f of result.updated) console.log(` ${colors.dim(f)}`);\n }\n if (result.added.length > 0) {\n for (const f of result.added) console.log(` ${colors.dim(f)}`);\n }\n if (result.conflicted.length > 0) {\n console.log(\n ` ${colors.yellow(\"Conflicted\")} (template applied, your changes backed up):`,\n );\n if (result.backupDir) console.log(` ${colors.dim(result.backupDir)}`);\n for (const f of result.conflicted) console.log(` ${colors.dim(f)}`);\n }\n if (hasRetirement) {\n console.log(` ${colors.yellow(\"Retired\")} (replaced by generated stubs — ADR 0023):`);\n if (result.retiredBackupDir) console.log(` ${colors.dim(result.retiredBackupDir)}`);\n for (const f of result.retiredConflicted ?? []) {\n console.log(` ${colors.dim(`${f} (backed up)`)}`);\n }\n for (const f of result.retired ?? []) console.log(` ${colors.dim(f)}`);\n printStubMigrationGuide(result.retiredConflicted);\n }\n }\n if (\n result.updated.length === 0 &&\n result.added.length === 0 &&\n result.conflicted.length === 0 &&\n !hasRetirement\n ) {\n console.log(` ${colors.dim(\"Already up to date\")}`);\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"upgrade\") {\n if ((input as any).json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n console.log();\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n if (result.status === \"dry-run\") {\n console.log(colors.cyan(`${icons.ok} Dry run — no changes applied`));\n } else {\n console.log(colors.green(`${icons.ok} Upgrade complete`));\n }\n const mainPkg = result.packages.find(\n (p: { name: string; from?: string; to: string }) => p.name === \"everything-dev\",\n );\n const versionDelta =\n mainPkg?.from && mainPkg.from !== mainPkg.to ? `${mainPkg.from} → ${mainPkg.to}` : null;\n if (versionDelta) {\n console.log(` ${colors.dim(`Upgraded everything-dev ${versionDelta}`)}`);\n }\n for (const pkg of result.packages) {\n if (pkg.name === \"everything-dev\") continue;\n if (pkg.from && pkg.from !== pkg.to) {\n console.log(` ${colors.dim(`${pkg.name} ${pkg.from} → ${pkg.to}`)}`);\n } else if (!pkg.from) {\n console.log(` ${colors.dim(`${pkg.name} ${pkg.to} (new)`)}`);\n } else {\n console.log(` ${colors.dim(`${pkg.name} ${pkg.to} (up to date)`)}`);\n }\n }\n if (result.changelogUrl) {\n console.log(` Changelog: ${result.changelogUrl}`);\n }\n if (result.selectedPlugins && result.selectedPlugins.length > 0) {\n console.log(` Added plugins: ${result.selectedPlugins.join(\", \")}`);\n }\n if (result.sync) {\n const sync = result.sync;\n const hasRetirement =\n (sync.retired?.length ?? 0) > 0 || (sync.retiredConflicted?.length ?? 0) > 0;\n console.log(` ${colors.dim(\"Sync results:\")}`);\n if (\n sync.updated.length > 0 ||\n sync.added.length > 0 ||\n sync.conflicted.length > 0 ||\n hasRetirement\n ) {\n console.log(\n ` ${sync.updated.length} updated, ${sync.added.length} added, ${sync.conflicted.length} conflicted`,\n );\n if (sync.conflicted.length > 0) {\n console.log(\n ` ${colors.yellow(\"Conflicted\")} (template applied, your changes backed up):`,\n );\n if (sync.backupDir) console.log(` ${colors.dim(sync.backupDir)}`);\n for (const f of sync.conflicted) console.log(` ${colors.dim(f)}`);\n }\n if (hasRetirement) {\n console.log(` ${colors.yellow(\"Retired\")} (replaced by generated stubs — ADR 0023):`);\n if (sync.retiredBackupDir) console.log(` ${colors.dim(sync.retiredBackupDir)}`);\n for (const f of sync.retiredConflicted ?? []) {\n console.log(` ${colors.dim(`${f} (backed up)`)}`);\n }\n for (const f of sync.retired ?? []) console.log(` ${colors.dim(f)}`);\n printStubMigrationGuide(sync.retiredConflicted);\n }\n } else {\n console.log(` ${colors.dim(\"Already up to date\")}`);\n }\n }\n if (result.migrated && result.migrated.length > 0) {\n console.log(` Migrated: ${result.migrated.length} file(s)`);\n for (const f of result.migrated) console.log(` ${colors.dim(f)}`);\n }\n if (versionDelta || (result.sync && result.sync.conflicted.length > 0)) {\n console.log();\n console.log(colors.dim(\" For AI agents:\"));\n const parentRepo = \"nearbuilders/everything-dev\";\n const somedelta =\n mainPkg?.from && mainPkg.to\n ? `v${mainPkg.from.replace(/^[\\^~>=v]+/, \"\")}...v${mainPkg.to.replace(/^[\\^~>=v]+/, \"\")}`\n : \"\";\n console.log(\n colors.dim(\n ` This upgrade applied template changes${somedelta ? ` (${somedelta})` : \"\"}.`,\n ),\n );\n if (result.sync && result.sync.conflicted.length > 0) {\n console.log(\n colors.dim(\n ` ${result.sync.conflicted.length} file(s) had local conflicts — template version applied, backups at ${result.sync.backupDir || \".bos/sync-backup/\"}.`,\n ),\n );\n console.log(\n colors.dim(\n ` If local changes should be preserved upstream, open a PR: https://github.com/${parentRepo}${somedelta ? `/compare/${somedelta}` : \"\"}`,\n ),\n );\n }\n console.log(\n colors.dim(\n \" Load matching intent skills: pnpm dlx @tanstack/intent@latest load everything-dev#...\",\n ),\n );\n console.log(colors.dim(\" Review AGENTS.md — local updates may need merging.\"));\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"status\") {\n console.log();\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n console.log(colors.cyan(frames.top(52)));\n console.log(` ${icons.app} ${gradients.cyber(\"STATUS\")}`);\n console.log(colors.cyan(frames.bottom(52)));\n console.log();\n if (result.extends) console.log(` ${colors.dim(\"Extends:\")} ${result.extends}`);\n if (result.account) console.log(` ${colors.dim(\"Account:\")} ${result.account}`);\n if (result.domain) console.log(` ${colors.dim(\"Domain:\")} ${result.domain}`);\n console.log();\n console.log(` ${colors.dim(\"Packages:\")}`);\n for (const pkg of result.packages) {\n const hasUpdate =\n pkg.installed && pkg.latest && compareSemver(pkg.installed, pkg.latest) < 0;\n const versionStr = hasUpdate\n ? `${pkg.installed} → ${pkg.latest}`\n : pkg.installed || \"not installed\";\n const label = hasUpdate ? colors.yellow(versionStr) : colors.dim(versionStr);\n console.log(` ${colors.dim(`${pkg.name}`)} ${label}`);\n }\n console.log();\n if (result.lastSync) {\n const ago = formatTimeAgo(result.lastSync);\n console.log(` ${colors.dim(\"Last sync:\")} ${ago}`);\n } else {\n console.log(` ${colors.dim(\"Last sync:\")} never`);\n }\n const envLabel =\n result.envFile === \"found\"\n ? colors.green(\"found\")\n : result.envFile === \"example-only\"\n ? colors.yellow(\"missing (only .env.example found)\")\n : colors.error(\"missing\");\n console.log(` ${colors.dim(\".env:\")} ${envLabel}`);\n if (result.parentReachable !== undefined) {\n const parentLabel = result.parentReachable\n ? colors.green(\"reachable\")\n : colors.error(\"unreachable\");\n console.log(` ${colors.dim(\"Parent:\")} ${parentLabel}`);\n }\n const hasUpdates = result.packages.some(\n (p: { installed?: string; latest?: string }) =>\n p.installed && p.latest && compareSemver(p.installed, p.latest) < 0,\n );\n if (hasUpdates) {\n console.log();\n console.log(\n colors.dim(\n ` Run ${colors.cyan(\"bos upgrade\")} to update packages and sync template files.`,\n ),\n );\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"ps\") {\n const psResult = result as PsResult;\n console.log();\n if (psResult.status === \"error\") {\n console.error(`[CLI] ${psResult.error || \"Unknown error\"}`);\n process.exit(1);\n }\n const entries = psResult.entries ?? [];\n if (entries.length === 0) {\n console.log(colors.dim(\" No tracked development processes running.\"));\n console.log();\n console.log(\n colors.dim(` Start one with ${colors.cyan(\"bos dev\")} and it will appear here.`),\n );\n console.log();\n return;\n }\n console.log(colors.cyan(frames.top(60)));\n console.log(` ${icons.app} ${gradients.cyber(\"PROCESSES\")}`);\n console.log(colors.cyan(frames.bottom(60)));\n console.log();\n for (const entry of entries) {\n const ageMs = Date.now() - entry.startedAt;\n const ageStr =\n ageMs < 60_000\n ? `${Math.floor(ageMs / 1000)}s`\n : ageMs < 3_600_000\n ? `${Math.floor(ageMs / 60_000)}m`\n : `${Math.floor(ageMs / 3_600_000)}h`;\n const roleTag =\n entry.role === \"workspace-parent\"\n ? colors.magenta(\"parent\")\n : entry.role === \"workspace-child\"\n ? colors.blue(\"child\")\n : colors.dim(\"dev\");\n console.log(` ${colors.green(`pid ${entry.pid}`)} ${roleTag} ${colors.dim(ageStr)}`);\n console.log(` ${colors.dim(\"dir:\")} ${entry.configDir}`);\n if (entry.parentPid !== undefined) {\n console.log(` ${colors.dim(\"parent:\")} ${entry.parentPid}`);\n }\n const portPairs = Object.entries(entry.ports ?? {})\n .filter(([, p]) => typeof p === \"number\")\n .map(([k, v]) => `${k}=${v}`);\n if (portPairs.length > 0) {\n console.log(` ${colors.dim(\"ports:\")} ${portPairs.join(\" \")}`);\n }\n if (entry.budget) {\n console.log(` ${colors.dim(\"budget:\")} [${entry.budget.min}, ${entry.budget.max}]`);\n }\n console.log(` ${colors.dim(\"desc:\")} ${entry.description}`);\n console.log();\n }\n return;\n }\n\n if (descriptor.key === \"logs\") {\n const logsResult = result as LogsResult;\n const opts = input as LogsOptions;\n for (const line of logsResult.lines) {\n console.log(line);\n }\n if (logsResult.lines.length === 0) {\n console.log(colors.dim(` No matching log lines in ${logsResult.logFile}.`));\n }\n if (opts.follow) {\n if (logsResult.logFile === \"unknown\" || !existsSync(logsResult.logFile)) {\n console.log(colors.dim(\" No log file to follow — nothing was found on disk.\"));\n } else {\n const filter = opts.service;\n let byteOffset = 0;\n for (const line of logsResult.lines) byteOffset += Buffer.byteLength(line, \"utf8\") + 1;\n const followMatch = (line: string): boolean => {\n if (!filter) return true;\n const source = /\\] \\[([^\\]]+)\\] \\[(?:OUT|ERR)\\] /.exec(line)?.[1];\n return source === filter || source === `plugin:${filter}`;\n };\n const watcher = watch(logsResult.logFile, (event) => {\n if (event !== \"change\") return;\n void readFile(logsResult.logFile, \"utf8\")\n .then((text) => {\n const newLines = text\n .slice(byteOffset)\n .split(\"\\n\")\n .filter((line) => line.length > 0 && followMatch(line));\n byteOffset = Buffer.byteLength(text, \"utf8\");\n for (const line of newLines) {\n console.log(line);\n }\n })\n .catch(() => {\n // the followed file was rotated or deleted — stop following\n watcher.close();\n });\n });\n console.log(colors.dim(\" Following — Ctrl+C to stop.\"));\n process.on(\"SIGINT\", () => {\n watcher.close();\n process.exit(0);\n });\n }\n }\n return;\n }\n\n if (descriptor.key === \"kill\") {\n const killResult = result as KillResult;\n console.log();\n if (killResult.status === \"error\") {\n console.error(`[CLI] ${killResult.error || \"Unknown error\"}`);\n process.exit(1);\n }\n if (killResult.killed.length > 0) {\n console.log(colors.green(`${icons.ok} Sent ${killResult.killed.length} kill signal(s)`));\n for (const k of killResult.killed) {\n console.log(` ${colors.dim(\"pid\")} ${k.pid} ${colors.dim(k.configDir)}`);\n }\n }\n if (killResult.skipped.length > 0) {\n console.log(colors.yellow(`${icons.err} ${killResult.skipped.length} skipped`));\n for (const s of killResult.skipped) {\n console.log(` ${colors.dim(\"pid\")} ${s.pid} ${colors.dim(s.reason)}`);\n }\n }\n if (killResult.killed.length === 0 && killResult.skipped.length === 0) {\n const opts = input as KillOptions;\n if (opts.all) {\n console.log(colors.dim(\" No tracked processes to kill.\"));\n } else {\n const configPath = findConfigPath();\n const dir = opts.configDir ?? (configPath ? resolve(dirname(configPath)) : process.cwd());\n console.log(colors.dim(` No tracked processes for ${dir}`));\n console.log(colors.dim(` Use ${colors.cyan(\"--all\")} to kill across all directories.`));\n }\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"typesGen\") {\n console.log();\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n console.log(colors.green(`${icons.ok} Types generated`));\n if (result.generated.length > 0) {\n console.log(` ${colors.dim(\"Written:\")}`);\n for (const f of result.generated) console.log(` ${colors.dim(f)}`);\n }\n if (result.fetched.length > 0 || result.skipped.length > 0 || result.failed.length > 0) {\n console.log(` ${colors.dim(\"Contract sources:\")}`);\n for (const entry of result.fetched) {\n const space = entry.indexOf(\" \");\n const key = space !== -1 ? entry.slice(0, space) : entry;\n const rest = space !== -1 ? entry.slice(space + 1) : \"\";\n const restSpace = rest.indexOf(\" \");\n const detail = restSpace !== -1 ? rest.slice(restSpace + 1) : \"\";\n console.log(\n ` ${key} ${colors.cyan(\"remote\")}${detail ? ` ${colors.dim(detail)}` : \"\"}`,\n );\n }\n for (const entry of result.skipped) {\n const space = entry.indexOf(\" \");\n const key = space !== -1 ? entry.slice(0, space) : entry;\n const rest = space !== -1 ? entry.slice(space + 1) : \"\";\n if (rest === \"no URL resolved\") {\n console.log(` ${key} ${colors.dim(\"no URL resolved\")}`);\n continue;\n }\n const restSpace = rest.indexOf(\" \");\n const detail = restSpace !== -1 ? rest.slice(restSpace + 1) : \"\";\n console.log(` ${key} ${colors.dim(\"local\")}${detail ? ` ${colors.dim(detail)}` : \"\"}`);\n }\n }\n if (result.failed.length > 0) {\n console.log(` ${colors.yellow(\"Failed:\")}`);\n for (const f of result.failed) {\n const colon = f.indexOf(\": \");\n if (colon !== -1) {\n console.log(` ${colors.error(f.slice(0, colon))}${colors.dim(f.slice(colon))}`);\n } else {\n console.log(` ${colors.error(f)}`);\n }\n }\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"typecheck\") {\n console.log();\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n const failed = result.results.filter((r: TypecheckWorkspaceResult) => !r.passed);\n const passed = result.results.filter((r: TypecheckWorkspaceResult) => r.passed);\n console.log(colors.cyan(frames.top(52)));\n console.log(` ${icons.app} ${gradients.cyber(\"TYPECHECK\")}`);\n console.log(colors.cyan(frames.bottom(52)));\n console.log();\n for (const r of result.results) {\n const icon = r.passed ? colors.green(\"✓\") : colors.error(\"✗\");\n console.log(` ${icon} ${r.workspace}`);\n }\n if (result.skipped.length > 0) {\n console.log(` ${colors.dim(`Skipped: ${result.skipped.join(\", \")}`)}`);\n }\n console.log();\n if (failed.length > 0) {\n console.log(` ${colors.error(`${failed.length} failed`)}`);\n for (const f of failed) {\n if (f.error) console.log(` ${colors.dim(f.error)}`);\n }\n console.log();\n process.exit(1);\n }\n console.log(` ${colors.green(`${passed.length} passed`)}`);\n console.log();\n return;\n }\n\n if (descriptor.key === \"mfCheck\") {\n console.log();\n console.log(\n ` ${colors.dim(\"Host\")} ${result.hostReachable ? colors.green(\"OK \") : colors.error(\"FAIL\")} ${\n result.hostVersion ?? \"unreachable\"\n }${result.hostReason ? ` (${result.hostReason})` : \"\"}`,\n );\n for (const r of result.remotes) {\n const tag = r.ok ? colors.green(\"OK \") : colors.error(\"FAIL\");\n console.log(\n ` ${colors.dim(r.role.padEnd(10))} ${tag} ${r.url} pluginVersion=${r.pluginVersion ?? \"?\"}${\n r.reason ? ` ↳ ${r.reason}` : \"\"\n }`,\n );\n }\n console.log();\n if (result.status !== \"ok\") {\n console.log(\n colors.error(\n \" mf-compat: ✗ federation manifests NOT compatible — redeploy affected plugin(s) so pluginVersion and shared versions match host\",\n ),\n );\n console.log();\n process.exit(1);\n }\n console.log(colors.green(\" mf-compat: ✓ all federation manifests compatible\"));\n console.log();\n return;\n }\n\n if (result?.status === \"error\" && descriptor.key !== \"publish\" && descriptor.key !== \"deploy\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n\n if (descriptor.key === \"login\") {\n console.log();\n console.log(colors.green(`${icons.ok} Logged in to ${result.siteUrl}`));\n if (result.accountId) console.log(` ${colors.dim(\"Account:\")} ${result.accountId}`);\n if (result.expiresAt) console.log(` ${colors.dim(\"Expires:\")} ${result.expiresAt}`);\n if (result.warning) console.log(` ${colors.yellow(\"⚠\")} ${result.warning}`);\n if (result.publishKey) {\n console.log(\n ` ${colors.dim(\"Publish key:\")} ${result.publishKey.publicKey} ${colors.dim(\n `(${result.publishKey.network}, exported to ${result.publishKey.exportedTo})`,\n )}`,\n );\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"logout\") {\n console.log();\n console.log(colors.green(`${icons.ok} Logged out`));\n if (result.revokedApiKey) console.log(` ${colors.dim(\"Revoked API key\")}`);\n if (result.removedPublishKey) console.log(` ${colors.dim(\"Removed exported publish key\")}`);\n if (result.warning) console.log(` ${colors.yellow(\"⚠\")} ${result.warning}`);\n console.log();\n return;\n }\n\n if (descriptor.key === \"keyPublish\") {\n process.stdout.write(`Generated publish key for ${result.account}\\n`);\n process.stdout.write(` Network: ${result.network}\\n`);\n process.stdout.write(` Allowance: ${result.allowance}\\n`);\n process.stdout.write(`\\n`);\n const secretName = result.env === \"staging\" ? \"NEAR_TESTNET_PRIVATE_KEY\" : \"NEAR_PRIVATE_KEY\";\n if (!process.stdout.isTTY) {\n process.stderr.write(\n ` ⚠ Non-interactive stdout: this private key will be captured in any log or pipe (GitHub Actions logs persist stdout).\\n`,\n );\n }\n process.stdout.write(\n ` Set this as ${secretName} in GitHub Actions or before calling publish:\\n`,\n );\n process.stdout.write(`${secretName}=${result.privateKey}\\n`);\n }\n\n if (descriptor.key === \"pluginAdd\") {\n console.log();\n console.log(colors.green(`${icons.ok} Added plugin ${result.key}`));\n if (result.development) console.log(` ${colors.dim(\"Development:\")} ${result.development}`);\n if (result.production) console.log(` ${colors.dim(\"Production:\")} ${result.production}`);\n console.log();\n return;\n }\n\n if (descriptor.key === \"pluginRemove\") {\n console.log();\n console.log(colors.green(`${icons.ok} Removed plugin ${result.key}`));\n console.log();\n return;\n }\n\n if (descriptor.key === \"pluginList\") {\n console.log();\n console.log(colors.cyan(frames.top(52)));\n console.log(` ${icons.config} ${gradients.cyber(\"PLUGINS\")}`);\n console.log(colors.cyan(frames.bottom(52)));\n console.log();\n if (result.plugins.length === 0) {\n console.log(colors.dim(\" No plugins configured\"));\n } else {\n for (const pluginItem of result.plugins) {\n console.log(` ${colors.cyan(pluginItem.key)}`);\n if (pluginItem.development)\n console.log(` ${colors.dim(\"Development:\")} ${pluginItem.development}`);\n if (pluginItem.production)\n console.log(` ${colors.dim(\"Production:\")} ${pluginItem.production}`);\n }\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"pluginPublish\") {\n console.log();\n console.log(colors.green(`${icons.ok} Published plugin ${result.key}`));\n if (result.path) console.log(` ${colors.dim(\"Path:\")} ${result.path}`);\n if (result.production) console.log(` ${colors.dim(\"Production:\")} ${result.production}`);\n if (result.version) console.log(` ${colors.dim(\"Version:\")} ${result.version}`);\n if (result.fingerprint) console.log(` ${colors.dim(\"Fingerprint:\")} ${result.fingerprint}`);\n console.log();\n return;\n }\n\n if (descriptor.key === \"registryUse\") {\n console.log();\n if (result.status === \"error\") {\n console.error(colors.error(`${icons.err} ${result.error || \"Unknown error\"}`));\n process.exit(1);\n }\n console.log(\n colors.green(\n `${icons.ok} ${result.status === \"dry-run\" ? \"Dry run\" : \"Composed\"} from ${result.from}`,\n ),\n );\n for (const section of result.applied) {\n console.log(` ${colors.green(\"+\")} ${section}`);\n }\n if (result.configPath) {\n console.log(` ${colors.dim(\"Config:\")} ${result.configPath}`);\n }\n if (result.status === \"updated\") {\n console.log(colors.dim(\" Run bos types gen to refresh generated types.\"));\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"publish\") {\n if (result.status === \"dry-run\") {\n console.log();\n console.log(colors.cyan(`${icons.ok} Dry run complete`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${result.registryUrl}`);\n console.log();\n return;\n }\n\n if (result.status === \"error\") {\n console.log();\n console.log(colors.error(`${icons.err} Publish failed`));\n if (result.error) {\n console.log(` ${colors.dim(\"Error:\")} ${result.error}`);\n }\n if (result.deployResults && result.deployResults.length > 0) {\n const failures = result.deployResults.filter((r: any) => !r.success);\n if (failures.length > 0) {\n console.log();\n for (const f of failures) {\n const errorLine = (f.error ?? \"Failed\").split(\"\\n\")[0];\n console.log(` ${colors.error(icons.err)} ${f.key}: ${errorLine}`);\n }\n }\n }\n console.log();\n process.exit(1);\n }\n\n if (result.status === \"published\") {\n console.log();\n console.log(colors.green(`${icons.ok} Published successfully`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${result.registryUrl}`);\n if (result.txHash) {\n console.log(` ${colors.dim(\"Transaction:\")} ${result.txHash}`);\n }\n if (result.built && result.built.length > 0) {\n console.log(` ${colors.dim(\"Built:\")} ${result.built.join(\", \")}`);\n }\n if (result.skipped && result.skipped.length > 0) {\n console.log(` ${colors.dim(\"Skipped:\")} ${result.skipped.join(\", \")}`);\n }\n if (result.deployResults) {\n const warnings = result.deployResults.flatMap((r: any) => r.warnings ?? []);\n if (warnings.length > 0) {\n console.log();\n console.log(` ${colors.yellow(\"⚠\")} Build warnings:`);\n for (const w of warnings) {\n console.log(` ${colors.dim(w)}`);\n }\n }\n }\n console.log();\n return;\n }\n }\n\n if (descriptor.key === \"rollback\") {\n const rollbackResult = result as any;\n if (rollbackResult.status === \"error\") {\n console.log();\n console.log(colors.error(`${icons.err} Roll back failed`));\n if (rollbackResult.error) {\n console.log(` ${colors.dim(\"Error:\")} ${rollbackResult.error}`);\n }\n if (rollbackResult.verification) {\n console.log();\n for (const check of rollbackResult.verification) {\n const mark = check.ok ? colors.green(icons.ok) : colors.error(icons.err);\n const reason = check.reason ? colors.dim(` — ${check.reason}`) : \"\";\n console.log(` ${mark} ${check.slot}${reason}`);\n }\n }\n console.log();\n process.exit(1);\n }\n\n if (rollbackResult.status === \"dry-run\") {\n console.log();\n console.log(colors.cyan(`${icons.ok} Rollback dry run complete`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${rollbackResult.registryUrl}`);\n console.log();\n return;\n }\n\n console.log();\n console.log(colors.green(`${icons.ok} Rolled back`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${rollbackResult.registryUrl}`);\n if (rollbackResult.txHash) {\n console.log(` ${colors.dim(\"Transaction:\")} ${rollbackResult.txHash}`);\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"deploy\") {\n const deployResult = result as any;\n if (deployResult.status === \"list\") {\n console.log();\n console.log(colors.cyan(\"Recent publishes (audit trail)\"));\n for (const entry of deployResult.history ?? []) {\n console.log(\n ` ${entry.blockTimestamp} ${colors.dim(`block ${entry.blockHeight}`)}${entry.publishedAt ? colors.dim(` ${entry.publishedAt}`) : \"\"}`,\n );\n }\n console.log();\n return;\n }\n if (deployResult.fingerprint) {\n console.log(` ${colors.dim(\"Fingerprint:\")} ${deployResult.fingerprint}`);\n }\n if (deployResult.status === \"dry-run\") {\n console.log();\n console.log(colors.cyan(`${icons.ok} Dry run complete`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${deployResult.registryUrl}`);\n console.log();\n return;\n }\n\n if (deployResult.status === \"error\") {\n console.log();\n console.log(colors.error(`${icons.err} Deploy failed`));\n if (deployResult.error) {\n console.log(` ${colors.dim(\"Error:\")} ${deployResult.error}`);\n }\n if (deployResult.deployResults && deployResult.deployResults.length > 0) {\n const failures = deployResult.deployResults.filter((r: any) => !r.success);\n if (failures.length > 0) {\n console.log();\n for (const f of failures) {\n const errorLine = (f.error ?? \"Failed\").split(\"\\n\")[0];\n console.log(` ${colors.error(icons.err)} ${f.key}: ${errorLine}`);\n }\n }\n }\n console.log();\n process.exit(1);\n }\n\n if (deployResult.status === \"deployed\") {\n console.log();\n console.log(colors.green(`${icons.ok} Deployed successfully`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${deployResult.registryUrl}`);\n if (deployResult.txHash) {\n console.log(` ${colors.dim(\"Transaction:\")} ${deployResult.txHash}`);\n }\n if (deployResult.built && deployResult.built.length > 0) {\n console.log(` ${colors.dim(\"Built:\")} ${deployResult.built.join(\", \")}`);\n }\n if (deployResult.skipped && deployResult.skipped.length > 0) {\n console.log(` ${colors.dim(\"Skipped:\")} ${deployResult.skipped.join(\", \")}`);\n }\n if (deployResult.deployResults) {\n const warnings = deployResult.deployResults.flatMap((r: any) => r.warnings ?? []);\n if (warnings.length > 0) {\n console.log();\n console.log(` ${colors.yellow(\"⚠\")} Build warnings:`);\n for (const w of warnings) {\n console.log(` ${colors.dim(w)}`);\n }\n }\n }\n if (deployResult.image) {\n console.log(` ${colors.dim(\"Image:\")} ${deployResult.image}`);\n }\n if (deployResult.service) {\n console.log(` ${colors.dim(\"Railway:\")} deployed ${deployResult.service}`);\n }\n console.log();\n return;\n }\n\n if (deployResult.status === \"published\") {\n console.log();\n console.log(colors.yellow(`${icons.err} Config published, but a deploy leg failed`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${deployResult.registryUrl}`);\n if (deployResult.txHash) {\n console.log(` ${colors.dim(\"Transaction:\")} ${deployResult.txHash}`);\n }\n if (deployResult.error) {\n console.log(` ${colors.dim(\"Error:\")} ${deployResult.error}`);\n }\n console.log();\n process.exit(1);\n }\n }\n\n if (descriptor.key === \"infraExport\") {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n } catch (error) {\n console.error(`[CLI] ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n}\n\nvoid main().catch((error) => {\n console.error(\"[CLI] Fatal error:\", error);\n process.exit(1);\n});\n"],"mappings":"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"}