{"version":3,"file":"init-flow.mjs","names":[],"sources":["../../../src/services/scaffold/init-flow.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { InitResult, OverrideSection, PhaseTiming } from \"../../contract\";\nimport { makeProjectEnv } from \"../../env/project-env\";\nimport { materializeViaLayer } from \"../../infra/materializer\";\nimport type { BosConfig, BosConfigInput, StarterLevel } from \"../../types\";\nimport { saveBosConfig } from \"../../utils/save-config\";\nimport { generateCodeArtifacts } from \"../codegen/artifacts\";\nimport { timePhase } from \"../dev/progress\";\nimport type { ResolvedPlatformManifest } from \"../platform/manifest\";\nimport { resolvePlatformManifest } from \"../platform/manifest\";\nimport { parseBosUrl } from \"../registry/fastkv\";\nimport { openResolution } from \"../resolution/session\";\nimport { syncResolvedSharedDeps } from \"../workspace/shared-deps\";\nimport {\n  buildInitPatterns,\n  buildPluginRouteExclusions,\n  buildStarterRouteExclusions,\n  convertChildConfigToAppForm,\n  copyFilteredFiles,\n  detectGitRemoteUrl,\n  fetchParentConfig,\n  generateDatabaseMigrations,\n  personalizeAgentsMd,\n  personalizeConfig,\n  releaseRefCandidates,\n  removeStrayLockfiles,\n  resolveSourceDir,\n  runPnpmInstall,\n  runTypesGen,\n  scaffoldMinimalProject,\n  writeDevOverlayTemplate,\n  writeInitSnapshot,\n} from \"./init\";\nimport { pruneUnusedUiFiles } from \"./prune\";\n\nexport async function fetchInitParent(\n  extendsAccount: string,\n  extendsGateway: string,\n): Promise<{ parentConfig: BosConfig; parentPluginKeys: string[] }> {\n  const parentConfig = await fetchParentConfig(extendsAccount, extendsGateway);\n  const parentPluginKeys =\n    parentConfig?.plugins && typeof parentConfig.plugins === \"object\"\n      ? Object.keys(parentConfig.plugins)\n      : [];\n  return { parentConfig, parentPluginKeys };\n}\n\nfunction normalizeExtendsRef(extendsInput: string | undefined, fallback: string): string {\n  if (!extendsInput) return fallback;\n  return extendsInput.startsWith(\"bos://\") ? extendsInput : `bos://${extendsInput}`;\n}\n\nexport class InitFlowService extends Context.Service<\n  InitFlowService,\n  {\n    run: (input: InitOptions) => Effect.Effect<InitResult, unknown>;\n  }\n>()(\"bos/InitFlowService\") {\n  static Live = Layer.succeed(\n    InitFlowService,\n    InitFlowService.of({\n      run: (input) =>\n        Effect.tryPromise({\n          try: async () => {\n            const timings: PhaseTiming[] = [];\n            let extendsAccount = \"\";\n            let extendsGateway = \"\";\n            let directory = input.directory;\n            const account = input.account;\n            const domain = input.domain;\n            let overrides = input.overrides as OverrideSection[] | undefined;\n            let plugins = input.plugins;\n\n            if (input.extends) {\n              try {\n                const { accountId, gatewayId } = parseBosUrl(\n                  normalizeExtendsRef(input.extends, \"\"),\n                );\n                extendsAccount = accountId;\n                extendsGateway = gatewayId;\n              } catch {\n                extendsAccount = \"\";\n                extendsGateway = \"\";\n              }\n            }\n\n            extendsAccount = extendsAccount || \"dev.everything.near\";\n            extendsGateway = extendsGateway || \"everything.dev\";\n\n            directory = directory || domain || extendsGateway;\n            const targetDir = resolve(directory);\n            const extendsRef = `bos://${extendsAccount}/${extendsGateway}`;\n\n            let parentPluginKeys: string[] = [];\n            let parentConfig: BosConfig | null = null;\n            try {\n              const parent = await timePhase(timings, \"parent config\", () =>\n                fetchInitParent(extendsAccount, extendsGateway),\n              );\n              parentConfig = parent.parentConfig;\n              parentPluginKeys = parent.parentPluginKeys;\n            } catch (e) {\n              console.warn(\n                `[init] Failed to fetch parent config from ${extendsAccount}/${extendsGateway}: ${\n                  e instanceof Error ? e.message : String(e)\n                }`,\n              );\n              return {\n                status: \"error\" as const,\n                directory,\n                extendsRef,\n                account,\n                domain,\n                extends: extendsRef,\n                plugins,\n                overrides,\n                filesCopied: 0,\n                timings,\n                error: `No config found at ${extendsRef} — are you sure this is the right parent?`,\n              };\n            }\n\n            overrides = overrides?.length ? overrides : ([\"ui\", \"api\"] as OverrideSection[]);\n            const level: StarterLevel = input.level ?? \"simple\";\n            if (overrides.includes(\"plugins\") && plugins === undefined) {\n              plugins = parentPluginKeys;\n            }\n            plugins = plugins ?? [];\n\n            const pluginDirMap: Record<string, string> = {};\n            if (parentConfig?.plugins) {\n              for (const plugin of plugins) {\n                const entry = (parentConfig.plugins as Record<string, unknown>)?.[plugin];\n                if (entry && typeof entry === \"object\") {\n                  const dev = (entry as Record<string, unknown>).development;\n                  if (typeof dev === \"string\") {\n                    const match = dev.match(/^local:plugins\\/(.+)$/);\n                    if (match?.[1] && match[1] !== plugin) pluginDirMap[plugin] = match[1];\n                  }\n                }\n              }\n            }\n\n            const repository =\n              (await detectGitRemoteUrl(process.cwd()).catch(() => undefined)) ??\n              parentConfig?.repository;\n\n            // ADR 0034: init scaffolds a pinned snapshot. Resolve the platform\n            // release manifest first (unpinned — the child does not exist yet,\n            // and its future pin must not constrain introducing it); the\n            // framework version becomes the scaffold's release ref and the\n            // authored config's `platform` pin. No manifest and no explicit\n            // --source → fail loud.\n            let platform: ResolvedPlatformManifest | undefined;\n            if (!input.source) {\n              const chainManifest = await timePhase(timings, \"platform manifest\", () =>\n                resolvePlatformManifest({\n                  configDir: process.cwd(),\n                  localConfig: {\n                    ...(parentConfig as Record<string, unknown>),\n                    extends: extendsRef,\n                    platform: undefined,\n                  },\n                  cacheRead: () => null,\n                  cacheWrite: () => {},\n                }),\n              );\n              if (!chainManifest) {\n                console.warn(\n                  `[init] No platform release manifest resolves behind ${extendsRef} — publish one or scaffold with --source`,\n                );\n                return {\n                  status: \"error\" as const,\n                  directory,\n                  extendsRef,\n                  account,\n                  domain,\n                  extends: extendsRef,\n                  plugins,\n                  overrides,\n                  filesCopied: 0,\n                  timings,\n                  error: `No platform release manifest resolves behind ${extendsRef} — publish a platform manifest (bos publish) or scaffold with --source`,\n                };\n              }\n              platform = chainManifest;\n            }\n            const releaseRef = platform\n              ? releaseRefCandidates(platform.manifest.frameworkVersion)\n              : undefined;\n\n            const {\n              sourceDir,\n              parentConfig: resolvedParentConfig,\n              cleanup,\n            } = await timePhase(timings, \"template source\", () =>\n              resolveSourceDir({\n                extendsAccount,\n                extendsGateway,\n                source: input.source,\n                ref: releaseRef,\n              }),\n            );\n\n            parentConfig = resolvedParentConfig;\n\n            const isMinimalScaffold = sourceDir === \"\";\n\n            try {\n              let filesCopied: number;\n              let childBosConfig: BosConfigInput | null = null;\n\n              if (isMinimalScaffold) {\n                filesCopied = await timePhase(timings, \"scaffold project\", () =>\n                  scaffoldMinimalProject(targetDir, parentConfig as unknown as BosConfigInput, {\n                    extendsAccount,\n                    extendsGateway,\n                    account: account || extendsAccount,\n                    domain,\n                    plugins,\n                    overrides,\n                    repository,\n                    title: parentConfig?.title,\n                    description: parentConfig?.description,\n                    starter: level,\n                    catalog: platform?.manifest.catalog,\n                    platform: platform?.manifest.frameworkVersion,\n                  }),\n                );\n\n                await timePhase(timings, \"personalize config\", () =>\n                  personalizeConfig(targetDir, {\n                    extendsAccount,\n                    extendsGateway,\n                    account: account || extendsAccount,\n                    domain: domain || extendsGateway,\n                    plugins,\n                    overrides,\n                    mode: \"init\",\n                    repository,\n                    title: parentConfig?.title,\n                    description: parentConfig?.description,\n                    testnet: parentConfig?.testnet,\n                    staging: parentConfig?.staging,\n                    starter: level,\n                    catalog: platform?.manifest.catalog,\n                    platform: platform?.manifest.frameworkVersion,\n                  }),\n                );\n\n                childBosConfig = await timePhase(timings, \"authored config form\", () =>\n                  convertChildConfigToAppForm(targetDir),\n                );\n\n                writeDevOverlayTemplate(targetDir, {\n                  extendsRef: `bos://${extendsAccount}/${extendsGateway}`,\n                });\n              } else {\n                const patterns = buildInitPatterns(overrides, plugins, pluginDirMap);\n                const routeExclusions = overrides.includes(\"ui\")\n                  ? buildPluginRouteExclusions(parentConfig, plugins)\n                  : [];\n                const starterExclusions = overrides.includes(\"ui\")\n                  ? buildStarterRouteExclusions(level, parentConfig)\n                  : [];\n                const copyIgnore = [...routeExclusions, ...starterExclusions];\n\n                filesCopied = await timePhase(timings, \"copy files\", () =>\n                  copyFilteredFiles(sourceDir, targetDir, patterns, {\n                    overrides,\n                    plugins,\n                    ignore: copyIgnore,\n                  }),\n                );\n\n                // The child's authored config is always generated, never copied:\n                // a TS-form parent's bos.app.ts imports everything-dev and cannot\n                // load before the child's install. Write the JSON form from the\n                // loaded parent config — the personalization +\n                // convertChildConfigToAppForm below produce the child's own\n                // authored bos.app.ts.\n                if (!existsSync(join(targetDir, \"bos.config.json\"))) {\n                  await saveBosConfig(targetDir, parentConfig);\n                }\n\n                await timePhase(timings, \"personalize config\", () =>\n                  personalizeConfig(targetDir, {\n                    extendsAccount,\n                    extendsGateway,\n                    account: account || extendsAccount,\n                    domain: domain || extendsGateway,\n                    plugins,\n                    overrides,\n                    workspaceOpts: { sourceDir },\n                    repository,\n                    title: parentConfig?.title,\n                    description: parentConfig?.description,\n                    testnet: parentConfig?.testnet,\n                    staging: parentConfig?.staging,\n                    starter: level,\n                    catalog: platform?.manifest.catalog,\n                    platform: platform?.manifest.frameworkVersion,\n                  }),\n                );\n\n                childBosConfig = await timePhase(timings, \"authored config form\", () =>\n                  convertChildConfigToAppForm(targetDir),\n                );\n\n                writeDevOverlayTemplate(targetDir, {\n                  extendsRef: `bos://${extendsAccount}/${extendsGateway}`,\n                });\n\n                if (overrides.includes(\"ui\")) {\n                  await timePhase(timings, \"prune unused ui files\", async () =>\n                    pruneUnusedUiFiles(targetDir, { log: console.log }),\n                  );\n                }\n\n                await timePhase(timings, \"write snapshot\", () =>\n                  writeInitSnapshot(\n                    targetDir,\n                    extendsAccount,\n                    extendsGateway,\n                    sourceDir,\n                    patterns,\n                    {\n                      overrides,\n                      plugins,\n                      ignore: copyIgnore,\n                      starter: level,\n                    },\n                  ),\n                );\n\n                await timePhase(timings, \"personalize agents\", () =>\n                  personalizeAgentsMd(targetDir, { overrides, plugins }),\n                );\n              }\n\n              await timePhase(timings, \"sync shared deps\", () =>\n                syncResolvedSharedDeps({\n                  configDir: targetDir,\n                  hostMode: \"local\",\n                  bosConfig: childBosConfig\n                    ? (childBosConfig as unknown as Record<string, unknown>)\n                    : undefined,\n                }),\n              );\n\n              // A stray lockfile (copied or left from a previous run) would pin\n              // stale framework resolutions — the fresh install re-resolves.\n              removeStrayLockfiles(targetDir);\n\n              const initConfig = await timePhase(timings, \"resolve config\", () =>\n                openResolution({ cwd: targetDir }).catch((error: unknown) => {\n                  console.warn(\n                    \"[init] Skipping config resolution — the child has no node_modules yet; `bos dev` resolves after `pnpm install`.\",\n                    error instanceof Error ? error.message : error,\n                  );\n                  return null;\n                }),\n              );\n              const initRuntime = initConfig?.runtime;\n              if (initRuntime) {\n                await timePhase(timings, \"generate env/docker\", async () => {\n                  await materializeViaLayer(targetDir, initRuntime);\n                });\n              }\n              await timePhase(timings, \"create env file\", async () => {\n                await Effect.runPromise(makeProjectEnv().ensureFile(targetDir));\n              });\n\n              if (!input.noInstall) {\n                await timePhase(timings, \"install dependencies\", () => runPnpmInstall(targetDir));\n                await timePhase(timings, \"generate types\", () => runTypesGen(targetDir));\n                await timePhase(timings, \"generate migrations\", () =>\n                  generateDatabaseMigrations(targetDir),\n                );\n              }\n\n              const initArtifactsConfig = initConfig?.config;\n              if (input.noInstall && initArtifactsConfig) {\n                await timePhase(timings, \"generate code artifacts\", () =>\n                  generateCodeArtifacts(targetDir, initArtifactsConfig),\n                );\n              }\n\n              return {\n                status: \"initialized\" as const,\n                directory,\n                extendsRef,\n                account,\n                domain,\n                extends: extendsRef,\n                plugins,\n                overrides,\n                filesCopied,\n                timings,\n                targetDir,\n              };\n            } finally {\n              await cleanup();\n            }\n          },\n          catch: (error) => {\n            const extendsRef = normalizeExtendsRef(\n              input.extends,\n              \"bos://dev.everything.near/everything.dev\",\n            );\n            return {\n              status: \"error\" as const,\n              directory: input.directory ?? \"\",\n              extendsRef,\n              account: input.account,\n              domain: input.domain,\n              extends: extendsRef,\n              plugins: input.plugins ?? [],\n              overrides: input.overrides,\n              filesCopied: 0,\n              timings: [] as PhaseTiming[],\n              error: error instanceof Error ? error.message : \"Unknown error\",\n            };\n          },\n        }),\n    }),\n  );\n}\n\nexport type InitOptions = {\n  directory?: string | undefined;\n  account?: string | undefined;\n  domain?: string | undefined;\n  extends?: string | undefined;\n  plugins?: string[] | undefined;\n  overrides?: OverrideSection[] | undefined;\n  level?: StarterLevel | undefined;\n  source?: string | undefined;\n  noInstall?: boolean | undefined;\n};\n"],"mappings":"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"}