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
package/dist/cli/init.mjs CHANGED
@@ -1,9 +1,9 @@
1
1
  import { fetchResponse } from "../http-client.mjs";
2
2
  import { fetchBosConfigFromFastKv } from "../fastkv.mjs";
3
- import { resolveExtendsRef } from "../merge.mjs";
4
3
  import { loadManifestNormalizationSpec, normalizePackageManifestsInTree } from "../internal/manifest-normalizer.mjs";
5
4
  import { saveBosConfig } from "../utils/save-config.mjs";
6
5
  import { writeSnapshot } from "./snapshot.mjs";
6
+ import { getExtendsRef, parseBosRef, readJsonFile } from "./utils/helpers.mjs";
7
7
  import { createRequire } from "node:module";
8
8
  import { createWriteStream, existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
9
9
  import { dirname, join, relative, resolve } from "node:path";
@@ -38,18 +38,6 @@ const OVERRIDE_WORKSPACE_MAP = {
38
38
  host: ["host"],
39
39
  plugins: []
40
40
  };
41
- function getExtendsRef(config) {
42
- if (typeof config.extends === "string") return config.extends;
43
- if (config.extends && typeof config.extends === "object") return resolveExtendsRef(config.extends, "production");
44
- }
45
- function parseBosRef(ref) {
46
- const match = ref.match(/^bos:\/\/([^/]+)\/(.+)$/);
47
- if (!match?.[1] || !match[2]) return null;
48
- return {
49
- account: match[1],
50
- gateway: match[2]
51
- };
52
- }
53
41
  function readWorkspaceCatalog(sourceDir) {
54
42
  const pkgPath = join(sourceDir, "package.json");
55
43
  if (!existsSync(pkgPath)) return {};
@@ -344,14 +332,31 @@ function buildRootTypecheckScript(sections) {
344
332
  if (sections.plugins) commands.push("if [ -d plugins ]; then for dir in plugins/*; do if [ -f \"$dir/package.json\" ]; then bun run --cwd \"$dir\" typecheck; fi; done; fi");
345
333
  return commands.join(" && ");
346
334
  }
335
+ function getParentOnlyScriptKeys(projectDir) {
336
+ const parentPkgPath = join(projectDir, "node_modules", "everything-dev", "package.json");
337
+ if (!existsSync(parentPkgPath)) return [];
338
+ try {
339
+ const parentScripts = JSON.parse(readFileSync(parentPkgPath, "utf-8")).scripts ?? {};
340
+ const allChildKeys = new Set(Object.keys(buildChildRootScripts({
341
+ ui: true,
342
+ api: true,
343
+ host: true,
344
+ plugins: true
345
+ })));
346
+ allChildKeys.add("test:integration");
347
+ return Object.keys(parentScripts).filter((key) => !allChildKeys.has(key));
348
+ } catch {
349
+ return [];
350
+ }
351
+ }
347
352
  function buildChildRootScripts(sections) {
348
353
  const scripts = {
349
- dev: "node_modules/.bin/bos dev",
350
- "dev:proxy": "node_modules/.bin/bos dev --proxy",
351
- build: "node_modules/.bin/bos build",
352
- deploy: "node_modules/.bin/bos build --deploy",
353
- publish: "node_modules/.bin/bos publish",
354
- start: "node_modules/.bin/bos start",
354
+ dev: "bos dev",
355
+ "dev:proxy": "bos dev --proxy",
356
+ build: "bos build",
357
+ deploy: "bos build --deploy",
358
+ publish: "bos publish",
359
+ start: "bos start",
355
360
  typecheck: buildRootTypecheckScript(sections),
356
361
  lint: "biome check .",
357
362
  "lint:fix": "biome check --write .",
@@ -360,31 +365,34 @@ function buildChildRootScripts(sections) {
360
365
  changeset: "changeset",
361
366
  version: "changeset version",
362
367
  release: "echo 'Packages versioned - app release handled by workflow'",
363
- postinstall: "node_modules/.bin/bos types gen || true",
364
- "types:gen": "node_modules/.bin/bos types gen",
365
- bos: "node_modules/.bin/bos"
368
+ postinstall: "node node_modules/.bin/bos types gen || true",
369
+ "types:gen": "node node_modules/.bin/bos types gen",
370
+ bos: "bos"
366
371
  };
367
372
  if (sections.api) {
368
373
  scripts["db:push"] = "bun run --cwd api drizzle-kit push";
369
- scripts["db:studio"] = "node_modules/.bin/bos db:studio";
370
- scripts["db:doctor"] = "node_modules/.bin/bos db:doctor";
371
- scripts["db:repair"] = "node_modules/.bin/bos db:repair";
374
+ scripts["db:studio"] = "bos db:studio";
375
+ scripts["db:doctor"] = "bos db:doctor";
376
+ scripts["db:repair"] = "bos db:repair";
372
377
  scripts["db:generate"] = "bun run --cwd api drizzle-kit generate";
373
378
  scripts["db:migrate"] = "bun run --cwd api drizzle-kit migrate";
374
- scripts["test:api"] = "cd api && bun run test tests/integration/ tests/unit/";
375
- scripts["test:integration"] = "cd api && bun run test tests/integration/";
379
+ scripts["test:api"] = "bun run --cwd api test --if-present";
380
+ scripts["test:integration"] = "bun run --cwd api test tests/integration/ --if-present";
376
381
  }
377
- if (sections.host) scripts["test:e2e"] = "bun run --cwd host test:e2e";
378
- if (sections.api && sections.host) scripts.test = "bun run test:api && bun run test:e2e";
379
- else if (sections.api) scripts.test = "bun run test:api";
380
- else if (sections.host) scripts.test = "bun run test:e2e";
382
+ if (sections.host) scripts["test:e2e"] = "bun run --cwd host test --if-present";
383
+ const testTargets = [];
384
+ if (sections.api) testTargets.push("bun run --cwd api test --if-present");
385
+ if (sections.host) testTargets.push("bun run --cwd host test --if-present");
386
+ if (sections.ui) testTargets.push("bun run --cwd ui test --if-present");
387
+ if (sections.plugins) testTargets.push("for d in plugins/*; do [ -f \"$d/package.json\" ] && bun run --cwd \"$d\" test --if-present; done");
388
+ scripts.test = testTargets.length > 0 ? testTargets.join(" && ") : "echo \"No workspace directories configured\"";
381
389
  if (sections.api || sections.host) {
382
390
  scripts["dev:postgres"] = "docker compose up -d --wait && bun run dev";
383
391
  scripts["dev:postgres:down"] = "docker compose down";
384
392
  scripts["dev:postgres:reset"] = "docker compose down -v && docker compose up -d --wait";
385
393
  }
386
- if (sections.ui) scripts["dev:ui"] = "node_modules/.bin/bos dev --ui local --api remote";
387
- if (sections.api) scripts["dev:api"] = "node_modules/.bin/bos dev --ui remote --api local";
394
+ if (sections.ui) scripts["dev:ui"] = "bos dev --ui local --api remote";
395
+ if (sections.api) scripts["dev:api"] = "bos dev --ui remote --api local";
388
396
  return scripts;
389
397
  }
390
398
  async function personalizeConfig(destination, opts) {
@@ -470,6 +478,12 @@ async function personalizeConfig(destination, opts) {
470
478
  }
471
479
  await saveBosConfig(destination, config);
472
480
  }
481
+ for (const relPath of ["ui/src/lib/api-types.gen.ts", "api/src/lib/plugins-types.gen.ts"]) {
482
+ const absolutePath = join(destination, relPath);
483
+ try {
484
+ rmSync(absolutePath, { force: true });
485
+ } catch {}
486
+ }
473
487
  const pkgPath = join(destination, "package.json");
474
488
  if (existsSync(pkgPath)) {
475
489
  const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
@@ -504,6 +518,7 @@ async function personalizeConfig(destination, opts) {
504
518
  const scripts = pkg.scripts;
505
519
  for (const [key, value] of Object.entries(childScripts)) scripts[key] = value;
506
520
  for (const obsoleteScript of [
521
+ ...getParentOnlyScriptKeys(destination),
507
522
  "init",
508
523
  "sync-catalog",
509
524
  "db:push",
@@ -612,9 +627,9 @@ export type InferOutput<_TRoute extends string> = any;
612
627
  if (has("plugins")) for (const plugin of opts.plugins ?? []) {
613
628
  const pluginSrcDir = join(destination, "plugins", plugin, "src");
614
629
  const pluginIndexPath = join(pluginSrcDir, "index.ts");
615
- const pluginClientGenPath = join(pluginSrcDir, "plugins-client.gen.ts");
630
+ const pluginClientGenPath = join(pluginSrcDir, "lib", "plugins-client.gen.ts");
616
631
  if (!existsSync(pluginIndexPath) || existsSync(pluginClientGenPath)) continue;
617
- if (!readFileSync(pluginIndexPath, "utf-8").includes("./plugins-client.gen")) continue;
632
+ if (!readFileSync(pluginIndexPath, "utf-8").includes("./lib/plugins-client.gen")) continue;
618
633
  writeFileSync(pluginClientGenPath, "export type PluginsClient = Record<string, never>;\n");
619
634
  }
620
635
  }
@@ -663,15 +678,22 @@ function toRelativeImportPath(fromPath, toPath) {
663
678
  const rel = relative(dirname(toPath), fromPath);
664
679
  return rel.startsWith(".") ? rel : `./${rel}`;
665
680
  }
666
- async function runBunInstall(destination, spinner) {
667
- await runWithProgress("bun", ["install", "--ignore-scripts"], destination, spinner, "Installing dependencies");
681
+ async function runBunInstall(destination, opts) {
682
+ await runWithProgress("bun", ["install", "--ignore-scripts"], destination, opts?.spinner, "Installing dependencies");
668
683
  }
669
- async function runBunInstallForUpgrade(destination, spinner) {
670
- await runWithProgress("bun", ["install", "--force"], destination, spinner, "Installing dependencies");
684
+ async function runBunInstallForUpgrade(destination, opts) {
685
+ await runWithProgress("bun", ["install", "--force"], destination, opts?.spinner, "Installing dependencies");
671
686
  }
672
- async function runTypesGen(destination, spinner) {
673
- if (existsSync(join(destination, "node_modules", ".bin", "bos"))) {
674
- await runWithProgress("node_modules/.bin/bos", ["types", "gen"], destination, spinner, "Generating types");
687
+ async function runTypesGen(destination, opts) {
688
+ const bosModule = join(destination, "node_modules", "everything-dev", "dist", "cli.mjs");
689
+ if (existsSync(bosModule)) {
690
+ const args = [
691
+ bosModule,
692
+ "types",
693
+ "gen"
694
+ ];
695
+ if (opts?.remotePlugins && opts.remotePlugins.length > 0) args.push("--remote-plugins", opts.remotePlugins.join(","));
696
+ await runWithProgress(process.execPath, args, destination, opts?.spinner, "Generating types");
675
697
  return;
676
698
  }
677
699
  throw new Error("Unable to locate bos CLI for types generation");
@@ -688,7 +710,11 @@ async function runWithProgress(command, args, cwd, spinner, label) {
688
710
  const child = execa(command, args, {
689
711
  cwd,
690
712
  stdio: "inherit",
691
- timeout: COMMAND_TIMEOUTS[command] ?? 2 * 6e4
713
+ timeout: COMMAND_TIMEOUTS[command] ?? 2 * 6e4,
714
+ env: {
715
+ ...process.env,
716
+ BOS_NO_BANNER: "1"
717
+ }
692
718
  });
693
719
  if (spinner) {
694
720
  const start = Date.now();
@@ -730,9 +756,6 @@ function removeInitLockfile(lockfilePath) {
730
756
  if (!existsSync(lockfilePath)) return;
731
757
  rmSync(lockfilePath, { force: true });
732
758
  }
733
- function readJsonFile(filePath) {
734
- return JSON.parse(readFileSync(filePath, "utf-8"));
735
- }
736
759
  async function scaffoldMinimalProject(destination, parentConfig, opts) {
737
760
  mkdirSync(destination, { recursive: true });
738
761
  const has = (section) => opts.overrides.includes(section);
@@ -1055,5 +1078,5 @@ docker-compose.yml
1055
1078
  }
1056
1079
 
1057
1080
  //#endregion
1058
- export { INIT_ROOT_PATTERNS, buildChildAgentsMd, buildChildRootScripts, buildInitPatterns, buildPluginRouteExclusions, copyFilteredFiles, detectGitRemoteUrl, downloadTarball, execCommand, extractSkillsBlock, fetchParentConfig, generateDatabaseMigrations, personalizeAgentsMd, personalizeConfig, removeInitLockfile, resolveCatalogChainSource, resolveRepositoryViaExtendsChain, resolveSourceDir, runBunInstall, runBunInstallForUpgrade, runDockerComposeUp, runTypesGen, scaffoldMinimalProject, sourcePathToDestinationPath, stripOrphanedWorkspacesFromLockfile, writeInitSnapshot };
1081
+ export { INIT_ROOT_PATTERNS, buildChildAgentsMd, buildChildRootScripts, buildInitPatterns, buildPluginRouteExclusions, copyFilteredFiles, detectGitRemoteUrl, downloadTarball, execCommand, extractSkillsBlock, fetchParentConfig, generateDatabaseMigrations, getParentOnlyScriptKeys, personalizeAgentsMd, personalizeConfig, removeInitLockfile, resolveCatalogChainSource, resolveRepositoryViaExtendsChain, resolveSourceDir, runBunInstall, runBunInstallForUpgrade, runDockerComposeUp, runTypesGen, scaffoldMinimalProject, sourcePathToDestinationPath, stripOrphanedWorkspacesFromLockfile, writeInitSnapshot };
1059
1082
  //# sourceMappingURL=init.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.mjs","names":[],"sources":["../../src/cli/init.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { execa } from \"execa\";\nimport { glob } from \"glob\";\nimport type { OverrideSection } from \"../contract\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport { fetchResponse } from \"../http-client\";\nimport {\n loadManifestNormalizationSpec,\n normalizePackageManifestsInTree,\n} from \"../internal/manifest-normalizer\";\nimport { resolveExtendsRef } from \"../merge\";\nimport type { BosConfig, BosConfigInput } from \"../types\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { writeSnapshot } from \"./snapshot\";\n\nconst require = createRequire(import.meta.url);\n\nexport const INIT_ROOT_PATTERNS = [\n \"bos.config.json\",\n \"package.json\",\n \".env.example\",\n \".gitignore\",\n \"biome.json\",\n \"bunfig.toml\",\n \"Dockerfile\",\n \"railway.json\",\n \"railway.toml\",\n \"AGENTS.md\",\n \".changeset/config.json\",\n \".changeset/README.md\",\n \"README.md\",\n \"CONTRIBUTING.md\",\n \".github/templates/**\",\n] as const;\n\nconst OVERRIDE_WORKSPACE_MAP: Record<OverrideSection, string[]> = {\n ui: [\"ui\"],\n api: [\"api\"],\n host: [\"host\"],\n plugins: [],\n};\n\ninterface SourceResult {\n sourceDir: string;\n parentConfig: BosConfig;\n cleanup: () => Promise<void>;\n}\n\nexport interface CatalogChainSource {\n catalog: Record<string, string>;\n repository?: string;\n extendsChain: string[];\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 readWorkspaceCatalog(sourceDir: string): Record<string, string> {\n const pkgPath = join(sourceDir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {};\n }\n\n const pkg = readJsonFile<{ workspaces?: { catalog?: Record<string, string> } }>(pkgPath);\n return { ...(pkg.workspaces?.catalog ?? {}) };\n}\n\nexport async function resolveCatalogChainSource(opts: {\n extendsAccount: string;\n extendsGateway: string;\n sourceDir?: string;\n}): Promise<CatalogChainSource> {\n const catalogs: Record<string, string>[] = [];\n const cleanups: Array<() => Promise<void>> = [];\n const extendsChain: string[] = [];\n const visited = new Set<string>();\n let repository: string | undefined;\n let currentRef = `bos://${opts.extendsAccount}/${opts.extendsGateway}`;\n let sourceDir = opts.sourceDir ? resolve(opts.sourceDir) : undefined;\n let configPath = sourceDir ? join(sourceDir, \"bos.config.json\") : undefined;\n\n try {\n while (true) {\n if (visited.has(currentRef)) {\n throw new Error(`Circular extends detected while resolving catalog source: ${currentRef}`);\n }\n\n visited.add(currentRef);\n extendsChain.push(currentRef);\n\n let config: Record<string, unknown>;\n let currentSourceDir = sourceDir;\n let cleanup: () => Promise<void> = async () => {};\n\n if (configPath) {\n config = readJsonFile<Record<string, unknown>>(configPath);\n currentSourceDir = dirname(configPath);\n } else {\n const parsed = parseBosRef(currentRef);\n if (!parsed) {\n break;\n }\n const sourceResult = await resolveSourceDir({\n extendsAccount: parsed.account,\n extendsGateway: parsed.gateway,\n });\n config = sourceResult.parentConfig as Record<string, unknown>;\n currentSourceDir = sourceResult.sourceDir || undefined;\n cleanup = sourceResult.cleanup;\n }\n\n cleanups.push(cleanup);\n catalogs.push(currentSourceDir ? readWorkspaceCatalog(currentSourceDir) : {});\n\n if (typeof config.repository === \"string\") {\n repository = config.repository;\n }\n\n const nextExtendsRef = getExtendsRef(config);\n if (!nextExtendsRef) {\n break;\n }\n\n if (nextExtendsRef.startsWith(\"bos://\")) {\n currentRef = nextExtendsRef;\n sourceDir = undefined;\n configPath = undefined;\n continue;\n }\n\n if (!currentSourceDir) {\n break;\n }\n\n const nextConfigPath = resolve(currentSourceDir, nextExtendsRef);\n if (!existsSync(nextConfigPath)) {\n break;\n }\n\n currentRef = nextConfigPath;\n sourceDir = dirname(nextConfigPath);\n configPath = nextConfigPath;\n }\n } finally {\n for (const cleanup of cleanups.reverse()) {\n await cleanup();\n }\n }\n\n return {\n catalog: Object.assign({}, ...catalogs.reverse()),\n repository,\n extendsChain,\n };\n}\n\nexport async function resolveSourceDir(opts: {\n extendsAccount: string;\n extendsGateway: string;\n source?: string;\n}): Promise<SourceResult> {\n if (opts.source) {\n const sourceDir = resolve(opts.source);\n if (!existsSync(join(sourceDir, \"bos.config.json\"))) {\n throw new Error(`No bos.config.json found in source directory: ${sourceDir}`);\n }\n const parentConfig = JSON.parse(\n readFileSync(join(sourceDir, \"bos.config.json\"), \"utf-8\"),\n ) as BosConfig;\n return { sourceDir, parentConfig, cleanup: async () => {} };\n }\n\n const parentConfig = await fetchParentConfig(opts.extendsAccount, opts.extendsGateway);\n\n if (parentConfig.repository) {\n const { dir: sourceDir, cleanup } = await downloadTarball(parentConfig.repository);\n return { sourceDir, parentConfig, cleanup };\n }\n\n const chainResult = await resolveRepositoryViaExtendsChain(\n opts.extendsAccount,\n opts.extendsGateway,\n );\n if (chainResult?.repository) {\n const { dir: sourceDir, cleanup } = await downloadTarball(chainResult.repository);\n return { sourceDir, parentConfig: chainResult.config, cleanup };\n }\n\n return {\n sourceDir: \"\",\n parentConfig,\n cleanup: async () => {},\n };\n}\n\nexport function buildInitPatterns(\n overrides: OverrideSection[],\n plugins?: string[],\n pluginDirMap?: Record<string, string>,\n): string[] {\n const has = (section: OverrideSection) => overrides.includes(section);\n const patterns: string[] = [...INIT_ROOT_PATTERNS];\n\n if (has(\"ui\")) patterns.push(\"ui/**\");\n if (has(\"api\")) patterns.push(\"api/**\");\n if (has(\"host\")) patterns.push(\"host/**\");\n if (has(\"plugins\")) {\n for (const plugin of plugins ?? []) {\n const dirName = pluginDirMap?.[plugin] ?? plugin;\n patterns.push(`plugins/${dirName}/**`);\n }\n }\n\n return patterns;\n}\n\nexport function buildPluginRouteExclusions(\n parentConfig: { plugins?: Record<string, unknown> } | null | undefined,\n selectedPlugins: string[],\n): string[] {\n if (!parentConfig?.plugins) return [];\n\n const selected = new Set(selectedPlugins);\n const claimedBySelected = new Set<string>();\n const claimedByUnselected: string[] = [];\n\n for (const [pluginKey, entry] of Object.entries(parentConfig.plugins)) {\n const routes = extractPluginRoutes(entry);\n if (!routes) continue;\n\n if (selected.has(pluginKey)) {\n for (const route of routes) claimedBySelected.add(route);\n } else {\n for (const route of routes) claimedByUnselected.push(route);\n }\n }\n\n return claimedByUnselected.filter((route) => !claimedBySelected.has(route));\n}\n\nfunction extractPluginRoutes(entry: unknown): string[] | undefined {\n if (typeof entry !== \"object\" || entry === null) return undefined;\n const routes = (entry as { routes?: unknown }).routes;\n if (!Array.isArray(routes)) return undefined;\n return routes.filter((r): r is string => typeof r === \"string\");\n}\n\nexport function sourcePathToDestinationPath(filePath: string): string {\n return filePath.startsWith(\".github/templates/\")\n ? filePath.replace(/^\\.github\\/templates\\//, \".github/\")\n : filePath;\n}\n\nexport async function fetchParentConfig(\n extendsAccount: string,\n extendsGateway: string,\n): Promise<BosConfig> {\n const bosUrl = `bos://${extendsAccount}/${extendsGateway}`;\n return fetchBosConfigFromFastKv<BosConfig>(bosUrl);\n}\n\nexport async function resolveRepositoryViaExtendsChain(\n extendsAccount: string,\n extendsGateway: string,\n visited = new Set<string>(),\n): Promise<{ repository: string; config: BosConfig } | null> {\n const key = `bos://${extendsAccount}/${extendsGateway}`;\n if (visited.has(key)) return null;\n visited.add(key);\n\n try {\n const config = await fetchParentConfig(extendsAccount, extendsGateway);\n if (config.repository) {\n return { repository: config.repository, config };\n }\n\n const extendsRef = getExtendsRef(config as Record<string, unknown>);\n if (extendsRef) {\n const normalized = extendsRef.startsWith(\"bos://\") ? extendsRef : `bos://${extendsRef}`;\n const parsed = parseBosRef(normalized);\n if (parsed) {\n const result = await resolveRepositoryViaExtendsChain(\n parsed.account,\n parsed.gateway,\n visited,\n );\n if (result) return result;\n }\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function detectGitRemoteUrl(directory: string): Promise<string | undefined> {\n try {\n const { stdout } = await execa(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd: directory,\n stdio: \"pipe\",\n });\n const url = stdout.trim();\n if (!url) return undefined;\n return normalizeGitUrl(url);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeGitUrl(url: string): string | undefined {\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return `https://github.com/${sshMatch[1]}/${sshMatch[2]}`;\n }\n const httpsMatch = url.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?(?:\\/.*)?$/);\n if (httpsMatch) {\n return `https://github.com/${httpsMatch[1]}/${httpsMatch[2]}`;\n }\n return url.endsWith(\".git\") ? url.slice(0, -4) : url;\n}\n\nexport async function downloadTarball(\n repoUrl: string,\n): Promise<{ dir: string; cleanup: () => Promise<void> }> {\n const parsed = parseGitHubUrl(repoUrl);\n if (!parsed) {\n throw new Error(`Cannot parse repository URL: ${repoUrl}`);\n }\n\n const { owner, repo } = parsed;\n let response: Response | null = null;\n\n for (const branch of [\"main\", \"master\"]) {\n const candidate = await fetchResponse(\n `https://api.github.com/repos/${owner}/${repo}/tarball/${branch}`,\n {\n headers: { \"User-Agent\": \"everything-dev\" },\n redirect: \"follow\",\n timeout: \"60 seconds\",\n },\n );\n if (candidate.ok) {\n response = candidate;\n break;\n }\n if (candidate.status !== 404) {\n throw new Error(\n `GitHub tarball download failed: ${candidate.status} ${candidate.statusText}`,\n );\n }\n }\n\n if (!response) {\n throw new Error(`GitHub tarball download failed for ${repoUrl}: tried main and master`);\n }\n\n if (!response.body) {\n throw new Error(\"GitHub tarball download returned empty body\");\n }\n\n const tmpDir = mkTmpDir(\"bos-init-tarball-\");\n const tarballPath = join(tmpDir, \"source.tar.gz\");\n\n const fileStream = createWriteStream(tarballPath);\n const reader = response.body as unknown as NodeJS.ReadableStream;\n await pipeline(reader, fileStream);\n\n const extractDir = mkTmpDir(\"bos-init-extract-\");\n try {\n const tar = require(\"tar\") as {\n extract: (opts: { cwd: string; file: string; strip: number }) => Promise<void>;\n };\n await tar.extract({ cwd: extractDir, file: tarballPath, strip: 1 });\n } catch {\n await execCommand(\"tar\", [\"-xzf\", tarballPath, \"--strip-components=1\", \"-C\", extractDir]);\n }\n\n rmSync(tmpDir, { recursive: true, force: true });\n\n return {\n dir: extractDir,\n cleanup: async () => {\n rmSync(extractDir, { recursive: true, force: true });\n },\n };\n}\n\nfunction parseGitHubUrl(url: string): { owner: string; repo: string } | null {\n const httpsMatch = url.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?(?:\\/.*)?$/);\n if (httpsMatch) {\n return { owner: httpsMatch[1], repo: httpsMatch[2] };\n }\n\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2] };\n }\n\n return null;\n}\n\nexport async function copyFilteredFiles(\n sourceDir: string,\n destination: string,\n patterns: string[],\n options: {\n overrides: OverrideSection[];\n plugins?: string[];\n ignore?: string[];\n },\n): Promise<number> {\n if (patterns.length === 0) {\n return 0;\n }\n\n const baseIgnore = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\", \"**/.bos/**\"];\n const ignore = options.ignore ? [...baseIgnore, ...options.ignore] : baseIgnore;\n\n const allFiles = new Set<string>();\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n ignore,\n });\n for (const match of matches) {\n allFiles.add(match);\n }\n }\n\n mkdirSync(destination, { recursive: true });\n\n let count = 0;\n for (const filePath of allFiles) {\n const src = join(sourceDir, filePath);\n const stat = lstatSync(src);\n if (!stat.isFile()) continue;\n\n const destPath = sourcePathToDestinationPath(filePath);\n const dest = join(destination, destPath);\n mkdirSync(dirname(dest), { recursive: true });\n const content = readFileSync(src);\n writeFileSync(dest, content);\n count++;\n }\n\n return count;\n}\n\nfunction stripProductionFields(entry: Record<string, unknown>): void {\n delete entry.production;\n delete entry.integrity;\n delete entry.ssr;\n delete entry.ssrIntegrity;\n}\n\nfunction buildRootTypecheckScript(sections: {\n ui: boolean;\n api: boolean;\n host: boolean;\n plugins: boolean;\n}): string {\n const commands = [\"bun run types:gen\"];\n\n if (sections.ui) {\n commands.push(\"if [ -d ui ]; then bun run --cwd ui typecheck; fi\");\n }\n if (sections.api) {\n commands.push(\"if [ -d api ]; then bun run --cwd api typecheck; fi\");\n }\n if (sections.host) {\n commands.push(\"if [ -d host ]; then bun run --cwd host typecheck; fi\");\n }\n if (sections.plugins) {\n commands.push(\n 'if [ -d plugins ]; then for dir in plugins/*; do if [ -f \"$dir/package.json\" ]; then bun run --cwd \"$dir\" typecheck; fi; done; fi',\n );\n }\n\n return commands.join(\" && \");\n}\n\nexport function buildChildRootScripts(sections: {\n ui: boolean;\n api: boolean;\n host: boolean;\n plugins: boolean;\n}): Record<string, string> {\n const scripts: Record<string, string> = {\n dev: \"node_modules/.bin/bos dev\",\n \"dev:proxy\": \"node_modules/.bin/bos dev --proxy\",\n build: \"node_modules/.bin/bos build\",\n deploy: \"node_modules/.bin/bos build --deploy\",\n publish: \"node_modules/.bin/bos publish\",\n start: \"node_modules/.bin/bos start\",\n typecheck: buildRootTypecheckScript(sections),\n lint: \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n format: \"biome format --write .\",\n \"format:check\": \"biome format .\",\n changeset: \"changeset\",\n version: \"changeset version\",\n release: \"echo 'Packages versioned - app release handled by workflow'\",\n postinstall: \"node_modules/.bin/bos types gen || true\",\n \"types:gen\": \"node_modules/.bin/bos types gen\",\n bos: \"node_modules/.bin/bos\",\n };\n\n if (sections.api) {\n scripts[\"db:push\"] = \"bun run --cwd api drizzle-kit push\";\n scripts[\"db:studio\"] = \"node_modules/.bin/bos db:studio\";\n scripts[\"db:doctor\"] = \"node_modules/.bin/bos db:doctor\";\n scripts[\"db:repair\"] = \"node_modules/.bin/bos db:repair\";\n scripts[\"db:generate\"] = \"bun run --cwd api drizzle-kit generate\";\n scripts[\"db:migrate\"] = \"bun run --cwd api drizzle-kit migrate\";\n scripts[\"test:api\"] = \"cd api && bun run test tests/integration/ tests/unit/\";\n scripts[\"test:integration\"] = \"cd api && bun run test tests/integration/\";\n }\n\n if (sections.host) {\n scripts[\"test:e2e\"] = \"bun run --cwd host test:e2e\";\n }\n\n if (sections.api && sections.host) {\n scripts.test = \"bun run test:api && bun run test:e2e\";\n } else if (sections.api) {\n scripts.test = \"bun run test:api\";\n } else if (sections.host) {\n scripts.test = \"bun run test:e2e\";\n }\n\n if (sections.api || sections.host) {\n scripts[\"dev:postgres\"] = \"docker compose up -d --wait && bun run dev\";\n scripts[\"dev:postgres:down\"] = \"docker compose down\";\n scripts[\"dev:postgres:reset\"] = \"docker compose down -v && docker compose up -d --wait\";\n }\n\n if (sections.ui) {\n scripts[\"dev:ui\"] = \"node_modules/.bin/bos dev --ui local --api remote\";\n }\n if (sections.api) {\n scripts[\"dev:api\"] = \"node_modules/.bin/bos dev --ui remote --api local\";\n }\n\n return scripts;\n}\n\nexport async function personalizeConfig(\n destination: string,\n opts: {\n extendsAccount: string;\n extendsGateway: string;\n account?: string;\n domain?: string;\n plugins?: string[];\n overrides: OverrideSection[];\n pluginRoutes?: Record<string, string[]>;\n workspaceOpts?: { localOverrides?: boolean; sourceDir?: string };\n mode?: \"init\" | \"sync\";\n existingConfig?: Record<string, unknown>;\n repository?: string;\n title?: string;\n description?: string;\n testnet?: string;\n staging?: unknown;\n },\n): Promise<void> {\n const has = (section: OverrideSection) => opts.overrides.includes(section);\n const existingApp =\n opts.mode === \"sync\" && opts.existingConfig?.app && typeof opts.existingConfig.app === \"object\"\n ? (opts.existingConfig.app as Record<string, unknown>)\n : undefined;\n const preservedAuth = existingApp?.auth;\n\n const explicitRootKeys = new Set(\n Object.entries(opts)\n .filter(\n ([key, value]) =>\n value !== undefined &&\n ![\n \"extendsAccount\",\n \"extendsGateway\",\n \"plugins\",\n \"overrides\",\n \"pluginRoutes\",\n \"workspaceOpts\",\n \"mode\",\n \"existingConfig\",\n ].includes(key),\n )\n .map(([key]) => key),\n );\n\n const configPath = join(destination, \"bos.config.json\");\n if (existsSync(configPath)) {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n\n config.extends = `bos://${opts.extendsAccount}/${opts.extendsGateway}`;\n\n if (opts.account) {\n config.account = opts.account;\n }\n if (opts.domain) {\n config.domain = opts.domain;\n }\n if (opts.repository) {\n config.repository = opts.repository;\n } else {\n delete config.repository;\n }\n\n const inheritableFields = [\"title\", \"description\", \"testnet\", \"staging\"] as const;\n for (const field of inheritableFields) {\n if (!(field in opts)) {\n delete config[field];\n }\n }\n\n if (config.app && typeof config.app === \"object\") {\n const app = config.app as Record<string, unknown>;\n\n for (const entryKey of Object.keys(app)) {\n if (\n !has(entryKey as OverrideSection) &&\n (entryKey === \"host\" || entryKey === \"ui\" || entryKey === \"api\")\n ) {\n delete app[entryKey];\n continue;\n }\n if (entryKey === \"auth\") {\n delete app[entryKey];\n continue;\n }\n const entry = app[entryKey];\n if (entry && typeof entry === \"object\") {\n stripProductionFields(entry as Record<string, unknown>);\n }\n }\n\n if (preservedAuth !== undefined) {\n app.auth = preservedAuth;\n }\n\n if (Object.keys(app).length === 0) {\n delete config.app;\n }\n }\n\n if (has(\"plugins\")) {\n if (config.plugins && typeof config.plugins === \"object\") {\n const plugins = config.plugins as Record<string, unknown>;\n\n if (opts.plugins !== undefined) {\n for (const pluginKey of Object.keys(plugins)) {\n if (!opts.plugins.includes(pluginKey)) {\n delete plugins[pluginKey];\n }\n }\n }\n\n for (const pluginKey of Object.keys(plugins)) {\n const plugin = plugins[pluginKey];\n let pluginObj: Record<string, unknown>;\n\n if (typeof plugin === \"string\") {\n pluginObj = { extends: plugin };\n plugins[pluginKey] = pluginObj;\n } else if (plugin && typeof plugin === \"object\") {\n pluginObj = { ...(plugin as Record<string, unknown>) };\n plugins[pluginKey] = pluginObj;\n } else {\n continue;\n }\n\n stripProductionFields(pluginObj);\n }\n\n if (Object.keys(plugins).length === 0) {\n config.plugins = {};\n }\n }\n } else {\n config.plugins = {};\n }\n\n if (opts.mode === \"sync\" && opts.existingConfig) {\n const managedRootKeys = new Set([\"extends\", \"account\", \"domain\", \"app\", \"plugins\"]);\n const preservedRootKeys = new Set([\n ...managedRootKeys,\n ...Object.keys(opts.existingConfig),\n ...explicitRootKeys,\n ]);\n\n for (const key of Object.keys(config)) {\n if (!preservedRootKeys.has(key)) {\n delete config[key];\n }\n }\n\n for (const [key, value] of Object.entries(opts.existingConfig)) {\n if (!(key in config) && !managedRootKeys.has(key) && !explicitRootKeys.has(key)) {\n config[key] = value;\n }\n }\n }\n\n await saveBosConfig(destination, config);\n }\n\n const pkgPath = join(destination, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n const childScripts = buildChildRootScripts({\n ui: has(\"ui\"),\n api: has(\"api\"),\n host: has(\"host\"),\n plugins: has(\"plugins\"),\n });\n\n if (typeof pkg.name !== \"string\" || pkg.name.length === 0) {\n pkg.name = \"monorepo\";\n }\n pkg.private = true;\n pkg.type = \"module\";\n delete pkg.module;\n delete pkg.peerDependencies;\n\n if (pkg.workspaces && typeof pkg.workspaces === \"object\") {\n const ws = pkg.workspaces as { packages?: string[] };\n if (Array.isArray(ws.packages)) {\n ws.packages = ws.packages.filter((p: string) => {\n if (p.startsWith(\"packages/\")) return false;\n if (p === \"ui\") return has(\"ui\");\n if (p === \"api\") return has(\"api\");\n if (p === \"host\") return has(\"host\");\n if (p.startsWith(\"plugins/\")) return false;\n return true;\n });\n\n if (has(\"plugins\")) {\n if (!ws.packages.includes(\"plugins/*\")) {\n ws.packages.push(\"plugins/*\");\n }\n }\n }\n }\n\n if (!pkg.scripts || typeof pkg.scripts !== \"object\") {\n pkg.scripts = {};\n }\n const scripts = pkg.scripts as Record<string, string>;\n for (const [key, value] of Object.entries(childScripts)) {\n scripts[key] = value;\n }\n for (const obsoleteScript of [\n \"init\",\n \"sync-catalog\",\n \"db:push\",\n \"db:studio\",\n \"db:doctor\",\n \"db:repair\",\n \"db:generate\",\n \"db:migrate\",\n \"test\",\n \"test:api\",\n \"test:integration\",\n \"test:e2e\",\n \"dev:postgres\",\n \"dev:postgres:down\",\n \"dev:postgres:reset\",\n \"dev:ui\",\n \"dev:api\",\n ]) {\n if (!(obsoleteScript in childScripts)) {\n delete scripts[obsoleteScript];\n }\n }\n\n if (pkg.devDependencies && typeof pkg.devDependencies === \"object\") {\n const deps = pkg.devDependencies as Record<string, string>;\n delete deps[\"every-plugin\"];\n delete deps[\"everything-dev\"];\n }\n\n if (!pkg.workspaces || typeof pkg.workspaces !== \"object\") {\n pkg.workspaces = { packages: [], catalog: {} };\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 }\n\n if (!pkg.dependencies) pkg.dependencies = {};\n const deps = pkg.dependencies as Record<string, string>;\n const spec = opts.workspaceOpts?.sourceDir\n ? loadManifestNormalizationSpec(opts.workspaceOpts.sourceDir)\n : null;\n if (spec) {\n workspaces.catalog[\"everything-dev\"] = spec.rootCatalog[\"everything-dev\"];\n workspaces.catalog[\"every-plugin\"] = spec.rootCatalog[\"every-plugin\"];\n }\n const frameworkCatalog = (\n await resolveCatalogChainSource({\n extendsAccount: opts.extendsAccount,\n extendsGateway: opts.extendsGateway,\n sourceDir: opts.workspaceOpts?.sourceDir,\n })\n ).catalog;\n for (const [name, version] of Object.entries(frameworkCatalog)) {\n workspaces.catalog[name] = version;\n }\n if (!deps[\"everything-dev\"]) deps[\"everything-dev\"] = \"catalog:\";\n if (!deps[\"every-plugin\"]) deps[\"every-plugin\"] = \"catalog:\";\n\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n const apiTsConfigPath = join(destination, \"api\", \"tsconfig.json\");\n if (existsSync(apiTsConfigPath)) {\n const apiTsConfig = JSON.parse(readFileSync(apiTsConfigPath, \"utf-8\")) as {\n files?: string[];\n [key: string]: unknown;\n };\n if (apiTsConfig.files) {\n const validFiles = apiTsConfig.files.filter((f) => existsSync(join(destination, \"api\", f)));\n if (validFiles.length !== apiTsConfig.files.length) {\n if (validFiles.length === 0) {\n delete apiTsConfig.files;\n } else {\n apiTsConfig.files = validFiles;\n }\n writeFileSync(apiTsConfigPath, `${JSON.stringify(apiTsConfig, null, 2)}\\n`);\n }\n }\n }\n\n await resolveWorkspaceRefs(destination, opts.workspaceOpts);\n\n if (has(\"ui\")) {\n const genContractPath = join(destination, \"ui\", \"src\", \"lib\", \"api-types.gen.ts\");\n if (!existsSync(genContractPath)) {\n mkdirSync(dirname(genContractPath), { recursive: true });\n writeFileSync(genContractPath, `export type ApiContract = Record<string, never>;\\n`);\n }\n }\n\n if (has(\"api\")) {\n const pluginsClientGenPath = join(destination, \"api\", \"src\", \"lib\", \"plugins-types.gen.ts\");\n if (!existsSync(pluginsClientGenPath)) {\n mkdirSync(dirname(pluginsClientGenPath), { recursive: true });\n writeFileSync(\n pluginsClientGenPath,\n `import type { ContractRouterClient, AnyContractRouter } from \"@orpc/contract\";\\ntype ClientFactory<C extends AnyContractRouter> = (context?: Record<string, unknown>) => ContractRouterClient<C>;\\nexport type PluginsClient = Record<string, never>;\\n`,\n );\n }\n }\n\n const authTypesPaths: string[] = [];\n if (has(\"ui\")) {\n authTypesPaths.push(join(destination, \"ui\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n if (has(\"api\")) {\n authTypesPaths.push(join(destination, \"api\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n if (has(\"host\") && existsSync(join(destination, \"host\", \"src\"))) {\n authTypesPaths.push(join(destination, \"host\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n for (const authTypesGenPath of authTypesPaths) {\n if (!existsSync(authTypesGenPath)) {\n mkdirSync(dirname(authTypesGenPath), { recursive: true });\n writeFileSync(authTypesGenPath, generateAuthTypesContent(authTypesGenPath, destination));\n }\n }\n\n if (authTypesPaths.length > 0) {\n const authDir = join(destination, \".bos\", \"generated\", \"auth\");\n if (!existsSync(authDir)) {\n mkdirSync(authDir, { recursive: true });\n }\n const authExportStubPath = join(authDir, \"auth-export.d.ts\");\n if (!existsSync(authExportStubPath)) {\n writeFileSync(\n authExportStubPath,\n `export type Auth = any;\nexport type AuthOrganizationContext = any;\nexport type AuthOrganization = any;\nexport type AuthOrganizationSummary = any;\nexport type AuthOrganizationMember = any;\nexport type AuthApiKey = any;\nexport type AuthInvitation = any;\nexport type GetActiveMemberInput = any;\nexport type GetOrganizationInput = any;\nexport type ListMembersInput = any;\nexport type ListInvitationsInput = any;\nexport type ListApiKeysInput = any;\nexport type AuthServices = any;\nexport type createAuthInstance = any;\n`,\n );\n }\n const contractStubPath = join(authDir, \"contract.d.ts\");\n if (!existsSync(contractStubPath)) {\n writeFileSync(\n contractStubPath,\n `export type ContractType = any;\nexport type InferOutput<_TRoute extends string> = any;\n`,\n );\n }\n }\n\n if (has(\"plugins\")) {\n for (const plugin of opts.plugins ?? []) {\n const pluginSrcDir = join(destination, \"plugins\", plugin, \"src\");\n const pluginIndexPath = join(pluginSrcDir, \"index.ts\");\n const pluginClientGenPath = join(pluginSrcDir, \"plugins-client.gen.ts\");\n if (!existsSync(pluginIndexPath) || existsSync(pluginClientGenPath)) {\n continue;\n }\n const pluginIndex = readFileSync(pluginIndexPath, \"utf-8\");\n if (!pluginIndex.includes(\"./plugins-client.gen\")) {\n continue;\n }\n writeFileSync(pluginClientGenPath, \"export type PluginsClient = Record<string, never>;\\n\");\n }\n }\n}\n\nfunction generateAuthTypesContent(targetPath: string, configDir: string): string {\n const authExportRel = toRelativeImportPath(\n join(configDir, \".bos\", \"generated\", \"auth\", \"auth-export.d.ts\"),\n targetPath,\n );\n const contractRel = toRelativeImportPath(\n join(configDir, \".bos\", \"generated\", \"auth\", \"contract.d.ts\"),\n targetPath,\n );\n\n return `export type {\n Auth,\n AuthOrganizationContext,\n AuthOrganization,\n AuthOrganizationSummary,\n AuthOrganizationMember,\n AuthApiKey,\n AuthInvitation,\n GetActiveMemberInput,\n GetOrganizationInput,\n ListMembersInput,\n ListInvitationsInput,\n ListApiKeysInput,\n AuthServices,\n createAuthInstance,\n} from \"${authExportRel}\";\nimport type { InferOutput, ContractType as AuthContract } from \"${contractRel}\";\nimport type { Auth as BaseAuth } from \"${authExportRel}\";\n\ntype RawAuthSession = InferOutput<\"getSession\">;\ntype RawAuthRequestContext = InferOutput<\"getContext\">;\ntype RawAuthActiveMember = InferOutput<\"getActiveMember\">;\n\nexport type AuthSessionUser = NonNullable<RawAuthSession[\"user\"]>;\nexport type AuthSessionData = NonNullable<RawAuthSession[\"session\"]>;\nexport type AuthSession = {\n user: AuthSessionUser | null;\n session: AuthSessionData | null;\n};\nexport type AuthRequestContext = RawAuthRequestContext;\nexport type AuthPluginContext = Partial<AuthRequestContext> & {\n reqHeaders?: Headers;\n getRawBody?: () => Promise<string>;\n};\nexport type AuthActiveMember = RawAuthActiveMember;\nexport type AuthBaseSession = BaseAuth[\"$Infer\"][\"Session\"];\nexport type AuthContractType = AuthContract;\n`;\n}\n\nfunction toRelativeImportPath(fromPath: string, toPath: string): string {\n const rel = relative(dirname(toPath), fromPath);\n return rel.startsWith(\".\") ? rel : `./${rel}`;\n}\n\nexport async function runBunInstall(\n destination: string,\n spinner?: { message: (msg: string) => void },\n): Promise<void> {\n await runWithProgress(\n \"bun\",\n [\"install\", \"--ignore-scripts\"],\n destination,\n spinner,\n \"Installing dependencies\",\n );\n}\n\nexport async function runBunInstallForUpgrade(\n destination: string,\n spinner?: { message: (msg: string) => void },\n): Promise<void> {\n await runWithProgress(\n \"bun\",\n [\"install\", \"--force\"],\n destination,\n spinner,\n \"Installing dependencies\",\n );\n}\n\nexport async function runTypesGen(\n destination: string,\n spinner?: { message: (msg: string) => void },\n): Promise<void> {\n const localBosBin = join(destination, \"node_modules\", \".bin\", \"bos\");\n if (existsSync(localBosBin)) {\n await runWithProgress(\n \"node_modules/.bin/bos\",\n [\"types\", \"gen\"],\n destination,\n spinner,\n \"Generating types\",\n );\n return;\n }\n\n throw new Error(\"Unable to locate bos CLI for types generation\");\n}\n\nexport async function runDockerComposeUp(destination: string): Promise<void> {\n await execCommand(\"docker\", [\"compose\", \"up\", \"-d\", \"--wait\"], destination, { stdio: \"inherit\" });\n}\n\nasync function runWithProgress(\n command: string,\n args: string[],\n cwd: string,\n spinner: { message: (msg: string) => void } | undefined,\n label: string,\n): Promise<void> {\n const timeout = COMMAND_TIMEOUTS[command] ?? 2 * 60_000;\n const child = execa(command, args, { cwd, stdio: \"inherit\", timeout });\n\n if (spinner) {\n const start = Date.now();\n const interval = setInterval(() => {\n const elapsed = Math.round((Date.now() - start) / 1000);\n spinner.message(`${label}... (${elapsed}s)`);\n }, 2000);\n try {\n await child;\n } finally {\n clearInterval(interval);\n }\n } else {\n await child;\n }\n}\n\nexport function stripOrphanedWorkspacesFromLockfile(\n lockfilePath: string,\n allowedWorkspaces: string[],\n): void {\n if (!existsSync(lockfilePath)) return;\n\n const content = readFileSync(lockfilePath, \"utf-8\");\n let lockfile: Record<string, unknown>;\n try {\n lockfile = JSON.parse(content) as Record<string, unknown>;\n } catch {\n return;\n }\n\n const workspaces = lockfile.workspaces;\n if (!workspaces || typeof workspaces !== \"object\") return;\n\n const workspaceMap = workspaces as Record<string, unknown>;\n const allowed = new Set([\"\", ...allowedWorkspaces]);\n\n const keys = Object.keys(workspaceMap);\n let changed = false;\n for (const key of keys) {\n if (allowed.has(key)) continue;\n if (\n allowedWorkspaces.some(\n (pattern) => pattern.endsWith(\"/*\") && key.startsWith(pattern.slice(0, -1)),\n )\n )\n continue;\n delete workspaceMap[key];\n changed = true;\n }\n\n if (changed) {\n writeFileSync(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`);\n }\n}\n\nexport function removeInitLockfile(lockfilePath: string): void {\n if (!existsSync(lockfilePath)) return;\n rmSync(lockfilePath, { force: true });\n}\n\nfunction readJsonFile<T>(filePath: string): T {\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as T;\n}\n\nexport async function scaffoldMinimalProject(\n destination: string,\n parentConfig: BosConfigInput,\n opts: {\n extendsAccount: string;\n extendsGateway: string;\n account?: string;\n domain?: string;\n plugins?: string[];\n overrides: OverrideSection[];\n repository?: string;\n title?: string;\n description?: string;\n },\n): Promise<number> {\n mkdirSync(destination, { recursive: true });\n\n const has = (section: OverrideSection) => opts.overrides.includes(section);\n\n const config: Record<string, unknown> = {\n extends: `bos://${opts.extendsAccount}/${opts.extendsGateway}`,\n account: opts.account || opts.extendsAccount,\n ...(opts.domain ? { domain: opts.domain } : {}),\n ...(opts.repository ? { repository: opts.repository } : {}),\n ...(opts.title ? { title: opts.title } : {}),\n ...(opts.description ? { description: opts.description } : {}),\n };\n\n if (parentConfig.app && typeof parentConfig.app === \"object\") {\n const app: Record<string, unknown> = {};\n const parentApp = parentConfig.app as Record<string, Record<string, unknown>>;\n\n if (has(\"host\") && parentApp.host) {\n app.host = { ...parentApp.host };\n stripProductionFields(app.host as Record<string, unknown>);\n }\n\n if (has(\"ui\") && parentApp.ui) {\n app.ui = { ...parentApp.ui };\n stripProductionFields(app.ui as Record<string, unknown>);\n }\n\n if (has(\"api\") && parentApp.api) {\n app.api = { ...parentApp.api };\n stripProductionFields(app.api as Record<string, unknown>);\n }\n\n if (Object.keys(app).length > 0) {\n config.app = app;\n }\n }\n\n if (has(\"plugins\") && opts.plugins && opts.plugins.length > 0 && parentConfig.plugins) {\n const plugins: Record<string, unknown> = {};\n for (const key of opts.plugins) {\n const parentPlugin = (parentConfig.plugins as Record<string, unknown>)?.[key];\n if (parentPlugin) {\n if (typeof parentPlugin === \"string\") {\n plugins[key] = { extends: parentPlugin };\n } else {\n const pluginCopy = { ...(parentPlugin as Record<string, unknown>) };\n stripProductionFields(pluginCopy);\n plugins[key] = pluginCopy;\n }\n }\n }\n config.plugins = plugins;\n } else if (has(\"plugins\")) {\n config.plugins = {};\n }\n\n await saveBosConfig(destination, config);\n\n const workspacePackages: string[] = [];\n for (const section of opts.overrides) {\n workspacePackages.push(...OVERRIDE_WORKSPACE_MAP[section]);\n }\n if (has(\"plugins\")) {\n workspacePackages.push(\"plugins/*\");\n }\n\n const catalog = (\n await resolveCatalogChainSource({\n extendsAccount: opts.extendsAccount,\n extendsGateway: opts.extendsGateway,\n })\n ).catalog;\n\n const pkg: Record<string, unknown> = {\n name: \"monorepo\",\n private: true,\n type: \"module\",\n scripts: buildChildRootScripts({\n ui: has(\"ui\"),\n api: has(\"api\"),\n host: has(\"host\"),\n plugins: has(\"plugins\"),\n }),\n dependencies: {\n \"everything-dev\": \"catalog:\",\n \"every-plugin\": \"catalog:\",\n },\n devDependencies: {},\n workspaces: {\n packages: workspacePackages,\n catalog,\n },\n };\n writeFileSync(join(destination, \"package.json\"), `${JSON.stringify(pkg, null, 2)}\\n`);\n\n writeFileSync(join(destination, \".gitignore\"), generateGitignore());\n\n return 4;\n}\n\nasync function resolveWorkspaceRefs(\n destination: string,\n options?: { localOverrides?: boolean; sourceDir?: string },\n): Promise<void> {\n await normalizePackageManifestsInTree({\n sourceRootDir: options?.sourceDir ?? destination,\n targetDir: destination,\n resolveCatalogRefs: false,\n preserveCatalogRefs: true,\n removeWorkspaceDeps: [\"host\"],\n });\n}\n\nexport async function writeInitSnapshot(\n destination: string,\n extendsAccount: string,\n extendsGateway: string,\n sourceDir: string,\n patterns: string[],\n options: {\n overrides: OverrideSection[];\n plugins?: string[];\n ignore?: string[];\n },\n): Promise<void> {\n const baseIgnore = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\", \"**/.bos/**\"];\n const ignore = options.ignore ? [...baseIgnore, ...options.ignore] : baseIgnore;\n\n const allFiles = new Set<string>();\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n ignore,\n });\n for (const match of matches) {\n allFiles.add(match);\n }\n }\n\n const fileHashes: Record<string, string> = {};\n for (const filePath of allFiles) {\n const src = join(sourceDir, filePath);\n const stat = lstatSync(src);\n if (!stat.isFile()) continue;\n const content = readFileSync(src);\n const destPath = sourcePathToDestinationPath(filePath);\n fileHashes[destPath] = computeHash(content);\n }\n\n await writeSnapshot(destination, {\n parentRef: `bos://${extendsAccount}/${extendsGateway}`,\n files: fileHashes,\n });\n}\n\nfunction computeHash(data: Uint8Array): string {\n return createHash(\"sha256\").update(data).digest(\"hex\").substring(0, 16);\n}\n\nfunction mkTmpDir(prefix: string): string {\n return mkdtempSync(join(tmpdir(), `${prefix}-`));\n}\n\nexport async function generateDatabaseMigrations(destination: string): Promise<void> {\n const drizzleConfigs = await glob(\"**/drizzle.config.ts\", {\n cwd: destination,\n nodir: true,\n dot: false,\n absolute: false,\n ignore: [\"**/node_modules/**\"],\n });\n\n for (const configPath of drizzleConfigs) {\n const workspaceDir = dirname(configPath);\n const pkgPath = join(destination, workspaceDir, \"package.json\");\n if (!existsSync(pkgPath)) continue;\n\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n const scripts = pkg.scripts as Record<string, string> | undefined;\n if (!scripts?.[\"db:generate\"]) continue;\n\n const cwd = join(destination, workspaceDir);\n await execCommand(\"bun\", [\"run\", \"db:generate\"], cwd);\n }\n}\n\nconst COMMAND_TIMEOUTS: Record<string, number> = {\n bun: 5 * 60_000,\n docker: 5 * 60_000,\n node_modules: 2 * 60_000,\n tar: 60_000,\n};\n\nexport async function execCommand(\n command: string,\n args: string[],\n cwd?: string,\n options?: { stdio?: \"pipe\" | \"inherit\" },\n): Promise<void> {\n const timeout = COMMAND_TIMEOUTS[command] ?? 2 * 60_000;\n await execa(command, args, { cwd, stdio: options?.stdio ?? \"pipe\", timeout });\n}\n\nexport function extractSkillsBlock(content: string): string {\n const match = content.match(/<!-- intent-skills:start -->[\\s\\S]*?<!-- intent-skills:end -->/);\n return match ? match[0] : \"\";\n}\n\nfunction buildChildAgentsInstructions(opts: {\n overrides: OverrideSection[];\n plugins?: string[];\n}): string {\n const has = (section: OverrideSection) => opts.overrides.includes(section);\n const parts: string[] = [];\n\n parts.push(`# Agent Instructions\n\nThis document provides operational guidance for AI agents working in this everything.dev project.\n\n## Quick Reference\n\n**Start Development:**\n\\`\\`\\`bash\ncp .env.example .env # First time only\nbun install\nbun run dev\n\\`\\`\\`\n\n**Check Status:**\n\\`\\`\\`bash\nbos ps # List running processes\nbos status # Project health check\nbos info # Show configuration\n\\`\\`\\``);\n\n const archLines = [\n \"This is an everything.dev child project. Depending on your overrides, it may include:\",\n ];\n if (has(\"ui\"))\n archLines.push(\"- **UI** — React 19 + TanStack Router frontend, loaded via Module Federation\");\n if (has(\"api\")) archLines.push(\"- **API** — Hono.js + oRPC backend with Effect services\");\n if (has(\"host\"))\n archLines.push(\"- **Host** — Server-side runtime with Module Federation orchestration\");\n if (has(\"plugins\"))\n archLines.push(\"- **Plugins** — Self-contained business logic modules with oRPC contracts\");\n archLines.push(\n \"\",\n \"The parent runtime provides the shared framework; your project provides custom overrides.\",\n );\n parts.push(`## Architecture\\n\\n${archLines.join(\"\\n\")}`);\n\n parts.push(`## Development Workflow\n\n### Starting Development\n1. \\`cp .env.example .env\\` (first time)\n2. \\`bun install\\`\n3. \\`bun run dev\\``);\n\n parts.push(`### Debugging Issues\n\n**API not responding:**\n- Check \\`bos ps\\` to see if the API process is running\n- Check \\`.bos/logs/api.log\\` for errors\n\n**UI not loading:**\n- Verify the dev server is running: \\`bos ps\\`\n- Check browser console for Module Federation errors\n- Clear browser cache and retry\n\n**Type errors:**\n- Run \\`bun run typecheck\\``);\n\n const changeLines: string[] = [\"### Making Changes\"];\n if (has(\"ui\"))\n changeLines.push(\"- **UI Changes**: Edit `ui/src/` files → hot reload automatically\");\n if (has(\"api\"))\n changeLines.push(\"- **API Changes**: Edit `api/src/` files → hot reload automatically\");\n if (has(\"host\"))\n changeLines.push(\n \"- **Host Changes**: Edit `host/src/` when changing runtime resolution, auth wiring, SSR, proxying, or plugin mounting\",\n );\n changeLines.push(\n \"- **New Components**: Create in `ui/src/components/ui/`, export from `ui/src/components/index.ts`\",\n );\n changeLines.push(\n \"- **New Routes**: Create file in `ui/src/routes/`, TanStack Router auto-generates tree\",\n );\n parts.push(`## Code Changes\\n\\n${changeLines.join(\"\\n\")}`);\n\n parts.push(`### Style Requirements\n- Use semantic Tailwind classes: \\`bg-background\\`, \\`text-foreground\\`, \\`text-muted-foreground\\`\n- No hardcoded colors like \\`bg-blue-600\\`\n- No code comments in implementation\n- Component file naming: lowercase kebab-case (\\`data-table.tsx\\`, \\`user-profile.tsx\\`)\n- Follow existing patterns in neighboring files`);\n\n if (has(\"api\")) {\n parts.push(`### Adding API Endpoints\n1. Define in \\`api/src/contract.ts\\` — the oRPC route definitions and Zod schemas\n2. Implement in \\`api/src/index.ts\\` — the \\`createRouter\\` function\n3. Use in UI via \\`apiClient\\` from \\`useApiClient()\\` in \\`@/app\\``);\n }\n\n if (has(\"plugins\")) {\n parts.push(`### Plugin Architecture\n\nBusiness logic is organized into independent plugins loaded via Module Federation:\n- Each plugin has its own \\`contract.ts\\` — oRPC route definitions and Zod schemas\n- Each plugin has its own \\`index.ts\\` — \\`createPlugin\\` with variables, secrets, context, router\n- Each plugin has its own rspack config for independent deployment\n\nThe UI accesses plugin routes via namespaced clients: \\`apiClient.<plugin>.<method>()\\`.\n\n### Plugin Client (pluginsClient)\n\nThe API plugin receives typed client factories for all other plugins via \\`createPlugin.withPlugins<PluginsClient>()\\`, enabling in-process composition without HTTP roundtrips.\n\n### Generated Types\n\n\\`api/src/lib/plugins-types.gen.ts\\`, \\`api/src/lib/auth-types.gen.ts\\`, \\`ui/src/lib/api-types.gen.ts\\`, and \\`ui/src/lib/auth-types.gen.ts\\` are generated by \\`bos types gen\\` from \\`bos.config.json\\`. These files are gitignored and auto-regenerated on \\`bun install\\`, \\`typecheck\\`, \\`bos dev\\`, \\`bos build\\`, and bos plugin management commands.\n\nIf you hand-edit \\`bos.config.json\\`, run \\`bos types gen\\` or restart \\`bos dev\\` to regenerate.`);\n }\n\n const testCommands: string[] = [];\n if (has(\"api\") || has(\"host\") || has(\"ui\")) {\n testCommands.push(\"bun run test # Run all tests\");\n testCommands.push(\"bun typecheck # Type check all packages\");\n testCommands.push(\"bun lint # Run linting\");\n }\n if (testCommands.length > 0) {\n parts.push(`## Testing & Quality\n\n**Before committing:**\n\\`\\`\\`bash\n${testCommands.join(\"\\n\")}\n\\`\\`\\``);\n }\n\n parts.push(`## Common Patterns\n\n### Authentication Check\n\nRoutes requiring auth use \\`_authenticated.tsx\\` layout:\n\\`\\`\\`typescript\nexport const Route = createFileRoute('/_layout/_authenticated')({\n beforeLoad: async ({ location }) => {\n const { data: session } = await authClient.getSession();\n if (!session?.user) {\n throw redirect({ to: '/login', search: { redirect: location.pathname } });\n }\n },\n});\n\\`\\`\\``);\n\n if (has(\"ui\")) {\n parts.push(`### API Client Usage\n\\`\\`\\`typescript\nimport { useApiClient } from \"@/app\";\n\nfunction MyComponent() {\n const apiClient = useApiClient();\n const { data } = await apiClient.ping();\n}\n\\`\\`\\``);\n }\n\n parts.push(`## Troubleshooting\n\n**Process won't start:**\n\\`\\`\\`bash\nbos kill # Kill all tracked processes\nbun install # Ensure dependencies\nbun run dev # Restart\n\\`\\`\\`\n\n**Module Federation errors:**\n- Check \\`bos.config.json\\` URLs are accessible\n- Verify shared dependency versions match in package.json\n- Clear browser cache\n\n**Database issues:**\n\\`\\`\\`bash\nbun run db:push # Push schema changes\nbun run db:studio # Open Drizzle Studio\n\\`\\`\\`\n\n## Environment\n\n**Required files:**\n- \\`.env\\` — Secrets (see \\`.env.example\\`)\n- \\`bos.config.json\\` — Runtime configuration (committed)`);\n\n return `${parts.join(\"\\n\\n\")}\\n`;\n}\n\nexport function buildChildAgentsMd(\n skillsBlock: string,\n opts: {\n overrides: OverrideSection[];\n plugins?: string[];\n },\n): string {\n return `${skillsBlock}\\n\\n${buildChildAgentsInstructions(opts)}`;\n}\n\nexport async function personalizeAgentsMd(\n destination: string,\n opts: {\n overrides: OverrideSection[];\n plugins?: string[];\n },\n): Promise<void> {\n const agentsMdPath = join(destination, \"AGENTS.md\");\n if (!existsSync(agentsMdPath)) return;\n\n const content = readFileSync(agentsMdPath, \"utf-8\");\n const skillsBlock = extractSkillsBlock(content);\n if (!skillsBlock) return;\n\n const childContent = buildChildAgentsMd(skillsBlock, opts);\n writeFileSync(agentsMdPath, childContent);\n}\n\nfunction generateGitignore(): string {\n return `node_modules/\ndist/\n.env\n.bos/\ndocker-compose.yml\n*.gen.ts\n*.gen.tsx\n`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"init.mjs","names":[],"sources":["../../src/cli/init.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { execa } from \"execa\";\nimport { glob } from \"glob\";\nimport type { OverrideSection } from \"../contract\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport { fetchResponse } from \"../http-client\";\nimport {\n loadManifestNormalizationSpec,\n normalizePackageManifestsInTree,\n} from \"../internal/manifest-normalizer\";\nimport type { BosConfig, BosConfigInput } from \"../types\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { writeSnapshot } from \"./snapshot\";\nimport { getExtendsRef, parseBosRef, readJsonFile } from \"./utils/helpers\";\n\nconst require = createRequire(import.meta.url);\n\nexport const INIT_ROOT_PATTERNS = [\n \"bos.config.json\",\n \"package.json\",\n \".env.example\",\n \".gitignore\",\n \"biome.json\",\n \"bunfig.toml\",\n \"Dockerfile\",\n \"railway.json\",\n \"railway.toml\",\n \"AGENTS.md\",\n \".changeset/config.json\",\n \".changeset/README.md\",\n \"README.md\",\n \"CONTRIBUTING.md\",\n \".github/templates/**\",\n] as const;\n\nconst OVERRIDE_WORKSPACE_MAP: Record<OverrideSection, string[]> = {\n ui: [\"ui\"],\n api: [\"api\"],\n host: [\"host\"],\n plugins: [],\n};\n\ninterface SourceResult {\n sourceDir: string;\n parentConfig: BosConfig;\n cleanup: () => Promise<void>;\n}\n\nexport interface CatalogChainSource {\n catalog: Record<string, string>;\n repository?: string;\n extendsChain: string[];\n}\n\nfunction readWorkspaceCatalog(sourceDir: string): Record<string, string> {\n const pkgPath = join(sourceDir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {};\n }\n\n const pkg = readJsonFile<{ workspaces?: { catalog?: Record<string, string> } }>(pkgPath);\n return { ...(pkg.workspaces?.catalog ?? {}) };\n}\n\nexport async function resolveCatalogChainSource(opts: {\n extendsAccount: string;\n extendsGateway: string;\n sourceDir?: string;\n}): Promise<CatalogChainSource> {\n const catalogs: Record<string, string>[] = [];\n const cleanups: Array<() => Promise<void>> = [];\n const extendsChain: string[] = [];\n const visited = new Set<string>();\n let repository: string | undefined;\n let currentRef = `bos://${opts.extendsAccount}/${opts.extendsGateway}`;\n let sourceDir = opts.sourceDir ? resolve(opts.sourceDir) : undefined;\n let configPath = sourceDir ? join(sourceDir, \"bos.config.json\") : undefined;\n\n try {\n while (true) {\n if (visited.has(currentRef)) {\n throw new Error(`Circular extends detected while resolving catalog source: ${currentRef}`);\n }\n\n visited.add(currentRef);\n extendsChain.push(currentRef);\n\n let config: Record<string, unknown>;\n let currentSourceDir = sourceDir;\n let cleanup: () => Promise<void> = async () => {};\n\n if (configPath) {\n config = readJsonFile<Record<string, unknown>>(configPath);\n currentSourceDir = dirname(configPath);\n } else {\n const parsed = parseBosRef(currentRef);\n if (!parsed) {\n break;\n }\n const sourceResult = await resolveSourceDir({\n extendsAccount: parsed.account,\n extendsGateway: parsed.gateway,\n });\n config = sourceResult.parentConfig as Record<string, unknown>;\n currentSourceDir = sourceResult.sourceDir || undefined;\n cleanup = sourceResult.cleanup;\n }\n\n cleanups.push(cleanup);\n catalogs.push(currentSourceDir ? readWorkspaceCatalog(currentSourceDir) : {});\n\n if (typeof config.repository === \"string\") {\n repository = config.repository;\n }\n\n const nextExtendsRef = getExtendsRef(config);\n if (!nextExtendsRef) {\n break;\n }\n\n if (nextExtendsRef.startsWith(\"bos://\")) {\n currentRef = nextExtendsRef;\n sourceDir = undefined;\n configPath = undefined;\n continue;\n }\n\n if (!currentSourceDir) {\n break;\n }\n\n const nextConfigPath = resolve(currentSourceDir, nextExtendsRef);\n if (!existsSync(nextConfigPath)) {\n break;\n }\n\n currentRef = nextConfigPath;\n sourceDir = dirname(nextConfigPath);\n configPath = nextConfigPath;\n }\n } finally {\n for (const cleanup of cleanups.reverse()) {\n await cleanup();\n }\n }\n\n return {\n catalog: Object.assign({}, ...catalogs.reverse()),\n repository,\n extendsChain,\n };\n}\n\nexport async function resolveSourceDir(opts: {\n extendsAccount: string;\n extendsGateway: string;\n source?: string;\n}): Promise<SourceResult> {\n if (opts.source) {\n const sourceDir = resolve(opts.source);\n if (!existsSync(join(sourceDir, \"bos.config.json\"))) {\n throw new Error(`No bos.config.json found in source directory: ${sourceDir}`);\n }\n const parentConfig = JSON.parse(\n readFileSync(join(sourceDir, \"bos.config.json\"), \"utf-8\"),\n ) as BosConfig;\n return { sourceDir, parentConfig, cleanup: async () => {} };\n }\n\n const parentConfig = await fetchParentConfig(opts.extendsAccount, opts.extendsGateway);\n\n if (parentConfig.repository) {\n const { dir: sourceDir, cleanup } = await downloadTarball(parentConfig.repository);\n return { sourceDir, parentConfig, cleanup };\n }\n\n const chainResult = await resolveRepositoryViaExtendsChain(\n opts.extendsAccount,\n opts.extendsGateway,\n );\n if (chainResult?.repository) {\n const { dir: sourceDir, cleanup } = await downloadTarball(chainResult.repository);\n return { sourceDir, parentConfig: chainResult.config, cleanup };\n }\n\n return {\n sourceDir: \"\",\n parentConfig,\n cleanup: async () => {},\n };\n}\n\nexport function buildInitPatterns(\n overrides: OverrideSection[],\n plugins?: string[],\n pluginDirMap?: Record<string, string>,\n): string[] {\n const has = (section: OverrideSection) => overrides.includes(section);\n const patterns: string[] = [...INIT_ROOT_PATTERNS];\n\n if (has(\"ui\")) patterns.push(\"ui/**\");\n if (has(\"api\")) patterns.push(\"api/**\");\n if (has(\"host\")) patterns.push(\"host/**\");\n if (has(\"plugins\")) {\n for (const plugin of plugins ?? []) {\n const dirName = pluginDirMap?.[plugin] ?? plugin;\n patterns.push(`plugins/${dirName}/**`);\n }\n }\n\n return patterns;\n}\n\nexport function buildPluginRouteExclusions(\n parentConfig: { plugins?: Record<string, unknown> } | null | undefined,\n selectedPlugins: string[],\n): string[] {\n if (!parentConfig?.plugins) return [];\n\n const selected = new Set(selectedPlugins);\n const claimedBySelected = new Set<string>();\n const claimedByUnselected: string[] = [];\n\n for (const [pluginKey, entry] of Object.entries(parentConfig.plugins)) {\n const routes = extractPluginRoutes(entry);\n if (!routes) continue;\n\n if (selected.has(pluginKey)) {\n for (const route of routes) claimedBySelected.add(route);\n } else {\n for (const route of routes) claimedByUnselected.push(route);\n }\n }\n\n return claimedByUnselected.filter((route) => !claimedBySelected.has(route));\n}\n\nfunction extractPluginRoutes(entry: unknown): string[] | undefined {\n if (typeof entry !== \"object\" || entry === null) return undefined;\n const routes = (entry as { routes?: unknown }).routes;\n if (!Array.isArray(routes)) return undefined;\n return routes.filter((r): r is string => typeof r === \"string\");\n}\n\nexport function sourcePathToDestinationPath(filePath: string): string {\n return filePath.startsWith(\".github/templates/\")\n ? filePath.replace(/^\\.github\\/templates\\//, \".github/\")\n : filePath;\n}\n\nexport async function fetchParentConfig(\n extendsAccount: string,\n extendsGateway: string,\n): Promise<BosConfig> {\n const bosUrl = `bos://${extendsAccount}/${extendsGateway}`;\n return fetchBosConfigFromFastKv<BosConfig>(bosUrl);\n}\n\nexport async function resolveRepositoryViaExtendsChain(\n extendsAccount: string,\n extendsGateway: string,\n visited = new Set<string>(),\n): Promise<{ repository: string; config: BosConfig } | null> {\n const key = `bos://${extendsAccount}/${extendsGateway}`;\n if (visited.has(key)) return null;\n visited.add(key);\n\n try {\n const config = await fetchParentConfig(extendsAccount, extendsGateway);\n if (config.repository) {\n return { repository: config.repository, config };\n }\n\n const extendsRef = getExtendsRef(config as Record<string, unknown>);\n if (extendsRef) {\n const normalized = extendsRef.startsWith(\"bos://\") ? extendsRef : `bos://${extendsRef}`;\n const parsed = parseBosRef(normalized);\n if (parsed) {\n const result = await resolveRepositoryViaExtendsChain(\n parsed.account,\n parsed.gateway,\n visited,\n );\n if (result) return result;\n }\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function detectGitRemoteUrl(directory: string): Promise<string | undefined> {\n try {\n const { stdout } = await execa(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd: directory,\n stdio: \"pipe\",\n });\n const url = stdout.trim();\n if (!url) return undefined;\n return normalizeGitUrl(url);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeGitUrl(url: string): string | undefined {\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return `https://github.com/${sshMatch[1]}/${sshMatch[2]}`;\n }\n const httpsMatch = url.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?(?:\\/.*)?$/);\n if (httpsMatch) {\n return `https://github.com/${httpsMatch[1]}/${httpsMatch[2]}`;\n }\n return url.endsWith(\".git\") ? url.slice(0, -4) : url;\n}\n\nexport async function downloadTarball(\n repoUrl: string,\n): Promise<{ dir: string; cleanup: () => Promise<void> }> {\n const parsed = parseGitHubUrl(repoUrl);\n if (!parsed) {\n throw new Error(`Cannot parse repository URL: ${repoUrl}`);\n }\n\n const { owner, repo } = parsed;\n let response: Response | null = null;\n\n for (const branch of [\"main\", \"master\"]) {\n const candidate = await fetchResponse(\n `https://api.github.com/repos/${owner}/${repo}/tarball/${branch}`,\n {\n headers: { \"User-Agent\": \"everything-dev\" },\n redirect: \"follow\",\n timeout: \"60 seconds\",\n },\n );\n if (candidate.ok) {\n response = candidate;\n break;\n }\n if (candidate.status !== 404) {\n throw new Error(\n `GitHub tarball download failed: ${candidate.status} ${candidate.statusText}`,\n );\n }\n }\n\n if (!response) {\n throw new Error(`GitHub tarball download failed for ${repoUrl}: tried main and master`);\n }\n\n if (!response.body) {\n throw new Error(\"GitHub tarball download returned empty body\");\n }\n\n const tmpDir = mkTmpDir(\"bos-init-tarball-\");\n const tarballPath = join(tmpDir, \"source.tar.gz\");\n\n const fileStream = createWriteStream(tarballPath);\n const reader = response.body as unknown as NodeJS.ReadableStream;\n await pipeline(reader, fileStream);\n\n const extractDir = mkTmpDir(\"bos-init-extract-\");\n try {\n const tar = require(\"tar\") as {\n extract: (opts: { cwd: string; file: string; strip: number }) => Promise<void>;\n };\n await tar.extract({ cwd: extractDir, file: tarballPath, strip: 1 });\n } catch {\n await execCommand(\"tar\", [\"-xzf\", tarballPath, \"--strip-components=1\", \"-C\", extractDir]);\n }\n\n rmSync(tmpDir, { recursive: true, force: true });\n\n return {\n dir: extractDir,\n cleanup: async () => {\n rmSync(extractDir, { recursive: true, force: true });\n },\n };\n}\n\nfunction parseGitHubUrl(url: string): { owner: string; repo: string } | null {\n const httpsMatch = url.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?(?:\\/.*)?$/);\n if (httpsMatch) {\n return { owner: httpsMatch[1], repo: httpsMatch[2] };\n }\n\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2] };\n }\n\n return null;\n}\n\nexport async function copyFilteredFiles(\n sourceDir: string,\n destination: string,\n patterns: string[],\n options: {\n overrides: OverrideSection[];\n plugins?: string[];\n ignore?: string[];\n },\n): Promise<number> {\n if (patterns.length === 0) {\n return 0;\n }\n\n const baseIgnore = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\", \"**/.bos/**\"];\n const ignore = options.ignore ? [...baseIgnore, ...options.ignore] : baseIgnore;\n\n const allFiles = new Set<string>();\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n ignore,\n });\n for (const match of matches) {\n allFiles.add(match);\n }\n }\n\n mkdirSync(destination, { recursive: true });\n\n let count = 0;\n for (const filePath of allFiles) {\n const src = join(sourceDir, filePath);\n const stat = lstatSync(src);\n if (!stat.isFile()) continue;\n\n const destPath = sourcePathToDestinationPath(filePath);\n const dest = join(destination, destPath);\n mkdirSync(dirname(dest), { recursive: true });\n const content = readFileSync(src);\n writeFileSync(dest, content);\n count++;\n }\n\n return count;\n}\n\nfunction stripProductionFields(entry: Record<string, unknown>): void {\n delete entry.production;\n delete entry.integrity;\n delete entry.ssr;\n delete entry.ssrIntegrity;\n}\n\nfunction buildRootTypecheckScript(sections: {\n ui: boolean;\n api: boolean;\n host: boolean;\n plugins: boolean;\n}): string {\n const commands = [\"bun run types:gen\"];\n\n if (sections.ui) {\n commands.push(\"if [ -d ui ]; then bun run --cwd ui typecheck; fi\");\n }\n if (sections.api) {\n commands.push(\"if [ -d api ]; then bun run --cwd api typecheck; fi\");\n }\n if (sections.host) {\n commands.push(\"if [ -d host ]; then bun run --cwd host typecheck; fi\");\n }\n if (sections.plugins) {\n commands.push(\n 'if [ -d plugins ]; then for dir in plugins/*; do if [ -f \"$dir/package.json\" ]; then bun run --cwd \"$dir\" typecheck; fi; done; fi',\n );\n }\n\n return commands.join(\" && \");\n}\n\nexport function getParentOnlyScriptKeys(projectDir: string): string[] {\n const parentPkgPath = join(projectDir, \"node_modules\", \"everything-dev\", \"package.json\");\n if (!existsSync(parentPkgPath)) return [];\n\n try {\n const parentPkg = JSON.parse(readFileSync(parentPkgPath, \"utf-8\")) as Record<string, unknown>;\n const parentScripts = (parentPkg.scripts ?? {}) as Record<string, string>;\n\n const allChildKeys = new Set(\n Object.keys(buildChildRootScripts({ ui: true, api: true, host: true, plugins: true })),\n );\n allChildKeys.add(\"test:integration\");\n\n return Object.keys(parentScripts).filter((key) => !allChildKeys.has(key));\n } catch {\n return [];\n }\n}\n\nexport function buildChildRootScripts(sections: {\n ui: boolean;\n api: boolean;\n host: boolean;\n plugins: boolean;\n}): Record<string, string> {\n const scripts: Record<string, string> = {\n dev: \"bos dev\",\n \"dev:proxy\": \"bos dev --proxy\",\n build: \"bos build\",\n deploy: \"bos build --deploy\",\n publish: \"bos publish\",\n start: \"bos start\",\n typecheck: buildRootTypecheckScript(sections),\n lint: \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n format: \"biome format --write .\",\n \"format:check\": \"biome format .\",\n changeset: \"changeset\",\n version: \"changeset version\",\n release: \"echo 'Packages versioned - app release handled by workflow'\",\n postinstall: \"node node_modules/.bin/bos types gen || true\",\n \"types:gen\": \"node node_modules/.bin/bos types gen\",\n bos: \"bos\",\n };\n\n if (sections.api) {\n scripts[\"db:push\"] = \"bun run --cwd api drizzle-kit push\";\n scripts[\"db:studio\"] = \"bos db:studio\";\n scripts[\"db:doctor\"] = \"bos db:doctor\";\n scripts[\"db:repair\"] = \"bos db:repair\";\n scripts[\"db:generate\"] = \"bun run --cwd api drizzle-kit generate\";\n scripts[\"db:migrate\"] = \"bun run --cwd api drizzle-kit migrate\";\n scripts[\"test:api\"] = \"bun run --cwd api test --if-present\";\n scripts[\"test:integration\"] = \"bun run --cwd api test tests/integration/ --if-present\";\n }\n\n if (sections.host) {\n scripts[\"test:e2e\"] = \"bun run --cwd host test --if-present\";\n }\n\n const testTargets: string[] = [];\n if (sections.api) testTargets.push(\"bun run --cwd api test --if-present\");\n if (sections.host) testTargets.push(\"bun run --cwd host test --if-present\");\n if (sections.ui) testTargets.push(\"bun run --cwd ui test --if-present\");\n if (sections.plugins) {\n testTargets.push(\n 'for d in plugins/*; do [ -f \"$d/package.json\" ] && bun run --cwd \"$d\" test --if-present; done',\n );\n }\n scripts.test =\n testTargets.length > 0\n ? testTargets.join(\" && \")\n : 'echo \"No workspace directories configured\"';\n\n if (sections.api || sections.host) {\n scripts[\"dev:postgres\"] = \"docker compose up -d --wait && bun run dev\";\n scripts[\"dev:postgres:down\"] = \"docker compose down\";\n scripts[\"dev:postgres:reset\"] = \"docker compose down -v && docker compose up -d --wait\";\n }\n\n if (sections.ui) {\n scripts[\"dev:ui\"] = \"bos dev --ui local --api remote\";\n }\n if (sections.api) {\n scripts[\"dev:api\"] = \"bos dev --ui remote --api local\";\n }\n\n return scripts;\n}\n\nexport async function personalizeConfig(\n destination: string,\n opts: {\n extendsAccount: string;\n extendsGateway: string;\n account?: string;\n domain?: string;\n plugins?: string[];\n overrides: OverrideSection[];\n pluginRoutes?: Record<string, string[]>;\n workspaceOpts?: { localOverrides?: boolean; sourceDir?: string };\n mode?: \"init\" | \"sync\";\n existingConfig?: Record<string, unknown>;\n repository?: string;\n title?: string;\n description?: string;\n testnet?: string;\n staging?: unknown;\n },\n): Promise<void> {\n const has = (section: OverrideSection) => opts.overrides.includes(section);\n const existingApp =\n opts.mode === \"sync\" && opts.existingConfig?.app && typeof opts.existingConfig.app === \"object\"\n ? (opts.existingConfig.app as Record<string, unknown>)\n : undefined;\n const preservedAuth = existingApp?.auth;\n\n const explicitRootKeys = new Set(\n Object.entries(opts)\n .filter(\n ([key, value]) =>\n value !== undefined &&\n ![\n \"extendsAccount\",\n \"extendsGateway\",\n \"plugins\",\n \"overrides\",\n \"pluginRoutes\",\n \"workspaceOpts\",\n \"mode\",\n \"existingConfig\",\n ].includes(key),\n )\n .map(([key]) => key),\n );\n\n const configPath = join(destination, \"bos.config.json\");\n if (existsSync(configPath)) {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n\n config.extends = `bos://${opts.extendsAccount}/${opts.extendsGateway}`;\n\n if (opts.account) {\n config.account = opts.account;\n }\n if (opts.domain) {\n config.domain = opts.domain;\n }\n if (opts.repository) {\n config.repository = opts.repository;\n } else {\n delete config.repository;\n }\n\n const inheritableFields = [\"title\", \"description\", \"testnet\", \"staging\"] as const;\n for (const field of inheritableFields) {\n if (!(field in opts)) {\n delete config[field];\n }\n }\n\n if (config.app && typeof config.app === \"object\") {\n const app = config.app as Record<string, unknown>;\n\n for (const entryKey of Object.keys(app)) {\n if (\n !has(entryKey as OverrideSection) &&\n (entryKey === \"host\" || entryKey === \"ui\" || entryKey === \"api\")\n ) {\n delete app[entryKey];\n continue;\n }\n if (entryKey === \"auth\") {\n delete app[entryKey];\n continue;\n }\n const entry = app[entryKey];\n if (entry && typeof entry === \"object\") {\n stripProductionFields(entry as Record<string, unknown>);\n }\n }\n\n if (preservedAuth !== undefined) {\n app.auth = preservedAuth;\n }\n\n if (Object.keys(app).length === 0) {\n delete config.app;\n }\n }\n\n if (has(\"plugins\")) {\n if (config.plugins && typeof config.plugins === \"object\") {\n const plugins = config.plugins as Record<string, unknown>;\n\n if (opts.plugins !== undefined) {\n for (const pluginKey of Object.keys(plugins)) {\n if (!opts.plugins.includes(pluginKey)) {\n delete plugins[pluginKey];\n }\n }\n }\n\n for (const pluginKey of Object.keys(plugins)) {\n const plugin = plugins[pluginKey];\n let pluginObj: Record<string, unknown>;\n\n if (typeof plugin === \"string\") {\n pluginObj = { extends: plugin };\n plugins[pluginKey] = pluginObj;\n } else if (plugin && typeof plugin === \"object\") {\n pluginObj = { ...(plugin as Record<string, unknown>) };\n plugins[pluginKey] = pluginObj;\n } else {\n continue;\n }\n\n stripProductionFields(pluginObj);\n }\n\n if (Object.keys(plugins).length === 0) {\n config.plugins = {};\n }\n }\n } else {\n config.plugins = {};\n }\n\n if (opts.mode === \"sync\" && opts.existingConfig) {\n const managedRootKeys = new Set([\"extends\", \"account\", \"domain\", \"app\", \"plugins\"]);\n const preservedRootKeys = new Set([\n ...managedRootKeys,\n ...Object.keys(opts.existingConfig),\n ...explicitRootKeys,\n ]);\n\n for (const key of Object.keys(config)) {\n if (!preservedRootKeys.has(key)) {\n delete config[key];\n }\n }\n\n for (const [key, value] of Object.entries(opts.existingConfig)) {\n if (!(key in config) && !managedRootKeys.has(key) && !explicitRootKeys.has(key)) {\n config[key] = value;\n }\n }\n }\n\n await saveBosConfig(destination, config);\n }\n\n for (const relPath of [\"ui/src/lib/api-types.gen.ts\", \"api/src/lib/plugins-types.gen.ts\"]) {\n const absolutePath = join(destination, relPath);\n try {\n rmSync(absolutePath, { force: true });\n } catch {}\n }\n\n const pkgPath = join(destination, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n const childScripts = buildChildRootScripts({\n ui: has(\"ui\"),\n api: has(\"api\"),\n host: has(\"host\"),\n plugins: has(\"plugins\"),\n });\n\n if (typeof pkg.name !== \"string\" || pkg.name.length === 0) {\n pkg.name = \"monorepo\";\n }\n pkg.private = true;\n pkg.type = \"module\";\n delete pkg.module;\n delete pkg.peerDependencies;\n\n if (pkg.workspaces && typeof pkg.workspaces === \"object\") {\n const ws = pkg.workspaces as { packages?: string[] };\n if (Array.isArray(ws.packages)) {\n ws.packages = ws.packages.filter((p: string) => {\n if (p.startsWith(\"packages/\")) return false;\n if (p === \"ui\") return has(\"ui\");\n if (p === \"api\") return has(\"api\");\n if (p === \"host\") return has(\"host\");\n if (p.startsWith(\"plugins/\")) return false;\n return true;\n });\n\n if (has(\"plugins\")) {\n if (!ws.packages.includes(\"plugins/*\")) {\n ws.packages.push(\"plugins/*\");\n }\n }\n }\n }\n\n if (!pkg.scripts || typeof pkg.scripts !== \"object\") {\n pkg.scripts = {};\n }\n const scripts = pkg.scripts as Record<string, string>;\n for (const [key, value] of Object.entries(childScripts)) {\n scripts[key] = value;\n }\n for (const obsoleteScript of [\n ...getParentOnlyScriptKeys(destination),\n \"init\",\n \"sync-catalog\",\n \"db:push\",\n \"db:studio\",\n \"db:doctor\",\n \"db:repair\",\n \"db:generate\",\n \"db:migrate\",\n \"test\",\n \"test:api\",\n \"test:integration\",\n \"test:e2e\",\n \"dev:postgres\",\n \"dev:postgres:down\",\n \"dev:postgres:reset\",\n \"dev:ui\",\n \"dev:api\",\n ]) {\n if (!(obsoleteScript in childScripts)) {\n delete scripts[obsoleteScript];\n }\n }\n\n if (pkg.devDependencies && typeof pkg.devDependencies === \"object\") {\n const deps = pkg.devDependencies as Record<string, string>;\n delete deps[\"every-plugin\"];\n delete deps[\"everything-dev\"];\n }\n\n if (!pkg.workspaces || typeof pkg.workspaces !== \"object\") {\n pkg.workspaces = { packages: [], catalog: {} };\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 }\n\n if (!pkg.dependencies) pkg.dependencies = {};\n const deps = pkg.dependencies as Record<string, string>;\n const spec = opts.workspaceOpts?.sourceDir\n ? loadManifestNormalizationSpec(opts.workspaceOpts.sourceDir)\n : null;\n if (spec) {\n workspaces.catalog[\"everything-dev\"] = spec.rootCatalog[\"everything-dev\"];\n workspaces.catalog[\"every-plugin\"] = spec.rootCatalog[\"every-plugin\"];\n }\n const frameworkCatalog = (\n await resolveCatalogChainSource({\n extendsAccount: opts.extendsAccount,\n extendsGateway: opts.extendsGateway,\n sourceDir: opts.workspaceOpts?.sourceDir,\n })\n ).catalog;\n for (const [name, version] of Object.entries(frameworkCatalog)) {\n workspaces.catalog[name] = version;\n }\n if (!deps[\"everything-dev\"]) deps[\"everything-dev\"] = \"catalog:\";\n if (!deps[\"every-plugin\"]) deps[\"every-plugin\"] = \"catalog:\";\n\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n const apiTsConfigPath = join(destination, \"api\", \"tsconfig.json\");\n if (existsSync(apiTsConfigPath)) {\n const apiTsConfig = JSON.parse(readFileSync(apiTsConfigPath, \"utf-8\")) as {\n files?: string[];\n [key: string]: unknown;\n };\n if (apiTsConfig.files) {\n const validFiles = apiTsConfig.files.filter((f) => existsSync(join(destination, \"api\", f)));\n if (validFiles.length !== apiTsConfig.files.length) {\n if (validFiles.length === 0) {\n delete apiTsConfig.files;\n } else {\n apiTsConfig.files = validFiles;\n }\n writeFileSync(apiTsConfigPath, `${JSON.stringify(apiTsConfig, null, 2)}\\n`);\n }\n }\n }\n\n await resolveWorkspaceRefs(destination, opts.workspaceOpts);\n\n if (has(\"ui\")) {\n const genContractPath = join(destination, \"ui\", \"src\", \"lib\", \"api-types.gen.ts\");\n if (!existsSync(genContractPath)) {\n mkdirSync(dirname(genContractPath), { recursive: true });\n writeFileSync(genContractPath, `export type ApiContract = Record<string, never>;\\n`);\n }\n }\n\n if (has(\"api\")) {\n const pluginsClientGenPath = join(destination, \"api\", \"src\", \"lib\", \"plugins-types.gen.ts\");\n if (!existsSync(pluginsClientGenPath)) {\n mkdirSync(dirname(pluginsClientGenPath), { recursive: true });\n writeFileSync(\n pluginsClientGenPath,\n `import type { ContractRouterClient, AnyContractRouter } from \"@orpc/contract\";\\ntype ClientFactory<C extends AnyContractRouter> = (context?: Record<string, unknown>) => ContractRouterClient<C>;\\nexport type PluginsClient = Record<string, never>;\\n`,\n );\n }\n }\n\n const authTypesPaths: string[] = [];\n if (has(\"ui\")) {\n authTypesPaths.push(join(destination, \"ui\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n if (has(\"api\")) {\n authTypesPaths.push(join(destination, \"api\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n if (has(\"host\") && existsSync(join(destination, \"host\", \"src\"))) {\n authTypesPaths.push(join(destination, \"host\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n for (const authTypesGenPath of authTypesPaths) {\n if (!existsSync(authTypesGenPath)) {\n mkdirSync(dirname(authTypesGenPath), { recursive: true });\n writeFileSync(authTypesGenPath, generateAuthTypesContent(authTypesGenPath, destination));\n }\n }\n\n if (authTypesPaths.length > 0) {\n const authDir = join(destination, \".bos\", \"generated\", \"auth\");\n if (!existsSync(authDir)) {\n mkdirSync(authDir, { recursive: true });\n }\n const authExportStubPath = join(authDir, \"auth-export.d.ts\");\n if (!existsSync(authExportStubPath)) {\n writeFileSync(\n authExportStubPath,\n `export type Auth = any;\nexport type AuthOrganizationContext = any;\nexport type AuthOrganization = any;\nexport type AuthOrganizationSummary = any;\nexport type AuthOrganizationMember = any;\nexport type AuthApiKey = any;\nexport type AuthInvitation = any;\nexport type GetActiveMemberInput = any;\nexport type GetOrganizationInput = any;\nexport type ListMembersInput = any;\nexport type ListInvitationsInput = any;\nexport type ListApiKeysInput = any;\nexport type AuthServices = any;\nexport type createAuthInstance = any;\n`,\n );\n }\n const contractStubPath = join(authDir, \"contract.d.ts\");\n if (!existsSync(contractStubPath)) {\n writeFileSync(\n contractStubPath,\n `export type ContractType = any;\nexport type InferOutput<_TRoute extends string> = any;\n`,\n );\n }\n }\n\n if (has(\"plugins\")) {\n for (const plugin of opts.plugins ?? []) {\n const pluginSrcDir = join(destination, \"plugins\", plugin, \"src\");\n const pluginIndexPath = join(pluginSrcDir, \"index.ts\");\n const pluginClientGenPath = join(pluginSrcDir, \"lib\", \"plugins-client.gen.ts\");\n if (!existsSync(pluginIndexPath) || existsSync(pluginClientGenPath)) {\n continue;\n }\n const pluginIndex = readFileSync(pluginIndexPath, \"utf-8\");\n if (!pluginIndex.includes(\"./lib/plugins-client.gen\")) {\n continue;\n }\n writeFileSync(pluginClientGenPath, \"export type PluginsClient = Record<string, never>;\\n\");\n }\n }\n}\n\nfunction generateAuthTypesContent(targetPath: string, configDir: string): string {\n const authExportRel = toRelativeImportPath(\n join(configDir, \".bos\", \"generated\", \"auth\", \"auth-export.d.ts\"),\n targetPath,\n );\n const contractRel = toRelativeImportPath(\n join(configDir, \".bos\", \"generated\", \"auth\", \"contract.d.ts\"),\n targetPath,\n );\n\n return `export type {\n Auth,\n AuthOrganizationContext,\n AuthOrganization,\n AuthOrganizationSummary,\n AuthOrganizationMember,\n AuthApiKey,\n AuthInvitation,\n GetActiveMemberInput,\n GetOrganizationInput,\n ListMembersInput,\n ListInvitationsInput,\n ListApiKeysInput,\n AuthServices,\n createAuthInstance,\n} from \"${authExportRel}\";\nimport type { InferOutput, ContractType as AuthContract } from \"${contractRel}\";\nimport type { Auth as BaseAuth } from \"${authExportRel}\";\n\ntype RawAuthSession = InferOutput<\"getSession\">;\ntype RawAuthRequestContext = InferOutput<\"getContext\">;\ntype RawAuthActiveMember = InferOutput<\"getActiveMember\">;\n\nexport type AuthSessionUser = NonNullable<RawAuthSession[\"user\"]>;\nexport type AuthSessionData = NonNullable<RawAuthSession[\"session\"]>;\nexport type AuthSession = {\n user: AuthSessionUser | null;\n session: AuthSessionData | null;\n};\nexport type AuthRequestContext = RawAuthRequestContext;\nexport type AuthPluginContext = Partial<AuthRequestContext> & {\n reqHeaders?: Headers;\n getRawBody?: () => Promise<string>;\n};\nexport type AuthActiveMember = RawAuthActiveMember;\nexport type AuthBaseSession = BaseAuth[\"$Infer\"][\"Session\"];\nexport type AuthContractType = AuthContract;\n`;\n}\n\nfunction toRelativeImportPath(fromPath: string, toPath: string): string {\n const rel = relative(dirname(toPath), fromPath);\n return rel.startsWith(\".\") ? rel : `./${rel}`;\n}\n\nexport async function runBunInstall(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n },\n): Promise<void> {\n await runWithProgress(\n \"bun\",\n [\"install\", \"--ignore-scripts\"],\n destination,\n opts?.spinner,\n \"Installing dependencies\",\n );\n}\n\nexport async function runBunInstallForUpgrade(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n },\n): Promise<void> {\n await runWithProgress(\n \"bun\",\n [\"install\", \"--force\"],\n destination,\n opts?.spinner,\n \"Installing dependencies\",\n );\n}\n\nexport async function runTypesGen(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n remotePlugins?: string[];\n },\n): Promise<void> {\n const bosModule = join(destination, \"node_modules\", \"everything-dev\", \"dist\", \"cli.mjs\");\n if (existsSync(bosModule)) {\n const args = [bosModule, \"types\", \"gen\"];\n if (opts?.remotePlugins && opts.remotePlugins.length > 0) {\n args.push(\"--remote-plugins\", opts.remotePlugins.join(\",\"));\n }\n await runWithProgress(process.execPath, args, destination, opts?.spinner, \"Generating types\");\n return;\n }\n\n throw new Error(\"Unable to locate bos CLI for types generation\");\n}\n\nexport async function runDockerComposeUp(destination: string): Promise<void> {\n await execCommand(\"docker\", [\"compose\", \"up\", \"-d\", \"--wait\"], destination, { stdio: \"inherit\" });\n}\n\nasync function runWithProgress(\n command: string,\n args: string[],\n cwd: string,\n spinner: { message: (msg: string) => void } | undefined,\n label: string,\n): Promise<void> {\n const timeout = COMMAND_TIMEOUTS[command] ?? 2 * 60_000;\n const child = execa(command, args, {\n cwd,\n stdio: \"inherit\",\n timeout,\n env: { ...process.env, BOS_NO_BANNER: \"1\" },\n });\n\n if (spinner) {\n const start = Date.now();\n const interval = setInterval(() => {\n const elapsed = Math.round((Date.now() - start) / 1000);\n spinner.message(`${label}... (${elapsed}s)`);\n }, 2000);\n try {\n await child;\n } finally {\n clearInterval(interval);\n }\n } else {\n await child;\n }\n}\n\nexport function stripOrphanedWorkspacesFromLockfile(\n lockfilePath: string,\n allowedWorkspaces: string[],\n): void {\n if (!existsSync(lockfilePath)) return;\n\n const content = readFileSync(lockfilePath, \"utf-8\");\n let lockfile: Record<string, unknown>;\n try {\n lockfile = JSON.parse(content) as Record<string, unknown>;\n } catch {\n return;\n }\n\n const workspaces = lockfile.workspaces;\n if (!workspaces || typeof workspaces !== \"object\") return;\n\n const workspaceMap = workspaces as Record<string, unknown>;\n const allowed = new Set([\"\", ...allowedWorkspaces]);\n\n const keys = Object.keys(workspaceMap);\n let changed = false;\n for (const key of keys) {\n if (allowed.has(key)) continue;\n if (\n allowedWorkspaces.some(\n (pattern) => pattern.endsWith(\"/*\") && key.startsWith(pattern.slice(0, -1)),\n )\n )\n continue;\n delete workspaceMap[key];\n changed = true;\n }\n\n if (changed) {\n writeFileSync(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`);\n }\n}\n\nexport function removeInitLockfile(lockfilePath: string): void {\n if (!existsSync(lockfilePath)) return;\n rmSync(lockfilePath, { force: true });\n}\n\nexport async function scaffoldMinimalProject(\n destination: string,\n parentConfig: BosConfigInput,\n opts: {\n extendsAccount: string;\n extendsGateway: string;\n account?: string;\n domain?: string;\n plugins?: string[];\n overrides: OverrideSection[];\n repository?: string;\n title?: string;\n description?: string;\n },\n): Promise<number> {\n mkdirSync(destination, { recursive: true });\n\n const has = (section: OverrideSection) => opts.overrides.includes(section);\n\n const config: Record<string, unknown> = {\n extends: `bos://${opts.extendsAccount}/${opts.extendsGateway}`,\n account: opts.account || opts.extendsAccount,\n ...(opts.domain ? { domain: opts.domain } : {}),\n ...(opts.repository ? { repository: opts.repository } : {}),\n ...(opts.title ? { title: opts.title } : {}),\n ...(opts.description ? { description: opts.description } : {}),\n };\n\n if (parentConfig.app && typeof parentConfig.app === \"object\") {\n const app: Record<string, unknown> = {};\n const parentApp = parentConfig.app as Record<string, Record<string, unknown>>;\n\n if (has(\"host\") && parentApp.host) {\n app.host = { ...parentApp.host };\n stripProductionFields(app.host as Record<string, unknown>);\n }\n\n if (has(\"ui\") && parentApp.ui) {\n app.ui = { ...parentApp.ui };\n stripProductionFields(app.ui as Record<string, unknown>);\n }\n\n if (has(\"api\") && parentApp.api) {\n app.api = { ...parentApp.api };\n stripProductionFields(app.api as Record<string, unknown>);\n }\n\n if (Object.keys(app).length > 0) {\n config.app = app;\n }\n }\n\n if (has(\"plugins\") && opts.plugins && opts.plugins.length > 0 && parentConfig.plugins) {\n const plugins: Record<string, unknown> = {};\n for (const key of opts.plugins) {\n const parentPlugin = (parentConfig.plugins as Record<string, unknown>)?.[key];\n if (parentPlugin) {\n if (typeof parentPlugin === \"string\") {\n plugins[key] = { extends: parentPlugin };\n } else {\n const pluginCopy = { ...(parentPlugin as Record<string, unknown>) };\n stripProductionFields(pluginCopy);\n plugins[key] = pluginCopy;\n }\n }\n }\n config.plugins = plugins;\n } else if (has(\"plugins\")) {\n config.plugins = {};\n }\n\n await saveBosConfig(destination, config);\n\n const workspacePackages: string[] = [];\n for (const section of opts.overrides) {\n workspacePackages.push(...OVERRIDE_WORKSPACE_MAP[section]);\n }\n if (has(\"plugins\")) {\n workspacePackages.push(\"plugins/*\");\n }\n\n const catalog = (\n await resolveCatalogChainSource({\n extendsAccount: opts.extendsAccount,\n extendsGateway: opts.extendsGateway,\n })\n ).catalog;\n\n const pkg: Record<string, unknown> = {\n name: \"monorepo\",\n private: true,\n type: \"module\",\n scripts: buildChildRootScripts({\n ui: has(\"ui\"),\n api: has(\"api\"),\n host: has(\"host\"),\n plugins: has(\"plugins\"),\n }),\n dependencies: {\n \"everything-dev\": \"catalog:\",\n \"every-plugin\": \"catalog:\",\n },\n devDependencies: {},\n workspaces: {\n packages: workspacePackages,\n catalog,\n },\n };\n writeFileSync(join(destination, \"package.json\"), `${JSON.stringify(pkg, null, 2)}\\n`);\n\n writeFileSync(join(destination, \".gitignore\"), generateGitignore());\n\n return 4;\n}\n\nasync function resolveWorkspaceRefs(\n destination: string,\n options?: { localOverrides?: boolean; sourceDir?: string },\n): Promise<void> {\n await normalizePackageManifestsInTree({\n sourceRootDir: options?.sourceDir ?? destination,\n targetDir: destination,\n resolveCatalogRefs: false,\n preserveCatalogRefs: true,\n removeWorkspaceDeps: [\"host\"],\n });\n}\n\nexport async function writeInitSnapshot(\n destination: string,\n extendsAccount: string,\n extendsGateway: string,\n sourceDir: string,\n patterns: string[],\n options: {\n overrides: OverrideSection[];\n plugins?: string[];\n ignore?: string[];\n },\n): Promise<void> {\n const baseIgnore = [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\", \"**/.bos/**\"];\n const ignore = options.ignore ? [...baseIgnore, ...options.ignore] : baseIgnore;\n\n const allFiles = new Set<string>();\n for (const pattern of patterns) {\n const matches = await glob(pattern, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n ignore,\n });\n for (const match of matches) {\n allFiles.add(match);\n }\n }\n\n const fileHashes: Record<string, string> = {};\n for (const filePath of allFiles) {\n const src = join(sourceDir, filePath);\n const stat = lstatSync(src);\n if (!stat.isFile()) continue;\n const content = readFileSync(src);\n const destPath = sourcePathToDestinationPath(filePath);\n fileHashes[destPath] = computeHash(content);\n }\n\n await writeSnapshot(destination, {\n parentRef: `bos://${extendsAccount}/${extendsGateway}`,\n files: fileHashes,\n });\n}\n\nfunction computeHash(data: Uint8Array): string {\n return createHash(\"sha256\").update(data).digest(\"hex\").substring(0, 16);\n}\n\nfunction mkTmpDir(prefix: string): string {\n return mkdtempSync(join(tmpdir(), `${prefix}-`));\n}\n\nexport async function generateDatabaseMigrations(destination: string): Promise<void> {\n const drizzleConfigs = await glob(\"**/drizzle.config.ts\", {\n cwd: destination,\n nodir: true,\n dot: false,\n absolute: false,\n ignore: [\"**/node_modules/**\"],\n });\n\n for (const configPath of drizzleConfigs) {\n const workspaceDir = dirname(configPath);\n const pkgPath = join(destination, workspaceDir, \"package.json\");\n if (!existsSync(pkgPath)) continue;\n\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n const scripts = pkg.scripts as Record<string, string> | undefined;\n if (!scripts?.[\"db:generate\"]) continue;\n\n const cwd = join(destination, workspaceDir);\n await execCommand(\"bun\", [\"run\", \"db:generate\"], cwd);\n }\n}\n\nconst COMMAND_TIMEOUTS: Record<string, number> = {\n bun: 5 * 60_000,\n docker: 5 * 60_000,\n node_modules: 2 * 60_000,\n tar: 60_000,\n};\n\nexport async function execCommand(\n command: string,\n args: string[],\n cwd?: string,\n options?: { stdio?: \"pipe\" | \"inherit\" },\n): Promise<void> {\n const timeout = COMMAND_TIMEOUTS[command] ?? 2 * 60_000;\n await execa(command, args, { cwd, stdio: options?.stdio ?? \"pipe\", timeout });\n}\n\nexport function extractSkillsBlock(content: string): string {\n const match = content.match(/<!-- intent-skills:start -->[\\s\\S]*?<!-- intent-skills:end -->/);\n return match ? match[0] : \"\";\n}\n\nfunction buildChildAgentsInstructions(opts: {\n overrides: OverrideSection[];\n plugins?: string[];\n}): string {\n const has = (section: OverrideSection) => opts.overrides.includes(section);\n const parts: string[] = [];\n\n parts.push(`# Agent Instructions\n\nThis document provides operational guidance for AI agents working in this everything.dev project.\n\n## Quick Reference\n\n**Start Development:**\n\\`\\`\\`bash\ncp .env.example .env # First time only\nbun install\nbun run dev\n\\`\\`\\`\n\n**Check Status:**\n\\`\\`\\`bash\nbos ps # List running processes\nbos status # Project health check\nbos info # Show configuration\n\\`\\`\\``);\n\n const archLines = [\n \"This is an everything.dev child project. Depending on your overrides, it may include:\",\n ];\n if (has(\"ui\"))\n archLines.push(\"- **UI** — React 19 + TanStack Router frontend, loaded via Module Federation\");\n if (has(\"api\")) archLines.push(\"- **API** — Hono.js + oRPC backend with Effect services\");\n if (has(\"host\"))\n archLines.push(\"- **Host** — Server-side runtime with Module Federation orchestration\");\n if (has(\"plugins\"))\n archLines.push(\"- **Plugins** — Self-contained business logic modules with oRPC contracts\");\n archLines.push(\n \"\",\n \"The parent runtime provides the shared framework; your project provides custom overrides.\",\n );\n parts.push(`## Architecture\\n\\n${archLines.join(\"\\n\")}`);\n\n parts.push(`## Development Workflow\n\n### Starting Development\n1. \\`cp .env.example .env\\` (first time)\n2. \\`bun install\\`\n3. \\`bun run dev\\``);\n\n parts.push(`### Debugging Issues\n\n**API not responding:**\n- Check \\`bos ps\\` to see if the API process is running\n- Check \\`.bos/logs/api.log\\` for errors\n\n**UI not loading:**\n- Verify the dev server is running: \\`bos ps\\`\n- Check browser console for Module Federation errors\n- Clear browser cache and retry\n\n**Type errors:**\n- Run \\`bun run typecheck\\``);\n\n const changeLines: string[] = [\"### Making Changes\"];\n if (has(\"ui\"))\n changeLines.push(\"- **UI Changes**: Edit `ui/src/` files → hot reload automatically\");\n if (has(\"api\"))\n changeLines.push(\"- **API Changes**: Edit `api/src/` files → hot reload automatically\");\n if (has(\"host\"))\n changeLines.push(\n \"- **Host Changes**: Edit `host/src/` when changing runtime resolution, auth wiring, SSR, proxying, or plugin mounting\",\n );\n changeLines.push(\n \"- **New Components**: Create in `ui/src/components/ui/`, export from `ui/src/components/index.ts`\",\n );\n changeLines.push(\n \"- **New Routes**: Create file in `ui/src/routes/`, TanStack Router auto-generates tree\",\n );\n parts.push(`## Code Changes\\n\\n${changeLines.join(\"\\n\")}`);\n\n parts.push(`### Style Requirements\n- Use semantic Tailwind classes: \\`bg-background\\`, \\`text-foreground\\`, \\`text-muted-foreground\\`\n- No hardcoded colors like \\`bg-blue-600\\`\n- No code comments in implementation\n- Component file naming: lowercase kebab-case (\\`data-table.tsx\\`, \\`user-profile.tsx\\`)\n- Follow existing patterns in neighboring files`);\n\n if (has(\"api\")) {\n parts.push(`### Adding API Endpoints\n1. Define in \\`api/src/contract.ts\\` — the oRPC route definitions and Zod schemas\n2. Implement in \\`api/src/index.ts\\` — the \\`createRouter\\` function\n3. Use in UI via \\`apiClient\\` from \\`useApiClient()\\` in \\`@/app\\``);\n }\n\n if (has(\"plugins\")) {\n parts.push(`### Plugin Architecture\n\nBusiness logic is organized into independent plugins loaded via Module Federation:\n- Each plugin has its own \\`contract.ts\\` — oRPC route definitions and Zod schemas\n- Each plugin has its own \\`index.ts\\` — \\`createPlugin\\` with variables, secrets, context, router\n- Each plugin has its own rspack config for independent deployment\n\nThe UI accesses plugin routes via namespaced clients: \\`apiClient.<plugin>.<method>()\\`.\n\n### Plugin Client (pluginsClient)\n\nThe API plugin receives typed client factories for all other plugins via \\`createPlugin.withPlugins<PluginsClient>()\\`, enabling in-process composition without HTTP roundtrips.\n\n### Generated Types\n\n\\`api/src/lib/plugins-types.gen.ts\\`, \\`api/src/lib/auth-types.gen.ts\\`, \\`ui/src/lib/api-types.gen.ts\\`, and \\`ui/src/lib/auth-types.gen.ts\\` are generated by \\`bos types gen\\` from \\`bos.config.json\\`. These files are gitignored and auto-regenerated on \\`bun install\\`, \\`typecheck\\`, \\`bos dev\\`, \\`bos build\\`, and bos plugin management commands.\n\nIf you hand-edit \\`bos.config.json\\`, run \\`bos types gen\\` or restart \\`bos dev\\` to regenerate.`);\n }\n\n const testCommands: string[] = [];\n if (has(\"api\") || has(\"host\") || has(\"ui\")) {\n testCommands.push(\"bun run test # Run all tests\");\n testCommands.push(\"bun typecheck # Type check all packages\");\n testCommands.push(\"bun lint # Run linting\");\n }\n if (testCommands.length > 0) {\n parts.push(`## Testing & Quality\n\n**Before committing:**\n\\`\\`\\`bash\n${testCommands.join(\"\\n\")}\n\\`\\`\\``);\n }\n\n parts.push(`## Common Patterns\n\n### Authentication Check\n\nRoutes requiring auth use \\`_authenticated.tsx\\` layout:\n\\`\\`\\`typescript\nexport const Route = createFileRoute('/_layout/_authenticated')({\n beforeLoad: async ({ location }) => {\n const { data: session } = await authClient.getSession();\n if (!session?.user) {\n throw redirect({ to: '/login', search: { redirect: location.pathname } });\n }\n },\n});\n\\`\\`\\``);\n\n if (has(\"ui\")) {\n parts.push(`### API Client Usage\n\\`\\`\\`typescript\nimport { useApiClient } from \"@/app\";\n\nfunction MyComponent() {\n const apiClient = useApiClient();\n const { data } = await apiClient.ping();\n}\n\\`\\`\\``);\n }\n\n parts.push(`## Troubleshooting\n\n**Process won't start:**\n\\`\\`\\`bash\nbos kill # Kill all tracked processes\nbun install # Ensure dependencies\nbun run dev # Restart\n\\`\\`\\`\n\n**Module Federation errors:**\n- Check \\`bos.config.json\\` URLs are accessible\n- Verify shared dependency versions match in package.json\n- Clear browser cache\n\n**Database issues:**\n\\`\\`\\`bash\nbun run db:push # Push schema changes\nbun run db:studio # Open Drizzle Studio\n\\`\\`\\`\n\n## Environment\n\n**Required files:**\n- \\`.env\\` — Secrets (see \\`.env.example\\`)\n- \\`bos.config.json\\` — Runtime configuration (committed)`);\n\n return `${parts.join(\"\\n\\n\")}\\n`;\n}\n\nexport function buildChildAgentsMd(\n skillsBlock: string,\n opts: {\n overrides: OverrideSection[];\n plugins?: string[];\n },\n): string {\n return `${skillsBlock}\\n\\n${buildChildAgentsInstructions(opts)}`;\n}\n\nexport async function personalizeAgentsMd(\n destination: string,\n opts: {\n overrides: OverrideSection[];\n plugins?: string[];\n },\n): Promise<void> {\n const agentsMdPath = join(destination, \"AGENTS.md\");\n if (!existsSync(agentsMdPath)) return;\n\n const content = readFileSync(agentsMdPath, \"utf-8\");\n const skillsBlock = extractSkillsBlock(content);\n if (!skillsBlock) return;\n\n const childContent = buildChildAgentsMd(skillsBlock, opts);\n writeFileSync(agentsMdPath, childContent);\n}\n\nfunction generateGitignore(): string {\n return `node_modules/\ndist/\n.env\n.bos/\ndocker-compose.yml\n*.gen.ts\n*.gen.tsx\n`;\n}\n"],"mappings":"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"}