everything-dev 1.51.7 → 1.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/api-contract.cjs +66 -16
  2. package/dist/api-contract.cjs.map +1 -1
  3. package/dist/api-contract.mjs +65 -17
  4. package/dist/api-contract.mjs.map +1 -1
  5. package/dist/app.cjs +1 -1
  6. package/dist/app.cjs.map +1 -1
  7. package/dist/app.mjs +1 -1
  8. package/dist/app.mjs.map +1 -1
  9. package/dist/cli/infra.cjs +0 -67
  10. package/dist/cli/infra.cjs.map +1 -1
  11. package/dist/cli/infra.mjs +1 -65
  12. package/dist/cli/infra.mjs.map +1 -1
  13. package/dist/cli/init.cjs +76 -52
  14. package/dist/cli/init.cjs.map +1 -1
  15. package/dist/cli/init.d.cts +15 -7
  16. package/dist/cli/init.d.cts.map +1 -1
  17. package/dist/cli/init.d.mts +15 -7
  18. package/dist/cli/init.d.mts.map +1 -1
  19. package/dist/cli/init.mjs +70 -47
  20. package/dist/cli/init.mjs.map +1 -1
  21. package/dist/cli/sync.cjs +34 -5
  22. package/dist/cli/sync.cjs.map +1 -1
  23. package/dist/cli/sync.mjs +35 -6
  24. package/dist/cli/sync.mjs.map +1 -1
  25. package/dist/cli/upgrade.cjs +151 -93
  26. package/dist/cli/upgrade.cjs.map +1 -1
  27. package/dist/cli/upgrade.mjs +138 -80
  28. package/dist/cli/upgrade.mjs.map +1 -1
  29. package/dist/cli/utils/helpers.cjs +25 -0
  30. package/dist/cli/utils/helpers.cjs.map +1 -0
  31. package/dist/cli/utils/helpers.mjs +23 -0
  32. package/dist/cli/utils/helpers.mjs.map +1 -0
  33. package/dist/cli.cjs +84 -72
  34. package/dist/cli.cjs.map +1 -1
  35. package/dist/cli.mjs +84 -72
  36. package/dist/cli.mjs.map +1 -1
  37. package/dist/code-artifacts.cjs +1 -1
  38. package/dist/code-artifacts.mjs +1 -1
  39. package/dist/config.cjs +47 -5
  40. package/dist/config.cjs.map +1 -1
  41. package/dist/config.d.cts +1 -1
  42. package/dist/config.d.cts.map +1 -1
  43. package/dist/config.d.mts +1 -1
  44. package/dist/config.d.mts.map +1 -1
  45. package/dist/config.mjs +47 -5
  46. package/dist/config.mjs.map +1 -1
  47. package/dist/contract.cjs +9 -4
  48. package/dist/contract.cjs.map +1 -1
  49. package/dist/contract.d.cts +42 -24
  50. package/dist/contract.d.cts.map +1 -1
  51. package/dist/contract.d.mts +42 -24
  52. package/dist/contract.d.mts.map +1 -1
  53. package/dist/contract.meta.cjs +2 -1
  54. package/dist/contract.meta.cjs.map +1 -1
  55. package/dist/contract.meta.d.cts +3 -0
  56. package/dist/contract.meta.d.mts +3 -0
  57. package/dist/contract.meta.mjs +2 -1
  58. package/dist/contract.meta.mjs.map +1 -1
  59. package/dist/contract.mjs +9 -4
  60. package/dist/contract.mjs.map +1 -1
  61. package/dist/dag.cjs +177 -0
  62. package/dist/dag.cjs.map +1 -0
  63. package/dist/dag.d.cts +24 -0
  64. package/dist/dag.d.cts.map +1 -0
  65. package/dist/dag.d.mts +24 -0
  66. package/dist/dag.d.mts.map +1 -0
  67. package/dist/dag.mjs +168 -0
  68. package/dist/dag.mjs.map +1 -0
  69. package/dist/index.cjs +2 -0
  70. package/dist/index.d.cts +2 -2
  71. package/dist/index.d.mts +2 -2
  72. package/dist/index.mjs +2 -2
  73. package/dist/infra/planner.cjs +1 -1
  74. package/dist/infra/planner.mjs +1 -1
  75. package/dist/merge.cjs +1 -1
  76. package/dist/merge.cjs.map +1 -1
  77. package/dist/merge.mjs +1 -1
  78. package/dist/merge.mjs.map +1 -1
  79. package/dist/near-cli.cjs +1 -1
  80. package/dist/near-cli.mjs +1 -1
  81. package/dist/orchestrator.cjs +1 -1
  82. package/dist/orchestrator.cjs.map +1 -1
  83. package/dist/orchestrator.mjs +1 -1
  84. package/dist/orchestrator.mjs.map +1 -1
  85. package/dist/plugin.cjs +28 -30
  86. package/dist/plugin.cjs.map +1 -1
  87. package/dist/plugin.d.cts +67 -11
  88. package/dist/plugin.d.cts.map +1 -1
  89. package/dist/plugin.d.mts +67 -11
  90. package/dist/plugin.d.mts.map +1 -1
  91. package/dist/plugin.mjs +30 -32
  92. package/dist/plugin.mjs.map +1 -1
  93. package/dist/types.cjs +52 -9
  94. package/dist/types.cjs.map +1 -1
  95. package/dist/types.d.cts +131 -3
  96. package/dist/types.d.cts.map +1 -1
  97. package/dist/types.d.mts +131 -3
  98. package/dist/types.d.mts.map +1 -1
  99. package/dist/types.mjs +51 -10
  100. package/dist/types.mjs.map +1 -1
  101. package/package.json +8 -3
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.mjs","names":[],"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 { syncResolvedSharedDeps } from \"../shared-deps\";\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/auth-utils\"', 'from \"@/lib/auth\"'],\n [\"from '@/lib/auth-utils'\", \"from '@/lib/auth'\"],\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 \"api/src/lib/plugins.ts\",\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/lib/auth-utils.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/publish.yml\",\n \".github/workflows/release-sync.yml\",\n \"api/src/db/migrator.ts\",\n \"api/src/db/load-migrations.ts\",\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:\") || value.startsWith(\"link:\")) {\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:\") && !value.startsWith(\"link:\")) {\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 \"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 \"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 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 }\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 if (pluginConfig.routes !== undefined) {\n return { routes: pluginConfig.routes };\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 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 (e) {\n console.warn(`[Upgrade] Failed to parse plugin config at ${filePath}: ${e}`);\n }\n\n try {\n rmSync(filePath);\n migrated.push(relativePath);\n } catch (e) {\n console.warn(`[Upgrade] Failed to remove migrated plugin config at ${filePath}: ${e}`);\n }\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\nconst LEGACY_DIST_IMPORT_REWRITES = [\n ['from \"everything-dev/dist/', 'from \"everything-dev/'],\n [\"from 'everything-dev/dist/\", \"from 'everything-dev/\"],\n] as const;\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction balancedParenEnd(source: string, openIdx: number): number {\n let depth = 1;\n let i = openIdx;\n while (i < source.length) {\n const ch = source[i];\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0) return i;\n }\n i++;\n }\n return -1;\n}\n\nfunction deriveTagFromLayerExpr(layerExpr: string): string | null {\n const m = layerExpr.match(/^\\s*([A-Z]\\w*)/);\n if (!m) return null;\n const name = m[1];\n if (name.endsWith(\"Live\")) return `${name.slice(0, -4)}Tag`;\n if (name.endsWith(\"Layer\")) return `${name.slice(0, -5)}Tag`;\n return null;\n}\n\ntype PipeProvideCall = {\n argStart: number;\n endIdx: number;\n dotIdx: number;\n pipeCloseEnd: number;\n};\n\nfunction findAllPipeEffectProvideCalls(source: string): PipeProvideCall[] {\n const out: PipeProvideCall[] = [];\n const needle = \"Effect.provide(\";\n let searchFrom = 0;\n while (true) {\n const provideIdx = source.indexOf(needle, searchFrom);\n if (provideIdx === -1) break;\n const argStart = provideIdx + needle.length;\n const endIdx = balancedParenEnd(source, argStart);\n if (endIdx === -1) {\n searchFrom = argStart;\n continue;\n }\n let p = provideIdx - 1;\n while (p >= 0 && /\\s/.test(source[p])) p--;\n if (p < 0 || source[p] !== \"(\") {\n searchFrom = endIdx + 1;\n continue;\n }\n p--;\n const pipeWord = \".pipe\";\n if (p - pipeWord.length + 1 < 0 || source.slice(p - pipeWord.length + 1, p + 1) !== pipeWord) {\n searchFrom = endIdx + 1;\n continue;\n }\n const dotIdx = p - pipeWord.length + 1;\n let q = endIdx + 1;\n while (q < source.length && /\\s/.test(source[q])) q++;\n if (q < source.length && source[q] === \",\") q++;\n while (q < source.length && /\\s/.test(source[q])) q++;\n if (q >= source.length || source[q] !== \")\") {\n searchFrom = endIdx + 1;\n continue;\n }\n out.push({ argStart, endIdx, dotIdx, pipeCloseEnd: q + 1 });\n searchFrom = q + 1;\n }\n return out;\n}\n\nfunction rewritePipeEffectProvideForm(source: string, relPath: string): string {\n const calls = findAllPipeEffectProvideCalls(source);\n if (calls.length === 0) return source;\n\n let result = source;\n\n for (let k = calls.length - 1; k >= 0; k--) {\n const call = calls[k];\n const layerExpr = result.slice(call.argStart, call.endIdx).trim();\n const tagName = deriveTagFromLayerExpr(layerExpr);\n if (!tagName) {\n console.warn(\n `[Upgrade] ${relPath}: found .pipe(Effect.provide(${layerExpr})) but could not derive a tag name — skipping. Migrate manually to tools.buildService(<Tag>, ${layerExpr}).`,\n );\n continue;\n }\n const tagUseRe = new RegExp(`(yield\\\\*\\\\s+)${escapeRegex(tagName)}(\\\\s*;?)`, \"g\");\n const tagMatches = [...result.matchAll(tagUseRe)];\n if (tagMatches.length !== 1) {\n console.warn(\n `[Upgrade] ${relPath}: found .pipe(Effect.provide(${layerExpr})) expecting a single \\`yield* ${tagName}\\`, but found ${tagMatches.length} — skipping. Migrate manually.`,\n );\n continue;\n }\n const tm = tagMatches[0];\n const tagStart = tm.index ?? -1;\n if (tagStart < 0) continue;\n const tagLen = tm[0].length;\n const replacement = `${tm[1]}tools.buildService(${tagName}, ${layerExpr})${tm[2]}`;\n if (tagStart < call.dotIdx) {\n result =\n result.slice(0, tagStart) +\n replacement +\n result.slice(tagStart + tagLen, call.dotIdx) +\n result.slice(call.pipeCloseEnd);\n } else {\n result =\n result.slice(0, call.dotIdx) +\n result.slice(call.pipeCloseEnd, tagStart) +\n replacement +\n result.slice(tagStart + tagLen);\n }\n }\n\n return result;\n}\n\nexport async function rewriteLegacyPluginScopedLayerPatterns(\n projectDir: string,\n): Promise<string[]> {\n const files = await glob([\"plugins/*/src/index.ts\", \"api/src/index.ts\"], {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n\n if (files.length === 0) return [];\n\n const migrated: string[] = [];\n const effectProvidePattern = /\\byield\\*\\s*Effect\\.provide\\(/g;\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 // Rewrite yield* Effect.provide(Tag, LayerExpr) → yield* tools.buildService(Tag, LayerExpr)\n next = next.replaceAll(effectProvidePattern, \"yield* tools.buildService(\");\n\n // Rewrite the .pipe(Effect.provide(<LayerExpr>)) form: move <LayerExpr> into a\n // tools.buildService(<Tag>, <LayerExpr>) call replacing the bare `yield* <Tag>`\n // inside the generator, and drop the trailing .pipe(Effect.provide(...)).\n next = rewritePipeEffectProvideForm(next, file);\n\n // Add tools as third argument to initialize if it only has (config) or (config, plugins)\n const hasEffectProvideOrServiceBuild = next.includes(\"tools.buildService(\");\n\n if (hasEffectProvideOrServiceBuild) {\n // Rewrite initialize: (config, plugins) => or initialize: (config) =>\n // to include tools\n next = next.replace(\n /(initialize:\\s*)\\((\\w+)(?:,\\s*(\\w+))?\\s*\\)\\s*=>/g,\n (_match, prefix: string, p1: string, p2: string | undefined) => {\n if (p2) {\n return `${prefix}(${p1}, ${p2}, tools) =>`;\n }\n return `${prefix}(${p1}, _plugins, tools) =>`;\n },\n );\n }\n\n if (next !== original) {\n writeFileSync(filePath, next);\n migrated.push(file);\n }\n }\n\n return migrated;\n}\n\nasync function rewriteLegacyDistImports(projectDir: string): Promise<string[]> {\n const files = await glob(\"**/*.{ts,tsx,js,jsx,mjs,cjs}\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n ignore: [\"node_modules/**\", \"dist/**\"],\n });\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_DIST_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 deps\", 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 syncResolvedSharedDeps({\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 ...(await rewriteLegacyPluginScopedLayerPatterns(projectDir)),\n ...(await rewriteLegacyDistImports(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\n const legacyPluginDbFiles = await glob(\"plugins/*/src/db/{migrator,load-migrations}.ts\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n for (const file of legacyPluginDbFiles) {\n rmSync(join(projectDir, file));\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":";;;;;;;;;;;;;;;AAqBA,MAAM,qBAAqB,CAAC,kBAAkB,cAAc;AAC5D,MAAM,oBAAoB;AAC1B,MAAM,6BAA6B;CACjC;CACA;CACA;CACA;AACF;AACA,MAAM,4BAA4B;CAChC,CAAC,mBAAiB,gBAAc;CAChC,CAAC,iBAAiB,cAAc;CAChC,CAAC,6BAA2B,qBAAmB;CAC/C,CAAC,2BAA2B,mBAAmB;CAC/C,CAAC,iCAA+B,gBAAc;CAC9C,CAAC,+BAA+B,cAAc;CAC9C,CAAC,6BAA2B,gBAAc;CAC1C,CAAC,2BAA2B,cAAc;AAC5C;AACA,MAAM,iBAAiB;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAQA,SAAS,cAAc,OAA0C;CAC/D,IAAI,CAAC,OAAO,OAAO;CAEnB,OADc,MAAM,MAAM,mCACf,CAAC,GAAG,MAAM;AACvB;AAEA,SAAS,aAAgB,UAAqB;CAC5C,OAAO,KAAK,MAAM,aAAa,UAAU,OAAO,CAAC;AACnD;AAEA,SAAS,oBAAoB,YAA6C;CACxE,OAAO,aAAsC,KAAK,YAAY,cAAc,CAAC;AAC/E;AAEA,SAAS,qBAAqB,YAAoB,aAAyC;CAIzF,OAHY,oBAAoB,UAGvB,CAAC,CAAC,YAAY,UAAU;AACnC;AAEA,SAAS,4BAA4B,YAAoB,aAAyC;CAChG,MAAM,MAAM,oBAAoB,UAAU;CAE1C,KAAK,MAAM,aAAa;EAAC;EAAgB;EAAmB;CAAkB,GAAY;EAExF,MAAM,QADQ,IAAI,UACC,GAAG;EACtB,IAAI,CAAC,OAAO;EAEZ,IAAI,UAAU,YACZ,OACE,qBAAqB,YAAY,WAAW,KAC5C,qBAAqB,YAAY,WAAW;EAIhD,IAAI,MAAM,WAAW,YAAY,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW,OAAO,GACzF,OAAO,qBAAqB,YAAY,WAAW;EAGrD,OAAO;CACT;CAEA,OACE,qBAAqB,YAAY,WAAW,KAAK,qBAAqB,YAAY,WAAW;AAEjG;AAEA,SAAS,eACP,OACA,cACS;CACT,IAAI,CAAC,OAAO,OAAO;CAEnB,IAAI,WAAW;CACf,KAAK,MAAM,eAAe,cACxB,IAAI,cAAc,OAAO,WAAW,GAClC,WAAW;CAIf,OAAO;AACT;AAEA,SAAS,6BACP,KACA,cACS;CACT,IAAI,WAAW;CAEf,KAAK,MAAM,aAAa;EAAC;EAAgB;EAAmB;CAAkB,GAAY;EACxF,MAAM,QAAQ,IAAI;EAClB,IAAI,eAAe,OAAO,YAAY,GACpC,WAAW;CAEf;CAEA,OAAO;AACT;AAEA,SAAS,kCACP,KACA,cACoC;CACpC,KAAK,MAAM,aAAa;EAAC;EAAgB;EAAmB;CAAkB,GAAY;EACxF,MAAM,QAAQ,IAAI;EAClB,IAAI,CAAC,OAAO;EACZ,IAAI,aAAa,MAAM,gBAAgB,OAAO,MAAM,iBAAiB,QAAQ,GAC3E,OAAO;CAEX;AAGF;AAEA,SAAS,qCAAqC,KAAuC;CAEnF,IAAI,CADgB,kCAAkC,KAAK,0BAC5C,GAAG,OAAO;CAEzB,KAAK,MAAM,aAAa;EAAC;EAAgB;EAAmB;CAAkB,GAE5E,IADc,IAAI,UACT,GAAG,oBAAoB,OAAO;CAGzC,OAAO;AACT;AAEA,SAAS,yBAAyB,KAAuC;CACvE,IAAI,CAAC,qCAAqC,GAAG,GAAG,OAAO;CAEvD,MAAM,cAAc,kCAAkC,KAAK,0BAA0B;CACrF,IAAI,CAAC,aAAa,OAAO;CAEzB,YAAY,qBAAqB;CACjC,OAAO;AACT;AAEA,SAAS,8BACP,KACA,cACS;CACT,KAAK,MAAM,aAAa;EAAC;EAAgB;EAAmB;CAAkB,GAAY;EACxF,MAAM,QAAQ,IAAI;EAClB,IAAI,CAAC,OAAO;EAEZ,KAAK,MAAM,eAAe,cAAc;GACtC,MAAM,QAAQ,MAAM;GACpB,IAAI,CAAC,OAAO;GACZ,IAAI,UAAU,cAAc,CAAC,MAAM,WAAW,OAAO,KAAK,CAAC,MAAM,WAAW,OAAO,GACjF,OAAO;EAEX;CACF;CAEA,OAAO;AACT;AAEA,SAAS,4BACP,UACA,cACS;CACT,OAAO,8BACL,aAAsC,QAAQ,GAC9C,YACF;AACF;AAEA,SAAS,6BACP,UACA,cACS;CACT,MAAM,MAAM,aAAsC,QAAQ;CAC1D,MAAM,WAAW,6BAA6B,KAAK,YAAY;CAE/D,IAAI,UACF,cAAc,UAAU,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,GAAG;CAG7D,OAAO;AACT;AAEA,SAAS,6BAA6B,UAA2B;CAC/D,MAAM,MAAM,aAAsC,QAAQ;CAC1D,MAAM,WAAW,yBAAyB,GAAG;CAE7C,IAAI,UACF,cAAc,UAAU,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,GAAG;CAG7D,OAAO;AACT;AAEA,SAAS,0BACP,YACA,eACS;CACT,MAAM,UAAU,KAAK,YAAY,cAAc;CAC/C,MAAM,MAAM,aAAsC,OAAO;CACzD,IAAI,WAAW,6BAA6B,KAAK,OAAO,KAAK,aAAa,CAAC;CAE3E,IAAI,CAAC,IAAI,cAAc,OAAO,IAAI,eAAe,UAAU;EACzD,IAAI,aAAa;GAAE,UAAU,CAAC;GAAG,SAAS,CAAC;EAAE;EAC7C,WAAW;CACb;CAEA,MAAM,aAAa,IAAI;CACvB,IAAI,CAAC,WAAW,WAAW,OAAO,WAAW,YAAY,UAAU;EACjE,WAAW,UAAU,CAAC;EACtB,WAAW;CACb;CAEA,KAAK,MAAM,CAAC,aAAa,YAAY,OAAO,QAAQ,aAAa,GAC/D,IAAI,WAAW,QAAQ,iBAAiB,SAAS;EAC/C,WAAW,QAAQ,eAAe;EAClC,WAAW;CACb;CAGF,IAAI,UACF,cAAc,SAAS,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,GAAG;CAG5D,OAAO;AACT;AAEA,eAAe,uBAAuB,YAAiD;CACrF,MAAM,aAAa,KAAK,YAAY,iBAAiB;CACrD,IAAI,CAAC,WAAW,UAAU,GACxB,OAAO;EAAE,SAAS,CAAC;EAAG,cAAc,CAAC;CAAE;CAGzC,MAAM,cAAc,KAAK,MAAM,aAAa,YAAY,OAAO,CAAC;CAChE,IAAI,aAAa,cAAc,WAAW;CAC1C,IAAI,CAAC,YAAY,WAAW,QAAQ,GAClC,OAAO;EACL,SAAS,CAAC;EACV,YAAY,OAAO,YAAY,eAAe,WAAW,YAAY,aAAa;EAClF,cAAc,CAAC;CACjB;CAGF,MAAM,eAAyB,CAAC;CAChC,MAAM,0BAAU,IAAI,IAAY;CAChC,IAAI,aAAa,OAAO,YAAY,eAAe,WAAW,YAAY,aAAa;CACvF,IAAI,UAAU;CAEd,OAAO,YAAY,WAAW,QAAQ,GAAG;EACvC,IAAI,QAAQ,IAAI,UAAU,GACxB,MAAM,IAAI,MAAM,6DAA6D,YAAY;EAE3F,QAAQ,IAAI,UAAU;EACtB,aAAa,KAAK,UAAU;EAE5B,MAAM,SAAS,YAAY,UAAU;EACrC,IAAI,CAAC,QACH;EAGF,UAAU;EAEV,IAAI;EACJ,IAAI;GACF,eAAgB,MAAM,kBAAkB,OAAO,SAAS,OAAO,OAAO;EAIxE,QAAQ;GACN;EACF;EAEA,IAAI,OAAO,aAAa,eAAe,UACrC,aAAa,aAAa;EAG5B,MAAM,iBAAiB,cAAc,YAAY;EACjD,IAAI,CAAC,gBAAgB,WAAW,QAAQ,GACtC;EAGF,aAAa;CACf;CAEA,MAAM,SAAS,YAAY,OAAO;CAClC,IAAI,CAAC,QACH,OAAO;EAAE,SAAS,CAAC;EAAG;EAAY;CAAa;CAGjD,MAAM,SAAS,MAAM,0BAA0B;EAC7C,gBAAgB,OAAO;EACvB,gBAAgB,OAAO;CACzB,CAAC;CAED,OAAO;EACL,SAAS,OAAO;EAChB,YAAY,OAAO,cAAc;EACjC,cAAc,OAAO,aAAa,SAAS,IAAI,OAAO,eAAe;CACvE;AACF;AAEA,SAAS,cAAc,QAAqD;CAC1E,IAAI,OAAO,OAAO,YAAY,UAC5B,OAAO,OAAO;CAGhB,IAAI,OAAO,WAAW,OAAO,OAAO,YAAY,UAC9C,OAAO,kBAAkB,OAAO,SAAmC,YAAY;AAInF;AAEA,SAAS,YAAY,KAA0D;CAC7E,MAAM,QAAQ,IAAI,MAAM,yBAAyB;CACjD,IAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,IAAI,OAAO;CACrC,OAAO;EAAE,SAAS,MAAM;EAAI,SAAS,MAAM;CAAG;AAChD;AAEA,SAAS,iBAAiB,KAAyD;CACjF,MAAM,YAAY,IAAI,QAAQ,GAAG;CACjC,IAAI,cAAc,IAChB,OAAO,EAAE,WAAW,IAAI;CAE1B,OAAO;EACL,WAAW,IAAI,MAAM,GAAG,SAAS;EACjC,YAAY,IAAI,MAAM,YAAY,CAAC,KAAK;CAC1C;AACF;AAEA,SAAS,kBAAkB,KAAa,YAA4B;CAClE,MAAM,SAAS,iBAAiB,GAAG;CACnC,IAAI,OAAO,YAAY,OAAO;CAC9B,OAAO,GAAG,OAAO,UAAU,GAAG;AAChC;AAEA,SAAS,qBACP,OACA,YACS;CACT,IAAI,CAAC,OAAO,SAAS,OAAO;CAE5B,IAAI,OAAO,MAAM,YAAY,UAAU;EACrC,MAAM,OAAO,kBAAkB,MAAM,SAAS,UAAU;EACxD,IAAI,SAAS,MAAM,SAAS,OAAO;EACnC,MAAM,UAAU;EAChB,OAAO;CACT;CAEA,IAAI,OAAO,MAAM,YAAY,UAAU;EACrC,IAAI,UAAU;EACd,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,OAAkC,GAAG;GACnF,IAAI,OAAO,UAAU,UAAU;GAC/B,MAAM,OAAO,kBAAkB,OAAO,UAAU;GAChD,IAAI,SAAS,OAAO;IAClB,AAAC,MAAM,QAAoC,OAAO;IAClD,UAAU;GACZ;EACF;EACA,OAAO;CACT;CAEA,OAAO;AACT;AAEA,SAAS,yBAAyB,QAA0C;CAC1E,IAAI,UAAU;CACd,MAAM,MACJ,OAAO,OAAO,OAAO,OAAO,QAAQ,WAC/B,OAAO,MACR;CAEN,IAAI,KAAK,OAAO,OAAO,IAAI,QAAQ,UACjC,UAAU,qBAAqB,IAAI,KAAgC,SAAS,KAAK;CAEnF,IAAI,KAAK,QAAQ,OAAO,IAAI,SAAS,UACnC,UAAU,qBAAqB,IAAI,MAAiC,UAAU,KAAK;CAGrF,IAAI,OAAO,WAAW,OAAO,OAAO,YAAY,UAC9C,KAAK,MAAM,CAAC,WAAW,gBAAgB,OAAO,QAC5C,OAAO,OACT,GAAG;EACD,IAAI,OAAO,gBAAgB,UAAU;GACnC,MAAM,OAAO,kBAAkB,aAAa,WAAW,WAAW;GAClE,IAAI,SAAS,aAAa;IACxB,AAAC,OAAO,QAAoC,aAAa;IACzD,UAAU;GACZ;GACA;EACF;EACA,IAAI,CAAC,eAAe,OAAO,gBAAgB,UAAU;EACrD,UACE,qBAAqB,aAAwC,WAAW,WAAW,KACnF;CACJ;CAGF,OAAO;AACT;AAEA,SAAS,4BAA4B,QAAiC,WAA4B;CAChG,IAAI,UAAU;CACd,IAAI,CAAC,OAAO,WAAW,OAAO,OAAO,YAAY,UAC/C,OAAO;CAIT,MAAM,QADU,OAAO,QACD;CACtB,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO;CAEhD,MAAM,cAAc;CAEpB,IAAI,UAAU,aAAa;EACzB,OAAO,YAAY;EACnB,UAAU;CACZ;CAEA,IAAI,OAAO,YAAY,gBAAgB,YAAY,YAAY,YAAY,WAAW,QAAQ,GAC5F;MAAI,aAAa,aAAa;GAC5B,OAAO,YAAY;GACnB,UAAU;EACZ;;CAGF,UAAU,qBAAqB,aAAa,WAAW,WAAW,KAAK;CAEvE,OAAO;AACT;AAEA,SAAS,0BACP,YACA,WACA,cACS;CACT,IAAI,UAAU;CAEd,IAAI,CAAC,WAAW,WAAW,OAAO,WAAW,YAAY,UAAU;EACjE,WAAW,UAAU,CAAC;EACtB,UAAU;CACZ;CACA,MAAM,UAAU,WAAW;CAC3B,IAAI,CAAC,QAAQ,cAAc,OAAO,QAAQ,eAAe,UAAU;EACjE,QAAQ,aAAa,CAAC;EACtB,UAAU;CACZ;CAEA,MAAM,QAAQ,QAAQ;CAEtB,MAAM,aAAa,mBAAmB,cAAc,SAAS;CAE7D,MAAM,UAAU,YAAY,YAAY;CAExC,IAAI,YAAY;EACd,KAAK,MAAM,OAAO;GAChB;GACA;GACA;GACA;GACA;GACA;EACF,GACE,IAAI,WAAW,SAAS,UAAa,MAAM,SAAS,QAAW;GAC7D,MAAM,OAAO,WAAW;GACxB,UAAU;EACZ;EAGF,IAAI,OAAO,WAAW,gBAAgB,YAAY,WAAW,YAAY,WAAW,QAAQ,GAC1F,WAAW,cAAc,iBAAiB;EAE5C,IAAI,MAAM,gBAAgB,UAAa,WAAW,gBAAgB,QAAW;GAC3E,MAAM,cAAc,WAAW;GAC/B,UAAU;EACZ;CACF;CAEA,IAAI,SACF;OAAK,MAAM,OAAO;GAChB;GACA;GACA;GACA;GACA;GACA;EACF,GACE,IAAI,QAAQ,SAAS,UAAa,MAAM,SAAS,QAAW;GAC1D,MAAM,OAAO,QAAQ;GACrB,UAAU;EACZ;CACF;CAGF,IAAI,aAAa,OAAO;EACtB,MAAM,aAAa,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;EACvE,IAAI,CAAC,cAAc,WAAW,SAAS,YAAY,WAAW,GAAG;GAC/D,OAAO,MAAM;GACb,UAAU;EACZ;CACF;CAEA,IAAI,UAAU,OAAO;EACnB,OAAO,MAAM;EACb,UAAU;CACZ;CAEA,IAAI,wBAAwB,cAAc,SAAS,GAAG;EACpD,IAAI,MAAM,WAAW,UAAa,MAAM,QAAQ,aAAa,MAAM,GAAG;GACpE,MAAM,SAAS,aAAa;GAC5B,UAAU;EACZ;EACA,MAAM,MAAM,YAAY,YAAY;EACpC,IAAI,KACF;OAAI,MAAM,WAAW,UAAa,MAAM,QAAQ,IAAI,MAAM,GAAG;IAC3D,MAAM,SAAS,IAAI;IACnB,UAAU;GACZ;;CAEJ;CAEA,OAAO;AACT;AAEA,SAAS,mBACP,cACA,WACgC;CAChC,IACE,aAAa,WACb,OAAO,aAAa,YAAY,YAC/B,aAAa,QAAoC,cAClD,OAAQ,aAAa,QAAoC,eAAe,UAExE,OAAQ,aAAa,QAAoC;CAG3D,IAAI,aAAa,WAAW,QAC1B,OAAO,EAAE,QAAQ,aAAa,OAAO;CAGvC,OAAO;AACT;AAEA,SAAS,wBACP,cACA,YACS;CACT,OACG,aAAa,WAAW,UAAa,MAAM,QAAQ,aAAa,MAAM,KACvE,YAAY,YAAY,MAAM;AAElC;AAEA,SAAS,YAAY,cAAuE;CAC1F,IAAI,CAAC,aAAa,OAAO,OAAO,aAAa,QAAQ,UAAU,OAAO;CACtE,MAAM,MAAM,aAAa;CACzB,IAAI,CAAC,IAAI,OAAO,OAAO,IAAI,QAAQ,UAAU,OAAO;CACpD,OAAO,IAAI;AACb;AAEA,eAAsB,sBAAsB,YAAuC;CACjF,MAAM,WAAqB,CAAC;CAC5B,MAAM,iBAAiB,KAAK,YAAY,iBAAiB;CAEzD,IAAI,WAAW,cAAc,GAAG;EAC9B,MAAM,aAAa,KAAK,MAAM,aAAa,gBAAgB,OAAO,CAAC;EACnE,IAAI,cAAc,yBAAyB,UAAU;EAErD,MAAM,oBAAoB,MAAM,KAAK,6BAA6B;GAChE,KAAK;GACL,OAAO;GACP,KAAK;GACL,UAAU;EACZ,CAAC;EAED,KAAK,MAAM,gBAAgB,mBAAmB;GAE5C,MAAM,YADQ,aAAa,MAAM,uCACX,CAAC,GAAG;GAC1B,IAAI,CAAC,WAAW;GAEhB,MAAM,WAAW,KAAK,YAAY,YAAY;GAC9C,IAAI;IAEF,cAAc,0BAA0B,YAAY,WAD/B,KAAK,MAAM,aAAa,UAAU,OAAO,CACY,CAAC,KAAK;GAClF,SAAS,GAAG;IACV,QAAQ,KAAK,8CAA8C,SAAS,IAAI,GAAG;GAC7E;GAEA,IAAI;IACF,OAAO,QAAQ;IACf,SAAS,KAAK,YAAY;GAC5B,SAAS,GAAG;IACV,QAAQ,KAAK,wDAAwD,SAAS,IAAI,GAAG;GACvF;EACF;EAEA,IAAI,WAAW,WAAW,OAAO,WAAW,YAAY,UACtD,KAAK,MAAM,aAAa,OAAO,KAAK,WAAW,OAAkC,GAC/E,cAAc,4BAA4B,YAAY,SAAS,KAAK;EAIxE,IAAI,eAAe,SAAS,SAAS,GAAG;GACtC,MAAM,cAAc,YAAY,UAAU;GAC1C,IAAI,CAAC,SAAS,SAAS,iBAAiB,GACtC,SAAS,KAAK,iBAAiB;EAEnC;CACF;CAEA,OAAO;AACT;AAEA,eAAe,wBAAwB,YAI7B;CACR,MAAM,aAAa,KAAK,YAAY,iBAAiB;CACrD,IAAI,CAAC,WAAW,UAAU,GACxB,OAAO;CAGT,MAAM,cAAc,KAAK,MAAM,aAAa,YAAY,OAAO,CAAC;CAChE,MAAM,aAAa,cAAc,WAAW;CAC5C,IAAI,CAAC,YAAY,WAAW,QAAQ,GAClC,OAAO;CAGT,MAAM,SAAS,YAAY,UAAU;CACrC,IAAI,CAAC,QACH,OAAO;CAGT,IAAI;CACJ,IAAI;EACF,eAAe,MAAM,kBAAkB,OAAO,SAAS,OAAO,OAAO;CACvE,QAAQ;EACN,OAAO;CACT;CAEA,MAAM,gBACJ,aAAa,WAAW,OAAO,aAAa,YAAY,WACnD,aAAa,UACd,CAAC;CACP,MAAM,eACJ,YAAY,WAAW,OAAO,YAAY,YAAY,WACjD,YAAY,UACb,CAAC;CAGP,OAAO;EAAE;EAAa;EAAe,eADf,OAAO,KAAK,aAAa,CAAC,CAAC,QAAQ,QAAQ,EAAE,OAAO,aACzB;CAAE;AACrD;AAEA,eAAe,yBAAyB,YAAuC;CAC7E,IAAI,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,OAAO,OAC1C,OAAO,CAAC;CAGV,MAAM,gBAAgB,MAAM,wBAAwB,UAAU;CAC9D,IAAI,CAAC,iBAAiB,cAAc,cAAc,WAAW,GAC3D,OAAO,CAAC;CAGV,MAAM,gBAAgB,MAAM,EAAE,YAAY;EACxC,SAAS;EACT,SAAS,cAAc,cAAc,KAAK,SAAS;GAAE,OAAO;GAAK,OAAO;EAAI,EAAE;EAC9E,UAAU;CACZ,CAAC;CAED,IAAI,EAAE,SAAS,aAAa,GAC1B,QAAQ,KAAK,CAAC;CAGhB,MAAM,WAAW;CACjB,IAAI,SAAS,WAAW,GACtB,OAAO,CAAC;CAOV,MAAM,cAAc,EAAE,GAHpB,cAAc,YAAY,WAAW,OAAO,cAAc,YAAY,YAAY,WAC7E,cAAc,YAAY,UAC3B,CAAC,EAC+B;CACtC,KAAK,MAAM,OAAO,UAAU;EAC1B,MAAM,eAAe,cAAc,cAAc;EACjD,IAAI,gBAAgB,OAAO,iBAAiB,UAAU;GACpD,MAAM,aAAa,gBAAgB,YAAuC;GAC1E,qBAAqB,YAAY,WAAW,KAAK;GACjD,YAAY,OAAO;EACrB,OAAO,IAAI,OAAO,iBAAiB,UACjC,YAAY,OAAO,kBAAkB,cAAc,WAAW,KAAK;OAEnE,YAAY,OAAO;CAEvB;CAEA,cAAc,YAAY,UAAU;CACpC,MAAM,cAAc,YAAY,cAAc,WAAW;CAEzD,OAAO;AACT;AAEA,SAAS,qBAAqB,YAAoB,aAAyC;CACzF,OAAO,8BAA8B,YAAY,WAAW;AAC9D;AAEA,SAAS,cAAc,OAA2C,aAA8B;CAC9F,IAAI,CAAC,SAAS,EAAE,eAAe,QAAQ,OAAO;CAC9C,IAAI,MAAM,iBAAiB,cAAc,MAAM,YAAY,CAAC,WAAW,OAAO,GAAG,OAAO;CACxF,MAAM,eAAe;CACrB,OAAO;AACT;AAEA,eAAe,0BAA0B,YAAuC;CAC9E,MAAM,cAAc,KAAK,YAAY,cAAc;CACnD,IAAI,CAAC,WAAW,WAAW,GAAG,OAAO,CAAC;CAGtC,MAAM,kBADU,KAAK,MAAM,aAAa,aAAa,OAAO,CAC9B,CAAC,CAAC;CAEhC,MAAM,WAAqB,CAAC;CAC5B,IAAI,MAAM,QAAQ,eAAe,GAC/B,SAAS,KAAK,GAAG,eAAe;MAC3B,IAAI,iBAAiB,YAAY,MAAM,QAAQ,gBAAgB,QAAQ,GAC5E,SAAS,KAAK,GAAG,gBAAgB,QAAQ;CAG3C,IAAI,SAAS,WAAW,GAAG,OAAO,CAAC;CAEnC,MAAM,WAAqB,CAAC;CAC5B,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,UAAU,MAAM,KAAK,SAAS;GAAE,KAAK;GAAY,KAAK;GAAO,UAAU;EAAM,CAAC;EACpF,KAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,UAAU,KAAK,YAAY,OAAO,cAAc;GACtD,IAAI,WAAW,OAAO,KAAK,SAAS,OAAO,CAAC,CAAC,OAAO,GAClD,SAAS,KAAK,OAAO;EAEzB;CACF;CAEA,OAAO,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAC9B;AAEA,eAAsB,4BAA4B,YAAsC;CACtF,MAAM,aAAa,KAAK,YAAY,iBAAiB;CACrD,MAAM,UAAU,KAAK,YAAY,cAAc;CAC/C,IAAI,CAAC,WAAW,UAAU,KAAK,CAAC,WAAW,OAAO,GAChD,OAAO;CAKT,IAAI,CADe,cADJ,aAAsC,UACf,CACxB,CAAC,EAAE,WAAW,QAAQ,GAClC,OAAO;CAGT,MAAM,MAAM,aAAsC,OAAO;CACzD,IAAI,UAAU;CAEd,IAAI,IAAI,YAAY,MAAM;EACxB,IAAI,UAAU;EACd,UAAU;CACZ;CACA,IAAI,IAAI,SAAS,UAAU;EACzB,IAAI,OAAO;EACX,UAAU;CACZ;CACA,IAAI,YAAY,KAAK;EACnB,OAAO,IAAI;EACX,UAAU;CACZ;CAEA,MAAM,qBAAqB,MAAM,KAAK,0BAA0B;EAC9D,KAAK;EACL,OAAO;EACP,KAAK;EACL,UAAU;CACZ,CAAC;CACD,MAAM,eAAe,sBAAsB;EACzC,IAAI,WAAW,KAAK,YAAY,MAAM,cAAc,CAAC;EACrD,KAAK,WAAW,KAAK,YAAY,OAAO,cAAc,CAAC;EACvD,MAAM,WAAW,KAAK,YAAY,QAAQ,cAAc,CAAC;EACzD,SAAS,mBAAmB,SAAS;CACvC,CAAC;CAED,IAAI,CAAC,IAAI,WAAW,OAAO,IAAI,YAAY,UAAU;EACnD,IAAI,UAAU,CAAC;EACf,UAAU;CACZ;CACA,MAAM,UAAU,IAAI;CACpB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,YAAY,GACpD,IAAI,QAAQ,SAAS,OAAO;EAC1B,QAAQ,OAAO;EACf,UAAU;CACZ;CAEF,KAAK,MAAM,kBAAkB,CAAC,gBAAgB,MAAM,GAClD,IAAI,kBAAkB,SAAS;EAC7B,OAAO,QAAQ;EACf,UAAU;CACZ;CAGF,MAAM,aAAa,IAAI;CACvB,IAAI,cAAc,OAAO,eAAe,UAAU;EAChD,MAAM,kBAAkB;EACxB,IAAI,MAAM,QAAQ,gBAAgB,QAAQ,GAAG;GAC3C,MAAM,eAAe,gBAAgB,SAAS,QAC3C,UAAU,UAAU,6BAA6B,UAAU,uBAC9D;GACA,IAAI,aAAa,WAAW,gBAAgB,SAAS,QAAQ;IAC3D,gBAAgB,WAAW;IAC3B,UAAU;GACZ;EACF;CACF;CAEA,IAAI,IAAI,aAAa,OAAO,IAAI,cAAc,UAAU;EACtD,MAAM,YAAY,IAAI;EACtB,KAAK,MAAM,eAAe,oBAAoB;GAC5C,MAAM,QAAQ,UAAU;GACxB,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,gBAAgB,GAAG;IACnE,OAAO,UAAU;IACjB,UAAU;GACZ;EACF;EACA,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,WAAW,GAAG;GACvC,OAAO,IAAI;GACX,UAAU;EACZ;CACF;CAEA,IAAI,yBAAyB,GAAG,GAC9B,UAAU;CAGZ,MAAM,wBAAwB,MAAM,0BAA0B,UAAU;CACxE,KAAK,MAAM,oBAAoB,uBAC7B,IAAI,6BAA6B,gBAAgB,GAC/C,UAAU;CAId,IAAI,SACF,cAAc,SAAS,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,GAAG;CAG5D,OAAO;AACT;AAEA,SAAS,kBACP,YACA,YACA,YACoB;CACpB,MAAM,cAAc,cAAc,UAAU;CAC5C,MAAM,YAAY,cAAc,UAAU;CAC1C,IAAI,CAAC,eAAe,CAAC,aAAa,gBAAgB,WAAW,OAAO;CAEpE,MAAM,UAAU;CAChB,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,cAAc,QAAQ,MAAM,uDAAuD;CACzF,IAAI,CAAC,aAAa,OAAO;CAEzB,MAAM,GAAG,OAAO,QAAQ;CACxB,OAAO,sBAAsB,MAAM,GAAG,KAAK,YAAY,YAAY,MAAM;AAC3E;AAEA,eAAe,uBAAuB,YAAuC;CAC3E,MAAM,QAAQ,MAAM,KAAK,wBAAwB;EAC/C,KAAK;EACL,OAAO;EACP,KAAK;EACL,UAAU;CACZ,CAAC;CACD,MAAM,WAAqB,CAAC;CAE5B,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,WAAW,KAAK,YAAY,IAAI;EACtC,MAAM,WAAW,aAAa,UAAU,OAAO;EAC/C,IAAI,OAAO;EAEX,KAAK,MAAM,CAAC,MAAM,OAAO,2BACvB,OAAO,KAAK,WAAW,MAAM,EAAE;EAGjC,IAAI,SAAS,UAAU;GACrB,cAAc,UAAU,IAAI;GAC5B,SAAS,KAAK,IAAI;EACpB;CACF;CAEA,OAAO;AACT;AAEA,MAAM,8BAA8B,CAClC,CAAC,+BAA8B,wBAAuB,GACtD,CAAC,8BAA8B,uBAAuB,CACxD;AAEA,SAAS,YAAY,GAAmB;CACtC,OAAO,EAAE,QAAQ,uBAAuB,MAAM;AAChD;AAEA,SAAS,iBAAiB,QAAgB,SAAyB;CACjE,IAAI,QAAQ;CACZ,IAAI,IAAI;CACR,OAAO,IAAI,OAAO,QAAQ;EACxB,MAAM,KAAK,OAAO;EAClB,IAAI,OAAO,KAAK;OACX,IAAI,OAAO,KAAK;GACnB;GACA,IAAI,UAAU,GAAG,OAAO;EAC1B;EACA;CACF;CACA,OAAO;AACT;AAEA,SAAS,uBAAuB,WAAkC;CAChE,MAAM,IAAI,UAAU,MAAM,gBAAgB;CAC1C,IAAI,CAAC,GAAG,OAAO;CACf,MAAM,OAAO,EAAE;CACf,IAAI,KAAK,SAAS,MAAM,GAAG,OAAO,GAAG,KAAK,MAAM,GAAG,EAAE,EAAE;CACvD,IAAI,KAAK,SAAS,OAAO,GAAG,OAAO,GAAG,KAAK,MAAM,GAAG,EAAE,EAAE;CACxD,OAAO;AACT;AASA,SAAS,8BAA8B,QAAmC;CACxE,MAAM,MAAyB,CAAC;CAChC,MAAM,SAAS;CACf,IAAI,aAAa;CACjB,OAAO,MAAM;EACX,MAAM,aAAa,OAAO,QAAQ,QAAQ,UAAU;EACpD,IAAI,eAAe,IAAI;EACvB,MAAM,WAAW,aAAa;EAC9B,MAAM,SAAS,iBAAiB,QAAQ,QAAQ;EAChD,IAAI,WAAW,IAAI;GACjB,aAAa;GACb;EACF;EACA,IAAI,IAAI,aAAa;EACrB,OAAO,KAAK,KAAK,KAAK,KAAK,OAAO,EAAE,GAAG;EACvC,IAAI,IAAI,KAAK,OAAO,OAAO,KAAK;GAC9B,aAAa,SAAS;GACtB;EACF;EACA;EAEA,IAAI,IAAI,IAAkB,IAAI,KAAK,OAAO,MAAM,IAAI,IAAkB,GAAG,IAAI,CAAC,MAAM,SAAU;GAC5F,aAAa,SAAS;GACtB;EACF;EACA,MAAM,SAAS,IAAI,IAAkB;EACrC,IAAI,IAAI,SAAS;EACjB,OAAO,IAAI,OAAO,UAAU,KAAK,KAAK,OAAO,EAAE,GAAG;EAClD,IAAI,IAAI,OAAO,UAAU,OAAO,OAAO,KAAK;EAC5C,OAAO,IAAI,OAAO,UAAU,KAAK,KAAK,OAAO,EAAE,GAAG;EAClD,IAAI,KAAK,OAAO,UAAU,OAAO,OAAO,KAAK;GAC3C,aAAa,SAAS;GACtB;EACF;EACA,IAAI,KAAK;GAAE;GAAU;GAAQ;GAAQ,cAAc,IAAI;EAAE,CAAC;EAC1D,aAAa,IAAI;CACnB;CACA,OAAO;AACT;AAEA,SAAS,6BAA6B,QAAgB,SAAyB;CAC7E,MAAM,QAAQ,8BAA8B,MAAM;CAClD,IAAI,MAAM,WAAW,GAAG,OAAO;CAE/B,IAAI,SAAS;CAEb,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,OAAO,MAAM;EACnB,MAAM,YAAY,OAAO,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC,KAAK;EAChE,MAAM,UAAU,uBAAuB,SAAS;EAChD,IAAI,CAAC,SAAS;GACZ,QAAQ,KACN,aAAa,QAAQ,+BAA+B,UAAU,+FAA+F,UAAU,GACzK;GACA;EACF;EACA,MAAM,WAAW,IAAI,OAAO,iBAAiB,YAAY,OAAO,EAAE,WAAW,GAAG;EAChF,MAAM,aAAa,CAAC,GAAG,OAAO,SAAS,QAAQ,CAAC;EAChD,IAAI,WAAW,WAAW,GAAG;GAC3B,QAAQ,KACN,aAAa,QAAQ,+BAA+B,UAAU,iCAAiC,QAAQ,gBAAgB,WAAW,OAAO,+BAC3I;GACA;EACF;EACA,MAAM,KAAK,WAAW;EACtB,MAAM,WAAW,GAAG,SAAS;EAC7B,IAAI,WAAW,GAAG;EAClB,MAAM,SAAS,GAAG,EAAE,CAAC;EACrB,MAAM,cAAc,GAAG,GAAG,GAAG,qBAAqB,QAAQ,IAAI,UAAU,GAAG,GAAG;EAC9E,IAAI,WAAW,KAAK,QAClB,SACE,OAAO,MAAM,GAAG,QAAQ,IACxB,cACA,OAAO,MAAM,WAAW,QAAQ,KAAK,MAAM,IAC3C,OAAO,MAAM,KAAK,YAAY;OAEhC,SACE,OAAO,MAAM,GAAG,KAAK,MAAM,IAC3B,OAAO,MAAM,KAAK,cAAc,QAAQ,IACxC,cACA,OAAO,MAAM,WAAW,MAAM;CAEpC;CAEA,OAAO;AACT;AAEA,eAAsB,uCACpB,YACmB;CACnB,MAAM,QAAQ,MAAM,KAAK,CAAC,0BAA0B,kBAAkB,GAAG;EACvE,KAAK;EACL,OAAO;EACP,KAAK;EACL,UAAU;CACZ,CAAC;CAED,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC;CAEhC,MAAM,WAAqB,CAAC;CAC5B,MAAM,uBAAuB;CAE7B,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,WAAW,KAAK,YAAY,IAAI;EACtC,MAAM,WAAW,aAAa,UAAU,OAAO;EAC/C,IAAI,OAAO;EAGX,OAAO,KAAK,WAAW,sBAAsB,4BAA4B;EAKzE,OAAO,6BAA6B,MAAM,IAAI;EAK9C,IAFuC,KAAK,SAAS,qBAEpB,GAG/B,OAAO,KAAK,QACV,qDACC,QAAQ,QAAgB,IAAY,OAA2B;GAC9D,IAAI,IACF,OAAO,GAAG,OAAO,GAAG,GAAG,IAAI,GAAG;GAEhC,OAAO,GAAG,OAAO,GAAG,GAAG;EACzB,CACF;EAGF,IAAI,SAAS,UAAU;GACrB,cAAc,UAAU,IAAI;GAC5B,SAAS,KAAK,IAAI;EACpB;CACF;CAEA,OAAO;AACT;AAEA,eAAe,yBAAyB,YAAuC;CAC7E,MAAM,QAAQ,MAAM,KAAK,gCAAgC;EACvD,KAAK;EACL,OAAO;EACP,KAAK;EACL,UAAU;EACV,QAAQ,CAAC,mBAAmB,SAAS;CACvC,CAAC;CAED,MAAM,WAAqB,CAAC;CAE5B,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,WAAW,KAAK,YAAY,IAAI;EACtC,MAAM,WAAW,aAAa,UAAU,OAAO;EAC/C,IAAI,OAAO;EAEX,KAAK,MAAM,CAAC,MAAM,OAAO,6BACvB,OAAO,KAAK,WAAW,MAAM,EAAE;EAGjC,IAAI,SAAS,UAAU;GACrB,cAAc,UAAU,IAAI;GAC5B,SAAS,KAAK,IAAI;EACpB;CACF;CAEA,OAAO;AACT;AAEA,eAAsB,gBACpB,YACA,SACwB;CACxB,MAAM,UAAyB,CAAC;CAEhC,IAAI,CAAC,WADW,KAAK,YAAY,cACX,CAAC,GACrB,OAAO;EACL,QAAQ;EACR,UAAU,CAAC;EACX;EACA,OAAO;CACT;CAGF,MAAM,eAAe,MAAM,uBAAuB,UAAU;CAC5D,MAAM,oBAAoB,aAAa;CACvC,MAAM,+BAA+B,OAAO,KAAK,iBAAiB;CAIlE,MAAM,wBAHqB,oBAAoB,UAGA,CAAC,CAAC,YAAY,WAAW,CAAC;CACzE,MAAM,oBAAoB,MAAM,0BAA0B,UAAU;CACpE,MAAM,wBACJ,6BAA6B,SAAS,MACrC,8BAA8B,oBAAoB,UAAU,GAAG,4BAA4B,KAC1F,kBAAkB,MAAM,YACtB,4BAA4B,SAAS,4BAA4B,CACnE;CACJ,MAAM,yBACJ,qCAAqC,oBAAoB,UAAU,CAAC,KACpE,kBAAkB,MAAM,YACtB,qCAAqC,aAAsC,OAAO,CAAC,CACrF;CAEF,MAAM,EAAE,UAAU,0BAA0B,MAAM,UAChD,SACA,0BACA,YAAY;EACV,MAAM,eAA0C,CAAC;EAEjD,KAAK,MAAM,QAAQ,oBAAoB;GACrC,MAAM,UAAU,4BAA4B,YAAY,IAAI;GAC5D,MAAM,SAAS,kBAAkB,SAAS,WAAW;GAErD,aAAa,KAAK;IAAE;IAAM,MAAM;IAAS,IAAI;GAAO,CAAC;EACvD;EAEA,MAAM,4BAID,CAAC;EACN,KAAK,MAAM,CAAC,MAAM,kBAAkB,OAAO,QAAQ,iBAAiB,GAAG;GACrE,IAAI,mBAAmB,SAAS,IAAI,GAAG;GAEvC,MAAM,iBAAiB,sBAAsB;GAC7C,IAAI,mBAAmB,eAAe;GACtC,0BAA0B,KAAK;IAAE;IAAM,MAAM;IAAgB,IAAI;GAAc,CAAC;EAClF;EAEA,OAAO;GAAE,UAAU;GAAc,uBAAuB;EAA0B;CACpF,CACF;CAEA,MAAM,sBAAsB,SAAS,MAAM,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,MAAS;CACxF,MAAM,oBAAoB,sBAAsB,SAAS;CACzD,MAAM,aACJ,uBAAuB,qBAAqB,yBAAyB;CAEvE,IAAI,QAAQ,QAAQ;EAClB,IAAI;EACJ,MAAM,gBAAgB,QAAQ,SAC1B,OACA,MAAM,UAAU,SAAS,iCACvB,wBAAwB,UAAU,CACpC;EACJ,IAAI,YAAY;GACd,MAAM,UAAU,SAAS,MAAM,MAAM,EAAE,SAAS,gBAAgB;GAChE,IAAI,SAAS,QAAQ,QAAQ,SAAS,QAAQ,IAC5C,eAAe,kBAAkB,QAAQ,MAAM,QAAQ,IAAI,aAAa,UAAU;EAEtF;EAEA,OAAO;GACL,QAAQ;GACR,UAAU,CACR,GAAG,UACH,GAAG,sBAAsB,KAAK,OAAO;IAAE,MAAM,EAAE;IAAM,MAAM,EAAE;IAAM,IAAI,EAAE;GAAG,EAAE,CAChF;GACA,kBAAkB,eAAe;GACjC;GACA;EACF;CACF;CAEA,MAAM,UAAU,SAAS,yBAAyB,YAAY;EAC5D,IAAI,6BAA6B,SAAS,GACxC,0BAA0B,YAAY,iBAAiB;EAGzD,IAAI,6BAA6B,SAAS,GACxC,KAAK,MAAM,WAAW,mBACpB,6BAA6B,SAAS,4BAA4B;CAGxE,CAAC;CAED,MAAM,qBAAqB,MAAM,UAAU,SAAS,6BAClD,sBAAsB,UAAU,CAClC;CACA,MAAM,0BAA0B,MAAM,UAAU,SAAS,8BACvD,4BAA4B,UAAU,CACxC;CAEA,IAAI;CACJ,IAAI,eAAyB,CAAC;CAC9B,IAAI,CAAC,QAAQ,QAAQ;EACnB,eAAe,MAAM,UAAU,SAAS,2BAA2B,YAAY;GAC7E,IAAI,QAAQ,QAAQ,OAAO,CAAC;GAC5B,OAAO,yBAAyB,UAAU;EAC5C,CAAC;EAED,aAAa,MAAM,UAAU,SAAS,uBACpC,aAAa,YAAY;GACvB,QAAQ;GACR,WAAW;EACb,CAAC,CACH;EAEA,IAAI,6BAA6B,SAAS,GACxC,0BAA0B,YAAY,iBAAiB;CAE3D;CAEA,MAAM,aAAa,MAAM,UAAU,SAAS,oBAAoB,YAAY;EAC1E,MAAM,eAAe,MAAM,mBAAmB,EAAE,KAAK,WAAW,CAAC;EACjE,IAAI,CAAC,cACH,MAAM,IAAI,MAAM,+CAA+C;EAGjE,OAAO,uBAAuB;GAC5B,WAAW;GACX,UAAU;GACV,WAAW,aAAa;EAC1B,CAAC;CACH,CAAC;CAED,KAAK,cAAc,aAAa,SAAS,KAAK,WAAW,mBAAmB,CAAC,QAAQ,WAAW;EAC9F,MAAM,UAAU,SAAS,8BAA8B,wBAAwB,UAAU,CAAC;EAC1F,MAAM,UAAU,SAAS,wBAAwB,YAAY,UAAU,CAAC;CAC1E;CAEA,MAAM,gBAAgB,MAAM,UAAU,SAAS,wBAAwB,YAAY;EACjF,MAAM,oBAAoB;GACxB,GAAG;GACH,GAAI,0BAA0B,CAAC,cAAc,IAAI,CAAC;GAClD,GAAI,MAAM,uBAAuB,UAAU;GAC3C,GAAI,MAAM,uCAAuC,UAAU;GAC3D,GAAI,MAAM,yBAAyB,UAAU;EAC/C;EACA,KAAK,MAAM,QAAQ,gBAAgB;GACjC,MAAM,WAAW,KAAK,YAAY,IAAI;GACtC,IAAI,WAAW,QAAQ,GAAG;IACxB,OAAO,QAAQ;IACf,kBAAkB,KAAK,IAAI;GAC7B;EACF;EAEA,MAAM,sBAAsB,MAAM,KAAK,kDAAkD;GACvF,KAAK;GACL,OAAO;GACP,KAAK;GACL,UAAU;EACZ,CAAC;EACD,KAAK,MAAM,QAAQ,qBAAqB;GACtC,OAAO,KAAK,YAAY,IAAI,CAAC;GAC7B,kBAAkB,KAAK,IAAI;EAC7B;EAEA,OAAO;CACT,CAAC;CAED,IAAI;CACJ,MAAM,UAAU,SAAS,MAAM,MAAM,EAAE,SAAS,gBAAgB;CAChE,IAAI,SAAS,QAAQ,QAAQ,SAAS,QAAQ,IAC5C,eAAe,kBAAkB,QAAQ,MAAM,QAAQ,IAAI,aAAa,UAAU;CAGpF,OAAO;EACL,QAAQ;EACR,UAAU,CACR,GAAG,UACH,GAAG,sBAAsB,KAAK,OAAO;GAAE,MAAM,EAAE;GAAM,MAAM,EAAE;GAAM,IAAI,EAAE;EAAG,EAAE,CAChF;EACA,MAAM;EACN,UAAU,cAAc,SAAS,IAAI,gBAAgB;EACrD,iBAAiB,aAAa,SAAS,IAAI,eAAe;EAC1D;EACA;CACF;AACF"}
1
+ {"version":3,"file":"upgrade.mjs","names":[],"sources":["../../src/cli/upgrade.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { 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 { syncResolvedSharedDeps } from \"../shared-deps\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { readInstalledFrameworkVersion } from \"./framework-version\";\nimport {\n buildChildRootScripts,\n fetchParentConfig,\n getParentOnlyScriptKeys,\n resolveCatalogChainSource,\n runBunInstallForUpgrade,\n runTypesGen,\n} from \"./init\";\nimport { syncTemplate } from \"./sync\";\nimport { timePhase } from \"./timing\";\nimport { getExtendsRef, parseBosRef, readJsonFile } from \"./utils/helpers\";\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/auth-utils\"', 'from \"@/lib/auth\"'],\n [\"from '@/lib/auth-utils'\", \"from '@/lib/auth'\"],\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 \"api/src/lib/plugins.ts\",\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/lib/auth-utils.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/workflows/packages-release.yml\",\n \".github/workflows/publish.yml\",\n \".github/workflows/release-sync.yml\",\n \"api/src/db/migrator.ts\",\n \"api/src/db/load-migrations.ts\",\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 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:\") || value.startsWith(\"link:\")) {\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:\") && !value.startsWith(\"link:\")) {\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 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 \"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 \"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 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 }\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 if (pluginConfig.routes !== undefined) {\n return { routes: pluginConfig.routes };\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 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 (e) {\n console.warn(`[Upgrade] Failed to parse plugin config at ${filePath}: ${e}`);\n }\n\n try {\n rmSync(filePath);\n migrated.push(relativePath);\n } catch (e) {\n console.warn(`[Upgrade] Failed to remove migrated plugin config at ${filePath}: ${e}`);\n }\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 [...getParentOnlyScriptKeys(projectDir), \"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\nconst LEGACY_DIST_IMPORT_REWRITES = [\n ['from \"everything-dev/', 'from \"everything-dev/'],\n [\"from 'everything-dev/\", \"from 'everything-dev/\"],\n] as const;\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction balancedParenEnd(source: string, openIdx: number): number {\n let depth = 1;\n let i = openIdx;\n while (i < source.length) {\n const ch = source[i];\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0) return i;\n }\n i++;\n }\n return -1;\n}\n\nfunction deriveTagFromLayerExpr(layerExpr: string): string | null {\n const m = layerExpr.match(/^\\s*([A-Z]\\w*)/);\n if (!m) return null;\n const name = m[1];\n if (name.endsWith(\"Live\")) return `${name.slice(0, -4)}Tag`;\n if (name.endsWith(\"Layer\")) return `${name.slice(0, -5)}Tag`;\n return null;\n}\n\ntype PipeProvideCall = {\n argStart: number;\n endIdx: number;\n dotIdx: number;\n pipeCloseEnd: number;\n};\n\nfunction findAllPipeEffectProvideCalls(source: string): PipeProvideCall[] {\n const out: PipeProvideCall[] = [];\n const needle = \"Effect.provide(\";\n let searchFrom = 0;\n while (true) {\n const provideIdx = source.indexOf(needle, searchFrom);\n if (provideIdx === -1) break;\n const argStart = provideIdx + needle.length;\n const endIdx = balancedParenEnd(source, argStart);\n if (endIdx === -1) {\n searchFrom = argStart;\n continue;\n }\n let p = provideIdx - 1;\n while (p >= 0 && /\\s/.test(source[p])) p--;\n if (p < 0 || source[p] !== \"(\") {\n searchFrom = endIdx + 1;\n continue;\n }\n p--;\n const pipeWord = \".pipe\";\n if (p - pipeWord.length + 1 < 0 || source.slice(p - pipeWord.length + 1, p + 1) !== pipeWord) {\n searchFrom = endIdx + 1;\n continue;\n }\n const dotIdx = p - pipeWord.length + 1;\n let q = endIdx + 1;\n while (q < source.length && /\\s/.test(source[q])) q++;\n if (q < source.length && source[q] === \",\") q++;\n while (q < source.length && /\\s/.test(source[q])) q++;\n if (q >= source.length || source[q] !== \")\") {\n searchFrom = endIdx + 1;\n continue;\n }\n out.push({ argStart, endIdx, dotIdx, pipeCloseEnd: q + 1 });\n searchFrom = q + 1;\n }\n return out;\n}\n\nfunction rewritePipeEffectProvideForm(source: string, relPath: string): string {\n const calls = findAllPipeEffectProvideCalls(source);\n if (calls.length === 0) return source;\n\n let result = source;\n\n for (let k = calls.length - 1; k >= 0; k--) {\n const call = calls[k];\n const layerExpr = result.slice(call.argStart, call.endIdx).trim();\n const tagName = deriveTagFromLayerExpr(layerExpr);\n if (!tagName) {\n console.warn(\n `[Upgrade] ${relPath}: found .pipe(Effect.provide(${layerExpr})) but could not derive a tag name — skipping. Migrate manually to tools.buildService(<Tag>, ${layerExpr}).`,\n );\n continue;\n }\n const tagUseRe = new RegExp(`(yield\\\\*\\\\s+)${escapeRegex(tagName)}(\\\\s*;?)`, \"g\");\n const tagMatches = [...result.matchAll(tagUseRe)];\n if (tagMatches.length !== 1) {\n console.warn(\n `[Upgrade] ${relPath}: found .pipe(Effect.provide(${layerExpr})) expecting a single \\`yield* ${tagName}\\`, but found ${tagMatches.length} — skipping. Migrate manually.`,\n );\n continue;\n }\n const tm = tagMatches[0];\n const tagStart = tm.index ?? -1;\n if (tagStart < 0) continue;\n const tagLen = tm[0].length;\n const replacement = `${tm[1]}tools.buildService(${tagName}, ${layerExpr})${tm[2]}`;\n if (tagStart < call.dotIdx) {\n result =\n result.slice(0, tagStart) +\n replacement +\n result.slice(tagStart + tagLen, call.dotIdx) +\n result.slice(call.pipeCloseEnd);\n } else {\n result =\n result.slice(0, call.dotIdx) +\n result.slice(call.pipeCloseEnd, tagStart) +\n replacement +\n result.slice(tagStart + tagLen);\n }\n }\n\n return result;\n}\n\nexport async function rewriteLegacyPluginScopedLayerPatterns(\n projectDir: string,\n): Promise<string[]> {\n const files = await glob([\"plugins/*/src/index.ts\", \"api/src/index.ts\"], {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n\n if (files.length === 0) return [];\n\n const migrated: string[] = [];\n const effectProvidePattern = /\\byield\\*\\s*Effect\\.provide\\(/g;\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 // Rewrite yield* Effect.provide(Tag, LayerExpr) → yield* tools.buildService(Tag, LayerExpr)\n next = next.replaceAll(effectProvidePattern, \"yield* tools.buildService(\");\n\n // Rewrite the .pipe(Effect.provide(<LayerExpr>)) form: move <LayerExpr> into a\n // tools.buildService(<Tag>, <LayerExpr>) call replacing the bare `yield* <Tag>`\n // inside the generator, and drop the trailing .pipe(Effect.provide(...)).\n next = rewritePipeEffectProvideForm(next, file);\n\n // Add tools as third argument to initialize if it only has (config) or (config, plugins)\n const hasEffectProvideOrServiceBuild = next.includes(\"tools.buildService(\");\n\n if (hasEffectProvideOrServiceBuild) {\n // Rewrite initialize: (config, plugins) => or initialize: (config) =>\n // to include tools\n next = next.replace(\n /(initialize:\\s*)\\((\\w+)(?:,\\s*(\\w+))?\\s*\\)\\s*=>/g,\n (_match, prefix: string, p1: string, p2: string | undefined) => {\n if (p2) {\n return `${prefix}(${p1}, ${p2}, tools) =>`;\n }\n return `${prefix}(${p1}, _plugins, tools) =>`;\n },\n );\n }\n\n if (next !== original) {\n writeFileSync(filePath, next);\n migrated.push(file);\n }\n }\n\n return migrated;\n}\n\nasync function rewriteLegacyDistImports(projectDir: string): Promise<string[]> {\n const files = await glob(\"**/*.{ts,tsx,js,jsx,mjs,cjs}\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n ignore: [\"node_modules/**\", \"dist/**\"],\n });\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_DIST_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\nasync function runMigrationPhase(\n projectDir: string,\n options: UpgradeOptions,\n parentSource: ExtendedRootSource,\n): Promise<UpgradeResult> {\n const timings: PhaseTiming[] = [];\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 && parentSource.extendsChain.length > 0) {\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 json: false,\n }),\n );\n }\n\n await timePhase(timings, \"sync shared deps\", 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 syncResolvedSharedDeps({\n configDir: projectDir,\n hostMode: \"local\",\n bosConfig: configResult.config,\n });\n });\n\n if (!options.noInstall) {\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 ...(await rewriteLegacyPluginScopedLayerPatterns(projectDir)),\n ...(await rewriteLegacyDistImports(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\n const legacyPluginDbFiles = await glob(\"plugins/*/src/db/{migrator,load-migrations}.ts\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n for (const file of legacyPluginDbFiles) {\n rmSync(join(projectDir, file));\n nextMigratedFiles.push(file);\n }\n\n return nextMigratedFiles;\n });\n\n let changelogUrl: string | undefined;\n const mainPkg = parentSource.catalog[\"everything-dev\"];\n if (mainPkg) {\n changelogUrl = buildChangelogUrl(undefined, mainPkg, parentSource.repository);\n }\n\n return {\n status: \"upgraded\",\n packages: [],\n sync: syncResult,\n migrated: migratedFiles.length > 0 ? migratedFiles : undefined,\n selectedPlugins: addedPlugins.length > 0 ? addedPlugins : undefined,\n timings,\n changelogUrl,\n };\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 if (options.migrationsOnly) {\n return await runMigrationPhase(projectDir, options, parentSource);\n }\n\n // Phase 1: apply package updates, install, then re-exec migrations from the new package\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 needsInstall = (hasUpdates || hasCatalogUpdates) && !options.noInstall;\n\n if (needsInstall) {\n await timePhase(timings, \"install dependencies\", () => runBunInstallForUpgrade(projectDir));\n }\n\n // If we installed new framework packages, re-exec from the new package so migrations\n // run with the latest code instead of the old cached modules.\n if (needsInstall && hasFrameworkUpdates) {\n const bosPath = join(projectDir, \"node_modules\", \".bin\", \"bos\");\n const childArgs = [\n \"upgrade\",\n \"--migrations-only\",\n \"--no-install\",\n ...(options.noSync ? [\"--no-sync\"] : []),\n \"--json\",\n ];\n\n const childResult = spawnSync(bosPath, childArgs, {\n cwd: projectDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n encoding: \"utf-8\",\n env: { ...process.env, BOS_NO_BANNER: \"1\" },\n });\n\n if (childResult.status !== 0) {\n return {\n status: \"error\",\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n timings,\n error: `Migration phase failed: ${childResult.stderr || childResult.stdout || \"Unknown error\"}`,\n };\n }\n\n try {\n const childUpgrade: UpgradeResult = JSON.parse(childResult.stdout);\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n const changelogUrl =\n mainPkg?.from && mainPkg.from !== mainPkg.to\n ? buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository)\n : undefined;\n return {\n ...childUpgrade,\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n timings: [...timings, ...(childUpgrade.timings ?? [])],\n changelogUrl,\n };\n } catch {\n return {\n status: \"error\",\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n timings,\n error: \"Failed to parse migration phase output\",\n };\n }\n }\n\n // No framework version change: run migrations inline (same-package, no re-exec needed)\n // runMigrationPhase handles types gen internally — no separate runTypesGen call needed here.\n\n const migrationResult = await runMigrationPhase(projectDir, options, parentSource);\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n const changelogUrl =\n mainPkg?.from && mainPkg.from !== mainPkg.to\n ? buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository)\n : undefined;\n return {\n ...migrationResult,\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n timings: [...timings, ...(migrationResult.timings ?? [])],\n changelogUrl,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ const require_merge = require('../../merge.cjs');
2
+ let node_fs = require("node:fs");
3
+
4
+ //#region src/cli/utils/helpers.ts
5
+ function getExtendsRef(config) {
6
+ if (typeof config.extends === "string") return config.extends;
7
+ if (config.extends && typeof config.extends === "object") return require_merge.resolveExtendsRef(config.extends, "production");
8
+ }
9
+ function parseBosRef(ref) {
10
+ const match = ref.match(/^bos:\/\/([^/]+)\/(.+)$/);
11
+ if (!match?.[1] || !match[2]) return null;
12
+ return {
13
+ account: match[1],
14
+ gateway: match[2]
15
+ };
16
+ }
17
+ function readJsonFile(filePath) {
18
+ return JSON.parse((0, node_fs.readFileSync)(filePath, "utf-8"));
19
+ }
20
+
21
+ //#endregion
22
+ exports.getExtendsRef = getExtendsRef;
23
+ exports.parseBosRef = parseBosRef;
24
+ exports.readJsonFile = readJsonFile;
25
+ //# sourceMappingURL=helpers.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.cjs","names":["resolveExtendsRef"],"sources":["../../../src/cli/utils/helpers.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { resolveExtendsRef } from \"../../merge\";\n\nexport function 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\nexport function 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\nexport function readJsonFile<T>(filePath: string): T {\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as T;\n}\n"],"mappings":";;;;AAGA,SAAgB,cAAc,QAAqD;CACjF,IAAI,OAAO,OAAO,YAAY,UAC5B,OAAO,OAAO;CAGhB,IAAI,OAAO,WAAW,OAAO,OAAO,YAAY,UAC9C,OAAOA,gCAAkB,OAAO,SAAmC,YAAY;AAInF;AAEA,SAAgB,YAAY,KAA0D;CACpF,MAAM,QAAQ,IAAI,MAAM,yBAAyB;CACjD,IAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,IAAI,OAAO;CACrC,OAAO;EAAE,SAAS,MAAM;EAAI,SAAS,MAAM;CAAG;AAChD;AAEA,SAAgB,aAAgB,UAAqB;CACnD,OAAO,KAAK,gCAAmB,UAAU,OAAO,CAAC;AACnD"}
@@ -0,0 +1,23 @@
1
+ import { resolveExtendsRef } from "../../merge.mjs";
2
+ import { readFileSync } from "node:fs";
3
+
4
+ //#region src/cli/utils/helpers.ts
5
+ function getExtendsRef(config) {
6
+ if (typeof config.extends === "string") return config.extends;
7
+ if (config.extends && typeof config.extends === "object") return resolveExtendsRef(config.extends, "production");
8
+ }
9
+ function parseBosRef(ref) {
10
+ const match = ref.match(/^bos:\/\/([^/]+)\/(.+)$/);
11
+ if (!match?.[1] || !match[2]) return null;
12
+ return {
13
+ account: match[1],
14
+ gateway: match[2]
15
+ };
16
+ }
17
+ function readJsonFile(filePath) {
18
+ return JSON.parse(readFileSync(filePath, "utf-8"));
19
+ }
20
+
21
+ //#endregion
22
+ export { getExtendsRef, parseBosRef, readJsonFile };
23
+ //# sourceMappingURL=helpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.mjs","names":[],"sources":["../../../src/cli/utils/helpers.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { resolveExtendsRef } from \"../../merge\";\n\nexport function 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\nexport function 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\nexport function readJsonFile<T>(filePath: string): T {\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as T;\n}\n"],"mappings":";;;;AAGA,SAAgB,cAAc,QAAqD;CACjF,IAAI,OAAO,OAAO,YAAY,UAC5B,OAAO,OAAO;CAGhB,IAAI,OAAO,WAAW,OAAO,OAAO,YAAY,UAC9C,OAAO,kBAAkB,OAAO,SAAmC,YAAY;AAInF;AAEA,SAAgB,YAAY,KAA0D;CACpF,MAAM,QAAQ,IAAI,MAAM,yBAAyB;CACjD,IAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,IAAI,OAAO;CACrC,OAAO;EAAE,SAAS,MAAM;EAAI,SAAS,MAAM;CAAG;AAChD;AAEA,SAAgB,aAAgB,UAAqB;CACnD,OAAO,KAAK,MAAM,aAAa,UAAU,OAAO,CAAC;AACnD"}
package/dist/cli.cjs CHANGED
@@ -110,7 +110,8 @@ async function main() {
110
110
  const commandArgs = invocationArgs.slice(consumed);
111
111
  const projectDir = configPath ? (0, node_path.dirname)(configPath) : void 0;
112
112
  const edResolved = projectDir ? require_framework_version.resolveFrameworkPackage(projectDir, "everything-dev") : void 0;
113
- require_banner.printBanner("everything-dev", edResolved?.installedVersion ? `${edResolved.installedVersion}${edResolved.isLinked ? " (linked)" : ""}` : void 0);
113
+ const displayVersion = edResolved?.installedVersion ? `${edResolved.installedVersion}${edResolved.isLinked ? " (linked)" : ""}` : void 0;
114
+ if (!process.env.BOS_NO_BANNER) require_banner.printBanner("everything-dev", displayVersion);
114
115
  const pluginRuntime = (0, every_plugin.createPluginRuntime)({
115
116
  registry: { bos: { module: require_plugin.default } },
116
117
  secrets: {}
@@ -393,90 +394,83 @@ async function main() {
393
394
  return;
394
395
  }
395
396
  if (descriptor.key === "sync") {
397
+ if (input.json) {
398
+ console.log(JSON.stringify(result, null, 2));
399
+ return;
400
+ }
396
401
  console.log();
397
402
  if (result.status === "error") {
398
403
  console.error(`[CLI] ${result.error || "Unknown error"}`);
399
404
  process.exit(1);
400
405
  }
401
406
  if (result.status === "dry-run") console.log(require_theme.colors.cyan(`${require_theme.icons.ok} Dry run — no files written`));
402
- else console.log(require_theme.colors.green(`${require_theme.icons.ok} Template synced`));
403
- if (result.updated.length > 0) {
404
- console.log(` ${require_theme.colors.dim("Updated:")} ${result.updated.length} file(s)`);
405
- for (const f of result.updated) console.log(` ${require_theme.colors.dim(f)}`);
406
- }
407
- if (result.added.length > 0) {
408
- console.log(` ${require_theme.colors.dim("Added:")} ${result.added.length} file(s)`);
409
- for (const f of result.added) console.log(` ${require_theme.colors.dim(f)}`);
410
- }
411
- if (result.skipped.length > 0) {
412
- console.log(` ${require_theme.colors.yellow("Skipped:")} ${result.skipped.length} file(s) (locally modified, use --force to overwrite)`);
413
- for (const f of result.skipped) console.log(` ${require_theme.colors.dim(f)}`);
414
- }
415
- if (result.updated.length === 0 && result.added.length === 0 && result.skipped.length === 0) console.log(` ${require_theme.colors.dim("Already up to date")}`);
416
- if (result.status !== "dry-run" && result.updated.length > 0) {
417
- console.log();
418
- console.log(require_theme.colors.dim(" Review changes — your customizations take priority:"));
419
- console.log(require_theme.colors.dim(" • api/src/contract.ts, api/src/index.ts, api/src/db/schema.ts — never overwritten"));
420
- console.log(require_theme.colors.dim(" • ui/src/components/**, ui/src/styles.css — never overwritten"));
421
- console.log(require_theme.colors.dim(" • Other updated files — accept framework improvements, then restore your changes"));
422
- console.log(require_theme.colors.dim(" • Skipped files — yours already, only update with --force"));
407
+ else console.log(require_theme.colors.green(`${require_theme.icons.ok} Synced`));
408
+ if (result.updated.length > 0 || result.added.length > 0 || result.conflicted.length > 0) {
409
+ console.log(` ${require_theme.colors.dim("Sync results:")} ${result.updated.length} updated, ${result.added.length} added, ${result.conflicted.length} conflicted`);
410
+ if (result.updated.length > 0) for (const f of result.updated) console.log(` ${require_theme.colors.dim(f)}`);
411
+ if (result.added.length > 0) for (const f of result.added) console.log(` ${require_theme.colors.dim(f)}`);
412
+ if (result.conflicted.length > 0) {
413
+ console.log(` ${require_theme.colors.yellow("Conflicted")} (template applied, your changes backed up):`);
414
+ if (result.backupDir) console.log(` ${require_theme.colors.dim(result.backupDir)}`);
415
+ for (const f of result.conflicted) console.log(` ${require_theme.colors.dim(f)}`);
416
+ }
423
417
  }
418
+ if (result.updated.length === 0 && result.added.length === 0 && result.conflicted.length === 0) console.log(` ${require_theme.colors.dim("Already up to date")}`);
424
419
  console.log();
425
420
  return;
426
421
  }
427
422
  if (descriptor.key === "upgrade") {
423
+ if (input.json) {
424
+ console.log(JSON.stringify(result, null, 2));
425
+ return;
426
+ }
428
427
  console.log();
429
428
  if (result.status === "error") {
430
429
  console.error(`[CLI] ${result.error || "Unknown error"}`);
431
430
  process.exit(1);
432
431
  }
433
432
  if (result.status === "dry-run") console.log(require_theme.colors.cyan(`${require_theme.icons.ok} Dry run — no changes applied`));
434
- else console.log(require_theme.colors.green(`${require_theme.icons.ok} Upgrade successful`));
435
- for (const pkg of result.packages) if (pkg.from && pkg.from !== pkg.to) console.log(` ${require_theme.colors.dim(`${pkg.name}:`)} ${pkg.from} → ${pkg.to}`);
436
- else if (!pkg.from) console.log(` ${require_theme.colors.dim(`${pkg.name}:`)} ${pkg.to} (new)`);
437
- else console.log(` ${require_theme.colors.dim(`${pkg.name}:`)} ${pkg.to} (up to date)`);
438
- if (result.changelogUrl) console.log(` ${require_theme.colors.dim("Changelog:")} ${result.changelogUrl}`);
439
- if (result.availablePlugins && result.availablePlugins.length > 0) console.log(` ${require_theme.colors.dim("New parent plugins:")} ${result.availablePlugins.join(", ")}`);
440
- if (result.selectedPlugins && result.selectedPlugins.length > 0) console.log(` ${require_theme.colors.dim("Added plugins:")} ${result.selectedPlugins.join(", ")}`);
441
- printTimingSummary(result.timings);
433
+ else console.log(require_theme.colors.green(`${require_theme.icons.ok} Upgrade complete`));
434
+ const mainPkg = result.packages.find((p) => p.name === "everything-dev");
435
+ const versionDelta = mainPkg?.from && mainPkg.from !== mainPkg.to ? `${mainPkg.from} → ${mainPkg.to}` : null;
436
+ if (versionDelta) console.log(` ${require_theme.colors.dim(`Upgraded everything-dev ${versionDelta}`)}`);
437
+ for (const pkg of result.packages) {
438
+ if (pkg.name === "everything-dev") continue;
439
+ if (pkg.from && pkg.from !== pkg.to) console.log(` ${require_theme.colors.dim(`${pkg.name} ${pkg.from} → ${pkg.to}`)}`);
440
+ else if (!pkg.from) console.log(` ${require_theme.colors.dim(`${pkg.name} ${pkg.to} (new)`)}`);
441
+ else console.log(` ${require_theme.colors.dim(`${pkg.name} ${pkg.to} (up to date)`)}`);
442
+ }
443
+ if (result.changelogUrl) console.log(` Changelog: ${result.changelogUrl}`);
444
+ if (result.selectedPlugins && result.selectedPlugins.length > 0) console.log(` Added plugins: ${result.selectedPlugins.join(", ")}`);
442
445
  if (result.sync) {
443
446
  const sync = result.sync;
444
- if (sync.updated.length > 0) {
445
- console.log(` ${require_theme.colors.dim("Updated:")} ${sync.updated.length} file(s)`);
446
- for (const f of sync.updated) console.log(` ${require_theme.colors.dim(f)}`);
447
- }
448
- if (sync.added.length > 0) {
449
- console.log(` ${require_theme.colors.dim("Added:")} ${sync.added.length} file(s)`);
450
- for (const f of sync.added) console.log(` ${require_theme.colors.dim(f)}`);
451
- }
452
- if (sync.skipped.length > 0) {
453
- console.log(` ${require_theme.colors.yellow("Skipped:")} ${sync.skipped.length} file(s) (locally modified, use --force to overwrite)`);
454
- for (const f of sync.skipped) console.log(` ${require_theme.colors.dim(f)}`);
455
- }
456
- if (result.status !== "dry-run" && (sync.updated.length > 0 || sync.added.length > 0 || sync.skipped.length > 0)) {
457
- console.log();
458
- console.log(require_theme.colors.dim(" Resolve differences — your code takes priority:"));
459
- console.log();
460
- console.log(require_theme.colors.dim(" Never overwritten (safe):"));
461
- console.log(require_theme.colors.dim(" • api/src/contract.ts, api/src/index.ts, api/src/db/schema.ts"));
462
- console.log(require_theme.colors.dim(" • ui/src/components/**, ui/src/styles.css"));
463
- console.log();
464
- console.log(require_theme.colors.dim(" Replaced — review and keep your changes:"));
465
- console.log(require_theme.colors.dim(" • api/drizzle.config.ts, api/tsconfig.json, api/tsconfig.contract.json"));
466
- console.log(require_theme.colors.dim(" • api/plugin.dev.ts, api/rspack.config.js"));
467
- console.log(require_theme.colors.dim(" • ui/src/routes/* (core routes only)"));
468
- console.log();
469
- console.log(require_theme.colors.dim(" Merged — your deps preserved:"));
470
- console.log(require_theme.colors.dim(" • package.json, api/package.json, ui/package.json"));
471
- console.log();
472
- console.log(require_theme.colors.dim(" Skipped — already yours:"));
473
- console.log(require_theme.colors.dim(" • Use --force only if you want framework updates"));
474
- }
447
+ console.log(` ${require_theme.colors.dim("Sync results:")}`);
448
+ if (sync.updated.length > 0 || sync.added.length > 0 || sync.conflicted.length > 0) {
449
+ console.log(` ${sync.updated.length} updated, ${sync.added.length} added, ${sync.conflicted.length} conflicted`);
450
+ if (sync.conflicted.length > 0) {
451
+ console.log(` ${require_theme.colors.yellow("Conflicted")} (template applied, your changes backed up):`);
452
+ if (sync.backupDir) console.log(` ${require_theme.colors.dim(sync.backupDir)}`);
453
+ for (const f of sync.conflicted) console.log(` ${require_theme.colors.dim(f)}`);
454
+ }
455
+ } else console.log(` ${require_theme.colors.dim("Already up to date")}`);
475
456
  }
476
457
  if (result.migrated && result.migrated.length > 0) {
477
- console.log(` ${require_theme.colors.yellow("Removed:")} ${result.migrated.length} obsolete file(s)`);
458
+ console.log(` Migrated: ${result.migrated.length} file(s)`);
478
459
  for (const f of result.migrated) console.log(` ${require_theme.colors.dim(f)}`);
479
460
  }
461
+ if (versionDelta || result.sync && result.sync.conflicted.length > 0) {
462
+ console.log();
463
+ console.log(require_theme.colors.dim(" For AI agents:"));
464
+ const parentRepo = "nearbuilders/everything-dev";
465
+ const somedelta = mainPkg?.from && mainPkg.to ? `v${mainPkg.from.replace(/^[\^~>=v]+/, "")}...v${mainPkg.to.replace(/^[\^~>=v]+/, "")}` : "";
466
+ console.log(require_theme.colors.dim(` This upgrade applied template changes${somedelta ? ` (${somedelta})` : ""}.`));
467
+ if (result.sync && result.sync.conflicted.length > 0) {
468
+ console.log(require_theme.colors.dim(` ${result.sync.conflicted.length} file(s) had local conflicts — template version applied, backups at ${result.sync.backupDir || ".bos/sync-backup/"}.`));
469
+ console.log(require_theme.colors.dim(` If local changes should be preserved upstream, open a PR: https://github.com/${parentRepo}${somedelta ? `/compare/${somedelta}` : ""}`));
470
+ }
471
+ console.log(require_theme.colors.dim(" Load matching intent skills: bunx @tanstack/intent@latest load everything-dev#..."));
472
+ console.log(require_theme.colors.dim(" Review AGENTS.md — local updates may need merging."));
473
+ }
480
474
  console.log();
481
475
  return;
482
476
  }
@@ -588,22 +582,40 @@ async function main() {
588
582
  process.exit(1);
589
583
  }
590
584
  console.log(require_theme.colors.green(`${require_theme.icons.ok} Types generated`));
591
- if (result.source) console.log(` ${require_theme.colors.dim("Mode:")} ${result.source === "remote" ? require_theme.colors.cyan("remote") : require_theme.colors.dim("local")}`);
592
585
  if (result.generated.length > 0) {
593
- console.log(` ${require_theme.colors.dim("Generated:")}`);
586
+ console.log(` ${require_theme.colors.dim("Written:")}`);
594
587
  for (const f of result.generated) console.log(` ${require_theme.colors.dim(f)}`);
595
588
  }
596
- if (result.fetched.length > 0) {
597
- console.log(` ${require_theme.colors.dim("Fetched (remote):")}`);
598
- for (const url of result.fetched) console.log(` ${require_theme.colors.dim(url)}`);
599
- }
600
- if (result.skipped.length > 0) {
601
- console.log(` ${require_theme.colors.dim("Skipped:")}`);
602
- for (const s of result.skipped) console.log(` ${require_theme.colors.dim(s)}`);
589
+ if (result.fetched.length > 0 || result.skipped.length > 0 || result.failed.length > 0) {
590
+ console.log(` ${require_theme.colors.dim("Contract sources:")}`);
591
+ for (const entry of result.fetched) {
592
+ const space = entry.indexOf(" ");
593
+ const key = space !== -1 ? entry.slice(0, space) : entry;
594
+ const rest = space !== -1 ? entry.slice(space + 1) : "";
595
+ const restSpace = rest.indexOf(" ");
596
+ const detail = restSpace !== -1 ? rest.slice(restSpace + 1) : "";
597
+ console.log(` ${key} ${require_theme.colors.cyan("remote")}${detail ? ` ${require_theme.colors.dim(detail)}` : ""}`);
598
+ }
599
+ for (const entry of result.skipped) {
600
+ const space = entry.indexOf(" ");
601
+ const key = space !== -1 ? entry.slice(0, space) : entry;
602
+ const rest = space !== -1 ? entry.slice(space + 1) : "";
603
+ if (rest === "no URL resolved") {
604
+ console.log(` ${key} ${require_theme.colors.dim("no URL resolved")}`);
605
+ continue;
606
+ }
607
+ const restSpace = rest.indexOf(" ");
608
+ const detail = restSpace !== -1 ? rest.slice(restSpace + 1) : "";
609
+ console.log(` ${key} ${require_theme.colors.dim("local")}${detail ? ` ${require_theme.colors.dim(detail)}` : ""}`);
610
+ }
603
611
  }
604
612
  if (result.failed.length > 0) {
605
613
  console.log(` ${require_theme.colors.yellow("Failed:")}`);
606
- for (const f of result.failed) console.log(` ${require_theme.colors.error(f)}`);
614
+ for (const f of result.failed) {
615
+ const colon = f.indexOf(": ");
616
+ if (colon !== -1) console.log(` ${require_theme.colors.error(f.slice(0, colon))}${require_theme.colors.dim(f.slice(colon))}`);
617
+ else console.log(` ${require_theme.colors.error(f)}`);
618
+ }
607
619
  }
608
620
  console.log();
609
621
  return;