{"version":3,"file":"upgrade.cjs","names":["fetchParentConfig","resolveCatalogChainSource","resolveExtendsRef","saveBosConfig","process","p","readInstalledFrameworkVersion","buildChildRootScripts","timePhase","syncTemplate","loadResolvedConfig","syncAndGenerateSharedUi","runBunInstallForUpgrade","runTypesGen"],"sources":["../../src/cli/upgrade.ts"],"sourcesContent":["import { existsSync, readFileSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport { glob } from \"glob\";\nimport { loadResolvedConfig } from \"../config\";\nimport type { PhaseTiming, UpgradeOptions, UpgradeResult } from \"../contract\";\nimport { resolveExtendsRef } from \"../merge\";\nimport { syncAndGenerateSharedUi } from \"../shared\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { readInstalledFrameworkVersion } from \"./framework-version\";\nimport {\n  buildChildRootScripts,\n  fetchParentConfig,\n  resolveCatalogChainSource,\n  runBunInstallForUpgrade,\n  runTypesGen,\n} from \"./init\";\nimport { syncTemplate } from \"./sync\";\nimport { timePhase } from \"./timing\";\n\nconst FRAMEWORK_PACKAGES = [\"everything-dev\", \"every-plugin\"];\nconst AUTH_CORE_PACKAGE = \"@better-auth/core\";\nconst AUTH_CORE_TRIGGER_PACKAGES = [\n  \"better-auth\",\n  \"better-near-auth\",\n  \"@better-auth/api-key\",\n  \"@better-auth/passkey\",\n] as const;\nconst LEGACY_UI_IMPORT_REWRITES = [\n  ['from \"@/auth\"', 'from \"@/app\"'],\n  [\"from '@/auth'\", \"from '@/app'\"],\n  ['from \"@/lib/use-api-client\"', 'from \"@/app\"'],\n  [\"from '@/lib/use-api-client'\", \"from '@/app'\"],\n  ['from \"@/lib/api-client\"', 'from \"@/app\"'],\n  [\"from '@/lib/api-client'\", \"from '@/app'\"],\n] as const;\nconst OBSOLETE_FILES = [\n  \"ui/src/auth.ts\",\n  \"ui/src/auth-types.gen.ts\",\n  \"ui/src/lib/api-client.ts\",\n  \"ui/src/lib/use-api-client.ts\",\n  \"ui/src/api-contract.ts\",\n  \"ui/src/api-contract.gen.ts\",\n  \"ui/src/lib/auth-client.ts\",\n  \"ui/src/lib/session.ts\",\n  \"ui/scripts/generate-metadata.ts\",\n  \".github/dependabot.yml\",\n  \".github/templates/dependabot.yml\",\n  \".github/renovate.json\",\n  \".github/workflows/packages-release.yml\",\n  \".github/workflows/release.yml\",\n  \".github/workflows/release-sync.yml\",\n  \".github/workflows/staging.yml\",\n  \"packages/everything-dev/cli.js\",\n  \".templatekeep\",\n  \".templatesync-exclude\",\n];\n\ninterface ExtendedRootSource {\n  catalog: Record<string, string>;\n  repository?: string;\n  extendsChain: string[];\n}\n\nfunction extractSemver(value: string | undefined): string | null {\n  if (!value) return null;\n  const match = value.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n  return match?.[0] ?? null;\n}\n\nfunction readJsonFile<T>(filePath: string): T {\n  return JSON.parse(readFileSync(filePath, \"utf-8\")) as T;\n}\n\nfunction readRootPackageJson(projectDir: string): Record<string, unknown> {\n  return readJsonFile<Record<string, unknown>>(join(projectDir, \"package.json\"));\n}\n\nfunction readRootCatalogEntry(projectDir: string, packageName: string): string | undefined {\n  const pkg = readRootPackageJson(projectDir) as {\n    workspaces?: { catalog?: Record<string, string> };\n  };\n  return pkg.workspaces?.catalog?.[packageName];\n}\n\nfunction readCurrentPackageSpecifier(projectDir: string, packageName: string): string | undefined {\n  const pkg = readRootPackageJson(projectDir);\n\n  for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n    const field = pkg[fieldName] as Record<string, string> | undefined;\n    const value = field?.[packageName];\n    if (!value) continue;\n\n    if (value === \"catalog:\") {\n      return (\n        readRootCatalogEntry(projectDir, packageName) ??\n        readInstalledVersion(projectDir, packageName)\n      );\n    }\n\n    if (value.startsWith(\"workspace:\") || value.startsWith(\"file:\")) {\n      return readInstalledVersion(projectDir, packageName);\n    }\n\n    return value;\n  }\n\n  return (\n    readRootCatalogEntry(projectDir, packageName) ?? readInstalledVersion(projectDir, packageName)\n  );\n}\n\nfunction setCatalogRefs(\n  field: Record<string, string> | undefined,\n  packageNames: ReadonlyArray<string>,\n): boolean {\n  if (!field) return false;\n\n  let modified = false;\n  for (const packageName of packageNames) {\n    if (setCatalogRef(field, packageName)) {\n      modified = true;\n    }\n  }\n\n  return modified;\n}\n\nfunction syncPackageObjectCatalogRefs(\n  pkg: Record<string, unknown>,\n  packageNames: ReadonlyArray<string>,\n): boolean {\n  let modified = false;\n\n  for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n    const field = pkg[fieldName] as Record<string, string> | undefined;\n    if (setCatalogRefs(field, packageNames)) {\n      modified = true;\n    }\n  }\n\n  return modified;\n}\n\nfunction findPackageFieldWithAnyDependency(\n  pkg: Record<string, unknown>,\n  packageNames: ReadonlyArray<string>,\n): Record<string, string> | undefined {\n  for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n    const field = pkg[fieldName] as Record<string, string> | undefined;\n    if (!field) continue;\n    if (packageNames.some((packageName) => typeof field[packageName] === \"string\")) {\n      return field;\n    }\n  }\n\n  return undefined;\n}\n\nfunction packageObjectNeedsAuthCoreCatalogRef(pkg: Record<string, unknown>): boolean {\n  const targetField = findPackageFieldWithAnyDependency(pkg, AUTH_CORE_TRIGGER_PACKAGES);\n  if (!targetField) return false;\n\n  for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n    const field = pkg[fieldName] as Record<string, string> | undefined;\n    if (field?.[AUTH_CORE_PACKAGE]) return false;\n  }\n\n  return true;\n}\n\nfunction ensureAuthCoreCatalogRef(pkg: Record<string, unknown>): boolean {\n  if (!packageObjectNeedsAuthCoreCatalogRef(pkg)) return false;\n\n  const targetField = findPackageFieldWithAnyDependency(pkg, AUTH_CORE_TRIGGER_PACKAGES);\n  if (!targetField) return false;\n\n  targetField[AUTH_CORE_PACKAGE] = \"catalog:\";\n  return true;\n}\n\nfunction packageObjectNeedsCatalogRefs(\n  pkg: Record<string, unknown>,\n  packageNames: ReadonlyArray<string>,\n): boolean {\n  for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n    const field = pkg[fieldName] as Record<string, string> | undefined;\n    if (!field) continue;\n\n    for (const packageName of packageNames) {\n      const value = field[packageName];\n      if (!value) continue;\n      if (value !== \"catalog:\" && !value.startsWith(\"file:\")) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nfunction packageFileNeedsCatalogRefs(\n  filePath: string,\n  packageNames: ReadonlyArray<string>,\n): boolean {\n  return packageObjectNeedsCatalogRefs(\n    readJsonFile<Record<string, unknown>>(filePath),\n    packageNames,\n  );\n}\n\nfunction updatePackageFileCatalogRefs(\n  filePath: string,\n  packageNames: ReadonlyArray<string>,\n): boolean {\n  const pkg = readJsonFile<Record<string, unknown>>(filePath);\n  const modified = syncPackageObjectCatalogRefs(pkg, packageNames);\n\n  if (modified) {\n    writeFileSync(filePath, `${JSON.stringify(pkg, null, 2)}\\n`);\n  }\n\n  return modified;\n}\n\nfunction updatePackageFileAuthCoreRef(filePath: string): boolean {\n  const pkg = readJsonFile<Record<string, unknown>>(filePath);\n  const modified = ensureAuthCoreCatalogRef(pkg);\n\n  if (modified) {\n    writeFileSync(filePath, `${JSON.stringify(pkg, null, 2)}\\n`);\n  }\n\n  return modified;\n}\n\nfunction syncRootCatalogWithParent(\n  projectDir: string,\n  parentCatalog: Record<string, string>,\n): boolean {\n  const pkgPath = join(projectDir, \"package.json\");\n  const pkg = readJsonFile<Record<string, unknown>>(pkgPath);\n  let modified = syncPackageObjectCatalogRefs(pkg, Object.keys(parentCatalog));\n\n  if (!pkg.workspaces || typeof pkg.workspaces !== \"object\") {\n    pkg.workspaces = { packages: [], catalog: {} };\n    modified = true;\n  }\n\n  const workspaces = pkg.workspaces as { packages?: string[]; catalog?: Record<string, string> };\n  if (!workspaces.catalog || typeof workspaces.catalog !== \"object\") {\n    workspaces.catalog = {};\n    modified = true;\n  }\n\n  for (const [packageName, version] of Object.entries(parentCatalog)) {\n    if (workspaces.catalog[packageName] !== version) {\n      workspaces.catalog[packageName] = version;\n      modified = true;\n    }\n  }\n\n  if (modified) {\n    writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n  }\n\n  return modified;\n}\n\nasync function readExtendedRootSource(projectDir: string): Promise<ExtendedRootSource> {\n  const configPath = join(projectDir, \"bos.config.json\");\n  if (!existsSync(configPath)) {\n    return { catalog: {}, extendsChain: [] };\n  }\n\n  const localConfig = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n  let extendsRef = getExtendsRef(localConfig);\n  if (!extendsRef?.startsWith(\"bos://\")) {\n    return {\n      catalog: {},\n      repository: typeof localConfig.repository === \"string\" ? localConfig.repository : undefined,\n      extendsChain: [],\n    };\n  }\n\n  const extendsChain: string[] = [];\n  const visited = new Set<string>();\n  let repository = typeof localConfig.repository === \"string\" ? localConfig.repository : undefined;\n  let rootRef = extendsRef;\n\n  while (extendsRef?.startsWith(\"bos://\")) {\n    if (visited.has(extendsRef)) {\n      throw new Error(`Circular extends detected while resolving upgrade source: ${extendsRef}`);\n    }\n    visited.add(extendsRef);\n    extendsChain.push(extendsRef);\n\n    const parsed = parseBosRef(extendsRef);\n    if (!parsed) {\n      break;\n    }\n\n    rootRef = extendsRef;\n\n    let parentConfig: Record<string, unknown>;\n    try {\n      parentConfig = (await fetchParentConfig(parsed.account, parsed.gateway)) as Record<\n        string,\n        unknown\n      >;\n    } catch {\n      break;\n    }\n\n    if (typeof parentConfig.repository === \"string\") {\n      repository = parentConfig.repository;\n    }\n\n    const nextExtendsRef = getExtendsRef(parentConfig);\n    if (!nextExtendsRef?.startsWith(\"bos://\")) {\n      break;\n    }\n\n    extendsRef = nextExtendsRef;\n  }\n\n  const parsed = parseBosRef(rootRef);\n  if (!parsed) {\n    return { catalog: {}, repository, extendsChain };\n  }\n\n  const source = await resolveCatalogChainSource({\n    extendsAccount: parsed.account,\n    extendsGateway: parsed.gateway,\n  });\n\n  return {\n    catalog: source.catalog,\n    repository: source.repository ?? repository,\n    extendsChain: source.extendsChain.length > 0 ? source.extendsChain : extendsChain,\n  };\n}\n\nfunction getExtendsRef(config: Record<string, unknown>): string | undefined {\n  if (typeof config.extends === \"string\") {\n    return config.extends;\n  }\n\n  if (config.extends && typeof config.extends === \"object\") {\n    return resolveExtendsRef(config.extends as Record<string, string>, \"production\");\n  }\n\n  return undefined;\n}\n\nfunction parseBosRef(ref: string): { account: string; gateway: string } | null {\n  const match = ref.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n  if (!match?.[1] || !match[2]) return null;\n  return { account: match[1], gateway: match[2] };\n}\n\nfunction parseTargetedRef(ref: string): { configRef: string; targetPath?: string } {\n  const hashIndex = ref.indexOf(\"#\");\n  if (hashIndex === -1) {\n    return { configRef: ref };\n  }\n  return {\n    configRef: ref.slice(0, hashIndex),\n    targetPath: ref.slice(hashIndex + 1) || undefined,\n  };\n}\n\nfunction ensureTargetedRef(ref: string, targetPath: string): string {\n  const parsed = parseTargetedRef(ref);\n  if (parsed.targetPath) return ref;\n  return `${parsed.configRef}#${targetPath}`;\n}\n\nfunction rewriteExtendsTarget(\n  entry: Record<string, unknown> | undefined,\n  targetPath: string,\n): boolean {\n  if (!entry?.extends) return false;\n\n  if (typeof entry.extends === \"string\") {\n    const next = ensureTargetedRef(entry.extends, targetPath);\n    if (next === entry.extends) return false;\n    entry.extends = next;\n    return true;\n  }\n\n  if (typeof entry.extends === \"object\") {\n    let changed = false;\n    for (const [key, value] of Object.entries(entry.extends as Record<string, unknown>)) {\n      if (typeof value !== \"string\") continue;\n      const next = ensureTargetedRef(value, targetPath);\n      if (next !== value) {\n        (entry.extends as Record<string, unknown>)[key] = next;\n        changed = true;\n      }\n    }\n    return changed;\n  }\n\n  return false;\n}\n\nfunction migrateRootConfigTargets(config: Record<string, unknown>): boolean {\n  let changed = false;\n  const app =\n    config.app && typeof config.app === \"object\"\n      ? (config.app as Record<string, unknown>)\n      : undefined;\n\n  if (app?.api && typeof app.api === \"object\") {\n    changed = rewriteExtendsTarget(app.api as Record<string, unknown>, \"app.api\") || changed;\n  }\n  if (app?.auth && typeof app.auth === \"object\") {\n    changed = rewriteExtendsTarget(app.auth as Record<string, unknown>, \"app.auth\") || changed;\n  }\n\n  if (config.plugins && typeof config.plugins === \"object\") {\n    for (const [pluginKey, pluginValue] of Object.entries(\n      config.plugins as Record<string, unknown>,\n    )) {\n      if (typeof pluginValue === \"string\") {\n        const next = ensureTargetedRef(pluginValue, `plugins.${pluginKey}`);\n        if (next !== pluginValue) {\n          (config.plugins as Record<string, unknown>)[pluginKey] = next;\n          changed = true;\n        }\n        continue;\n      }\n      if (!pluginValue || typeof pluginValue !== \"object\") continue;\n      changed =\n        rewriteExtendsTarget(pluginValue as Record<string, unknown>, `plugins.${pluginKey}`) ||\n        changed;\n    }\n  }\n\n  return changed;\n}\n\nfunction migratePluginProviderConfig(config: Record<string, unknown>, pluginKey: string): boolean {\n  let changed = false;\n  if (!config.plugins || typeof config.plugins !== \"object\") {\n    return false;\n  }\n\n  const plugins = config.plugins as Record<string, unknown>;\n  const entry = plugins[pluginKey];\n  if (!entry || typeof entry !== \"object\") return false;\n\n  const pluginEntry = entry as Record<string, unknown>;\n\n  if (\"name\" in pluginEntry) {\n    delete pluginEntry.name;\n    changed = true;\n  }\n\n  if (typeof pluginEntry.development === \"string\" && pluginEntry.development.startsWith(\"local:\")) {\n    if (\"extends\" in pluginEntry) {\n      delete pluginEntry.extends;\n      changed = true;\n    }\n  }\n\n  changed = rewriteExtendsTarget(pluginEntry, `plugins.${pluginKey}`) || changed;\n\n  return changed;\n}\n\nfunction mergePluginConfigIntoRoot(\n  rootConfig: Record<string, unknown>,\n  pluginKey: string,\n  pluginConfig: Record<string, unknown>,\n): boolean {\n  let changed = false;\n\n  if (!rootConfig.plugins || typeof rootConfig.plugins !== \"object\") {\n    rootConfig.plugins = {};\n    changed = true;\n  }\n  const plugins = rootConfig.plugins as Record<string, unknown>;\n  if (!plugins[pluginKey] || typeof plugins[pluginKey] !== \"object\") {\n    plugins[pluginKey] = {};\n    changed = true;\n  }\n\n  const entry = plugins[pluginKey] as Record<string, unknown>;\n\n  const pluginData = extractPluginEntry(pluginConfig, pluginKey);\n\n  const apiData = getApiEntry(pluginConfig);\n\n  if (pluginData) {\n    for (const key of [\n      \"secrets\",\n      \"variables\",\n      \"routes\",\n      \"sidebar\",\n      \"production\",\n      \"integrity\",\n      \"proxy\",\n    ] as const) {\n      if (pluginData[key] !== undefined && entry[key] === undefined) {\n        entry[key] = pluginData[key];\n        changed = true;\n      }\n    }\n\n    if (typeof pluginData.development === \"string\" && pluginData.development.startsWith(\"local:\")) {\n      pluginData.development = `local:plugins/${pluginKey}`;\n    }\n    if (entry.development === undefined && pluginData.development !== undefined) {\n      entry.development = pluginData.development;\n      changed = true;\n    }\n  }\n\n  if (apiData) {\n    for (const key of [\n      \"production\",\n      \"integrity\",\n      \"proxy\",\n      \"variables\",\n      \"secrets\",\n      \"sidebar\",\n      \"routes\",\n    ] as const) {\n      if (apiData[key] !== undefined && entry[key] === undefined) {\n        entry[key] = apiData[key];\n        changed = true;\n      }\n    }\n  }\n\n  if (\"extends\" in entry) {\n    const extendsStr = typeof entry.extends === \"string\" ? entry.extends : undefined;\n    if (!extendsStr || extendsStr.includes(`#plugins.${pluginKey}`)) {\n      delete entry.extends;\n      changed = true;\n    }\n  }\n\n  if (\"name\" in entry) {\n    delete entry.name;\n    changed = true;\n  }\n\n  if (configHasTopLevelFields(pluginConfig, pluginKey)) {\n    if (entry.routes === undefined && Array.isArray(pluginConfig.routes)) {\n      entry.routes = pluginConfig.routes;\n      changed = true;\n    }\n    if (entry.sidebar === undefined && Array.isArray(pluginConfig.sidebar)) {\n      entry.sidebar = pluginConfig.sidebar;\n      changed = true;\n    }\n    const api = getApiEntry(pluginConfig);\n    if (api) {\n      if (entry.routes === undefined && Array.isArray(api.routes)) {\n        entry.routes = api.routes;\n        changed = true;\n      }\n      if (entry.sidebar === undefined && Array.isArray(api.sidebar)) {\n        entry.sidebar = api.sidebar;\n        changed = true;\n      }\n    }\n  }\n\n  return changed;\n}\n\nfunction extractPluginEntry(\n  pluginConfig: Record<string, unknown>,\n  pluginKey: string,\n): Record<string, unknown> | null {\n  if (\n    pluginConfig.plugins &&\n    typeof pluginConfig.plugins === \"object\" &&\n    (pluginConfig.plugins as Record<string, unknown>)[pluginKey] &&\n    typeof (pluginConfig.plugins as Record<string, unknown>)[pluginKey] === \"object\"\n  ) {\n    return (pluginConfig.plugins as Record<string, unknown>)[pluginKey] as Record<string, unknown>;\n  }\n\n  const fallback: Record<string, unknown> = {};\n  if (pluginConfig.sidebar !== undefined) {\n    fallback.sidebar = pluginConfig.sidebar;\n  }\n  if (pluginConfig.routes !== undefined) {\n    fallback.routes = pluginConfig.routes;\n  }\n  if (Object.keys(fallback).length > 0) {\n    return fallback;\n  }\n\n  return null;\n}\n\nfunction configHasTopLevelFields(\n  pluginConfig: Record<string, unknown>,\n  _pluginKey: string,\n): boolean {\n  return (\n    (pluginConfig.routes !== undefined && Array.isArray(pluginConfig.routes)) ||\n    (pluginConfig.sidebar !== undefined && Array.isArray(pluginConfig.sidebar)) ||\n    getApiEntry(pluginConfig) !== null\n  );\n}\n\nfunction getApiEntry(pluginConfig: Record<string, unknown>): Record<string, unknown> | null {\n  if (!pluginConfig.app || typeof pluginConfig.app !== \"object\") return null;\n  const app = pluginConfig.app as Record<string, unknown>;\n  if (!app.api || typeof app.api !== \"object\") return null;\n  return app.api as Record<string, unknown>;\n}\n\nexport async function migrateBosConfigFiles(projectDir: string): Promise<string[]> {\n  const migrated: string[] = [];\n  const rootConfigPath = join(projectDir, \"bos.config.json\");\n\n  if (existsSync(rootConfigPath)) {\n    const rootConfig = JSON.parse(readFileSync(rootConfigPath, \"utf-8\")) as Record<string, unknown>;\n    let rootChanged = migrateRootConfigTargets(rootConfig);\n\n    const pluginConfigPaths = await glob(\"plugins/*/bos.config.json\", {\n      cwd: projectDir,\n      nodir: true,\n      dot: false,\n      absolute: false,\n    });\n\n    for (const relativePath of pluginConfigPaths) {\n      const match = relativePath.match(/^plugins\\/([^/]+)\\/bos\\.config\\.json$/);\n      const pluginKey = match?.[1];\n      if (!pluginKey) continue;\n\n      const filePath = join(projectDir, relativePath);\n      try {\n        const pluginConfig = JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, unknown>;\n        rootChanged = mergePluginConfigIntoRoot(rootConfig, pluginKey, pluginConfig) || rootChanged;\n      } catch {}\n\n      try {\n        rmSync(filePath);\n        migrated.push(relativePath);\n      } catch {}\n    }\n\n    if (rootConfig.plugins && typeof rootConfig.plugins === \"object\") {\n      for (const pluginKey of Object.keys(rootConfig.plugins as Record<string, unknown>)) {\n        rootChanged = migratePluginProviderConfig(rootConfig, pluginKey) || rootChanged;\n      }\n    }\n\n    if (rootChanged || migrated.length > 0) {\n      await saveBosConfig(projectDir, rootConfig);\n      if (!migrated.includes(\"bos.config.json\")) {\n        migrated.push(\"bos.config.json\");\n      }\n    }\n  }\n\n  return migrated;\n}\n\nasync function loadParentPluginOptions(projectDir: string): Promise<{\n  localConfig: Record<string, unknown>;\n  parentPlugins: Record<string, unknown>;\n  newPluginKeys: string[];\n} | null> {\n  const configPath = join(projectDir, \"bos.config.json\");\n  if (!existsSync(configPath)) {\n    return null;\n  }\n\n  const localConfig = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n  const extendsRef = getExtendsRef(localConfig);\n  if (!extendsRef?.startsWith(\"bos://\")) {\n    return null;\n  }\n\n  const parsed = parseBosRef(extendsRef);\n  if (!parsed) {\n    return null;\n  }\n\n  let parentConfig: Record<string, unknown>;\n  try {\n    parentConfig = await fetchParentConfig(parsed.account, parsed.gateway);\n  } catch {\n    return null;\n  }\n\n  const parentPlugins =\n    parentConfig.plugins && typeof parentConfig.plugins === \"object\"\n      ? (parentConfig.plugins as Record<string, unknown>)\n      : {};\n  const localPlugins =\n    localConfig.plugins && typeof localConfig.plugins === \"object\"\n      ? (localConfig.plugins as Record<string, unknown>)\n      : {};\n\n  const newPluginKeys = Object.keys(parentPlugins).filter((key) => !(key in localPlugins));\n  return { localConfig, parentPlugins, newPluginKeys };\n}\n\nasync function addSelectedParentPlugins(projectDir: string): Promise<string[]> {\n  if (!process.stdin.isTTY || !process.stdout.isTTY) {\n    return [];\n  }\n\n  const pluginOptions = await loadParentPluginOptions(projectDir);\n  if (!pluginOptions || pluginOptions.newPluginKeys.length === 0) {\n    return [];\n  }\n\n  const selectedValue = await p.multiselect({\n    message: \"Select new plugins from parent:\",\n    options: pluginOptions.newPluginKeys.map((key) => ({ value: key, label: key })),\n    required: false,\n  });\n\n  if (p.isCancel(selectedValue)) {\n    process.exit(0);\n  }\n\n  const selected = selectedValue as string[];\n  if (selected.length === 0) {\n    return [];\n  }\n\n  const localPlugins =\n    pluginOptions.localConfig.plugins && typeof pluginOptions.localConfig.plugins === \"object\"\n      ? (pluginOptions.localConfig.plugins as Record<string, unknown>)\n      : {};\n  const nextPlugins = { ...localPlugins };\n  for (const key of selected) {\n    const parentPlugin = pluginOptions.parentPlugins[key];\n    if (parentPlugin && typeof parentPlugin === \"object\") {\n      const nextPlugin = structuredClone(parentPlugin as Record<string, unknown>);\n      rewriteExtendsTarget(nextPlugin, `plugins.${key}`);\n      nextPlugins[key] = nextPlugin;\n    } else if (typeof parentPlugin === \"string\") {\n      nextPlugins[key] = ensureTargetedRef(parentPlugin, `plugins.${key}`);\n    } else {\n      nextPlugins[key] = parentPlugin;\n    }\n  }\n\n  pluginOptions.localConfig.plugins = nextPlugins;\n  await saveBosConfig(projectDir, pluginOptions.localConfig);\n\n  return selected;\n}\n\nfunction readInstalledVersion(projectDir: string, packageName: string): string | undefined {\n  return readInstalledFrameworkVersion(projectDir, packageName);\n}\n\nfunction setCatalogRef(field: Record<string, string> | undefined, packageName: string): boolean {\n  if (!field || !(packageName in field)) return false;\n  if (field[packageName] === \"catalog:\" || field[packageName].startsWith(\"file:\")) return false;\n  field[packageName] = \"catalog:\";\n  return true;\n}\n\nasync function findWorkspacePackageJsons(projectDir: string): Promise<string[]> {\n  const rootPkgPath = join(projectDir, \"package.json\");\n  if (!existsSync(rootPkgPath)) return [];\n\n  const rootPkg = JSON.parse(readFileSync(rootPkgPath, \"utf-8\")) as Record<string, unknown>;\n  const workspaceConfig = rootPkg.workspaces as { packages?: string[] } | string[] | undefined;\n\n  const patterns: string[] = [];\n  if (Array.isArray(workspaceConfig)) {\n    patterns.push(...workspaceConfig);\n  } else if (workspaceConfig?.packages && Array.isArray(workspaceConfig.packages)) {\n    patterns.push(...workspaceConfig.packages);\n  }\n\n  if (patterns.length === 0) return [];\n\n  const pkgPaths: string[] = [];\n  for (const pattern of patterns) {\n    const matches = await glob(pattern, { cwd: projectDir, dot: false, absolute: false });\n    for (const match of matches) {\n      const pkgPath = join(projectDir, match, \"package.json\");\n      if (existsSync(pkgPath) && statSync(pkgPath).isFile()) {\n        pkgPaths.push(pkgPath);\n      }\n    }\n  }\n\n  return [...new Set(pkgPaths)];\n}\n\nexport async function migrateChildRootPackageJson(projectDir: string): Promise<boolean> {\n  const configPath = join(projectDir, \"bos.config.json\");\n  const pkgPath = join(projectDir, \"package.json\");\n  if (!existsSync(configPath) || !existsSync(pkgPath)) {\n    return false;\n  }\n\n  const config = readJsonFile<Record<string, unknown>>(configPath);\n  const extendsRef = getExtendsRef(config);\n  if (!extendsRef?.startsWith(\"bos://\")) {\n    return false;\n  }\n\n  const pkg = readJsonFile<Record<string, unknown>>(pkgPath);\n  let changed = false;\n\n  if (pkg.private !== true) {\n    pkg.private = true;\n    changed = true;\n  }\n  if (pkg.type !== \"module\") {\n    pkg.type = \"module\";\n    changed = true;\n  }\n  if (\"module\" in pkg) {\n    delete pkg.module;\n    changed = true;\n  }\n\n  const pluginPackageJsons = await glob(\"plugins/*/package.json\", {\n    cwd: projectDir,\n    nodir: true,\n    dot: false,\n    absolute: false,\n  });\n  const childScripts = buildChildRootScripts({\n    ui: existsSync(join(projectDir, \"ui\", \"package.json\")),\n    api: existsSync(join(projectDir, \"api\", \"package.json\")),\n    host: existsSync(join(projectDir, \"host\", \"package.json\")),\n    plugins: pluginPackageJsons.length > 0,\n  });\n\n  if (!pkg.scripts || typeof pkg.scripts !== \"object\") {\n    pkg.scripts = {};\n    changed = true;\n  }\n  const scripts = pkg.scripts as Record<string, string>;\n  for (const [key, value] of Object.entries(childScripts)) {\n    if (scripts[key] !== value) {\n      scripts[key] = value;\n      changed = true;\n    }\n  }\n  for (const obsoleteScript of [\"sync-catalog\", \"init\"]) {\n    if (obsoleteScript in scripts) {\n      delete scripts[obsoleteScript];\n      changed = true;\n    }\n  }\n\n  const workspaces = pkg.workspaces;\n  if (workspaces && typeof workspaces === \"object\") {\n    const workspaceConfig = workspaces as { packages?: string[] };\n    if (Array.isArray(workspaceConfig.packages)) {\n      const nextPackages = workspaceConfig.packages.filter(\n        (entry) => entry !== \"packages/everything-dev\" && entry !== \"packages/every-plugin\",\n      );\n      if (nextPackages.length !== workspaceConfig.packages.length) {\n        workspaceConfig.packages = nextPackages;\n        changed = true;\n      }\n    }\n  }\n\n  if (pkg.overrides && typeof pkg.overrides === \"object\") {\n    const overrides = pkg.overrides as Record<string, string>;\n    for (const packageName of FRAMEWORK_PACKAGES) {\n      const value = overrides[packageName];\n      if (typeof value === \"string\" && value.startsWith(\"file:packages/\")) {\n        delete overrides[packageName];\n        changed = true;\n      }\n    }\n    if (Object.keys(overrides).length === 0) {\n      delete pkg.overrides;\n      changed = true;\n    }\n  }\n\n  if (ensureAuthCoreCatalogRef(pkg)) {\n    changed = true;\n  }\n\n  const workspacePackageJsons = await findWorkspacePackageJsons(projectDir);\n  for (const workspacePkgPath of workspacePackageJsons) {\n    if (updatePackageFileAuthCoreRef(workspacePkgPath)) {\n      changed = true;\n    }\n  }\n\n  if (changed) {\n    writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n  }\n\n  return changed;\n}\n\nfunction buildChangelogUrl(\n  oldVersion: string | undefined,\n  newVersion: string,\n  repository: string | undefined,\n): string | undefined {\n  const fromVersion = extractSemver(oldVersion);\n  const toVersion = extractSemver(newVersion);\n  if (!fromVersion || !toVersion || fromVersion === toVersion) return undefined;\n\n  const repoUrl = repository;\n  if (!repoUrl) return undefined;\n\n  const githubMatch = repoUrl.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n  if (!githubMatch) return undefined;\n\n  const [, owner, repo] = githubMatch;\n  return `https://github.com/${owner}/${repo}/compare/v${fromVersion}...v${toVersion}`;\n}\n\nasync function rewriteLegacyUiImports(projectDir: string): Promise<string[]> {\n  const files = await glob(\"ui/src/**/*.{ts,tsx}\", {\n    cwd: projectDir,\n    nodir: true,\n    dot: false,\n    absolute: false,\n  });\n  const migrated: string[] = [];\n\n  for (const file of files) {\n    const filePath = join(projectDir, file);\n    const original = readFileSync(filePath, \"utf-8\");\n    let next = original;\n\n    for (const [from, to] of LEGACY_UI_IMPORT_REWRITES) {\n      next = next.replaceAll(from, to);\n    }\n\n    if (next !== original) {\n      writeFileSync(filePath, next);\n      migrated.push(file);\n    }\n  }\n\n  return migrated;\n}\n\nexport async function upgradeTemplate(\n  projectDir: string,\n  options: UpgradeOptions,\n): Promise<UpgradeResult> {\n  const timings: PhaseTiming[] = [];\n  const pkgPath = join(projectDir, \"package.json\");\n  if (!existsSync(pkgPath)) {\n    return {\n      status: \"error\",\n      packages: [],\n      timings,\n      error: \"No package.json found in current directory\",\n    };\n  }\n\n  const parentSource = await readExtendedRootSource(projectDir);\n  const sourceRootCatalog = parentSource.catalog;\n  const inheritedCatalogPackageNames = Object.keys(sourceRootCatalog);\n  const currentRootCatalog = readRootPackageJson(projectDir) as {\n    workspaces?: { catalog?: Record<string, string> };\n  };\n  const currentCatalogEntries = currentRootCatalog.workspaces?.catalog ?? {};\n  const workspacePkgPaths = await findWorkspacePackageJsons(projectDir);\n  const hasCatalogRefRewrites =\n    inheritedCatalogPackageNames.length > 0 &&\n    (packageObjectNeedsCatalogRefs(readRootPackageJson(projectDir), inheritedCatalogPackageNames) ||\n      workspacePkgPaths.some((pkgPath) =>\n        packageFileNeedsCatalogRefs(pkgPath, inheritedCatalogPackageNames),\n      ));\n  const hasAuthCoreRefRewrites =\n    packageObjectNeedsAuthCoreCatalogRef(readRootPackageJson(projectDir)) ||\n    workspacePkgPaths.some((pkgPath) =>\n      packageObjectNeedsAuthCoreCatalogRef(readJsonFile<Record<string, unknown>>(pkgPath)),\n    );\n\n  const { packages, catalogVersionUpdates } = await timePhase(\n    timings,\n    \"check package versions\",\n    async () => {\n      const nextPackages: UpgradeResult[\"packages\"] = [];\n\n      for (const name of FRAMEWORK_PACKAGES) {\n        const current = readCurrentPackageSpecifier(projectDir, name);\n        const target = sourceRootCatalog[name] ?? current ?? \"unknown\";\n\n        nextPackages.push({ name, from: current, to: target });\n      }\n\n      const nextCatalogVersionUpdates: Array<{\n        name: string;\n        from: string | undefined;\n        to: string;\n      }> = [];\n      for (const [name, targetVersion] of Object.entries(sourceRootCatalog)) {\n        if (FRAMEWORK_PACKAGES.includes(name)) continue;\n\n        const currentVersion = currentCatalogEntries[name];\n        if (currentVersion === targetVersion) continue;\n        nextCatalogVersionUpdates.push({ name, from: currentVersion, to: targetVersion });\n      }\n\n      return { packages: nextPackages, catalogVersionUpdates: nextCatalogVersionUpdates };\n    },\n  );\n\n  const hasFrameworkUpdates = packages.some((p) => p.from !== p.to && p.from !== undefined);\n  const hasCatalogUpdates = catalogVersionUpdates.length > 0;\n  const hasUpdates =\n    hasFrameworkUpdates || hasCatalogUpdates || hasCatalogRefRewrites || hasAuthCoreRefRewrites;\n\n  if (options.dryRun) {\n    let changelogUrl: string | undefined;\n    const pluginOptions = options.noSync\n      ? null\n      : await timePhase(timings, \"discover parent plugins\", () =>\n          loadParentPluginOptions(projectDir),\n        );\n    if (hasUpdates) {\n      const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n      if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n        changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository);\n      }\n    }\n\n    return {\n      status: \"dry-run\",\n      packages: [\n        ...packages,\n        ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n      ],\n      availablePlugins: pluginOptions?.newPluginKeys,\n      timings,\n      changelogUrl,\n    };\n  }\n\n  await timePhase(timings, \"apply package updates\", async () => {\n    if (inheritedCatalogPackageNames.length > 0) {\n      syncRootCatalogWithParent(projectDir, sourceRootCatalog);\n    }\n\n    if (inheritedCatalogPackageNames.length > 0) {\n      for (const pkgPath of workspacePkgPaths) {\n        updatePackageFileCatalogRefs(pkgPath, inheritedCatalogPackageNames);\n      }\n    }\n  });\n\n  const migratedBosConfigs = await timePhase(timings, \"migrate bos configs\", () =>\n    migrateBosConfigFiles(projectDir),\n  );\n  const migratedRootPackageJson = await timePhase(timings, \"migrate root package\", () =>\n    migrateChildRootPackageJson(projectDir),\n  );\n\n  let syncResult: UpgradeResult[\"sync\"];\n  let addedPlugins: string[] = [];\n  if (!options.noSync) {\n    addedPlugins = await timePhase(timings, \"discover parent plugins\", async () => {\n      if (options.dryRun) return [];\n      return addSelectedParentPlugins(projectDir);\n    });\n\n    syncResult = await timePhase(timings, \"sync template\", () =>\n      syncTemplate(projectDir, {\n        dryRun: false,\n        noInstall: true,\n      }),\n    );\n\n    if (inheritedCatalogPackageNames.length > 0) {\n      syncRootCatalogWithParent(projectDir, sourceRootCatalog);\n    }\n  }\n\n  const sharedSync = await timePhase(timings, \"sync shared ui\", async () => {\n    const configResult = await loadResolvedConfig({ cwd: projectDir });\n    if (!configResult) {\n      throw new Error(\"No bos.config.json found in current directory\");\n    }\n\n    return syncAndGenerateSharedUi({\n      configDir: projectDir,\n      hostMode: \"local\",\n      bosConfig: configResult.config,\n    });\n  });\n\n  if ((hasUpdates || addedPlugins.length > 0 || sharedSync.catalogChanged) && !options.noInstall) {\n    await timePhase(timings, \"install dependencies\", () => runBunInstallForUpgrade(projectDir));\n    await timePhase(timings, \"generate types\", () => runTypesGen(projectDir));\n  }\n\n  const migratedFiles = await timePhase(timings, \"clean obsolete files\", async () => {\n    const nextMigratedFiles = [\n      ...migratedBosConfigs,\n      ...(migratedRootPackageJson ? [\"package.json\"] : []),\n      ...(await rewriteLegacyUiImports(projectDir)),\n    ];\n    for (const file of OBSOLETE_FILES) {\n      const filePath = join(projectDir, file);\n      if (existsSync(filePath)) {\n        rmSync(filePath);\n        nextMigratedFiles.push(file);\n      }\n    }\n    return nextMigratedFiles;\n  });\n\n  let changelogUrl: string | undefined;\n  const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n  if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n    changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository);\n  }\n\n  return {\n    status: \"upgraded\",\n    packages: [\n      ...packages,\n      ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n    ],\n    sync: syncResult,\n    migrated: migratedFiles.length > 0 ? migratedFiles : undefined,\n    selectedPlugins: addedPlugins.length > 0 ? addedPlugins : undefined,\n    timings,\n    changelogUrl,\n  };\n}\n"],"mappings":"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"}