UNPKG

everything-dev

Version:

A consolidated product package for building Module Federation apps with oRPC APIs.

1 lines • 89.7 kB
{"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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"}