everything-dev 2.0.0-rc.0 → 2.0.0-rc.1

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.
package/dist/cli/init.cjs CHANGED
@@ -1131,8 +1131,8 @@ You don't need to wait for a PR to merge and run through CI/CD. Publish your own
1131
1131
  # Output: NEAR_PRIVATE_KEY=ed25519:...
1132
1132
  \`\`\`
1133
1133
  Add the key to your account via near-cli-rs, then set \`NEAR_PRIVATE_KEY\` in \`.env\` or CI secrets.
1134
- 4. **Update \`bos.config.json\`** — set \`account\` to your NEAR account, add \`extends\` to inherit the base platform, keep \`domain\` as the gateway:
1135
- \`\`\`json
1134
+ 4. **Update \`bos.app.ts\`** — set \`account\` to your NEAR account, add \`extends\` to inherit the base platform, keep \`domain\` as the gateway:
1135
+ \`\`\`ts
1136
1136
  { "extends": "bos://<parent-account>/<parent-gateway>", "account": "<your-account>.near", "domain": "<parent-gateway>" }
1137
1137
  \`\`\`
1138
1138
  5. **Publish and deploy:**
@@ -1202,9 +1202,9 @@ The API plugin receives typed client factories for all other plugins via \`creat
1202
1202
 
1203
1203
  ### Generated Types
1204
1204
 
1205
- \`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 \`pnpm install\`, \`typecheck\`, \`bos dev\`, \`bos build\`, and bos plugin management commands.
1205
+ \`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.app.ts\`. These files are gitignored and auto-regenerated on \`pnpm install\`, \`typecheck\`, \`bos dev\`, \`bos build\`, and bos plugin management commands.
1206
1206
 
1207
- If you hand-edit \`bos.config.json\`, run \`bos types gen\` or restart \`bos dev\` to regenerate.`);
1207
+ If you hand-edit \`bos.app.ts\`, run \`bos types gen\` or restart \`bos dev\` to regenerate.`);
1208
1208
  const testCommands = [];
1209
1209
  if (has("api") || has("host") || has("ui")) {
1210
1210
  testCommands.push("pnpm run test # Run all tests");
@@ -1273,7 +1273,7 @@ The host exposes several surfaces for programmatic agent access:
1273
1273
 
1274
1274
  ### Architecture note: remotes are code bundles
1275
1275
 
1276
- Remotes in \`bos.config.json\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. The UI, API, auth, and plugins all run in the same host process. There is no remote server to call; everything is loaded in-process through Module Federation and \`every-plugin\`.`);
1276
+ Remotes in \`bos.app.ts\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. The UI, API, auth, and plugins all run in the same host process. There is no remote server to call; everything is loaded in-process through Module Federation and \`every-plugin\`.`);
1277
1277
  parts.push(`## Troubleshooting
1278
1278
 
1279
1279
  **Process won't start:**
@@ -1284,7 +1284,7 @@ pnpm run dev # Restart
1284
1284
  \`\`\`
1285
1285
 
1286
1286
  **Module Federation errors:**
1287
- - Check \`bos.config.json\` URLs are accessible
1287
+ - Check \`bos.app.ts\` URLs are accessible
1288
1288
  - Verify shared dependency versions match in package.json
1289
1289
  - Clear browser cache
1290
1290
 
@@ -1298,7 +1298,7 @@ pnpm run db:studio # Open Drizzle Studio
1298
1298
 
1299
1299
  **Required files:**
1300
1300
  - \`.env\` — Secrets (see \`.env.example\`)
1301
- - \`bos.config.json\` — Runtime configuration (committed)`);
1301
+ - \`bos.app.ts\` — Runtime configuration (committed)`);
1302
1302
  return `${parts.join("\n\n")}\n`;
1303
1303
  }
1304
1304
  function buildChildAgentsMd(skillsBlock, opts) {
@@ -1370,7 +1370,7 @@ The \`x-api-key\` header works for \`/api/*\` (REST), \`/api/rpc/*\` (oRPC), and
1370
1370
  function buildChildSkillMd(title, repository) {
1371
1371
  return `# ${title} skill
1372
1372
 
1373
- Use this when you want an agent to run, edit, and publish **${title}** — an everything.dev app composed at runtime from \`bos.config.json\`.
1373
+ Use this when you want an agent to run, edit, and publish **${title}** — an everything.dev app composed at runtime from \`bos.app.ts\`.
1374
1374
 
1375
1375
  There are two ways to work with this app:
1376
1376
 
@@ -1420,7 +1420,7 @@ The repo ships agent workflow skills in \`.agents/skills/\` — start with \`eve
1420
1420
 
1421
1421
  ### Architecture note
1422
1422
 
1423
- Remotes in \`bos.config.json\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. Everything runs in the same host process.
1423
+ Remotes in \`bos.app.ts\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. Everything runs in the same host process.
1424
1424
 
1425
1425
  ### Run locally
1426
1426
 
@@ -1 +1 @@
1
- {"version":3,"file":"init.cjs","names":["join","existsSync","parseYaml","readFileSync","stringifyYaml","readWorkspaceCatalogFromDisk","findConfigPath","resolve","walkExtendsChain","basename","isAppDescriptorPath","loadAppDescriptorConfig","fetchBosConfigFromFastKv","getExtendsRef","parseBosRef","fetchResponse","createWriteStream","pipeline","tarExtract","lstatSync","dirname","serializeAppDescriptorSource","saveBosConfig","loadManifestNormalizationSpec","buildAuthTypesGenContent","buildAuthExportStub","buildAuthContractStub","relative","normalizePackageManifestsInTree","computeHash","writeSnapshot","mkdtempSync","tmpdir"],"sources":["../../src/cli/init.ts"],"sourcesContent":["import {\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { execa } from \"execa\";\nimport { glob } from \"glob\";\nimport { extract as tarExtract } from \"tar\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport {\n buildAuthContractStub,\n buildAuthExportStub,\n buildAuthTypesGenContent,\n} from \"../auth-types-gen\";\nimport { findConfigPath, isAppDescriptorPath, loadAppDescriptorConfig } from \"../config\";\nimport type { OverrideSection } from \"../contract\";\nimport { serializeAppDescriptorSource } from \"../descriptor/serialize\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport { fetchResponse } from \"../http-client\";\nimport {\n loadManifestNormalizationSpec,\n normalizePackageManifestsInTree,\n} from \"../internal/manifest-normalizer\";\nimport { walkExtendsChain } from \"../resolution/session\";\nimport type { BosConfig, BosConfigInput, ParentStarterConfig, StarterLevel } from \"../types\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { computeSnapshotHash as computeHash } from \"../utils/snapshot-hash\";\nimport { readWorkspaceCatalog as readWorkspaceCatalogFromDisk } from \"../workspace-catalog\";\nimport { writeSnapshot } from \"./snapshot\";\nimport { getExtendsRef, parseBosRef } from \"./utils/helpers\";\n\nexport const PNPM_PACKAGE_MANAGER = \"pnpm@12.10.1\";\n\n/**\n * Transitive-singleton overrides every workspace in the fleet must agree on\n * (ticket 05's deviation log: isolated resolution splits better-auth\n * peer-context identities across the plugin fleet). Values derive from the\n * catalog so sync keeps them current; keys absent from the catalog are left\n * unpinned.\n */\nconst CHILD_OVERRIDE_KEYS = [\n \"@better-fetch/fetch\",\n \"@rspack/core\",\n \"better-auth\",\n \"react\",\n \"react-dom\",\n] as const;\n\n/**\n * The child's workspace manifest: pnpm-workspace.yaml is canonical (v2, ADR\n * 0026) — packages globs synthesized from the child's override sections, the\n * catalog merged over any local entry, plus the fleet-wide linker posture and\n * singleton overrides. Re-running (sync/upgrade) merges instead of clobbering.\n */\nexport function writeChildWorkspaceYaml(\n projectDir: string,\n next: { packages: string[]; catalog: Record<string, string> },\n): boolean {\n const yamlPath = join(projectDir, \"pnpm-workspace.yaml\");\n let doc: {\n packages?: string[];\n catalog?: Record<string, string>;\n nodeLinker?: string;\n linkWorkspacePackages?: boolean;\n ignoreScripts?: boolean;\n overrides?: Record<string, string>;\n } = {};\n if (existsSync(yamlPath)) {\n try {\n const parsed = parseYaml(readFileSync(yamlPath, \"utf-8\"));\n if (parsed && typeof parsed === \"object\") doc = parsed;\n } catch {\n doc = {};\n }\n }\n\n let changed = !existsSync(yamlPath);\n const packages = [...new Set([...(doc.packages ?? []), ...next.packages])].sort();\n if (JSON.stringify(packages) !== JSON.stringify(doc.packages)) {\n doc.packages = packages;\n changed = true;\n }\n\n const catalog: Record<string, string> = { ...(doc.catalog ?? {}) };\n for (const [name, version] of Object.entries(next.catalog)) {\n if (catalog[name] !== version) {\n catalog[name] = version;\n changed = true;\n }\n }\n if (\n Object.keys(catalog).length > 0 &&\n Object.keys(catalog).length !== Object.keys(doc.catalog ?? {}).length\n ) {\n changed = true;\n }\n if (changed || !doc.catalog) {\n doc.catalog = Object.fromEntries(\n Object.entries(catalog).sort(([a], [b]) => a.localeCompare(b)),\n );\n }\n\n if (doc.nodeLinker !== \"hoisted\") {\n doc.nodeLinker = \"hoisted\";\n changed = true;\n }\n if (doc.linkWorkspacePackages !== true) {\n doc.linkWorkspacePackages = true;\n changed = true;\n }\n if (doc.ignoreScripts !== true) {\n doc.ignoreScripts = true;\n changed = true;\n }\n\n const overrides: Record<string, string> = { ...(doc.overrides ?? {}) };\n for (const key of CHILD_OVERRIDE_KEYS) {\n if (catalog[key] && overrides[key] !== catalog[key]) {\n overrides[key] = catalog[key];\n changed = true;\n }\n }\n if (Object.keys(overrides).length > 0) {\n doc.overrides = Object.fromEntries(\n Object.entries(overrides).sort(([a], [b]) => a.localeCompare(b)),\n );\n }\n\n if (changed) {\n writeFileSync(yamlPath, `${stringifyYaml(doc, { lineWidth: 0 }).trimEnd()}\\n`);\n return true;\n }\n return false;\n}\n\n/**\n * Init must never reuse a lockfile left in the target (copied from a parent\n * checkout or left by a previous run) — stale framework resolutions would\n * survive the fresh install. Bun's bun.lock is deleted on sight (ADR 0026's\n * silent-revert footgun); the child's own pnpm-lock.yaml is re-resolved.\n */\nexport function removeStrayLockfiles(projectDir: string): void {\n for (const lockfile of [\"pnpm-lock.yaml\", \"bun.lock\"]) {\n const lockfilePath = join(projectDir, lockfile);\n if (existsSync(lockfilePath)) {\n rmSync(lockfilePath, { force: true });\n }\n }\n}\n\nexport const INIT_ROOT_PATTERNS = [\n \"bos.config.json\",\n \"package.json\",\n \".env.example\",\n \".gitignore\",\n \"biome.json\",\n \"railway.json\",\n \"railway.toml\",\n \"AGENTS.md\",\n \".agents/skills/**\",\n \"skills-lock.json\",\n \"docs/agents/**\",\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\nexport function readWorkspaceCatalog(sourceDir: string): Record<string, string> {\n return readWorkspaceCatalogFromDisk(sourceDir);\n}\n\nexport async function resolveCatalogChainSource(opts: {\n extendsAccount: string;\n extendsGateway: string;\n sourceDir?: string;\n}): Promise<CatalogChainSource> {\n const entry = opts.sourceDir\n ? (findConfigPath(resolve(opts.sourceDir)) ?? join(resolve(opts.sourceDir), \"bos.config.json\"))\n : `bos://${opts.extendsAccount}/${opts.extendsGateway}`;\n const catalogs: Record<string, string>[] = [];\n const cleanups: Array<() => Promise<void>> = [];\n const resolvedRefs: string[] = [];\n let repository: string | undefined;\n\n try {\n await walkExtendsChain(entry, {\n env: \"production\",\n collectCatalogs: true,\n registerCleanup: (fn) => cleanups.push(fn),\n visit: async (link) => {\n resolvedRefs.unshift(\n link.ref.startsWith(\"bos://\") ? link.ref : join(link.baseDir, basename(link.ref)),\n );\n catalogs.push(readWorkspaceCatalog(link.sourceDir ?? link.baseDir));\n const repositoryValue = (link.config as Record<string, unknown>).repository;\n if (typeof repositoryValue === \"string\" && repository === undefined) {\n repository = repositoryValue;\n }\n },\n });\n } finally {\n for (const cleanup of [...cleanups].reverse()) {\n await cleanup();\n }\n }\n\n return {\n catalog: Object.assign({}, ...catalogs),\n repository,\n extendsChain: opts.sourceDir\n ? [`bos://${opts.extendsAccount}/${opts.extendsGateway}`, ...resolvedRefs.slice(1)]\n : resolvedRefs,\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 const configPath = findConfigPath(sourceDir);\n if (!configPath) {\n throw new Error(\n `No authored config (bos.app.ts or bos.config.json) found in source directory: ${sourceDir}`,\n );\n }\n const parentConfig = isAppDescriptorPath(configPath)\n ? ((await loadAppDescriptorConfig(configPath)) as BosConfig)\n : (JSON.parse(readFileSync(configPath, \"utf-8\")) 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_TEMPLATE_PATTERN);\n if (has(\"api\") || has(\"host\")) patterns.push(COMPOSE_TEMPLATE_PATTERN);\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\n/** api-override children get the slim generic shell, never the parent's domain API. */\nconst API_TEMPLATE_PATTERN = \".github/templates/api/**\";\n\n/** Child-sized compose (api + api-test databases) for local compute overrides. */\nconst COMPOSE_TEMPLATE_PATTERN = \".github/templates/docker-compose.yml\";\n\nexport function isApiTemplatePath(filePath: string): boolean {\n return filePath.startsWith(\".github/templates/api/\");\n}\n\nexport function isComposeTemplatePath(filePath: string): boolean {\n return filePath === COMPOSE_TEMPLATE_PATTERN;\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\nconst STARTER_PRODUCT_EXCLUSIONS = [\n \"_public/explore.tsx\",\n \"_public/stake.tsx\",\n \"_public/n/**\",\n \"_public/$accountId.tsx\",\n \"_public/$accountId/**\",\n \"_public/activity/**\",\n \"_public/-stake-*\",\n \"_authenticated/_dashboard/dashboard/node/**\",\n \"_authenticated/_dashboard/nodes/**\",\n \"_authenticated/_dashboard/tenant.*\",\n \"_authenticated/_dashboard/discover.tsx\",\n \"_authenticated/_dashboard/apply.tsx\",\n \"_authenticated/_dashboard/prototype-staking-poc.tsx\",\n \"_authenticated/onboarding/**\",\n \"_admin/_dashboard/_dashboard/admin/nodes/**\",\n \"_admin/_dashboard/_dashboard/admin/proposals/**\",\n \"_admin/_dashboard/_dashboard/admin/tenants/**\",\n \"_admin/_dashboard/_dashboard/admin/relayer.tsx\",\n \"_admin/_dashboard/_dashboard/admin/organizations.tsx\",\n] as const;\n\nconst STARTER_SIMPLE_EXCLUSIONS = [\n \"_authenticated.tsx\",\n \"_authenticated/**\",\n \"_admin.tsx\",\n \"_admin/**\",\n] as const;\n\n/**\n * Route-file globs (relative to the child's `ui/src/routes/`) that a starter\n * of the given level must not receive. Parent `starter` config can add\n * exclusions (`exclude`, `levels[level].exclude`) or reclaim routes for a\n * level (`levels[level].include`). Entries are prefixed with\n * `ui/src/routes/` so they compose with `copyFilteredFiles`'s ignore list.\n */\nexport function buildStarterRouteExclusions(\n level: StarterLevel,\n parentConfig: { starter?: ParentStarterConfig } | null | undefined,\n): string[] {\n const excluded = new Set<string>([...STARTER_PRODUCT_EXCLUSIONS]);\n if (level === \"simple\") {\n for (const entry of STARTER_SIMPLE_EXCLUSIONS) excluded.add(entry);\n }\n\n const starter = parentConfig?.starter;\n if (starter) {\n for (const entry of starter.exclude ?? []) excluded.add(entry);\n const levelConfig = starter.levels?.[level];\n if (levelConfig) {\n for (const entry of levelConfig.exclude ?? []) excluded.add(entry);\n for (const entry of levelConfig.include ?? []) excluded.delete(entry);\n }\n }\n\n return [...excluded].map((entry) => `ui/src/routes/${entry}`);\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 if (isApiTemplatePath(filePath)) {\n return filePath.replace(/^\\.github\\/templates\\/api\\//, \"api/\");\n }\n if (isComposeTemplatePath(filePath)) {\n return \"docker-compose.yml\";\n }\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 await tarExtract({ 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?.[1] && httpsMatch[2]) {\n return { owner: httpsMatch[1], repo: httpsMatch[2] };\n }\n\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch?.[1] && sshMatch[2]) {\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 if (!options.overrides.includes(\"api\")) {\n for (const match of allFiles) {\n if (isApiTemplatePath(match)) allFiles.delete(match);\n }\n }\n if (!options.overrides.includes(\"api\") && !options.overrides.includes(\"host\")) {\n for (const match of allFiles) {\n if (isComposeTemplatePath(match)) allFiles.delete(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 delete entry.pin;\n}\n\n/**\n * Scaffold the authored config as the TS form: the personalized\n * bos.config.json materializes into an authored `bos.app.ts` descriptor and\n * the JSON copy is removed — publish/sync still canonicalize to JSON for\n * FastKV from the resolved config. Returns the config that was converted, so\n * callers that need it (before the child has node_modules to import the\n * descriptor) can pass it onward.\n */\nexport async function convertChildConfigToAppForm(\n destination: string,\n): Promise<BosConfigInput | null> {\n const configPath = join(destination, \"bos.config.json\");\n if (!existsSync(configPath)) return null;\n const config = JSON.parse(readFileSync(configPath, \"utf-8\")) as BosConfigInput;\n writeFileSync(join(destination, \"bos.app.ts\"), serializeAppDescriptorSource(config));\n rmSync(configPath);\n return config;\n}\n\n/**\n * Scaffold the root dev-overlay starter (`bos.dev.ts`). Idempotent — never\n * overwrites an existing overlay. Dev overlays are merged child-wins over\n * the resolved config in development and are never published.\n */\nexport function writeDevOverlayTemplate(\n destination: string,\n opts: { extendsRef?: string } = {},\n): void {\n const overlayPath = join(destination, \"bos.dev.ts\");\n if (existsSync(overlayPath)) return;\n const extendsLine = opts.extendsRef ? `\\n// Inherited base: ${opts.extendsRef}\\n` : \"\";\n writeFileSync(\n overlayPath,\n `import type { AppDescriptor } from \"everything-dev/descriptor\";\n${extendsLine}\n/**\n * Development-only overlay for bos.app.ts — merged child-wins over the\n * resolved config when the environment is development. Never published.\n * Example: pin the auth attachment to a running dev server instead of\n * letting the dev harness spawn it.\n */\nexport default {\n // auth: { development: \"http://localhost:3006\" },\n} satisfies Partial<AppDescriptor>;\n`,\n );\n}\n\nfunction buildRootTypecheckScript(sections: {\n ui: boolean;\n api: boolean;\n host: boolean;\n plugins: boolean;\n}): string {\n const commands = [\"pnpm run types:gen\"];\n\n if (sections.ui) {\n commands.push(\"if [ -d ui ]; then pnpm --dir ui run typecheck; fi\");\n }\n if (sections.api) {\n commands.push(\"if [ -d api ]; then pnpm --dir api run typecheck; fi\");\n }\n if (sections.host) {\n commands.push(\"if [ -d host ]; then pnpm --dir host run 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 pnpm --dir \"$dir\" run 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 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 \"types:gen\": \"bos types gen\",\n bos: \"bos\",\n };\n\n if (sections.api) {\n scripts[\"db:push\"] = \"pnpm --dir api exec 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\"] = \"pnpm --dir api exec drizzle-kit generate\";\n scripts[\"db:migrate\"] = \"pnpm --dir api exec drizzle-kit migrate\";\n scripts[\"test:api\"] = \"pnpm --dir api run test --if-present\";\n scripts[\"test:integration\"] = \"pnpm --dir api run test tests/integration/ --if-present\";\n }\n\n if (sections.host) {\n scripts[\"test:e2e\"] = \"pnpm --dir host run test --if-present\";\n }\n\n const testTargets: string[] = [];\n if (sections.api) testTargets.push(\"pnpm --dir api run test --if-present\");\n if (sections.host) testTargets.push(\"pnpm --dir host run test --if-present\");\n if (sections.ui) testTargets.push(\"pnpm --dir ui run test --if-present\");\n if (sections.plugins) {\n testTargets.push(\n 'for d in plugins/*; do [ -f \"$d/package.json\" ] && pnpm --dir \"$d\" run test --if-present; done',\n );\n }\n scripts.test =\n testTargets.length > 0\n ? testTargets.join(\" && \")\n : 'echo \"No workspace directories configured\"';\n\n // Scripts key off the child's own override selection (what it runs locally),\n // not off resolved-config secrets — a ui-only child gets none of these.\n if (sections.api || sections.host) {\n scripts[\"dev:postgres\"] = \"docker compose up -d --wait && pnpm 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 starter?: StarterLevel;\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 const applyStarter = (config: Record<string, unknown>): void => {\n if (opts.starter) {\n config.starter = opts.starter;\n } else if (opts.mode !== \"sync\") {\n delete config.starter;\n }\n };\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 jsonConfigPath = join(destination, \"bos.config.json\");\n const appConfigPath = join(destination, \"bos.app.ts\");\n const tsForm = !existsSync(jsonConfigPath) && existsSync(appConfigPath);\n\n if (tsForm) {\n const config = (await loadAppDescriptorConfig(appConfigPath)) 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 applyStarter(config);\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 writeFileSync(appConfigPath, serializeAppDescriptorSource(config as BosConfigInput));\n return;\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 applyStarter(config);\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 pkg.packageManager = PNPM_PACKAGE_MANAGER;\n delete pkg.module;\n delete pkg.peerDependencies;\n delete pkg.patchedDependencies;\n\n const childWorkspaces: string[] = [];\n if (has(\"host\")) childWorkspaces.push(\"host\");\n if (has(\"ui\")) childWorkspaces.push(\"ui\");\n if (has(\"api\")) childWorkspaces.push(\"api\");\n if (has(\"plugins\")) childWorkspaces.push(\"plugins/*\");\n const localCatalog =\n pkg.workspaces && typeof pkg.workspaces === \"object\"\n ? ((pkg.workspaces as { catalog?: Record<string, string> }).catalog ?? {})\n : {};\n delete pkg.workspaces;\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 \"prepare\",\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 const catalog: Record<string, string> = { ...localCatalog };\n\n // The copied root manifest is the parent's — a monorepo root whose\n // dependencies (workspace members, vendored links) do not exist in the\n // child. The child root carries exactly the framework packages.\n pkg.dependencies = {\n \"everything-dev\": \"catalog:\",\n \"every-plugin\": \"catalog:\",\n };\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 const rootCatalogEverythingDev = spec.rootCatalog[\"everything-dev\"];\n const rootCatalogEveryPlugin = spec.rootCatalog[\"every-plugin\"];\n if (rootCatalogEverythingDev) {\n catalog[\"everything-dev\"] = rootCatalogEverythingDev;\n }\n if (rootCatalogEveryPlugin) {\n catalog[\"every-plugin\"] = rootCatalogEveryPlugin;\n }\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 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 writeChildWorkspaceYaml(destination, { packages: childWorkspaces, catalog });\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 const publicDir = join(destination, \"ui\", \"public\");\n if (!existsSync(publicDir)) {\n mkdirSync(publicDir, { recursive: true });\n }\n\n const llmsTxtPath = join(publicDir, \"llms.txt\");\n if (!existsSync(llmsTxtPath)) {\n const title = opts.title ?? opts.account ?? \"app\";\n writeFileSync(llmsTxtPath, buildChildLlmsTxt(title));\n }\n\n const skillMdPath = join(publicDir, \"skill.md\");\n if (!existsSync(skillMdPath)) {\n const title = opts.title ?? opts.account ?? \"app\";\n const repository = opts.repository ?? \"\";\n writeFileSync(skillMdPath, buildChildSkillMd(title, repository));\n }\n\n for (const agentFilePath of [llmsTxtPath, skillMdPath]) {\n const content = readFileSync(agentFilePath, \"utf-8\");\n if (content.includes(WORKFLOW_SKILLS_MARKER)) continue;\n writeFileSync(agentFilePath, `${content.replace(/\\n*$/, \"\\n\")}${WORKFLOW_SKILLS_NOTE}`);\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 { RouterContractClient, RouterContract } from \"@orpc/contract\";\\ntype ClientFactory<C extends RouterContract> = (context?: Record<string, unknown>) => RouterContractClient<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 const authExportRel = toRelativeImportPath(\n join(destination, \".bos\", \"generated\", \"auth\", \"auth-export.d.ts\"),\n authTypesGenPath,\n );\n const contractRel = toRelativeImportPath(\n join(destination, \".bos\", \"generated\", \"auth\", \"contract.d.ts\"),\n authTypesGenPath,\n );\n writeFileSync(authTypesGenPath, buildAuthTypesGenContent(authExportRel, contractRel));\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(authExportStubPath, buildAuthExportStub());\n }\n const contractStubPath = join(authDir, \"contract.d.ts\");\n if (!existsSync(contractStubPath)) {\n writeFileSync(contractStubPath, buildAuthContractStub());\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 toRelativeImportPath(fromPath: string, toPath: string): string {\n const rel = relative(dirname(toPath), fromPath);\n return rel.startsWith(\".\") ? rel : `./${rel}`;\n}\n\nexport async function runPnpmInstall(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n },\n): Promise<void> {\n await runWithProgress(\n \"pnpm\",\n [\"install\", \"--ignore-scripts\"],\n destination,\n opts?.spinner,\n \"Installing dependencies\",\n );\n}\n\nexport async function runPnpmInstallForUpgrade(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n },\n): Promise<void> {\n await runWithProgress(\n \"pnpm\",\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 { runDockerComposeUp } from \"../infra/docker\";\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 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 starter?: StarterLevel;\n /** local parent source dir — resolves the catalog offline (tests, --source) */\n catalogSourceDir?: 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 ...(opts.starter ? { starter: opts.starter } : {}),\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 sourceDir: opts.catalogSourceDir,\n })\n ).catalog;\n\n const pkg: Record<string, unknown> = {\n name: \"monorepo\",\n private: true,\n type: \"module\",\n packageManager: PNPM_PACKAGE_MANAGER,\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 };\n writeFileSync(join(destination, \"package.json\"), `${JSON.stringify(pkg, null, 2)}\\n`);\n\n writeChildWorkspaceYaml(destination, { packages: workspacePackages, catalog });\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 starter?: StarterLevel;\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 if (!options.overrides.includes(\"api\")) {\n for (const match of allFiles) {\n if (isApiTemplatePath(match)) allFiles.delete(match);\n }\n }\n if (!options.overrides.includes(\"api\") && !options.overrides.includes(\"host\")) {\n for (const match of allFiles) {\n if (isComposeTemplatePath(match)) allFiles.delete(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 destPath = sourcePathToDestinationPath(filePath);\n // Only snapshot what the scaffold actually delivered — files pruned\n // after copy (e.g. unused ui sources) must not come back via bos sync.\n if (!existsSync(join(destination, destPath))) continue;\n const content = readFileSync(src);\n fileHashes[destPath] = computeHash(content);\n }\n\n await writeSnapshot(destination, {\n parentRef: `bos://${extendsAccount}/${extendsGateway}`,\n files: fileHashes,\n starter: options.starter,\n });\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(\"pnpm\", [\"--dir\", \"api\", \"exec\", \"drizzle-kit\", \"generate\"], cwd);\n }\n}\n\nconst COMMAND_TIMEOUTS: Record<string, number> = {\n pnpm: 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\npnpm install\npnpm 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**Deploy:**\n\n[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/everything-dev-template?referralCode=MuB_vg&utm_medium=integration&utm_source=template&utm_campaign=generic)\n\nThe Railway template deploys the everything.dev Docker image. Set these variables:\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| \\`BOS_ACCOUNT\\` | The NEAR account that owns this app's published configuration on-chain | \\`myapp.near\\` |\n| \\`BOS_GATEWAY\\` | The core domain where this app is served | \\`myapp.com\\` |\n| \\`BETTER_AUTH_SECRET\\` | Secret for session encryption — generate with \\`openssl rand -base64 32\\` | (random) |\n\n**Self-deployed production:**\n\nYou don't need to wait for a PR to merge and run through CI/CD. Publish your own config on-chain under your own NEAR account and run your own host instance, inheriting the base platform via \\`extends\\`.\n\n1. **Install near-cli-rs** (the \\`bos\\` CLI shells out to it for \\`bos publish\\` and \\`bos key generate\\`):\n \\`\\`\\`bash\n curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/near-cli-rs/releases/download/v0.23.5/near-cli-rs-installer.sh | sh\n \\`\\`\\`\n2. **Create a NEAR account** (testnet or mainnet). Named accounts can own subaccounts; implicit hex accounts cannot:\n \\`\\`\\`bash\n near account create-account fund-my-account <your-account>.testnet use-faucet network-config testnet\n \\`\\`\\`\n3. **Generate a publish key** — a function-call key scoped to the FastKV registry contract:\n \\`\\`\\`bash\n bos key generate\n # Output: NEAR_PRIVATE_KEY=ed25519:...\n \\`\\`\\`\n Add the key to your account via near-cli-rs, then set \\`NEAR_PRIVATE_KEY\\` in \\`.env\\` or CI secrets.\n4. **Update \\`bos.config.json\\`** — set \\`account\\` to your NEAR account, add \\`extends\\` to inherit the base platform, keep \\`domain\\` as the gateway:\n \\`\\`\\`json\n { \"extends\": \"bos://<parent-account>/<parent-gateway>\", \"account\": \"<your-account>.near\", \"domain\": \"<parent-gateway>\" }\n \\`\\`\\`\n 5. **Publish and deploy:**\n \\`\\`\\`bash\n bos deploy # preflight → build → upload bundles → publish config to FastKV at bos://<your-account>/<gateway> → image/Railway when configured\n \\`\\`\\`\n6. **Deploy to Railway** (one-click template or \\`railway up\\`), set \\`BOS_ACCOUNT\\`, \\`BOS_GATEWAY\\` (same gateway as parent), and \\`BETTER_AUTH_SECRET\\`. Your Railway host fetches your config from FastKV and serves live.\n\n\\`BOS_GATEWAY\\` is the **FastKV lookup key**, not the DNS domain your Railway instance serves on. By keeping the same gateway while using your own \\`BOS_ACCOUNT\\`, your config lives at a separate FastKV path that \\`extends\\` the base runtime — you inherit the full platform and override only what you change.\n\n**Tenant creation** (for the admin wizard) is DAO-owned: connect a sputnik-dao account via the Trezu wallet in the admin wizard; the wizard publishes the tenant runtime config under \\`bos://<dao-account>/<gateway>\\`. No server-side subaccount keys are needed.`);\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. \\`pnpm install\\`\n2. \\`pnpm run dev\\`\n3. \\`bos dev\\` creates \\`.env\\` on first run and starts local Postgres via docker compose when it is down`);\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 \\`pnpm 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 \\`pnpm 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(\"pnpm run test # Run all tests\");\n testCommands.push(\"pnpm run typecheck # Type check all packages\");\n testCommands.push(\"pnpm run 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(`## Workflow Skills\n\nThis repo ships agent workflow skills in \\`.agents/skills/\\` — the ordered development flow (grill → spec → tickets → implement/tdd → code-review). Start \\`/everything-dev-app\\` to orient and pick the right next step; \\`/ask-matt\\` is the router if unsure.\n\n- \\`/grill-with-docs\\` — sharpen an idea by interview, leaving a paper trail in \\`GLOSSARY.md\\` and ADRs\n- \\`/to-spec\\` / \\`/to-tickets\\` — turn a plan into a spec, then tracer-bullet tickets under \\`.scratch/<feature>/issues/\\`\n- \\`/implement\\` + \\`/tdd\\` — build a ticket test-first at pre-agreed seams\n- \\`/code-review\\` — two-axis review (Standards + Spec) of the diff since a fixed point\n- \\`/diagnosing-bugs\\` — diagnosis loop for hard bugs and performance regressions\n\nRun \\`/setup-matt-pocock-skills\\` once before first use. Tracker and triage conventions live in \\`docs/agents/\\`.`);\n\n parts.push(`## Agent Communication Surface\n\nThe host exposes several surfaces for programmatic agent access:\n\n| Surface | Endpoint | Auth | Use |\n|---------|----------|------|-----|\n| MCP | \\`POST /api/mcp\\` | \\`x-api-key\\` header or session cookie | MCP clients — auto-generated tools from OpenAPI spec, stateless Streamable HTTP transport |\n| REST/OpenAPI | \\`GET/POST/... /api/{path}\\` | \\`x-api-key\\` header or session cookie | Standard REST; Scalar docs at \\`GET /api\\`, spec at \\`GET /api/spec.json\\` |\n| oRPC RPC | \\`POST /api/rpc/{procedure}\\` | \\`x-api-key\\` header or session cookie | Typed JSON-RPC for all API procedures |\n| Plugin RPC | \\`POST /api/rpc/{plugin}/{procedure}\\` | \\`x-api-key\\` header or session cookie | Per-plugin RPC (e.g. \\`/api/rpc/auth/getSession\\`) |\n| MCP discovery | \\`GET /.well-known/mcp.json\\` | None | JSON descriptor with server name, endpoint, and auth scheme |\n\n### Authentication for agents\n\n1. Sign in with your NEAR wallet (SIWN) at the website.\n2. Navigate to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a new key — the full secret (\\`edk_...\\`) is shown once. Copy it immediately.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\n### Architecture note: remotes are code bundles\n\nRemotes in \\`bos.config.json\\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. The UI, API, auth, and plugins all run in the same host process. There is no remote server to call; everything is loaded in-process through Module Federation and \\`every-plugin\\`.`);\n\n parts.push(`## Troubleshooting\n\n**Process won't start:**\n\\`\\`\\`bash\nbos kill # Kill all tracked processes\npnpm install # Ensure dependencies\npnpm 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\npnpm run db:push # Push schema changes\npnpm 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\nconst WORKFLOW_SKILLS_MARKER = \"everything-dev-app\";\nconst WORKFLOW_SKILLS_NOTE = `\n\n## Workflow skills\n\nThis repo ships agent workflow skills in \\`.agents/skills/\\` — the ordered development flow (grill → spec → tickets → implement/tdd → code-review). Start with \\`/everything-dev-app\\` to orient and pick the right next step. See \\`AGENTS.md\\` → Workflow Skills.\n`;\n\nexport function buildChildLlmsTxt(title: string): string {\n return `# ${title}\n\n> Application running on the everything.dev runtime.\n\n## Skills\n\n- [Skill](/skill.md): Agent-ready prompt for talking to, running, editing, and publishing this runtime.\n- Workflow skills (in the repo): \\`.agents/skills/\\` — start with \\`everything-dev-app\\` for the ordered development flow.\n\n## API\n\n- [OpenAPI docs](/api): Interactive API reference (Scalar)\n- [OpenAPI spec](/api/spec.json): Machine-readable OpenAPI JSON\n- [oRPC RPC](/api/rpc): Typed JSON-RPC endpoint for all API procedures\n- [Plugin RPC](/api/rpc/auth): Auth plugin RPC (session, NEAR SIWN, relay, API keys, organizations)\n\n## MCP\n\n- [MCP server](/api/mcp): Model Context Protocol server (Streamable HTTP, stateless). Auto-generates tools from the API's OpenAPI spec.\n- [MCP discovery](/.well-known/mcp.json): JSON descriptor with server name, endpoint URL, and auth scheme.\n\n## Auth\n\nAuthenticate to the API using an API key:\n\n1. Sign in with your NEAR wallet (SIWN) at the website.\n2. Go to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a key — the full secret (\\`edk_...\\`) is shown once.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\nThe \\`x-api-key\\` header works for \\`/api/*\\` (REST), \\`/api/rpc/*\\` (oRPC), and \\`/api/mcp\\` (MCP).\n\n## Source\n\n- [Repository](https://github.com/NEARBuilders/everything-dev): Clone and read \\`AGENTS.md\\` for full development instructions, TanStack Intent skills, and workflow guidance.\n`;\n}\n\nexport function buildChildSkillMd(title: string, repository: string): string {\n const repoLink = repository\n ? `- [Repository](${repository}): Clone and read \\`AGENTS.md\\` for full development instructions.`\n : `- Clone the repository and read \\`AGENTS.md\\` for full development instructions.`;\n\n return `# ${title} skill\n\nUse this when you want an agent to run, edit, and publish **${title}** — an everything.dev app composed at runtime from \\`bos.config.json\\`.\n\nThere are two ways to work with this app:\n\n1. **Talk to the app** — use the API via MCP or REST to read/write data without cloning anything.\n2. **Clone and modify** — clone the repository, run locally, edit code, and publish.\n\n## Mode 1: Talk to the app\n\n### MCP endpoint\n\n\\`\\`\\`\nPOST /api/mcp\n\\`\\`\\`\n\nTransport: Streamable HTTP (stateless). Connect your MCP client to \\`{origin}/api/mcp\\` to discover all available tools automatically.\n\n### Authentication\n\nUse an **API key**:\n\n1. Sign in with your NEAR wallet at the website (SIWN).\n2. Navigate to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a key — the full secret (\\`edk_...\\`) is shown once.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\n### REST / OpenAPI\n\n- **API docs**: \\`GET /api\\`\n- **OpenAPI spec**: \\`GET /api/spec.json\\`\n- **oRPC RPC**: \\`POST /api/rpc/{procedure}\\`\n- **MCP discovery**: \\`GET /.well-known/mcp.json\\`\n\n## Mode 2: Clone and modify\n\n### TanStack Intent\n\n- Registry entry: \\`https://tanstack.com/intent/registry/everything-dev\\`\n- Load with TanStack Intent: \\`npx @tanstack/intent@latest load everything-dev\\`\n\n### Read AGENTS.md first\n\nAfter cloning, read **\\`AGENTS.md\\`** at the repo root. It contains operational guidance, TanStack Intent skills, and workflow instructions.\n\n### Workflow skills\n\nThe repo ships agent workflow skills in \\`.agents/skills/\\` — start with \\`everything-dev-app\\` for the ordered development flow (grill → spec → tickets → implement/tdd → code-review).\n\n### Architecture note\n\nRemotes in \\`bos.config.json\\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. Everything runs in the same host process.\n\n### Run locally\n\n\\`\\`\\`bash\npnpm install\nbos dev\n\\`\\`\\`\n\n### Publish\n\n\\`\\`\\`bash\nbos deploy\n\\`\\`\\`\n\n## Source\n\n${repoLink}\n`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"init.cjs","names":["join","existsSync","parseYaml","readFileSync","stringifyYaml","readWorkspaceCatalogFromDisk","findConfigPath","resolve","walkExtendsChain","basename","isAppDescriptorPath","loadAppDescriptorConfig","fetchBosConfigFromFastKv","getExtendsRef","parseBosRef","fetchResponse","createWriteStream","pipeline","tarExtract","lstatSync","dirname","serializeAppDescriptorSource","saveBosConfig","loadManifestNormalizationSpec","buildAuthTypesGenContent","buildAuthExportStub","buildAuthContractStub","relative","normalizePackageManifestsInTree","computeHash","writeSnapshot","mkdtempSync","tmpdir"],"sources":["../../src/cli/init.ts"],"sourcesContent":["import {\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { execa } from \"execa\";\nimport { glob } from \"glob\";\nimport { extract as tarExtract } from \"tar\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport {\n buildAuthContractStub,\n buildAuthExportStub,\n buildAuthTypesGenContent,\n} from \"../auth-types-gen\";\nimport { findConfigPath, isAppDescriptorPath, loadAppDescriptorConfig } from \"../config\";\nimport type { OverrideSection } from \"../contract\";\nimport { serializeAppDescriptorSource } from \"../descriptor/serialize\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport { fetchResponse } from \"../http-client\";\nimport {\n loadManifestNormalizationSpec,\n normalizePackageManifestsInTree,\n} from \"../internal/manifest-normalizer\";\nimport { walkExtendsChain } from \"../resolution/session\";\nimport type { BosConfig, BosConfigInput, ParentStarterConfig, StarterLevel } from \"../types\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { computeSnapshotHash as computeHash } from \"../utils/snapshot-hash\";\nimport { readWorkspaceCatalog as readWorkspaceCatalogFromDisk } from \"../workspace-catalog\";\nimport { writeSnapshot } from \"./snapshot\";\nimport { getExtendsRef, parseBosRef } from \"./utils/helpers\";\n\nexport const PNPM_PACKAGE_MANAGER = \"pnpm@12.10.1\";\n\n/**\n * Transitive-singleton overrides every workspace in the fleet must agree on\n * (ticket 05's deviation log: isolated resolution splits better-auth\n * peer-context identities across the plugin fleet). Values derive from the\n * catalog so sync keeps them current; keys absent from the catalog are left\n * unpinned.\n */\nconst CHILD_OVERRIDE_KEYS = [\n \"@better-fetch/fetch\",\n \"@rspack/core\",\n \"better-auth\",\n \"react\",\n \"react-dom\",\n] as const;\n\n/**\n * The child's workspace manifest: pnpm-workspace.yaml is canonical (v2, ADR\n * 0026) — packages globs synthesized from the child's override sections, the\n * catalog merged over any local entry, plus the fleet-wide linker posture and\n * singleton overrides. Re-running (sync/upgrade) merges instead of clobbering.\n */\nexport function writeChildWorkspaceYaml(\n projectDir: string,\n next: { packages: string[]; catalog: Record<string, string> },\n): boolean {\n const yamlPath = join(projectDir, \"pnpm-workspace.yaml\");\n let doc: {\n packages?: string[];\n catalog?: Record<string, string>;\n nodeLinker?: string;\n linkWorkspacePackages?: boolean;\n ignoreScripts?: boolean;\n overrides?: Record<string, string>;\n } = {};\n if (existsSync(yamlPath)) {\n try {\n const parsed = parseYaml(readFileSync(yamlPath, \"utf-8\"));\n if (parsed && typeof parsed === \"object\") doc = parsed;\n } catch {\n doc = {};\n }\n }\n\n let changed = !existsSync(yamlPath);\n const packages = [...new Set([...(doc.packages ?? []), ...next.packages])].sort();\n if (JSON.stringify(packages) !== JSON.stringify(doc.packages)) {\n doc.packages = packages;\n changed = true;\n }\n\n const catalog: Record<string, string> = { ...(doc.catalog ?? {}) };\n for (const [name, version] of Object.entries(next.catalog)) {\n if (catalog[name] !== version) {\n catalog[name] = version;\n changed = true;\n }\n }\n if (\n Object.keys(catalog).length > 0 &&\n Object.keys(catalog).length !== Object.keys(doc.catalog ?? {}).length\n ) {\n changed = true;\n }\n if (changed || !doc.catalog) {\n doc.catalog = Object.fromEntries(\n Object.entries(catalog).sort(([a], [b]) => a.localeCompare(b)),\n );\n }\n\n if (doc.nodeLinker !== \"hoisted\") {\n doc.nodeLinker = \"hoisted\";\n changed = true;\n }\n if (doc.linkWorkspacePackages !== true) {\n doc.linkWorkspacePackages = true;\n changed = true;\n }\n if (doc.ignoreScripts !== true) {\n doc.ignoreScripts = true;\n changed = true;\n }\n\n const overrides: Record<string, string> = { ...(doc.overrides ?? {}) };\n for (const key of CHILD_OVERRIDE_KEYS) {\n if (catalog[key] && overrides[key] !== catalog[key]) {\n overrides[key] = catalog[key];\n changed = true;\n }\n }\n if (Object.keys(overrides).length > 0) {\n doc.overrides = Object.fromEntries(\n Object.entries(overrides).sort(([a], [b]) => a.localeCompare(b)),\n );\n }\n\n if (changed) {\n writeFileSync(yamlPath, `${stringifyYaml(doc, { lineWidth: 0 }).trimEnd()}\\n`);\n return true;\n }\n return false;\n}\n\n/**\n * Init must never reuse a lockfile left in the target (copied from a parent\n * checkout or left by a previous run) — stale framework resolutions would\n * survive the fresh install. Bun's bun.lock is deleted on sight (ADR 0026's\n * silent-revert footgun); the child's own pnpm-lock.yaml is re-resolved.\n */\nexport function removeStrayLockfiles(projectDir: string): void {\n for (const lockfile of [\"pnpm-lock.yaml\", \"bun.lock\"]) {\n const lockfilePath = join(projectDir, lockfile);\n if (existsSync(lockfilePath)) {\n rmSync(lockfilePath, { force: true });\n }\n }\n}\n\nexport const INIT_ROOT_PATTERNS = [\n \"bos.config.json\",\n \"package.json\",\n \".env.example\",\n \".gitignore\",\n \"biome.json\",\n \"railway.json\",\n \"railway.toml\",\n \"AGENTS.md\",\n \".agents/skills/**\",\n \"skills-lock.json\",\n \"docs/agents/**\",\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\nexport function readWorkspaceCatalog(sourceDir: string): Record<string, string> {\n return readWorkspaceCatalogFromDisk(sourceDir);\n}\n\nexport async function resolveCatalogChainSource(opts: {\n extendsAccount: string;\n extendsGateway: string;\n sourceDir?: string;\n}): Promise<CatalogChainSource> {\n const entry = opts.sourceDir\n ? (findConfigPath(resolve(opts.sourceDir)) ?? join(resolve(opts.sourceDir), \"bos.config.json\"))\n : `bos://${opts.extendsAccount}/${opts.extendsGateway}`;\n const catalogs: Record<string, string>[] = [];\n const cleanups: Array<() => Promise<void>> = [];\n const resolvedRefs: string[] = [];\n let repository: string | undefined;\n\n try {\n await walkExtendsChain(entry, {\n env: \"production\",\n collectCatalogs: true,\n registerCleanup: (fn) => cleanups.push(fn),\n visit: async (link) => {\n resolvedRefs.unshift(\n link.ref.startsWith(\"bos://\") ? link.ref : join(link.baseDir, basename(link.ref)),\n );\n catalogs.push(readWorkspaceCatalog(link.sourceDir ?? link.baseDir));\n const repositoryValue = (link.config as Record<string, unknown>).repository;\n if (typeof repositoryValue === \"string\" && repository === undefined) {\n repository = repositoryValue;\n }\n },\n });\n } finally {\n for (const cleanup of [...cleanups].reverse()) {\n await cleanup();\n }\n }\n\n return {\n catalog: Object.assign({}, ...catalogs),\n repository,\n extendsChain: opts.sourceDir\n ? [`bos://${opts.extendsAccount}/${opts.extendsGateway}`, ...resolvedRefs.slice(1)]\n : resolvedRefs,\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 const configPath = findConfigPath(sourceDir);\n if (!configPath) {\n throw new Error(\n `No authored config (bos.app.ts or bos.config.json) found in source directory: ${sourceDir}`,\n );\n }\n const parentConfig = isAppDescriptorPath(configPath)\n ? ((await loadAppDescriptorConfig(configPath)) as BosConfig)\n : (JSON.parse(readFileSync(configPath, \"utf-8\")) 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_TEMPLATE_PATTERN);\n if (has(\"api\") || has(\"host\")) patterns.push(COMPOSE_TEMPLATE_PATTERN);\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\n/** api-override children get the slim generic shell, never the parent's domain API. */\nconst API_TEMPLATE_PATTERN = \".github/templates/api/**\";\n\n/** Child-sized compose (api + api-test databases) for local compute overrides. */\nconst COMPOSE_TEMPLATE_PATTERN = \".github/templates/docker-compose.yml\";\n\nexport function isApiTemplatePath(filePath: string): boolean {\n return filePath.startsWith(\".github/templates/api/\");\n}\n\nexport function isComposeTemplatePath(filePath: string): boolean {\n return filePath === COMPOSE_TEMPLATE_PATTERN;\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\nconst STARTER_PRODUCT_EXCLUSIONS = [\n \"_public/explore.tsx\",\n \"_public/stake.tsx\",\n \"_public/n/**\",\n \"_public/$accountId.tsx\",\n \"_public/$accountId/**\",\n \"_public/activity/**\",\n \"_public/-stake-*\",\n \"_authenticated/_dashboard/dashboard/node/**\",\n \"_authenticated/_dashboard/nodes/**\",\n \"_authenticated/_dashboard/tenant.*\",\n \"_authenticated/_dashboard/discover.tsx\",\n \"_authenticated/_dashboard/apply.tsx\",\n \"_authenticated/_dashboard/prototype-staking-poc.tsx\",\n \"_authenticated/onboarding/**\",\n \"_admin/_dashboard/_dashboard/admin/nodes/**\",\n \"_admin/_dashboard/_dashboard/admin/proposals/**\",\n \"_admin/_dashboard/_dashboard/admin/tenants/**\",\n \"_admin/_dashboard/_dashboard/admin/relayer.tsx\",\n \"_admin/_dashboard/_dashboard/admin/organizations.tsx\",\n] as const;\n\nconst STARTER_SIMPLE_EXCLUSIONS = [\n \"_authenticated.tsx\",\n \"_authenticated/**\",\n \"_admin.tsx\",\n \"_admin/**\",\n] as const;\n\n/**\n * Route-file globs (relative to the child's `ui/src/routes/`) that a starter\n * of the given level must not receive. Parent `starter` config can add\n * exclusions (`exclude`, `levels[level].exclude`) or reclaim routes for a\n * level (`levels[level].include`). Entries are prefixed with\n * `ui/src/routes/` so they compose with `copyFilteredFiles`'s ignore list.\n */\nexport function buildStarterRouteExclusions(\n level: StarterLevel,\n parentConfig: { starter?: ParentStarterConfig } | null | undefined,\n): string[] {\n const excluded = new Set<string>([...STARTER_PRODUCT_EXCLUSIONS]);\n if (level === \"simple\") {\n for (const entry of STARTER_SIMPLE_EXCLUSIONS) excluded.add(entry);\n }\n\n const starter = parentConfig?.starter;\n if (starter) {\n for (const entry of starter.exclude ?? []) excluded.add(entry);\n const levelConfig = starter.levels?.[level];\n if (levelConfig) {\n for (const entry of levelConfig.exclude ?? []) excluded.add(entry);\n for (const entry of levelConfig.include ?? []) excluded.delete(entry);\n }\n }\n\n return [...excluded].map((entry) => `ui/src/routes/${entry}`);\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 if (isApiTemplatePath(filePath)) {\n return filePath.replace(/^\\.github\\/templates\\/api\\//, \"api/\");\n }\n if (isComposeTemplatePath(filePath)) {\n return \"docker-compose.yml\";\n }\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 await tarExtract({ 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?.[1] && httpsMatch[2]) {\n return { owner: httpsMatch[1], repo: httpsMatch[2] };\n }\n\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch?.[1] && sshMatch[2]) {\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 if (!options.overrides.includes(\"api\")) {\n for (const match of allFiles) {\n if (isApiTemplatePath(match)) allFiles.delete(match);\n }\n }\n if (!options.overrides.includes(\"api\") && !options.overrides.includes(\"host\")) {\n for (const match of allFiles) {\n if (isComposeTemplatePath(match)) allFiles.delete(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 delete entry.pin;\n}\n\n/**\n * Scaffold the authored config as the TS form: the personalized\n * bos.config.json materializes into an authored `bos.app.ts` descriptor and\n * the JSON copy is removed — publish/sync still canonicalize to JSON for\n * FastKV from the resolved config. Returns the config that was converted, so\n * callers that need it (before the child has node_modules to import the\n * descriptor) can pass it onward.\n */\nexport async function convertChildConfigToAppForm(\n destination: string,\n): Promise<BosConfigInput | null> {\n const configPath = join(destination, \"bos.config.json\");\n if (!existsSync(configPath)) return null;\n const config = JSON.parse(readFileSync(configPath, \"utf-8\")) as BosConfigInput;\n writeFileSync(join(destination, \"bos.app.ts\"), serializeAppDescriptorSource(config));\n rmSync(configPath);\n return config;\n}\n\n/**\n * Scaffold the root dev-overlay starter (`bos.dev.ts`). Idempotent — never\n * overwrites an existing overlay. Dev overlays are merged child-wins over\n * the resolved config in development and are never published.\n */\nexport function writeDevOverlayTemplate(\n destination: string,\n opts: { extendsRef?: string } = {},\n): void {\n const overlayPath = join(destination, \"bos.dev.ts\");\n if (existsSync(overlayPath)) return;\n const extendsLine = opts.extendsRef ? `\\n// Inherited base: ${opts.extendsRef}\\n` : \"\";\n writeFileSync(\n overlayPath,\n `import type { AppDescriptor } from \"everything-dev/descriptor\";\n${extendsLine}\n/**\n * Development-only overlay for bos.app.ts — merged child-wins over the\n * resolved config when the environment is development. Never published.\n * Example: pin the auth attachment to a running dev server instead of\n * letting the dev harness spawn it.\n */\nexport default {\n // auth: { development: \"http://localhost:3006\" },\n} satisfies Partial<AppDescriptor>;\n`,\n );\n}\n\nfunction buildRootTypecheckScript(sections: {\n ui: boolean;\n api: boolean;\n host: boolean;\n plugins: boolean;\n}): string {\n const commands = [\"pnpm run types:gen\"];\n\n if (sections.ui) {\n commands.push(\"if [ -d ui ]; then pnpm --dir ui run typecheck; fi\");\n }\n if (sections.api) {\n commands.push(\"if [ -d api ]; then pnpm --dir api run typecheck; fi\");\n }\n if (sections.host) {\n commands.push(\"if [ -d host ]; then pnpm --dir host run 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 pnpm --dir \"$dir\" run 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 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 \"types:gen\": \"bos types gen\",\n bos: \"bos\",\n };\n\n if (sections.api) {\n scripts[\"db:push\"] = \"pnpm --dir api exec 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\"] = \"pnpm --dir api exec drizzle-kit generate\";\n scripts[\"db:migrate\"] = \"pnpm --dir api exec drizzle-kit migrate\";\n scripts[\"test:api\"] = \"pnpm --dir api run test --if-present\";\n scripts[\"test:integration\"] = \"pnpm --dir api run test tests/integration/ --if-present\";\n }\n\n if (sections.host) {\n scripts[\"test:e2e\"] = \"pnpm --dir host run test --if-present\";\n }\n\n const testTargets: string[] = [];\n if (sections.api) testTargets.push(\"pnpm --dir api run test --if-present\");\n if (sections.host) testTargets.push(\"pnpm --dir host run test --if-present\");\n if (sections.ui) testTargets.push(\"pnpm --dir ui run test --if-present\");\n if (sections.plugins) {\n testTargets.push(\n 'for d in plugins/*; do [ -f \"$d/package.json\" ] && pnpm --dir \"$d\" run test --if-present; done',\n );\n }\n scripts.test =\n testTargets.length > 0\n ? testTargets.join(\" && \")\n : 'echo \"No workspace directories configured\"';\n\n // Scripts key off the child's own override selection (what it runs locally),\n // not off resolved-config secrets — a ui-only child gets none of these.\n if (sections.api || sections.host) {\n scripts[\"dev:postgres\"] = \"docker compose up -d --wait && pnpm 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 starter?: StarterLevel;\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 const applyStarter = (config: Record<string, unknown>): void => {\n if (opts.starter) {\n config.starter = opts.starter;\n } else if (opts.mode !== \"sync\") {\n delete config.starter;\n }\n };\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 jsonConfigPath = join(destination, \"bos.config.json\");\n const appConfigPath = join(destination, \"bos.app.ts\");\n const tsForm = !existsSync(jsonConfigPath) && existsSync(appConfigPath);\n\n if (tsForm) {\n const config = (await loadAppDescriptorConfig(appConfigPath)) 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 applyStarter(config);\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 writeFileSync(appConfigPath, serializeAppDescriptorSource(config as BosConfigInput));\n return;\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 applyStarter(config);\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 pkg.packageManager = PNPM_PACKAGE_MANAGER;\n delete pkg.module;\n delete pkg.peerDependencies;\n delete pkg.patchedDependencies;\n\n const childWorkspaces: string[] = [];\n if (has(\"host\")) childWorkspaces.push(\"host\");\n if (has(\"ui\")) childWorkspaces.push(\"ui\");\n if (has(\"api\")) childWorkspaces.push(\"api\");\n if (has(\"plugins\")) childWorkspaces.push(\"plugins/*\");\n const localCatalog =\n pkg.workspaces && typeof pkg.workspaces === \"object\"\n ? ((pkg.workspaces as { catalog?: Record<string, string> }).catalog ?? {})\n : {};\n delete pkg.workspaces;\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 \"prepare\",\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 const catalog: Record<string, string> = { ...localCatalog };\n\n // The copied root manifest is the parent's — a monorepo root whose\n // dependencies (workspace members, vendored links) do not exist in the\n // child. The child root carries exactly the framework packages.\n pkg.dependencies = {\n \"everything-dev\": \"catalog:\",\n \"every-plugin\": \"catalog:\",\n };\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 const rootCatalogEverythingDev = spec.rootCatalog[\"everything-dev\"];\n const rootCatalogEveryPlugin = spec.rootCatalog[\"every-plugin\"];\n if (rootCatalogEverythingDev) {\n catalog[\"everything-dev\"] = rootCatalogEverythingDev;\n }\n if (rootCatalogEveryPlugin) {\n catalog[\"every-plugin\"] = rootCatalogEveryPlugin;\n }\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 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 writeChildWorkspaceYaml(destination, { packages: childWorkspaces, catalog });\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 const publicDir = join(destination, \"ui\", \"public\");\n if (!existsSync(publicDir)) {\n mkdirSync(publicDir, { recursive: true });\n }\n\n const llmsTxtPath = join(publicDir, \"llms.txt\");\n if (!existsSync(llmsTxtPath)) {\n const title = opts.title ?? opts.account ?? \"app\";\n writeFileSync(llmsTxtPath, buildChildLlmsTxt(title));\n }\n\n const skillMdPath = join(publicDir, \"skill.md\");\n if (!existsSync(skillMdPath)) {\n const title = opts.title ?? opts.account ?? \"app\";\n const repository = opts.repository ?? \"\";\n writeFileSync(skillMdPath, buildChildSkillMd(title, repository));\n }\n\n for (const agentFilePath of [llmsTxtPath, skillMdPath]) {\n const content = readFileSync(agentFilePath, \"utf-8\");\n if (content.includes(WORKFLOW_SKILLS_MARKER)) continue;\n writeFileSync(agentFilePath, `${content.replace(/\\n*$/, \"\\n\")}${WORKFLOW_SKILLS_NOTE}`);\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 { RouterContractClient, RouterContract } from \"@orpc/contract\";\\ntype ClientFactory<C extends RouterContract> = (context?: Record<string, unknown>) => RouterContractClient<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 const authExportRel = toRelativeImportPath(\n join(destination, \".bos\", \"generated\", \"auth\", \"auth-export.d.ts\"),\n authTypesGenPath,\n );\n const contractRel = toRelativeImportPath(\n join(destination, \".bos\", \"generated\", \"auth\", \"contract.d.ts\"),\n authTypesGenPath,\n );\n writeFileSync(authTypesGenPath, buildAuthTypesGenContent(authExportRel, contractRel));\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(authExportStubPath, buildAuthExportStub());\n }\n const contractStubPath = join(authDir, \"contract.d.ts\");\n if (!existsSync(contractStubPath)) {\n writeFileSync(contractStubPath, buildAuthContractStub());\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 toRelativeImportPath(fromPath: string, toPath: string): string {\n const rel = relative(dirname(toPath), fromPath);\n return rel.startsWith(\".\") ? rel : `./${rel}`;\n}\n\nexport async function runPnpmInstall(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n },\n): Promise<void> {\n await runWithProgress(\n \"pnpm\",\n [\"install\", \"--ignore-scripts\"],\n destination,\n opts?.spinner,\n \"Installing dependencies\",\n );\n}\n\nexport async function runPnpmInstallForUpgrade(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n },\n): Promise<void> {\n await runWithProgress(\n \"pnpm\",\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 { runDockerComposeUp } from \"../infra/docker\";\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 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 starter?: StarterLevel;\n /** local parent source dir — resolves the catalog offline (tests, --source) */\n catalogSourceDir?: 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 ...(opts.starter ? { starter: opts.starter } : {}),\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 sourceDir: opts.catalogSourceDir,\n })\n ).catalog;\n\n const pkg: Record<string, unknown> = {\n name: \"monorepo\",\n private: true,\n type: \"module\",\n packageManager: PNPM_PACKAGE_MANAGER,\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 };\n writeFileSync(join(destination, \"package.json\"), `${JSON.stringify(pkg, null, 2)}\\n`);\n\n writeChildWorkspaceYaml(destination, { packages: workspacePackages, catalog });\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 starter?: StarterLevel;\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 if (!options.overrides.includes(\"api\")) {\n for (const match of allFiles) {\n if (isApiTemplatePath(match)) allFiles.delete(match);\n }\n }\n if (!options.overrides.includes(\"api\") && !options.overrides.includes(\"host\")) {\n for (const match of allFiles) {\n if (isComposeTemplatePath(match)) allFiles.delete(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 destPath = sourcePathToDestinationPath(filePath);\n // Only snapshot what the scaffold actually delivered — files pruned\n // after copy (e.g. unused ui sources) must not come back via bos sync.\n if (!existsSync(join(destination, destPath))) continue;\n const content = readFileSync(src);\n fileHashes[destPath] = computeHash(content);\n }\n\n await writeSnapshot(destination, {\n parentRef: `bos://${extendsAccount}/${extendsGateway}`,\n files: fileHashes,\n starter: options.starter,\n });\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(\"pnpm\", [\"--dir\", \"api\", \"exec\", \"drizzle-kit\", \"generate\"], cwd);\n }\n}\n\nconst COMMAND_TIMEOUTS: Record<string, number> = {\n pnpm: 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\npnpm install\npnpm 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**Deploy:**\n\n[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/everything-dev-template?referralCode=MuB_vg&utm_medium=integration&utm_source=template&utm_campaign=generic)\n\nThe Railway template deploys the everything.dev Docker image. Set these variables:\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| \\`BOS_ACCOUNT\\` | The NEAR account that owns this app's published configuration on-chain | \\`myapp.near\\` |\n| \\`BOS_GATEWAY\\` | The core domain where this app is served | \\`myapp.com\\` |\n| \\`BETTER_AUTH_SECRET\\` | Secret for session encryption — generate with \\`openssl rand -base64 32\\` | (random) |\n\n**Self-deployed production:**\n\nYou don't need to wait for a PR to merge and run through CI/CD. Publish your own config on-chain under your own NEAR account and run your own host instance, inheriting the base platform via \\`extends\\`.\n\n1. **Install near-cli-rs** (the \\`bos\\` CLI shells out to it for \\`bos publish\\` and \\`bos key generate\\`):\n \\`\\`\\`bash\n curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/near-cli-rs/releases/download/v0.23.5/near-cli-rs-installer.sh | sh\n \\`\\`\\`\n2. **Create a NEAR account** (testnet or mainnet). Named accounts can own subaccounts; implicit hex accounts cannot:\n \\`\\`\\`bash\n near account create-account fund-my-account <your-account>.testnet use-faucet network-config testnet\n \\`\\`\\`\n3. **Generate a publish key** — a function-call key scoped to the FastKV registry contract:\n \\`\\`\\`bash\n bos key generate\n # Output: NEAR_PRIVATE_KEY=ed25519:...\n \\`\\`\\`\n Add the key to your account via near-cli-rs, then set \\`NEAR_PRIVATE_KEY\\` in \\`.env\\` or CI secrets.\n4. **Update \\`bos.app.ts\\`** — set \\`account\\` to your NEAR account, add \\`extends\\` to inherit the base platform, keep \\`domain\\` as the gateway:\n \\`\\`\\`ts\n { \"extends\": \"bos://<parent-account>/<parent-gateway>\", \"account\": \"<your-account>.near\", \"domain\": \"<parent-gateway>\" }\n \\`\\`\\`\n 5. **Publish and deploy:**\n \\`\\`\\`bash\n bos deploy # preflight → build → upload bundles → publish config to FastKV at bos://<your-account>/<gateway> → image/Railway when configured\n \\`\\`\\`\n6. **Deploy to Railway** (one-click template or \\`railway up\\`), set \\`BOS_ACCOUNT\\`, \\`BOS_GATEWAY\\` (same gateway as parent), and \\`BETTER_AUTH_SECRET\\`. Your Railway host fetches your config from FastKV and serves live.\n\n\\`BOS_GATEWAY\\` is the **FastKV lookup key**, not the DNS domain your Railway instance serves on. By keeping the same gateway while using your own \\`BOS_ACCOUNT\\`, your config lives at a separate FastKV path that \\`extends\\` the base runtime — you inherit the full platform and override only what you change.\n\n**Tenant creation** (for the admin wizard) is DAO-owned: connect a sputnik-dao account via the Trezu wallet in the admin wizard; the wizard publishes the tenant runtime config under \\`bos://<dao-account>/<gateway>\\`. No server-side subaccount keys are needed.`);\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. \\`pnpm install\\`\n2. \\`pnpm run dev\\`\n3. \\`bos dev\\` creates \\`.env\\` on first run and starts local Postgres via docker compose when it is down`);\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 \\`pnpm 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.app.ts\\`. These files are gitignored and auto-regenerated on \\`pnpm install\\`, \\`typecheck\\`, \\`bos dev\\`, \\`bos build\\`, and bos plugin management commands.\n\nIf you hand-edit \\`bos.app.ts\\`, 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(\"pnpm run test # Run all tests\");\n testCommands.push(\"pnpm run typecheck # Type check all packages\");\n testCommands.push(\"pnpm run 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(`## Workflow Skills\n\nThis repo ships agent workflow skills in \\`.agents/skills/\\` — the ordered development flow (grill → spec → tickets → implement/tdd → code-review). Start \\`/everything-dev-app\\` to orient and pick the right next step; \\`/ask-matt\\` is the router if unsure.\n\n- \\`/grill-with-docs\\` — sharpen an idea by interview, leaving a paper trail in \\`GLOSSARY.md\\` and ADRs\n- \\`/to-spec\\` / \\`/to-tickets\\` — turn a plan into a spec, then tracer-bullet tickets under \\`.scratch/<feature>/issues/\\`\n- \\`/implement\\` + \\`/tdd\\` — build a ticket test-first at pre-agreed seams\n- \\`/code-review\\` — two-axis review (Standards + Spec) of the diff since a fixed point\n- \\`/diagnosing-bugs\\` — diagnosis loop for hard bugs and performance regressions\n\nRun \\`/setup-matt-pocock-skills\\` once before first use. Tracker and triage conventions live in \\`docs/agents/\\`.`);\n\n parts.push(`## Agent Communication Surface\n\nThe host exposes several surfaces for programmatic agent access:\n\n| Surface | Endpoint | Auth | Use |\n|---------|----------|------|-----|\n| MCP | \\`POST /api/mcp\\` | \\`x-api-key\\` header or session cookie | MCP clients — auto-generated tools from OpenAPI spec, stateless Streamable HTTP transport |\n| REST/OpenAPI | \\`GET/POST/... /api/{path}\\` | \\`x-api-key\\` header or session cookie | Standard REST; Scalar docs at \\`GET /api\\`, spec at \\`GET /api/spec.json\\` |\n| oRPC RPC | \\`POST /api/rpc/{procedure}\\` | \\`x-api-key\\` header or session cookie | Typed JSON-RPC for all API procedures |\n| Plugin RPC | \\`POST /api/rpc/{plugin}/{procedure}\\` | \\`x-api-key\\` header or session cookie | Per-plugin RPC (e.g. \\`/api/rpc/auth/getSession\\`) |\n| MCP discovery | \\`GET /.well-known/mcp.json\\` | None | JSON descriptor with server name, endpoint, and auth scheme |\n\n### Authentication for agents\n\n1. Sign in with your NEAR wallet (SIWN) at the website.\n2. Navigate to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a new key — the full secret (\\`edk_...\\`) is shown once. Copy it immediately.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\n### Architecture note: remotes are code bundles\n\nRemotes in \\`bos.app.ts\\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. The UI, API, auth, and plugins all run in the same host process. There is no remote server to call; everything is loaded in-process through Module Federation and \\`every-plugin\\`.`);\n\n parts.push(`## Troubleshooting\n\n**Process won't start:**\n\\`\\`\\`bash\nbos kill # Kill all tracked processes\npnpm install # Ensure dependencies\npnpm run dev # Restart\n\\`\\`\\`\n\n**Module Federation errors:**\n- Check \\`bos.app.ts\\` URLs are accessible\n- Verify shared dependency versions match in package.json\n- Clear browser cache\n\n**Database issues:**\n\\`\\`\\`bash\npnpm run db:push # Push schema changes\npnpm run db:studio # Open Drizzle Studio\n\\`\\`\\`\n\n## Environment\n\n**Required files:**\n- \\`.env\\` — Secrets (see \\`.env.example\\`)\n- \\`bos.app.ts\\` — 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\nconst WORKFLOW_SKILLS_MARKER = \"everything-dev-app\";\nconst WORKFLOW_SKILLS_NOTE = `\n\n## Workflow skills\n\nThis repo ships agent workflow skills in \\`.agents/skills/\\` — the ordered development flow (grill → spec → tickets → implement/tdd → code-review). Start with \\`/everything-dev-app\\` to orient and pick the right next step. See \\`AGENTS.md\\` → Workflow Skills.\n`;\n\nexport function buildChildLlmsTxt(title: string): string {\n return `# ${title}\n\n> Application running on the everything.dev runtime.\n\n## Skills\n\n- [Skill](/skill.md): Agent-ready prompt for talking to, running, editing, and publishing this runtime.\n- Workflow skills (in the repo): \\`.agents/skills/\\` — start with \\`everything-dev-app\\` for the ordered development flow.\n\n## API\n\n- [OpenAPI docs](/api): Interactive API reference (Scalar)\n- [OpenAPI spec](/api/spec.json): Machine-readable OpenAPI JSON\n- [oRPC RPC](/api/rpc): Typed JSON-RPC endpoint for all API procedures\n- [Plugin RPC](/api/rpc/auth): Auth plugin RPC (session, NEAR SIWN, relay, API keys, organizations)\n\n## MCP\n\n- [MCP server](/api/mcp): Model Context Protocol server (Streamable HTTP, stateless). Auto-generates tools from the API's OpenAPI spec.\n- [MCP discovery](/.well-known/mcp.json): JSON descriptor with server name, endpoint URL, and auth scheme.\n\n## Auth\n\nAuthenticate to the API using an API key:\n\n1. Sign in with your NEAR wallet (SIWN) at the website.\n2. Go to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a key — the full secret (\\`edk_...\\`) is shown once.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\nThe \\`x-api-key\\` header works for \\`/api/*\\` (REST), \\`/api/rpc/*\\` (oRPC), and \\`/api/mcp\\` (MCP).\n\n## Source\n\n- [Repository](https://github.com/NEARBuilders/everything-dev): Clone and read \\`AGENTS.md\\` for full development instructions, TanStack Intent skills, and workflow guidance.\n`;\n}\n\nexport function buildChildSkillMd(title: string, repository: string): string {\n const repoLink = repository\n ? `- [Repository](${repository}): Clone and read \\`AGENTS.md\\` for full development instructions.`\n : `- Clone the repository and read \\`AGENTS.md\\` for full development instructions.`;\n\n return `# ${title} skill\n\nUse this when you want an agent to run, edit, and publish **${title}** — an everything.dev app composed at runtime from \\`bos.app.ts\\`.\n\nThere are two ways to work with this app:\n\n1. **Talk to the app** — use the API via MCP or REST to read/write data without cloning anything.\n2. **Clone and modify** — clone the repository, run locally, edit code, and publish.\n\n## Mode 1: Talk to the app\n\n### MCP endpoint\n\n\\`\\`\\`\nPOST /api/mcp\n\\`\\`\\`\n\nTransport: Streamable HTTP (stateless). Connect your MCP client to \\`{origin}/api/mcp\\` to discover all available tools automatically.\n\n### Authentication\n\nUse an **API key**:\n\n1. Sign in with your NEAR wallet at the website (SIWN).\n2. Navigate to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a key — the full secret (\\`edk_...\\`) is shown once.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\n### REST / OpenAPI\n\n- **API docs**: \\`GET /api\\`\n- **OpenAPI spec**: \\`GET /api/spec.json\\`\n- **oRPC RPC**: \\`POST /api/rpc/{procedure}\\`\n- **MCP discovery**: \\`GET /.well-known/mcp.json\\`\n\n## Mode 2: Clone and modify\n\n### TanStack Intent\n\n- Registry entry: \\`https://tanstack.com/intent/registry/everything-dev\\`\n- Load with TanStack Intent: \\`npx @tanstack/intent@latest load everything-dev\\`\n\n### Read AGENTS.md first\n\nAfter cloning, read **\\`AGENTS.md\\`** at the repo root. It contains operational guidance, TanStack Intent skills, and workflow instructions.\n\n### Workflow skills\n\nThe repo ships agent workflow skills in \\`.agents/skills/\\` — start with \\`everything-dev-app\\` for the ordered development flow (grill → spec → tickets → implement/tdd → code-review).\n\n### Architecture note\n\nRemotes in \\`bos.app.ts\\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. Everything runs in the same host process.\n\n### Run locally\n\n\\`\\`\\`bash\npnpm install\nbos dev\n\\`\\`\\`\n\n### Publish\n\n\\`\\`\\`bash\nbos deploy\n\\`\\`\\`\n\n## Source\n\n${repoLink}\n`;\n}\n"],"mappings":"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"}
package/dist/cli/init.mjs CHANGED
@@ -1130,8 +1130,8 @@ You don't need to wait for a PR to merge and run through CI/CD. Publish your own
1130
1130
  # Output: NEAR_PRIVATE_KEY=ed25519:...
1131
1131
  \`\`\`
1132
1132
  Add the key to your account via near-cli-rs, then set \`NEAR_PRIVATE_KEY\` in \`.env\` or CI secrets.
1133
- 4. **Update \`bos.config.json\`** — set \`account\` to your NEAR account, add \`extends\` to inherit the base platform, keep \`domain\` as the gateway:
1134
- \`\`\`json
1133
+ 4. **Update \`bos.app.ts\`** — set \`account\` to your NEAR account, add \`extends\` to inherit the base platform, keep \`domain\` as the gateway:
1134
+ \`\`\`ts
1135
1135
  { "extends": "bos://<parent-account>/<parent-gateway>", "account": "<your-account>.near", "domain": "<parent-gateway>" }
1136
1136
  \`\`\`
1137
1137
  5. **Publish and deploy:**
@@ -1201,9 +1201,9 @@ The API plugin receives typed client factories for all other plugins via \`creat
1201
1201
 
1202
1202
  ### Generated Types
1203
1203
 
1204
- \`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 \`pnpm install\`, \`typecheck\`, \`bos dev\`, \`bos build\`, and bos plugin management commands.
1204
+ \`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.app.ts\`. These files are gitignored and auto-regenerated on \`pnpm install\`, \`typecheck\`, \`bos dev\`, \`bos build\`, and bos plugin management commands.
1205
1205
 
1206
- If you hand-edit \`bos.config.json\`, run \`bos types gen\` or restart \`bos dev\` to regenerate.`);
1206
+ If you hand-edit \`bos.app.ts\`, run \`bos types gen\` or restart \`bos dev\` to regenerate.`);
1207
1207
  const testCommands = [];
1208
1208
  if (has("api") || has("host") || has("ui")) {
1209
1209
  testCommands.push("pnpm run test # Run all tests");
@@ -1272,7 +1272,7 @@ The host exposes several surfaces for programmatic agent access:
1272
1272
 
1273
1273
  ### Architecture note: remotes are code bundles
1274
1274
 
1275
- Remotes in \`bos.config.json\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. The UI, API, auth, and plugins all run in the same host process. There is no remote server to call; everything is loaded in-process through Module Federation and \`every-plugin\`.`);
1275
+ Remotes in \`bos.app.ts\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. The UI, API, auth, and plugins all run in the same host process. There is no remote server to call; everything is loaded in-process through Module Federation and \`every-plugin\`.`);
1276
1276
  parts.push(`## Troubleshooting
1277
1277
 
1278
1278
  **Process won't start:**
@@ -1283,7 +1283,7 @@ pnpm run dev # Restart
1283
1283
  \`\`\`
1284
1284
 
1285
1285
  **Module Federation errors:**
1286
- - Check \`bos.config.json\` URLs are accessible
1286
+ - Check \`bos.app.ts\` URLs are accessible
1287
1287
  - Verify shared dependency versions match in package.json
1288
1288
  - Clear browser cache
1289
1289
 
@@ -1297,7 +1297,7 @@ pnpm run db:studio # Open Drizzle Studio
1297
1297
 
1298
1298
  **Required files:**
1299
1299
  - \`.env\` — Secrets (see \`.env.example\`)
1300
- - \`bos.config.json\` — Runtime configuration (committed)`);
1300
+ - \`bos.app.ts\` — Runtime configuration (committed)`);
1301
1301
  return `${parts.join("\n\n")}\n`;
1302
1302
  }
1303
1303
  function buildChildAgentsMd(skillsBlock, opts) {
@@ -1369,7 +1369,7 @@ The \`x-api-key\` header works for \`/api/*\` (REST), \`/api/rpc/*\` (oRPC), and
1369
1369
  function buildChildSkillMd(title, repository) {
1370
1370
  return `# ${title} skill
1371
1371
 
1372
- Use this when you want an agent to run, edit, and publish **${title}** — an everything.dev app composed at runtime from \`bos.config.json\`.
1372
+ Use this when you want an agent to run, edit, and publish **${title}** — an everything.dev app composed at runtime from \`bos.app.ts\`.
1373
1373
 
1374
1374
  There are two ways to work with this app:
1375
1375
 
@@ -1419,7 +1419,7 @@ The repo ships agent workflow skills in \`.agents/skills/\` — start with \`eve
1419
1419
 
1420
1420
  ### Architecture note
1421
1421
 
1422
- Remotes in \`bos.config.json\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. Everything runs in the same host process.
1422
+ Remotes in \`bos.app.ts\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. Everything runs in the same host process.
1423
1423
 
1424
1424
  ### Run locally
1425
1425
 
@@ -1 +1 @@
1
- {"version":3,"file":"init.mjs","names":["parseYaml","stringifyYaml","readWorkspaceCatalogFromDisk","tarExtract","computeHash"],"sources":["../../src/cli/init.ts"],"sourcesContent":["import {\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { execa } from \"execa\";\nimport { glob } from \"glob\";\nimport { extract as tarExtract } from \"tar\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport {\n buildAuthContractStub,\n buildAuthExportStub,\n buildAuthTypesGenContent,\n} from \"../auth-types-gen\";\nimport { findConfigPath, isAppDescriptorPath, loadAppDescriptorConfig } from \"../config\";\nimport type { OverrideSection } from \"../contract\";\nimport { serializeAppDescriptorSource } from \"../descriptor/serialize\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport { fetchResponse } from \"../http-client\";\nimport {\n loadManifestNormalizationSpec,\n normalizePackageManifestsInTree,\n} from \"../internal/manifest-normalizer\";\nimport { walkExtendsChain } from \"../resolution/session\";\nimport type { BosConfig, BosConfigInput, ParentStarterConfig, StarterLevel } from \"../types\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { computeSnapshotHash as computeHash } from \"../utils/snapshot-hash\";\nimport { readWorkspaceCatalog as readWorkspaceCatalogFromDisk } from \"../workspace-catalog\";\nimport { writeSnapshot } from \"./snapshot\";\nimport { getExtendsRef, parseBosRef } from \"./utils/helpers\";\n\nexport const PNPM_PACKAGE_MANAGER = \"pnpm@12.10.1\";\n\n/**\n * Transitive-singleton overrides every workspace in the fleet must agree on\n * (ticket 05's deviation log: isolated resolution splits better-auth\n * peer-context identities across the plugin fleet). Values derive from the\n * catalog so sync keeps them current; keys absent from the catalog are left\n * unpinned.\n */\nconst CHILD_OVERRIDE_KEYS = [\n \"@better-fetch/fetch\",\n \"@rspack/core\",\n \"better-auth\",\n \"react\",\n \"react-dom\",\n] as const;\n\n/**\n * The child's workspace manifest: pnpm-workspace.yaml is canonical (v2, ADR\n * 0026) — packages globs synthesized from the child's override sections, the\n * catalog merged over any local entry, plus the fleet-wide linker posture and\n * singleton overrides. Re-running (sync/upgrade) merges instead of clobbering.\n */\nexport function writeChildWorkspaceYaml(\n projectDir: string,\n next: { packages: string[]; catalog: Record<string, string> },\n): boolean {\n const yamlPath = join(projectDir, \"pnpm-workspace.yaml\");\n let doc: {\n packages?: string[];\n catalog?: Record<string, string>;\n nodeLinker?: string;\n linkWorkspacePackages?: boolean;\n ignoreScripts?: boolean;\n overrides?: Record<string, string>;\n } = {};\n if (existsSync(yamlPath)) {\n try {\n const parsed = parseYaml(readFileSync(yamlPath, \"utf-8\"));\n if (parsed && typeof parsed === \"object\") doc = parsed;\n } catch {\n doc = {};\n }\n }\n\n let changed = !existsSync(yamlPath);\n const packages = [...new Set([...(doc.packages ?? []), ...next.packages])].sort();\n if (JSON.stringify(packages) !== JSON.stringify(doc.packages)) {\n doc.packages = packages;\n changed = true;\n }\n\n const catalog: Record<string, string> = { ...(doc.catalog ?? {}) };\n for (const [name, version] of Object.entries(next.catalog)) {\n if (catalog[name] !== version) {\n catalog[name] = version;\n changed = true;\n }\n }\n if (\n Object.keys(catalog).length > 0 &&\n Object.keys(catalog).length !== Object.keys(doc.catalog ?? {}).length\n ) {\n changed = true;\n }\n if (changed || !doc.catalog) {\n doc.catalog = Object.fromEntries(\n Object.entries(catalog).sort(([a], [b]) => a.localeCompare(b)),\n );\n }\n\n if (doc.nodeLinker !== \"hoisted\") {\n doc.nodeLinker = \"hoisted\";\n changed = true;\n }\n if (doc.linkWorkspacePackages !== true) {\n doc.linkWorkspacePackages = true;\n changed = true;\n }\n if (doc.ignoreScripts !== true) {\n doc.ignoreScripts = true;\n changed = true;\n }\n\n const overrides: Record<string, string> = { ...(doc.overrides ?? {}) };\n for (const key of CHILD_OVERRIDE_KEYS) {\n if (catalog[key] && overrides[key] !== catalog[key]) {\n overrides[key] = catalog[key];\n changed = true;\n }\n }\n if (Object.keys(overrides).length > 0) {\n doc.overrides = Object.fromEntries(\n Object.entries(overrides).sort(([a], [b]) => a.localeCompare(b)),\n );\n }\n\n if (changed) {\n writeFileSync(yamlPath, `${stringifyYaml(doc, { lineWidth: 0 }).trimEnd()}\\n`);\n return true;\n }\n return false;\n}\n\n/**\n * Init must never reuse a lockfile left in the target (copied from a parent\n * checkout or left by a previous run) — stale framework resolutions would\n * survive the fresh install. Bun's bun.lock is deleted on sight (ADR 0026's\n * silent-revert footgun); the child's own pnpm-lock.yaml is re-resolved.\n */\nexport function removeStrayLockfiles(projectDir: string): void {\n for (const lockfile of [\"pnpm-lock.yaml\", \"bun.lock\"]) {\n const lockfilePath = join(projectDir, lockfile);\n if (existsSync(lockfilePath)) {\n rmSync(lockfilePath, { force: true });\n }\n }\n}\n\nexport const INIT_ROOT_PATTERNS = [\n \"bos.config.json\",\n \"package.json\",\n \".env.example\",\n \".gitignore\",\n \"biome.json\",\n \"railway.json\",\n \"railway.toml\",\n \"AGENTS.md\",\n \".agents/skills/**\",\n \"skills-lock.json\",\n \"docs/agents/**\",\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\nexport function readWorkspaceCatalog(sourceDir: string): Record<string, string> {\n return readWorkspaceCatalogFromDisk(sourceDir);\n}\n\nexport async function resolveCatalogChainSource(opts: {\n extendsAccount: string;\n extendsGateway: string;\n sourceDir?: string;\n}): Promise<CatalogChainSource> {\n const entry = opts.sourceDir\n ? (findConfigPath(resolve(opts.sourceDir)) ?? join(resolve(opts.sourceDir), \"bos.config.json\"))\n : `bos://${opts.extendsAccount}/${opts.extendsGateway}`;\n const catalogs: Record<string, string>[] = [];\n const cleanups: Array<() => Promise<void>> = [];\n const resolvedRefs: string[] = [];\n let repository: string | undefined;\n\n try {\n await walkExtendsChain(entry, {\n env: \"production\",\n collectCatalogs: true,\n registerCleanup: (fn) => cleanups.push(fn),\n visit: async (link) => {\n resolvedRefs.unshift(\n link.ref.startsWith(\"bos://\") ? link.ref : join(link.baseDir, basename(link.ref)),\n );\n catalogs.push(readWorkspaceCatalog(link.sourceDir ?? link.baseDir));\n const repositoryValue = (link.config as Record<string, unknown>).repository;\n if (typeof repositoryValue === \"string\" && repository === undefined) {\n repository = repositoryValue;\n }\n },\n });\n } finally {\n for (const cleanup of [...cleanups].reverse()) {\n await cleanup();\n }\n }\n\n return {\n catalog: Object.assign({}, ...catalogs),\n repository,\n extendsChain: opts.sourceDir\n ? [`bos://${opts.extendsAccount}/${opts.extendsGateway}`, ...resolvedRefs.slice(1)]\n : resolvedRefs,\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 const configPath = findConfigPath(sourceDir);\n if (!configPath) {\n throw new Error(\n `No authored config (bos.app.ts or bos.config.json) found in source directory: ${sourceDir}`,\n );\n }\n const parentConfig = isAppDescriptorPath(configPath)\n ? ((await loadAppDescriptorConfig(configPath)) as BosConfig)\n : (JSON.parse(readFileSync(configPath, \"utf-8\")) 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_TEMPLATE_PATTERN);\n if (has(\"api\") || has(\"host\")) patterns.push(COMPOSE_TEMPLATE_PATTERN);\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\n/** api-override children get the slim generic shell, never the parent's domain API. */\nconst API_TEMPLATE_PATTERN = \".github/templates/api/**\";\n\n/** Child-sized compose (api + api-test databases) for local compute overrides. */\nconst COMPOSE_TEMPLATE_PATTERN = \".github/templates/docker-compose.yml\";\n\nexport function isApiTemplatePath(filePath: string): boolean {\n return filePath.startsWith(\".github/templates/api/\");\n}\n\nexport function isComposeTemplatePath(filePath: string): boolean {\n return filePath === COMPOSE_TEMPLATE_PATTERN;\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\nconst STARTER_PRODUCT_EXCLUSIONS = [\n \"_public/explore.tsx\",\n \"_public/stake.tsx\",\n \"_public/n/**\",\n \"_public/$accountId.tsx\",\n \"_public/$accountId/**\",\n \"_public/activity/**\",\n \"_public/-stake-*\",\n \"_authenticated/_dashboard/dashboard/node/**\",\n \"_authenticated/_dashboard/nodes/**\",\n \"_authenticated/_dashboard/tenant.*\",\n \"_authenticated/_dashboard/discover.tsx\",\n \"_authenticated/_dashboard/apply.tsx\",\n \"_authenticated/_dashboard/prototype-staking-poc.tsx\",\n \"_authenticated/onboarding/**\",\n \"_admin/_dashboard/_dashboard/admin/nodes/**\",\n \"_admin/_dashboard/_dashboard/admin/proposals/**\",\n \"_admin/_dashboard/_dashboard/admin/tenants/**\",\n \"_admin/_dashboard/_dashboard/admin/relayer.tsx\",\n \"_admin/_dashboard/_dashboard/admin/organizations.tsx\",\n] as const;\n\nconst STARTER_SIMPLE_EXCLUSIONS = [\n \"_authenticated.tsx\",\n \"_authenticated/**\",\n \"_admin.tsx\",\n \"_admin/**\",\n] as const;\n\n/**\n * Route-file globs (relative to the child's `ui/src/routes/`) that a starter\n * of the given level must not receive. Parent `starter` config can add\n * exclusions (`exclude`, `levels[level].exclude`) or reclaim routes for a\n * level (`levels[level].include`). Entries are prefixed with\n * `ui/src/routes/` so they compose with `copyFilteredFiles`'s ignore list.\n */\nexport function buildStarterRouteExclusions(\n level: StarterLevel,\n parentConfig: { starter?: ParentStarterConfig } | null | undefined,\n): string[] {\n const excluded = new Set<string>([...STARTER_PRODUCT_EXCLUSIONS]);\n if (level === \"simple\") {\n for (const entry of STARTER_SIMPLE_EXCLUSIONS) excluded.add(entry);\n }\n\n const starter = parentConfig?.starter;\n if (starter) {\n for (const entry of starter.exclude ?? []) excluded.add(entry);\n const levelConfig = starter.levels?.[level];\n if (levelConfig) {\n for (const entry of levelConfig.exclude ?? []) excluded.add(entry);\n for (const entry of levelConfig.include ?? []) excluded.delete(entry);\n }\n }\n\n return [...excluded].map((entry) => `ui/src/routes/${entry}`);\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 if (isApiTemplatePath(filePath)) {\n return filePath.replace(/^\\.github\\/templates\\/api\\//, \"api/\");\n }\n if (isComposeTemplatePath(filePath)) {\n return \"docker-compose.yml\";\n }\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 await tarExtract({ 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?.[1] && httpsMatch[2]) {\n return { owner: httpsMatch[1], repo: httpsMatch[2] };\n }\n\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch?.[1] && sshMatch[2]) {\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 if (!options.overrides.includes(\"api\")) {\n for (const match of allFiles) {\n if (isApiTemplatePath(match)) allFiles.delete(match);\n }\n }\n if (!options.overrides.includes(\"api\") && !options.overrides.includes(\"host\")) {\n for (const match of allFiles) {\n if (isComposeTemplatePath(match)) allFiles.delete(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 delete entry.pin;\n}\n\n/**\n * Scaffold the authored config as the TS form: the personalized\n * bos.config.json materializes into an authored `bos.app.ts` descriptor and\n * the JSON copy is removed — publish/sync still canonicalize to JSON for\n * FastKV from the resolved config. Returns the config that was converted, so\n * callers that need it (before the child has node_modules to import the\n * descriptor) can pass it onward.\n */\nexport async function convertChildConfigToAppForm(\n destination: string,\n): Promise<BosConfigInput | null> {\n const configPath = join(destination, \"bos.config.json\");\n if (!existsSync(configPath)) return null;\n const config = JSON.parse(readFileSync(configPath, \"utf-8\")) as BosConfigInput;\n writeFileSync(join(destination, \"bos.app.ts\"), serializeAppDescriptorSource(config));\n rmSync(configPath);\n return config;\n}\n\n/**\n * Scaffold the root dev-overlay starter (`bos.dev.ts`). Idempotent — never\n * overwrites an existing overlay. Dev overlays are merged child-wins over\n * the resolved config in development and are never published.\n */\nexport function writeDevOverlayTemplate(\n destination: string,\n opts: { extendsRef?: string } = {},\n): void {\n const overlayPath = join(destination, \"bos.dev.ts\");\n if (existsSync(overlayPath)) return;\n const extendsLine = opts.extendsRef ? `\\n// Inherited base: ${opts.extendsRef}\\n` : \"\";\n writeFileSync(\n overlayPath,\n `import type { AppDescriptor } from \"everything-dev/descriptor\";\n${extendsLine}\n/**\n * Development-only overlay for bos.app.ts — merged child-wins over the\n * resolved config when the environment is development. Never published.\n * Example: pin the auth attachment to a running dev server instead of\n * letting the dev harness spawn it.\n */\nexport default {\n // auth: { development: \"http://localhost:3006\" },\n} satisfies Partial<AppDescriptor>;\n`,\n );\n}\n\nfunction buildRootTypecheckScript(sections: {\n ui: boolean;\n api: boolean;\n host: boolean;\n plugins: boolean;\n}): string {\n const commands = [\"pnpm run types:gen\"];\n\n if (sections.ui) {\n commands.push(\"if [ -d ui ]; then pnpm --dir ui run typecheck; fi\");\n }\n if (sections.api) {\n commands.push(\"if [ -d api ]; then pnpm --dir api run typecheck; fi\");\n }\n if (sections.host) {\n commands.push(\"if [ -d host ]; then pnpm --dir host run 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 pnpm --dir \"$dir\" run 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 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 \"types:gen\": \"bos types gen\",\n bos: \"bos\",\n };\n\n if (sections.api) {\n scripts[\"db:push\"] = \"pnpm --dir api exec 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\"] = \"pnpm --dir api exec drizzle-kit generate\";\n scripts[\"db:migrate\"] = \"pnpm --dir api exec drizzle-kit migrate\";\n scripts[\"test:api\"] = \"pnpm --dir api run test --if-present\";\n scripts[\"test:integration\"] = \"pnpm --dir api run test tests/integration/ --if-present\";\n }\n\n if (sections.host) {\n scripts[\"test:e2e\"] = \"pnpm --dir host run test --if-present\";\n }\n\n const testTargets: string[] = [];\n if (sections.api) testTargets.push(\"pnpm --dir api run test --if-present\");\n if (sections.host) testTargets.push(\"pnpm --dir host run test --if-present\");\n if (sections.ui) testTargets.push(\"pnpm --dir ui run test --if-present\");\n if (sections.plugins) {\n testTargets.push(\n 'for d in plugins/*; do [ -f \"$d/package.json\" ] && pnpm --dir \"$d\" run test --if-present; done',\n );\n }\n scripts.test =\n testTargets.length > 0\n ? testTargets.join(\" && \")\n : 'echo \"No workspace directories configured\"';\n\n // Scripts key off the child's own override selection (what it runs locally),\n // not off resolved-config secrets — a ui-only child gets none of these.\n if (sections.api || sections.host) {\n scripts[\"dev:postgres\"] = \"docker compose up -d --wait && pnpm 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 starter?: StarterLevel;\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 const applyStarter = (config: Record<string, unknown>): void => {\n if (opts.starter) {\n config.starter = opts.starter;\n } else if (opts.mode !== \"sync\") {\n delete config.starter;\n }\n };\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 jsonConfigPath = join(destination, \"bos.config.json\");\n const appConfigPath = join(destination, \"bos.app.ts\");\n const tsForm = !existsSync(jsonConfigPath) && existsSync(appConfigPath);\n\n if (tsForm) {\n const config = (await loadAppDescriptorConfig(appConfigPath)) 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 applyStarter(config);\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 writeFileSync(appConfigPath, serializeAppDescriptorSource(config as BosConfigInput));\n return;\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 applyStarter(config);\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 pkg.packageManager = PNPM_PACKAGE_MANAGER;\n delete pkg.module;\n delete pkg.peerDependencies;\n delete pkg.patchedDependencies;\n\n const childWorkspaces: string[] = [];\n if (has(\"host\")) childWorkspaces.push(\"host\");\n if (has(\"ui\")) childWorkspaces.push(\"ui\");\n if (has(\"api\")) childWorkspaces.push(\"api\");\n if (has(\"plugins\")) childWorkspaces.push(\"plugins/*\");\n const localCatalog =\n pkg.workspaces && typeof pkg.workspaces === \"object\"\n ? ((pkg.workspaces as { catalog?: Record<string, string> }).catalog ?? {})\n : {};\n delete pkg.workspaces;\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 \"prepare\",\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 const catalog: Record<string, string> = { ...localCatalog };\n\n // The copied root manifest is the parent's — a monorepo root whose\n // dependencies (workspace members, vendored links) do not exist in the\n // child. The child root carries exactly the framework packages.\n pkg.dependencies = {\n \"everything-dev\": \"catalog:\",\n \"every-plugin\": \"catalog:\",\n };\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 const rootCatalogEverythingDev = spec.rootCatalog[\"everything-dev\"];\n const rootCatalogEveryPlugin = spec.rootCatalog[\"every-plugin\"];\n if (rootCatalogEverythingDev) {\n catalog[\"everything-dev\"] = rootCatalogEverythingDev;\n }\n if (rootCatalogEveryPlugin) {\n catalog[\"every-plugin\"] = rootCatalogEveryPlugin;\n }\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 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 writeChildWorkspaceYaml(destination, { packages: childWorkspaces, catalog });\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 const publicDir = join(destination, \"ui\", \"public\");\n if (!existsSync(publicDir)) {\n mkdirSync(publicDir, { recursive: true });\n }\n\n const llmsTxtPath = join(publicDir, \"llms.txt\");\n if (!existsSync(llmsTxtPath)) {\n const title = opts.title ?? opts.account ?? \"app\";\n writeFileSync(llmsTxtPath, buildChildLlmsTxt(title));\n }\n\n const skillMdPath = join(publicDir, \"skill.md\");\n if (!existsSync(skillMdPath)) {\n const title = opts.title ?? opts.account ?? \"app\";\n const repository = opts.repository ?? \"\";\n writeFileSync(skillMdPath, buildChildSkillMd(title, repository));\n }\n\n for (const agentFilePath of [llmsTxtPath, skillMdPath]) {\n const content = readFileSync(agentFilePath, \"utf-8\");\n if (content.includes(WORKFLOW_SKILLS_MARKER)) continue;\n writeFileSync(agentFilePath, `${content.replace(/\\n*$/, \"\\n\")}${WORKFLOW_SKILLS_NOTE}`);\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 { RouterContractClient, RouterContract } from \"@orpc/contract\";\\ntype ClientFactory<C extends RouterContract> = (context?: Record<string, unknown>) => RouterContractClient<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 const authExportRel = toRelativeImportPath(\n join(destination, \".bos\", \"generated\", \"auth\", \"auth-export.d.ts\"),\n authTypesGenPath,\n );\n const contractRel = toRelativeImportPath(\n join(destination, \".bos\", \"generated\", \"auth\", \"contract.d.ts\"),\n authTypesGenPath,\n );\n writeFileSync(authTypesGenPath, buildAuthTypesGenContent(authExportRel, contractRel));\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(authExportStubPath, buildAuthExportStub());\n }\n const contractStubPath = join(authDir, \"contract.d.ts\");\n if (!existsSync(contractStubPath)) {\n writeFileSync(contractStubPath, buildAuthContractStub());\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 toRelativeImportPath(fromPath: string, toPath: string): string {\n const rel = relative(dirname(toPath), fromPath);\n return rel.startsWith(\".\") ? rel : `./${rel}`;\n}\n\nexport async function runPnpmInstall(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n },\n): Promise<void> {\n await runWithProgress(\n \"pnpm\",\n [\"install\", \"--ignore-scripts\"],\n destination,\n opts?.spinner,\n \"Installing dependencies\",\n );\n}\n\nexport async function runPnpmInstallForUpgrade(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n },\n): Promise<void> {\n await runWithProgress(\n \"pnpm\",\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 { runDockerComposeUp } from \"../infra/docker\";\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 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 starter?: StarterLevel;\n /** local parent source dir — resolves the catalog offline (tests, --source) */\n catalogSourceDir?: 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 ...(opts.starter ? { starter: opts.starter } : {}),\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 sourceDir: opts.catalogSourceDir,\n })\n ).catalog;\n\n const pkg: Record<string, unknown> = {\n name: \"monorepo\",\n private: true,\n type: \"module\",\n packageManager: PNPM_PACKAGE_MANAGER,\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 };\n writeFileSync(join(destination, \"package.json\"), `${JSON.stringify(pkg, null, 2)}\\n`);\n\n writeChildWorkspaceYaml(destination, { packages: workspacePackages, catalog });\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 starter?: StarterLevel;\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 if (!options.overrides.includes(\"api\")) {\n for (const match of allFiles) {\n if (isApiTemplatePath(match)) allFiles.delete(match);\n }\n }\n if (!options.overrides.includes(\"api\") && !options.overrides.includes(\"host\")) {\n for (const match of allFiles) {\n if (isComposeTemplatePath(match)) allFiles.delete(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 destPath = sourcePathToDestinationPath(filePath);\n // Only snapshot what the scaffold actually delivered — files pruned\n // after copy (e.g. unused ui sources) must not come back via bos sync.\n if (!existsSync(join(destination, destPath))) continue;\n const content = readFileSync(src);\n fileHashes[destPath] = computeHash(content);\n }\n\n await writeSnapshot(destination, {\n parentRef: `bos://${extendsAccount}/${extendsGateway}`,\n files: fileHashes,\n starter: options.starter,\n });\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(\"pnpm\", [\"--dir\", \"api\", \"exec\", \"drizzle-kit\", \"generate\"], cwd);\n }\n}\n\nconst COMMAND_TIMEOUTS: Record<string, number> = {\n pnpm: 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\npnpm install\npnpm 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**Deploy:**\n\n[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/everything-dev-template?referralCode=MuB_vg&utm_medium=integration&utm_source=template&utm_campaign=generic)\n\nThe Railway template deploys the everything.dev Docker image. Set these variables:\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| \\`BOS_ACCOUNT\\` | The NEAR account that owns this app's published configuration on-chain | \\`myapp.near\\` |\n| \\`BOS_GATEWAY\\` | The core domain where this app is served | \\`myapp.com\\` |\n| \\`BETTER_AUTH_SECRET\\` | Secret for session encryption — generate with \\`openssl rand -base64 32\\` | (random) |\n\n**Self-deployed production:**\n\nYou don't need to wait for a PR to merge and run through CI/CD. Publish your own config on-chain under your own NEAR account and run your own host instance, inheriting the base platform via \\`extends\\`.\n\n1. **Install near-cli-rs** (the \\`bos\\` CLI shells out to it for \\`bos publish\\` and \\`bos key generate\\`):\n \\`\\`\\`bash\n curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/near-cli-rs/releases/download/v0.23.5/near-cli-rs-installer.sh | sh\n \\`\\`\\`\n2. **Create a NEAR account** (testnet or mainnet). Named accounts can own subaccounts; implicit hex accounts cannot:\n \\`\\`\\`bash\n near account create-account fund-my-account <your-account>.testnet use-faucet network-config testnet\n \\`\\`\\`\n3. **Generate a publish key** — a function-call key scoped to the FastKV registry contract:\n \\`\\`\\`bash\n bos key generate\n # Output: NEAR_PRIVATE_KEY=ed25519:...\n \\`\\`\\`\n Add the key to your account via near-cli-rs, then set \\`NEAR_PRIVATE_KEY\\` in \\`.env\\` or CI secrets.\n4. **Update \\`bos.config.json\\`** — set \\`account\\` to your NEAR account, add \\`extends\\` to inherit the base platform, keep \\`domain\\` as the gateway:\n \\`\\`\\`json\n { \"extends\": \"bos://<parent-account>/<parent-gateway>\", \"account\": \"<your-account>.near\", \"domain\": \"<parent-gateway>\" }\n \\`\\`\\`\n 5. **Publish and deploy:**\n \\`\\`\\`bash\n bos deploy # preflight → build → upload bundles → publish config to FastKV at bos://<your-account>/<gateway> → image/Railway when configured\n \\`\\`\\`\n6. **Deploy to Railway** (one-click template or \\`railway up\\`), set \\`BOS_ACCOUNT\\`, \\`BOS_GATEWAY\\` (same gateway as parent), and \\`BETTER_AUTH_SECRET\\`. Your Railway host fetches your config from FastKV and serves live.\n\n\\`BOS_GATEWAY\\` is the **FastKV lookup key**, not the DNS domain your Railway instance serves on. By keeping the same gateway while using your own \\`BOS_ACCOUNT\\`, your config lives at a separate FastKV path that \\`extends\\` the base runtime — you inherit the full platform and override only what you change.\n\n**Tenant creation** (for the admin wizard) is DAO-owned: connect a sputnik-dao account via the Trezu wallet in the admin wizard; the wizard publishes the tenant runtime config under \\`bos://<dao-account>/<gateway>\\`. No server-side subaccount keys are needed.`);\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. \\`pnpm install\\`\n2. \\`pnpm run dev\\`\n3. \\`bos dev\\` creates \\`.env\\` on first run and starts local Postgres via docker compose when it is down`);\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 \\`pnpm 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 \\`pnpm 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(\"pnpm run test # Run all tests\");\n testCommands.push(\"pnpm run typecheck # Type check all packages\");\n testCommands.push(\"pnpm run 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(`## Workflow Skills\n\nThis repo ships agent workflow skills in \\`.agents/skills/\\` — the ordered development flow (grill → spec → tickets → implement/tdd → code-review). Start \\`/everything-dev-app\\` to orient and pick the right next step; \\`/ask-matt\\` is the router if unsure.\n\n- \\`/grill-with-docs\\` — sharpen an idea by interview, leaving a paper trail in \\`GLOSSARY.md\\` and ADRs\n- \\`/to-spec\\` / \\`/to-tickets\\` — turn a plan into a spec, then tracer-bullet tickets under \\`.scratch/<feature>/issues/\\`\n- \\`/implement\\` + \\`/tdd\\` — build a ticket test-first at pre-agreed seams\n- \\`/code-review\\` — two-axis review (Standards + Spec) of the diff since a fixed point\n- \\`/diagnosing-bugs\\` — diagnosis loop for hard bugs and performance regressions\n\nRun \\`/setup-matt-pocock-skills\\` once before first use. Tracker and triage conventions live in \\`docs/agents/\\`.`);\n\n parts.push(`## Agent Communication Surface\n\nThe host exposes several surfaces for programmatic agent access:\n\n| Surface | Endpoint | Auth | Use |\n|---------|----------|------|-----|\n| MCP | \\`POST /api/mcp\\` | \\`x-api-key\\` header or session cookie | MCP clients — auto-generated tools from OpenAPI spec, stateless Streamable HTTP transport |\n| REST/OpenAPI | \\`GET/POST/... /api/{path}\\` | \\`x-api-key\\` header or session cookie | Standard REST; Scalar docs at \\`GET /api\\`, spec at \\`GET /api/spec.json\\` |\n| oRPC RPC | \\`POST /api/rpc/{procedure}\\` | \\`x-api-key\\` header or session cookie | Typed JSON-RPC for all API procedures |\n| Plugin RPC | \\`POST /api/rpc/{plugin}/{procedure}\\` | \\`x-api-key\\` header or session cookie | Per-plugin RPC (e.g. \\`/api/rpc/auth/getSession\\`) |\n| MCP discovery | \\`GET /.well-known/mcp.json\\` | None | JSON descriptor with server name, endpoint, and auth scheme |\n\n### Authentication for agents\n\n1. Sign in with your NEAR wallet (SIWN) at the website.\n2. Navigate to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a new key — the full secret (\\`edk_...\\`) is shown once. Copy it immediately.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\n### Architecture note: remotes are code bundles\n\nRemotes in \\`bos.config.json\\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. The UI, API, auth, and plugins all run in the same host process. There is no remote server to call; everything is loaded in-process through Module Federation and \\`every-plugin\\`.`);\n\n parts.push(`## Troubleshooting\n\n**Process won't start:**\n\\`\\`\\`bash\nbos kill # Kill all tracked processes\npnpm install # Ensure dependencies\npnpm 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\npnpm run db:push # Push schema changes\npnpm 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\nconst WORKFLOW_SKILLS_MARKER = \"everything-dev-app\";\nconst WORKFLOW_SKILLS_NOTE = `\n\n## Workflow skills\n\nThis repo ships agent workflow skills in \\`.agents/skills/\\` — the ordered development flow (grill → spec → tickets → implement/tdd → code-review). Start with \\`/everything-dev-app\\` to orient and pick the right next step. See \\`AGENTS.md\\` → Workflow Skills.\n`;\n\nexport function buildChildLlmsTxt(title: string): string {\n return `# ${title}\n\n> Application running on the everything.dev runtime.\n\n## Skills\n\n- [Skill](/skill.md): Agent-ready prompt for talking to, running, editing, and publishing this runtime.\n- Workflow skills (in the repo): \\`.agents/skills/\\` — start with \\`everything-dev-app\\` for the ordered development flow.\n\n## API\n\n- [OpenAPI docs](/api): Interactive API reference (Scalar)\n- [OpenAPI spec](/api/spec.json): Machine-readable OpenAPI JSON\n- [oRPC RPC](/api/rpc): Typed JSON-RPC endpoint for all API procedures\n- [Plugin RPC](/api/rpc/auth): Auth plugin RPC (session, NEAR SIWN, relay, API keys, organizations)\n\n## MCP\n\n- [MCP server](/api/mcp): Model Context Protocol server (Streamable HTTP, stateless). Auto-generates tools from the API's OpenAPI spec.\n- [MCP discovery](/.well-known/mcp.json): JSON descriptor with server name, endpoint URL, and auth scheme.\n\n## Auth\n\nAuthenticate to the API using an API key:\n\n1. Sign in with your NEAR wallet (SIWN) at the website.\n2. Go to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a key — the full secret (\\`edk_...\\`) is shown once.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\nThe \\`x-api-key\\` header works for \\`/api/*\\` (REST), \\`/api/rpc/*\\` (oRPC), and \\`/api/mcp\\` (MCP).\n\n## Source\n\n- [Repository](https://github.com/NEARBuilders/everything-dev): Clone and read \\`AGENTS.md\\` for full development instructions, TanStack Intent skills, and workflow guidance.\n`;\n}\n\nexport function buildChildSkillMd(title: string, repository: string): string {\n const repoLink = repository\n ? `- [Repository](${repository}): Clone and read \\`AGENTS.md\\` for full development instructions.`\n : `- Clone the repository and read \\`AGENTS.md\\` for full development instructions.`;\n\n return `# ${title} skill\n\nUse this when you want an agent to run, edit, and publish **${title}** — an everything.dev app composed at runtime from \\`bos.config.json\\`.\n\nThere are two ways to work with this app:\n\n1. **Talk to the app** — use the API via MCP or REST to read/write data without cloning anything.\n2. **Clone and modify** — clone the repository, run locally, edit code, and publish.\n\n## Mode 1: Talk to the app\n\n### MCP endpoint\n\n\\`\\`\\`\nPOST /api/mcp\n\\`\\`\\`\n\nTransport: Streamable HTTP (stateless). Connect your MCP client to \\`{origin}/api/mcp\\` to discover all available tools automatically.\n\n### Authentication\n\nUse an **API key**:\n\n1. Sign in with your NEAR wallet at the website (SIWN).\n2. Navigate to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a key — the full secret (\\`edk_...\\`) is shown once.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\n### REST / OpenAPI\n\n- **API docs**: \\`GET /api\\`\n- **OpenAPI spec**: \\`GET /api/spec.json\\`\n- **oRPC RPC**: \\`POST /api/rpc/{procedure}\\`\n- **MCP discovery**: \\`GET /.well-known/mcp.json\\`\n\n## Mode 2: Clone and modify\n\n### TanStack Intent\n\n- Registry entry: \\`https://tanstack.com/intent/registry/everything-dev\\`\n- Load with TanStack Intent: \\`npx @tanstack/intent@latest load everything-dev\\`\n\n### Read AGENTS.md first\n\nAfter cloning, read **\\`AGENTS.md\\`** at the repo root. It contains operational guidance, TanStack Intent skills, and workflow instructions.\n\n### Workflow skills\n\nThe repo ships agent workflow skills in \\`.agents/skills/\\` — start with \\`everything-dev-app\\` for the ordered development flow (grill → spec → tickets → implement/tdd → code-review).\n\n### Architecture note\n\nRemotes in \\`bos.config.json\\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. Everything runs in the same host process.\n\n### Run locally\n\n\\`\\`\\`bash\npnpm install\nbos dev\n\\`\\`\\`\n\n### Publish\n\n\\`\\`\\`bash\nbos deploy\n\\`\\`\\`\n\n## Source\n\n${repoLink}\n`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"init.mjs","names":["parseYaml","stringifyYaml","readWorkspaceCatalogFromDisk","tarExtract","computeHash"],"sources":["../../src/cli/init.ts"],"sourcesContent":["import {\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { execa } from \"execa\";\nimport { glob } from \"glob\";\nimport { extract as tarExtract } from \"tar\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport {\n buildAuthContractStub,\n buildAuthExportStub,\n buildAuthTypesGenContent,\n} from \"../auth-types-gen\";\nimport { findConfigPath, isAppDescriptorPath, loadAppDescriptorConfig } from \"../config\";\nimport type { OverrideSection } from \"../contract\";\nimport { serializeAppDescriptorSource } from \"../descriptor/serialize\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport { fetchResponse } from \"../http-client\";\nimport {\n loadManifestNormalizationSpec,\n normalizePackageManifestsInTree,\n} from \"../internal/manifest-normalizer\";\nimport { walkExtendsChain } from \"../resolution/session\";\nimport type { BosConfig, BosConfigInput, ParentStarterConfig, StarterLevel } from \"../types\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { computeSnapshotHash as computeHash } from \"../utils/snapshot-hash\";\nimport { readWorkspaceCatalog as readWorkspaceCatalogFromDisk } from \"../workspace-catalog\";\nimport { writeSnapshot } from \"./snapshot\";\nimport { getExtendsRef, parseBosRef } from \"./utils/helpers\";\n\nexport const PNPM_PACKAGE_MANAGER = \"pnpm@12.10.1\";\n\n/**\n * Transitive-singleton overrides every workspace in the fleet must agree on\n * (ticket 05's deviation log: isolated resolution splits better-auth\n * peer-context identities across the plugin fleet). Values derive from the\n * catalog so sync keeps them current; keys absent from the catalog are left\n * unpinned.\n */\nconst CHILD_OVERRIDE_KEYS = [\n \"@better-fetch/fetch\",\n \"@rspack/core\",\n \"better-auth\",\n \"react\",\n \"react-dom\",\n] as const;\n\n/**\n * The child's workspace manifest: pnpm-workspace.yaml is canonical (v2, ADR\n * 0026) — packages globs synthesized from the child's override sections, the\n * catalog merged over any local entry, plus the fleet-wide linker posture and\n * singleton overrides. Re-running (sync/upgrade) merges instead of clobbering.\n */\nexport function writeChildWorkspaceYaml(\n projectDir: string,\n next: { packages: string[]; catalog: Record<string, string> },\n): boolean {\n const yamlPath = join(projectDir, \"pnpm-workspace.yaml\");\n let doc: {\n packages?: string[];\n catalog?: Record<string, string>;\n nodeLinker?: string;\n linkWorkspacePackages?: boolean;\n ignoreScripts?: boolean;\n overrides?: Record<string, string>;\n } = {};\n if (existsSync(yamlPath)) {\n try {\n const parsed = parseYaml(readFileSync(yamlPath, \"utf-8\"));\n if (parsed && typeof parsed === \"object\") doc = parsed;\n } catch {\n doc = {};\n }\n }\n\n let changed = !existsSync(yamlPath);\n const packages = [...new Set([...(doc.packages ?? []), ...next.packages])].sort();\n if (JSON.stringify(packages) !== JSON.stringify(doc.packages)) {\n doc.packages = packages;\n changed = true;\n }\n\n const catalog: Record<string, string> = { ...(doc.catalog ?? {}) };\n for (const [name, version] of Object.entries(next.catalog)) {\n if (catalog[name] !== version) {\n catalog[name] = version;\n changed = true;\n }\n }\n if (\n Object.keys(catalog).length > 0 &&\n Object.keys(catalog).length !== Object.keys(doc.catalog ?? {}).length\n ) {\n changed = true;\n }\n if (changed || !doc.catalog) {\n doc.catalog = Object.fromEntries(\n Object.entries(catalog).sort(([a], [b]) => a.localeCompare(b)),\n );\n }\n\n if (doc.nodeLinker !== \"hoisted\") {\n doc.nodeLinker = \"hoisted\";\n changed = true;\n }\n if (doc.linkWorkspacePackages !== true) {\n doc.linkWorkspacePackages = true;\n changed = true;\n }\n if (doc.ignoreScripts !== true) {\n doc.ignoreScripts = true;\n changed = true;\n }\n\n const overrides: Record<string, string> = { ...(doc.overrides ?? {}) };\n for (const key of CHILD_OVERRIDE_KEYS) {\n if (catalog[key] && overrides[key] !== catalog[key]) {\n overrides[key] = catalog[key];\n changed = true;\n }\n }\n if (Object.keys(overrides).length > 0) {\n doc.overrides = Object.fromEntries(\n Object.entries(overrides).sort(([a], [b]) => a.localeCompare(b)),\n );\n }\n\n if (changed) {\n writeFileSync(yamlPath, `${stringifyYaml(doc, { lineWidth: 0 }).trimEnd()}\\n`);\n return true;\n }\n return false;\n}\n\n/**\n * Init must never reuse a lockfile left in the target (copied from a parent\n * checkout or left by a previous run) — stale framework resolutions would\n * survive the fresh install. Bun's bun.lock is deleted on sight (ADR 0026's\n * silent-revert footgun); the child's own pnpm-lock.yaml is re-resolved.\n */\nexport function removeStrayLockfiles(projectDir: string): void {\n for (const lockfile of [\"pnpm-lock.yaml\", \"bun.lock\"]) {\n const lockfilePath = join(projectDir, lockfile);\n if (existsSync(lockfilePath)) {\n rmSync(lockfilePath, { force: true });\n }\n }\n}\n\nexport const INIT_ROOT_PATTERNS = [\n \"bos.config.json\",\n \"package.json\",\n \".env.example\",\n \".gitignore\",\n \"biome.json\",\n \"railway.json\",\n \"railway.toml\",\n \"AGENTS.md\",\n \".agents/skills/**\",\n \"skills-lock.json\",\n \"docs/agents/**\",\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\nexport function readWorkspaceCatalog(sourceDir: string): Record<string, string> {\n return readWorkspaceCatalogFromDisk(sourceDir);\n}\n\nexport async function resolveCatalogChainSource(opts: {\n extendsAccount: string;\n extendsGateway: string;\n sourceDir?: string;\n}): Promise<CatalogChainSource> {\n const entry = opts.sourceDir\n ? (findConfigPath(resolve(opts.sourceDir)) ?? join(resolve(opts.sourceDir), \"bos.config.json\"))\n : `bos://${opts.extendsAccount}/${opts.extendsGateway}`;\n const catalogs: Record<string, string>[] = [];\n const cleanups: Array<() => Promise<void>> = [];\n const resolvedRefs: string[] = [];\n let repository: string | undefined;\n\n try {\n await walkExtendsChain(entry, {\n env: \"production\",\n collectCatalogs: true,\n registerCleanup: (fn) => cleanups.push(fn),\n visit: async (link) => {\n resolvedRefs.unshift(\n link.ref.startsWith(\"bos://\") ? link.ref : join(link.baseDir, basename(link.ref)),\n );\n catalogs.push(readWorkspaceCatalog(link.sourceDir ?? link.baseDir));\n const repositoryValue = (link.config as Record<string, unknown>).repository;\n if (typeof repositoryValue === \"string\" && repository === undefined) {\n repository = repositoryValue;\n }\n },\n });\n } finally {\n for (const cleanup of [...cleanups].reverse()) {\n await cleanup();\n }\n }\n\n return {\n catalog: Object.assign({}, ...catalogs),\n repository,\n extendsChain: opts.sourceDir\n ? [`bos://${opts.extendsAccount}/${opts.extendsGateway}`, ...resolvedRefs.slice(1)]\n : resolvedRefs,\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 const configPath = findConfigPath(sourceDir);\n if (!configPath) {\n throw new Error(\n `No authored config (bos.app.ts or bos.config.json) found in source directory: ${sourceDir}`,\n );\n }\n const parentConfig = isAppDescriptorPath(configPath)\n ? ((await loadAppDescriptorConfig(configPath)) as BosConfig)\n : (JSON.parse(readFileSync(configPath, \"utf-8\")) 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_TEMPLATE_PATTERN);\n if (has(\"api\") || has(\"host\")) patterns.push(COMPOSE_TEMPLATE_PATTERN);\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\n/** api-override children get the slim generic shell, never the parent's domain API. */\nconst API_TEMPLATE_PATTERN = \".github/templates/api/**\";\n\n/** Child-sized compose (api + api-test databases) for local compute overrides. */\nconst COMPOSE_TEMPLATE_PATTERN = \".github/templates/docker-compose.yml\";\n\nexport function isApiTemplatePath(filePath: string): boolean {\n return filePath.startsWith(\".github/templates/api/\");\n}\n\nexport function isComposeTemplatePath(filePath: string): boolean {\n return filePath === COMPOSE_TEMPLATE_PATTERN;\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\nconst STARTER_PRODUCT_EXCLUSIONS = [\n \"_public/explore.tsx\",\n \"_public/stake.tsx\",\n \"_public/n/**\",\n \"_public/$accountId.tsx\",\n \"_public/$accountId/**\",\n \"_public/activity/**\",\n \"_public/-stake-*\",\n \"_authenticated/_dashboard/dashboard/node/**\",\n \"_authenticated/_dashboard/nodes/**\",\n \"_authenticated/_dashboard/tenant.*\",\n \"_authenticated/_dashboard/discover.tsx\",\n \"_authenticated/_dashboard/apply.tsx\",\n \"_authenticated/_dashboard/prototype-staking-poc.tsx\",\n \"_authenticated/onboarding/**\",\n \"_admin/_dashboard/_dashboard/admin/nodes/**\",\n \"_admin/_dashboard/_dashboard/admin/proposals/**\",\n \"_admin/_dashboard/_dashboard/admin/tenants/**\",\n \"_admin/_dashboard/_dashboard/admin/relayer.tsx\",\n \"_admin/_dashboard/_dashboard/admin/organizations.tsx\",\n] as const;\n\nconst STARTER_SIMPLE_EXCLUSIONS = [\n \"_authenticated.tsx\",\n \"_authenticated/**\",\n \"_admin.tsx\",\n \"_admin/**\",\n] as const;\n\n/**\n * Route-file globs (relative to the child's `ui/src/routes/`) that a starter\n * of the given level must not receive. Parent `starter` config can add\n * exclusions (`exclude`, `levels[level].exclude`) or reclaim routes for a\n * level (`levels[level].include`). Entries are prefixed with\n * `ui/src/routes/` so they compose with `copyFilteredFiles`'s ignore list.\n */\nexport function buildStarterRouteExclusions(\n level: StarterLevel,\n parentConfig: { starter?: ParentStarterConfig } | null | undefined,\n): string[] {\n const excluded = new Set<string>([...STARTER_PRODUCT_EXCLUSIONS]);\n if (level === \"simple\") {\n for (const entry of STARTER_SIMPLE_EXCLUSIONS) excluded.add(entry);\n }\n\n const starter = parentConfig?.starter;\n if (starter) {\n for (const entry of starter.exclude ?? []) excluded.add(entry);\n const levelConfig = starter.levels?.[level];\n if (levelConfig) {\n for (const entry of levelConfig.exclude ?? []) excluded.add(entry);\n for (const entry of levelConfig.include ?? []) excluded.delete(entry);\n }\n }\n\n return [...excluded].map((entry) => `ui/src/routes/${entry}`);\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 if (isApiTemplatePath(filePath)) {\n return filePath.replace(/^\\.github\\/templates\\/api\\//, \"api/\");\n }\n if (isComposeTemplatePath(filePath)) {\n return \"docker-compose.yml\";\n }\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 await tarExtract({ 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?.[1] && httpsMatch[2]) {\n return { owner: httpsMatch[1], repo: httpsMatch[2] };\n }\n\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch?.[1] && sshMatch[2]) {\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 if (!options.overrides.includes(\"api\")) {\n for (const match of allFiles) {\n if (isApiTemplatePath(match)) allFiles.delete(match);\n }\n }\n if (!options.overrides.includes(\"api\") && !options.overrides.includes(\"host\")) {\n for (const match of allFiles) {\n if (isComposeTemplatePath(match)) allFiles.delete(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 delete entry.pin;\n}\n\n/**\n * Scaffold the authored config as the TS form: the personalized\n * bos.config.json materializes into an authored `bos.app.ts` descriptor and\n * the JSON copy is removed — publish/sync still canonicalize to JSON for\n * FastKV from the resolved config. Returns the config that was converted, so\n * callers that need it (before the child has node_modules to import the\n * descriptor) can pass it onward.\n */\nexport async function convertChildConfigToAppForm(\n destination: string,\n): Promise<BosConfigInput | null> {\n const configPath = join(destination, \"bos.config.json\");\n if (!existsSync(configPath)) return null;\n const config = JSON.parse(readFileSync(configPath, \"utf-8\")) as BosConfigInput;\n writeFileSync(join(destination, \"bos.app.ts\"), serializeAppDescriptorSource(config));\n rmSync(configPath);\n return config;\n}\n\n/**\n * Scaffold the root dev-overlay starter (`bos.dev.ts`). Idempotent — never\n * overwrites an existing overlay. Dev overlays are merged child-wins over\n * the resolved config in development and are never published.\n */\nexport function writeDevOverlayTemplate(\n destination: string,\n opts: { extendsRef?: string } = {},\n): void {\n const overlayPath = join(destination, \"bos.dev.ts\");\n if (existsSync(overlayPath)) return;\n const extendsLine = opts.extendsRef ? `\\n// Inherited base: ${opts.extendsRef}\\n` : \"\";\n writeFileSync(\n overlayPath,\n `import type { AppDescriptor } from \"everything-dev/descriptor\";\n${extendsLine}\n/**\n * Development-only overlay for bos.app.ts — merged child-wins over the\n * resolved config when the environment is development. Never published.\n * Example: pin the auth attachment to a running dev server instead of\n * letting the dev harness spawn it.\n */\nexport default {\n // auth: { development: \"http://localhost:3006\" },\n} satisfies Partial<AppDescriptor>;\n`,\n );\n}\n\nfunction buildRootTypecheckScript(sections: {\n ui: boolean;\n api: boolean;\n host: boolean;\n plugins: boolean;\n}): string {\n const commands = [\"pnpm run types:gen\"];\n\n if (sections.ui) {\n commands.push(\"if [ -d ui ]; then pnpm --dir ui run typecheck; fi\");\n }\n if (sections.api) {\n commands.push(\"if [ -d api ]; then pnpm --dir api run typecheck; fi\");\n }\n if (sections.host) {\n commands.push(\"if [ -d host ]; then pnpm --dir host run 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 pnpm --dir \"$dir\" run 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 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 \"types:gen\": \"bos types gen\",\n bos: \"bos\",\n };\n\n if (sections.api) {\n scripts[\"db:push\"] = \"pnpm --dir api exec 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\"] = \"pnpm --dir api exec drizzle-kit generate\";\n scripts[\"db:migrate\"] = \"pnpm --dir api exec drizzle-kit migrate\";\n scripts[\"test:api\"] = \"pnpm --dir api run test --if-present\";\n scripts[\"test:integration\"] = \"pnpm --dir api run test tests/integration/ --if-present\";\n }\n\n if (sections.host) {\n scripts[\"test:e2e\"] = \"pnpm --dir host run test --if-present\";\n }\n\n const testTargets: string[] = [];\n if (sections.api) testTargets.push(\"pnpm --dir api run test --if-present\");\n if (sections.host) testTargets.push(\"pnpm --dir host run test --if-present\");\n if (sections.ui) testTargets.push(\"pnpm --dir ui run test --if-present\");\n if (sections.plugins) {\n testTargets.push(\n 'for d in plugins/*; do [ -f \"$d/package.json\" ] && pnpm --dir \"$d\" run test --if-present; done',\n );\n }\n scripts.test =\n testTargets.length > 0\n ? testTargets.join(\" && \")\n : 'echo \"No workspace directories configured\"';\n\n // Scripts key off the child's own override selection (what it runs locally),\n // not off resolved-config secrets — a ui-only child gets none of these.\n if (sections.api || sections.host) {\n scripts[\"dev:postgres\"] = \"docker compose up -d --wait && pnpm 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 starter?: StarterLevel;\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 const applyStarter = (config: Record<string, unknown>): void => {\n if (opts.starter) {\n config.starter = opts.starter;\n } else if (opts.mode !== \"sync\") {\n delete config.starter;\n }\n };\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 jsonConfigPath = join(destination, \"bos.config.json\");\n const appConfigPath = join(destination, \"bos.app.ts\");\n const tsForm = !existsSync(jsonConfigPath) && existsSync(appConfigPath);\n\n if (tsForm) {\n const config = (await loadAppDescriptorConfig(appConfigPath)) 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 applyStarter(config);\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 writeFileSync(appConfigPath, serializeAppDescriptorSource(config as BosConfigInput));\n return;\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 applyStarter(config);\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 pkg.packageManager = PNPM_PACKAGE_MANAGER;\n delete pkg.module;\n delete pkg.peerDependencies;\n delete pkg.patchedDependencies;\n\n const childWorkspaces: string[] = [];\n if (has(\"host\")) childWorkspaces.push(\"host\");\n if (has(\"ui\")) childWorkspaces.push(\"ui\");\n if (has(\"api\")) childWorkspaces.push(\"api\");\n if (has(\"plugins\")) childWorkspaces.push(\"plugins/*\");\n const localCatalog =\n pkg.workspaces && typeof pkg.workspaces === \"object\"\n ? ((pkg.workspaces as { catalog?: Record<string, string> }).catalog ?? {})\n : {};\n delete pkg.workspaces;\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 \"prepare\",\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 const catalog: Record<string, string> = { ...localCatalog };\n\n // The copied root manifest is the parent's — a monorepo root whose\n // dependencies (workspace members, vendored links) do not exist in the\n // child. The child root carries exactly the framework packages.\n pkg.dependencies = {\n \"everything-dev\": \"catalog:\",\n \"every-plugin\": \"catalog:\",\n };\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 const rootCatalogEverythingDev = spec.rootCatalog[\"everything-dev\"];\n const rootCatalogEveryPlugin = spec.rootCatalog[\"every-plugin\"];\n if (rootCatalogEverythingDev) {\n catalog[\"everything-dev\"] = rootCatalogEverythingDev;\n }\n if (rootCatalogEveryPlugin) {\n catalog[\"every-plugin\"] = rootCatalogEveryPlugin;\n }\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 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 writeChildWorkspaceYaml(destination, { packages: childWorkspaces, catalog });\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 const publicDir = join(destination, \"ui\", \"public\");\n if (!existsSync(publicDir)) {\n mkdirSync(publicDir, { recursive: true });\n }\n\n const llmsTxtPath = join(publicDir, \"llms.txt\");\n if (!existsSync(llmsTxtPath)) {\n const title = opts.title ?? opts.account ?? \"app\";\n writeFileSync(llmsTxtPath, buildChildLlmsTxt(title));\n }\n\n const skillMdPath = join(publicDir, \"skill.md\");\n if (!existsSync(skillMdPath)) {\n const title = opts.title ?? opts.account ?? \"app\";\n const repository = opts.repository ?? \"\";\n writeFileSync(skillMdPath, buildChildSkillMd(title, repository));\n }\n\n for (const agentFilePath of [llmsTxtPath, skillMdPath]) {\n const content = readFileSync(agentFilePath, \"utf-8\");\n if (content.includes(WORKFLOW_SKILLS_MARKER)) continue;\n writeFileSync(agentFilePath, `${content.replace(/\\n*$/, \"\\n\")}${WORKFLOW_SKILLS_NOTE}`);\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 { RouterContractClient, RouterContract } from \"@orpc/contract\";\\ntype ClientFactory<C extends RouterContract> = (context?: Record<string, unknown>) => RouterContractClient<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 const authExportRel = toRelativeImportPath(\n join(destination, \".bos\", \"generated\", \"auth\", \"auth-export.d.ts\"),\n authTypesGenPath,\n );\n const contractRel = toRelativeImportPath(\n join(destination, \".bos\", \"generated\", \"auth\", \"contract.d.ts\"),\n authTypesGenPath,\n );\n writeFileSync(authTypesGenPath, buildAuthTypesGenContent(authExportRel, contractRel));\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(authExportStubPath, buildAuthExportStub());\n }\n const contractStubPath = join(authDir, \"contract.d.ts\");\n if (!existsSync(contractStubPath)) {\n writeFileSync(contractStubPath, buildAuthContractStub());\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 toRelativeImportPath(fromPath: string, toPath: string): string {\n const rel = relative(dirname(toPath), fromPath);\n return rel.startsWith(\".\") ? rel : `./${rel}`;\n}\n\nexport async function runPnpmInstall(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n },\n): Promise<void> {\n await runWithProgress(\n \"pnpm\",\n [\"install\", \"--ignore-scripts\"],\n destination,\n opts?.spinner,\n \"Installing dependencies\",\n );\n}\n\nexport async function runPnpmInstallForUpgrade(\n destination: string,\n opts?: {\n spinner?: { message: (msg: string) => void };\n },\n): Promise<void> {\n await runWithProgress(\n \"pnpm\",\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 { runDockerComposeUp } from \"../infra/docker\";\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 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 starter?: StarterLevel;\n /** local parent source dir — resolves the catalog offline (tests, --source) */\n catalogSourceDir?: 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 ...(opts.starter ? { starter: opts.starter } : {}),\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 sourceDir: opts.catalogSourceDir,\n })\n ).catalog;\n\n const pkg: Record<string, unknown> = {\n name: \"monorepo\",\n private: true,\n type: \"module\",\n packageManager: PNPM_PACKAGE_MANAGER,\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 };\n writeFileSync(join(destination, \"package.json\"), `${JSON.stringify(pkg, null, 2)}\\n`);\n\n writeChildWorkspaceYaml(destination, { packages: workspacePackages, catalog });\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 starter?: StarterLevel;\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 if (!options.overrides.includes(\"api\")) {\n for (const match of allFiles) {\n if (isApiTemplatePath(match)) allFiles.delete(match);\n }\n }\n if (!options.overrides.includes(\"api\") && !options.overrides.includes(\"host\")) {\n for (const match of allFiles) {\n if (isComposeTemplatePath(match)) allFiles.delete(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 destPath = sourcePathToDestinationPath(filePath);\n // Only snapshot what the scaffold actually delivered — files pruned\n // after copy (e.g. unused ui sources) must not come back via bos sync.\n if (!existsSync(join(destination, destPath))) continue;\n const content = readFileSync(src);\n fileHashes[destPath] = computeHash(content);\n }\n\n await writeSnapshot(destination, {\n parentRef: `bos://${extendsAccount}/${extendsGateway}`,\n files: fileHashes,\n starter: options.starter,\n });\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(\"pnpm\", [\"--dir\", \"api\", \"exec\", \"drizzle-kit\", \"generate\"], cwd);\n }\n}\n\nconst COMMAND_TIMEOUTS: Record<string, number> = {\n pnpm: 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\npnpm install\npnpm 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**Deploy:**\n\n[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/everything-dev-template?referralCode=MuB_vg&utm_medium=integration&utm_source=template&utm_campaign=generic)\n\nThe Railway template deploys the everything.dev Docker image. Set these variables:\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| \\`BOS_ACCOUNT\\` | The NEAR account that owns this app's published configuration on-chain | \\`myapp.near\\` |\n| \\`BOS_GATEWAY\\` | The core domain where this app is served | \\`myapp.com\\` |\n| \\`BETTER_AUTH_SECRET\\` | Secret for session encryption — generate with \\`openssl rand -base64 32\\` | (random) |\n\n**Self-deployed production:**\n\nYou don't need to wait for a PR to merge and run through CI/CD. Publish your own config on-chain under your own NEAR account and run your own host instance, inheriting the base platform via \\`extends\\`.\n\n1. **Install near-cli-rs** (the \\`bos\\` CLI shells out to it for \\`bos publish\\` and \\`bos key generate\\`):\n \\`\\`\\`bash\n curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/near-cli-rs/releases/download/v0.23.5/near-cli-rs-installer.sh | sh\n \\`\\`\\`\n2. **Create a NEAR account** (testnet or mainnet). Named accounts can own subaccounts; implicit hex accounts cannot:\n \\`\\`\\`bash\n near account create-account fund-my-account <your-account>.testnet use-faucet network-config testnet\n \\`\\`\\`\n3. **Generate a publish key** — a function-call key scoped to the FastKV registry contract:\n \\`\\`\\`bash\n bos key generate\n # Output: NEAR_PRIVATE_KEY=ed25519:...\n \\`\\`\\`\n Add the key to your account via near-cli-rs, then set \\`NEAR_PRIVATE_KEY\\` in \\`.env\\` or CI secrets.\n4. **Update \\`bos.app.ts\\`** — set \\`account\\` to your NEAR account, add \\`extends\\` to inherit the base platform, keep \\`domain\\` as the gateway:\n \\`\\`\\`ts\n { \"extends\": \"bos://<parent-account>/<parent-gateway>\", \"account\": \"<your-account>.near\", \"domain\": \"<parent-gateway>\" }\n \\`\\`\\`\n 5. **Publish and deploy:**\n \\`\\`\\`bash\n bos deploy # preflight → build → upload bundles → publish config to FastKV at bos://<your-account>/<gateway> → image/Railway when configured\n \\`\\`\\`\n6. **Deploy to Railway** (one-click template or \\`railway up\\`), set \\`BOS_ACCOUNT\\`, \\`BOS_GATEWAY\\` (same gateway as parent), and \\`BETTER_AUTH_SECRET\\`. Your Railway host fetches your config from FastKV and serves live.\n\n\\`BOS_GATEWAY\\` is the **FastKV lookup key**, not the DNS domain your Railway instance serves on. By keeping the same gateway while using your own \\`BOS_ACCOUNT\\`, your config lives at a separate FastKV path that \\`extends\\` the base runtime — you inherit the full platform and override only what you change.\n\n**Tenant creation** (for the admin wizard) is DAO-owned: connect a sputnik-dao account via the Trezu wallet in the admin wizard; the wizard publishes the tenant runtime config under \\`bos://<dao-account>/<gateway>\\`. No server-side subaccount keys are needed.`);\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. \\`pnpm install\\`\n2. \\`pnpm run dev\\`\n3. \\`bos dev\\` creates \\`.env\\` on first run and starts local Postgres via docker compose when it is down`);\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 \\`pnpm 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.app.ts\\`. These files are gitignored and auto-regenerated on \\`pnpm install\\`, \\`typecheck\\`, \\`bos dev\\`, \\`bos build\\`, and bos plugin management commands.\n\nIf you hand-edit \\`bos.app.ts\\`, 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(\"pnpm run test # Run all tests\");\n testCommands.push(\"pnpm run typecheck # Type check all packages\");\n testCommands.push(\"pnpm run 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(`## Workflow Skills\n\nThis repo ships agent workflow skills in \\`.agents/skills/\\` — the ordered development flow (grill → spec → tickets → implement/tdd → code-review). Start \\`/everything-dev-app\\` to orient and pick the right next step; \\`/ask-matt\\` is the router if unsure.\n\n- \\`/grill-with-docs\\` — sharpen an idea by interview, leaving a paper trail in \\`GLOSSARY.md\\` and ADRs\n- \\`/to-spec\\` / \\`/to-tickets\\` — turn a plan into a spec, then tracer-bullet tickets under \\`.scratch/<feature>/issues/\\`\n- \\`/implement\\` + \\`/tdd\\` — build a ticket test-first at pre-agreed seams\n- \\`/code-review\\` — two-axis review (Standards + Spec) of the diff since a fixed point\n- \\`/diagnosing-bugs\\` — diagnosis loop for hard bugs and performance regressions\n\nRun \\`/setup-matt-pocock-skills\\` once before first use. Tracker and triage conventions live in \\`docs/agents/\\`.`);\n\n parts.push(`## Agent Communication Surface\n\nThe host exposes several surfaces for programmatic agent access:\n\n| Surface | Endpoint | Auth | Use |\n|---------|----------|------|-----|\n| MCP | \\`POST /api/mcp\\` | \\`x-api-key\\` header or session cookie | MCP clients — auto-generated tools from OpenAPI spec, stateless Streamable HTTP transport |\n| REST/OpenAPI | \\`GET/POST/... /api/{path}\\` | \\`x-api-key\\` header or session cookie | Standard REST; Scalar docs at \\`GET /api\\`, spec at \\`GET /api/spec.json\\` |\n| oRPC RPC | \\`POST /api/rpc/{procedure}\\` | \\`x-api-key\\` header or session cookie | Typed JSON-RPC for all API procedures |\n| Plugin RPC | \\`POST /api/rpc/{plugin}/{procedure}\\` | \\`x-api-key\\` header or session cookie | Per-plugin RPC (e.g. \\`/api/rpc/auth/getSession\\`) |\n| MCP discovery | \\`GET /.well-known/mcp.json\\` | None | JSON descriptor with server name, endpoint, and auth scheme |\n\n### Authentication for agents\n\n1. Sign in with your NEAR wallet (SIWN) at the website.\n2. Navigate to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a new key — the full secret (\\`edk_...\\`) is shown once. Copy it immediately.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\n### Architecture note: remotes are code bundles\n\nRemotes in \\`bos.app.ts\\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. The UI, API, auth, and plugins all run in the same host process. There is no remote server to call; everything is loaded in-process through Module Federation and \\`every-plugin\\`.`);\n\n parts.push(`## Troubleshooting\n\n**Process won't start:**\n\\`\\`\\`bash\nbos kill # Kill all tracked processes\npnpm install # Ensure dependencies\npnpm run dev # Restart\n\\`\\`\\`\n\n**Module Federation errors:**\n- Check \\`bos.app.ts\\` URLs are accessible\n- Verify shared dependency versions match in package.json\n- Clear browser cache\n\n**Database issues:**\n\\`\\`\\`bash\npnpm run db:push # Push schema changes\npnpm run db:studio # Open Drizzle Studio\n\\`\\`\\`\n\n## Environment\n\n**Required files:**\n- \\`.env\\` — Secrets (see \\`.env.example\\`)\n- \\`bos.app.ts\\` — 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\nconst WORKFLOW_SKILLS_MARKER = \"everything-dev-app\";\nconst WORKFLOW_SKILLS_NOTE = `\n\n## Workflow skills\n\nThis repo ships agent workflow skills in \\`.agents/skills/\\` — the ordered development flow (grill → spec → tickets → implement/tdd → code-review). Start with \\`/everything-dev-app\\` to orient and pick the right next step. See \\`AGENTS.md\\` → Workflow Skills.\n`;\n\nexport function buildChildLlmsTxt(title: string): string {\n return `# ${title}\n\n> Application running on the everything.dev runtime.\n\n## Skills\n\n- [Skill](/skill.md): Agent-ready prompt for talking to, running, editing, and publishing this runtime.\n- Workflow skills (in the repo): \\`.agents/skills/\\` — start with \\`everything-dev-app\\` for the ordered development flow.\n\n## API\n\n- [OpenAPI docs](/api): Interactive API reference (Scalar)\n- [OpenAPI spec](/api/spec.json): Machine-readable OpenAPI JSON\n- [oRPC RPC](/api/rpc): Typed JSON-RPC endpoint for all API procedures\n- [Plugin RPC](/api/rpc/auth): Auth plugin RPC (session, NEAR SIWN, relay, API keys, organizations)\n\n## MCP\n\n- [MCP server](/api/mcp): Model Context Protocol server (Streamable HTTP, stateless). Auto-generates tools from the API's OpenAPI spec.\n- [MCP discovery](/.well-known/mcp.json): JSON descriptor with server name, endpoint URL, and auth scheme.\n\n## Auth\n\nAuthenticate to the API using an API key:\n\n1. Sign in with your NEAR wallet (SIWN) at the website.\n2. Go to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a key — the full secret (\\`edk_...\\`) is shown once.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\nThe \\`x-api-key\\` header works for \\`/api/*\\` (REST), \\`/api/rpc/*\\` (oRPC), and \\`/api/mcp\\` (MCP).\n\n## Source\n\n- [Repository](https://github.com/NEARBuilders/everything-dev): Clone and read \\`AGENTS.md\\` for full development instructions, TanStack Intent skills, and workflow guidance.\n`;\n}\n\nexport function buildChildSkillMd(title: string, repository: string): string {\n const repoLink = repository\n ? `- [Repository](${repository}): Clone and read \\`AGENTS.md\\` for full development instructions.`\n : `- Clone the repository and read \\`AGENTS.md\\` for full development instructions.`;\n\n return `# ${title} skill\n\nUse this when you want an agent to run, edit, and publish **${title}** — an everything.dev app composed at runtime from \\`bos.app.ts\\`.\n\nThere are two ways to work with this app:\n\n1. **Talk to the app** — use the API via MCP or REST to read/write data without cloning anything.\n2. **Clone and modify** — clone the repository, run locally, edit code, and publish.\n\n## Mode 1: Talk to the app\n\n### MCP endpoint\n\n\\`\\`\\`\nPOST /api/mcp\n\\`\\`\\`\n\nTransport: Streamable HTTP (stateless). Connect your MCP client to \\`{origin}/api/mcp\\` to discover all available tools automatically.\n\n### Authentication\n\nUse an **API key**:\n\n1. Sign in with your NEAR wallet at the website (SIWN).\n2. Navigate to **Settings → API Keys** at \\`/settings/api-keys\\`.\n3. Create a key — the full secret (\\`edk_...\\`) is shown once.\n4. Pass it on every request: \\`x-api-key: edk_your_key_here\\`\n\n### REST / OpenAPI\n\n- **API docs**: \\`GET /api\\`\n- **OpenAPI spec**: \\`GET /api/spec.json\\`\n- **oRPC RPC**: \\`POST /api/rpc/{procedure}\\`\n- **MCP discovery**: \\`GET /.well-known/mcp.json\\`\n\n## Mode 2: Clone and modify\n\n### TanStack Intent\n\n- Registry entry: \\`https://tanstack.com/intent/registry/everything-dev\\`\n- Load with TanStack Intent: \\`npx @tanstack/intent@latest load everything-dev\\`\n\n### Read AGENTS.md first\n\nAfter cloning, read **\\`AGENTS.md\\`** at the repo root. It contains operational guidance, TanStack Intent skills, and workflow instructions.\n\n### Workflow skills\n\nThe repo ships agent workflow skills in \\`.agents/skills/\\` — start with \\`everything-dev-app\\` for the ordered development flow (grill → spec → tickets → implement/tdd → code-review).\n\n### Architecture note\n\nRemotes in \\`bos.app.ts\\` are **not hosted APIs** — they are code bundles loaded via Module Federation at runtime. Everything runs in the same host process.\n\n### Run locally\n\n\\`\\`\\`bash\npnpm install\nbos dev\n\\`\\`\\`\n\n### Publish\n\n\\`\\`\\`bash\nbos deploy\n\\`\\`\\`\n\n## Source\n\n${repoLink}\n`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuCA,MAAa,uBAAuB;;;;;;;;AASpC,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;AACF;;;;;;;AAQA,SAAgB,wBACd,YACA,MACS;CACT,MAAM,WAAW,KAAK,YAAY,qBAAqB;CACvD,IAAI,MAOA,CAAC;CACL,IAAI,WAAW,QAAQ,GACrB,IAAI;EACF,MAAM,SAASA,MAAU,aAAa,UAAU,OAAO,CAAC;EACxD,IAAI,UAAU,OAAO,WAAW,UAAU,MAAM;CAClD,QAAQ;EACN,MAAM,CAAC;CACT;CAGF,IAAI,UAAU,CAAC,WAAW,QAAQ;CAClC,MAAM,WAAW,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAI,IAAI,YAAY,CAAC,GAAI,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK;CAChF,IAAI,KAAK,UAAU,QAAQ,MAAM,KAAK,UAAU,IAAI,QAAQ,GAAG;EAC7D,IAAI,WAAW;EACf,UAAU;CACZ;CAEA,MAAM,UAAkC,EAAE,GAAI,IAAI,WAAW,CAAC,EAAG;CACjE,KAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,KAAK,OAAO,GACvD,IAAI,QAAQ,UAAU,SAAS;EAC7B,QAAQ,QAAQ;EAChB,UAAU;CACZ;CAEF,IACE,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,KAC9B,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAE/D,UAAU;CAEZ,IAAI,WAAW,CAAC,IAAI,SAClB,IAAI,UAAU,OAAO,YACnB,OAAO,QAAQ,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAC/D;CAGF,IAAI,IAAI,eAAe,WAAW;EAChC,IAAI,aAAa;EACjB,UAAU;CACZ;CACA,IAAI,IAAI,0BAA0B,MAAM;EACtC,IAAI,wBAAwB;EAC5B,UAAU;CACZ;CACA,IAAI,IAAI,kBAAkB,MAAM;EAC9B,IAAI,gBAAgB;EACpB,UAAU;CACZ;CAEA,MAAM,YAAoC,EAAE,GAAI,IAAI,aAAa,CAAC,EAAG;CACrE,KAAK,MAAM,OAAO,qBAChB,IAAI,QAAQ,QAAQ,UAAU,SAAS,QAAQ,MAAM;EACnD,UAAU,OAAO,QAAQ;EACzB,UAAU;CACZ;CAEF,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,SAAS,GAClC,IAAI,YAAY,OAAO,YACrB,OAAO,QAAQ,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CACjE;CAGF,IAAI,SAAS;EACX,cAAc,UAAU,GAAGC,UAAc,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG;EAC7E,OAAO;CACT;CACA,OAAO;AACT;;;;;;;AAQA,SAAgB,qBAAqB,YAA0B;CAC7D,KAAK,MAAM,YAAY,CAAC,kBAAkB,UAAU,GAAG;EACrD,MAAM,eAAe,KAAK,YAAY,QAAQ;EAC9C,IAAI,WAAW,YAAY,GACzB,OAAO,cAAc,EAAE,OAAO,KAAK,CAAC;CAExC;AACF;AAEA,MAAa,qBAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,yBAA4D;CAChE,IAAI,CAAC,IAAI;CACT,KAAK,CAAC,KAAK;CACX,MAAM,CAAC,MAAM;CACb,SAAS,CAAC;AACZ;AAcA,SAAgB,qBAAqB,WAA2C;CAC9E,OAAOC,uBAA6B,SAAS;AAC/C;AAEA,eAAsB,0BAA0B,MAIhB;CAC9B,MAAM,QAAQ,KAAK,YACd,eAAe,QAAQ,KAAK,SAAS,CAAC,KAAK,KAAK,QAAQ,KAAK,SAAS,GAAG,iBAAiB,IAC3F,SAAS,KAAK,eAAe,GAAG,KAAK;CACzC,MAAM,WAAqC,CAAC;CAC5C,MAAM,WAAuC,CAAC;CAC9C,MAAM,eAAyB,CAAC;CAChC,IAAI;CAEJ,IAAI;EACF,MAAM,iBAAiB,OAAO;GAC5B,KAAK;GACL,iBAAiB;GACjB,kBAAkB,OAAO,SAAS,KAAK,EAAE;GACzC,OAAO,OAAO,SAAS;IACrB,aAAa,QACX,KAAK,IAAI,WAAW,QAAQ,IAAI,KAAK,MAAM,KAAK,KAAK,SAAS,SAAS,KAAK,GAAG,CAAC,CAClF;IACA,SAAS,KAAK,qBAAqB,KAAK,aAAa,KAAK,OAAO,CAAC;IAClE,MAAM,kBAAmB,KAAK,OAAmC;IACjE,IAAI,OAAO,oBAAoB,YAAY,eAAe,QACxD,aAAa;GAEjB;EACF,CAAC;CACH,UAAU;EACR,KAAK,MAAM,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,QAAQ,GAC1C,MAAM,QAAQ;CAElB;CAEA,OAAO;EACL,SAAS,OAAO,OAAO,CAAC,GAAG,GAAG,QAAQ;EACtC;EACA,cAAc,KAAK,YACf,CAAC,SAAS,KAAK,eAAe,GAAG,KAAK,kBAAkB,GAAG,aAAa,MAAM,CAAC,CAAC,IAChF;CACN;AACF;AAEA,eAAsB,iBAAiB,MAIb;CACxB,IAAI,KAAK,QAAQ;EACf,MAAM,YAAY,QAAQ,KAAK,MAAM;EACrC,MAAM,aAAa,eAAe,SAAS;EAC3C,IAAI,CAAC,YACH,MAAM,IAAI,MACR,iFAAiF,WACnF;EAKF,OAAO;GAAE;GAAW,cAHC,oBAAoB,UAAU,IAC7C,MAAM,wBAAwB,UAAU,IACzC,KAAK,MAAM,aAAa,YAAY,OAAO,CAAC;GACf,SAAS,YAAY,CAAC;EAAE;CAC5D;CAEA,MAAM,eAAe,MAAM,kBAAkB,KAAK,gBAAgB,KAAK,cAAc;CAErF,IAAI,aAAa,YAAY;EAC3B,MAAM,EAAE,KAAK,WAAW,YAAY,MAAM,gBAAgB,aAAa,UAAU;EACjF,OAAO;GAAE;GAAW;GAAc;EAAQ;CAC5C;CAEA,MAAM,cAAc,MAAM,iCACxB,KAAK,gBACL,KAAK,cACP;CACA,IAAI,aAAa,YAAY;EAC3B,MAAM,EAAE,KAAK,WAAW,YAAY,MAAM,gBAAgB,YAAY,UAAU;EAChF,OAAO;GAAE;GAAW,cAAc,YAAY;GAAQ;EAAQ;CAChE;CAEA,OAAO;EACL,WAAW;EACX;EACA,SAAS,YAAY,CAAC;CACxB;AACF;AAEA,SAAgB,kBACd,WACA,SACA,cACU;CACV,MAAM,OAAO,YAA6B,UAAU,SAAS,OAAO;CACpE,MAAM,WAAqB,CAAC,GAAG,kBAAkB;CAEjD,IAAI,IAAI,IAAI,GAAG,SAAS,KAAK,OAAO;CACpC,IAAI,IAAI,KAAK,GAAG,SAAS,KAAK,oBAAoB;CAClD,IAAI,IAAI,KAAK,KAAK,IAAI,MAAM,GAAG,SAAS,KAAK,wBAAwB;CACrE,IAAI,IAAI,MAAM,GAAG,SAAS,KAAK,SAAS;CACxC,IAAI,IAAI,SAAS,GACf,KAAK,MAAM,UAAU,WAAW,CAAC,GAAG;EAClC,MAAM,UAAU,eAAe,WAAW;EAC1C,SAAS,KAAK,WAAW,QAAQ,IAAI;CACvC;CAGF,OAAO;AACT;;AAGA,MAAM,uBAAuB;;AAG7B,MAAM,2BAA2B;AAEjC,SAAgB,kBAAkB,UAA2B;CAC3D,OAAO,SAAS,WAAW,wBAAwB;AACrD;AAEA,SAAgB,sBAAsB,UAA2B;CAC/D,OAAO,aAAa;AACtB;AAEA,SAAgB,2BACd,cACA,iBACU;CACV,IAAI,CAAC,cAAc,SAAS,OAAO,CAAC;CAEpC,MAAM,WAAW,IAAI,IAAI,eAAe;CACxC,MAAM,oCAAoB,IAAI,IAAY;CAC1C,MAAM,sBAAgC,CAAC;CAEvC,KAAK,MAAM,CAAC,WAAW,UAAU,OAAO,QAAQ,aAAa,OAAO,GAAG;EACrE,MAAM,SAAS,oBAAoB,KAAK;EACxC,IAAI,CAAC,QAAQ;EAEb,IAAI,SAAS,IAAI,SAAS,GACxB,KAAK,MAAM,SAAS,QAAQ,kBAAkB,IAAI,KAAK;OAEvD,KAAK,MAAM,SAAS,QAAQ,oBAAoB,KAAK,KAAK;CAE9D;CAEA,OAAO,oBAAoB,QAAQ,UAAU,CAAC,kBAAkB,IAAI,KAAK,CAAC;AAC5E;AAEA,MAAM,6BAA6B;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,4BAA4B;CAChC;CACA;CACA;CACA;AACF;;;;;;;;AASA,SAAgB,4BACd,OACA,cACU;CACV,MAAM,2BAAW,IAAI,IAAY,CAAC,GAAG,0BAA0B,CAAC;CAChE,IAAI,UAAU,UACZ,KAAK,MAAM,SAAS,2BAA2B,SAAS,IAAI,KAAK;CAGnE,MAAM,UAAU,cAAc;CAC9B,IAAI,SAAS;EACX,KAAK,MAAM,SAAS,QAAQ,WAAW,CAAC,GAAG,SAAS,IAAI,KAAK;EAC7D,MAAM,cAAc,QAAQ,SAAS;EACrC,IAAI,aAAa;GACf,KAAK,MAAM,SAAS,YAAY,WAAW,CAAC,GAAG,SAAS,IAAI,KAAK;GACjE,KAAK,MAAM,SAAS,YAAY,WAAW,CAAC,GAAG,SAAS,OAAO,KAAK;EACtE;CACF;CAEA,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,UAAU,iBAAiB,OAAO;AAC9D;AAEA,SAAS,oBAAoB,OAAsC;CACjE,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,SAAU,MAA+B;CAC/C,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG,OAAO;CACnC,OAAO,OAAO,QAAQ,MAAmB,OAAO,MAAM,QAAQ;AAChE;AAEA,SAAgB,4BAA4B,UAA0B;CACpE,IAAI,kBAAkB,QAAQ,GAC5B,OAAO,SAAS,QAAQ,+BAA+B,MAAM;CAE/D,IAAI,sBAAsB,QAAQ,GAChC,OAAO;CAET,OAAO,SAAS,WAAW,oBAAoB,IAC3C,SAAS,QAAQ,0BAA0B,UAAU,IACrD;AACN;AAEA,eAAsB,kBACpB,gBACA,gBACoB;CACpB,MAAM,SAAS,SAAS,eAAe,GAAG;CAC1C,OAAO,yBAAoC,MAAM;AACnD;AAEA,eAAsB,iCACpB,gBACA,gBACA,0BAAU,IAAI,IAAY,GACiC;CAC3D,MAAM,MAAM,SAAS,eAAe,GAAG;CACvC,IAAI,QAAQ,IAAI,GAAG,GAAG,OAAO;CAC7B,QAAQ,IAAI,GAAG;CAEf,IAAI;EACF,MAAM,SAAS,MAAM,kBAAkB,gBAAgB,cAAc;EACrE,IAAI,OAAO,YACT,OAAO;GAAE,YAAY,OAAO;GAAY;EAAO;EAGjD,MAAM,aAAa,cAAc,MAAiC;EAClE,IAAI,YAAY;GACd,MAAM,aAAa,WAAW,WAAW,QAAQ,IAAI,aAAa,SAAS;GAC3E,MAAM,SAAS,YAAY,UAAU;GACrC,IAAI,QAAQ;IACV,MAAM,SAAS,MAAM,iCACnB,OAAO,SACP,OAAO,SACP,OACF;IACA,IAAI,QAAQ,OAAO;GACrB;EACF;EAEA,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,eAAsB,mBAAmB,WAAgD;CACvF,IAAI;EACF,MAAM,EAAE,WAAW,MAAM,MAAM,OAAO;GAAC;GAAU;GAAW;EAAQ,GAAG;GACrE,KAAK;GACL,OAAO;EACT,CAAC;EACD,MAAM,MAAM,OAAO,KAAK;EACxB,IAAI,CAAC,KAAK,OAAO;EACjB,OAAO,gBAAgB,GAAG;CAC5B,QAAQ;EACN;CACF;AACF;AAEA,SAAS,gBAAgB,KAAiC;CACxD,MAAM,WAAW,IAAI,MAAM,+CAA+C;CAC1E,IAAI,UACF,OAAO,sBAAsB,SAAS,GAAG,GAAG,SAAS;CAEvD,MAAM,aAAa,IAAI,MAAM,gEAAgE;CAC7F,IAAI,YACF,OAAO,sBAAsB,WAAW,GAAG,GAAG,WAAW;CAE3D,OAAO,IAAI,SAAS,MAAM,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI;AACnD;AAEA,eAAsB,gBACpB,SACwD;CACxD,MAAM,SAAS,eAAe,OAAO;CACrC,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,gCAAgC,SAAS;CAG3D,MAAM,EAAE,OAAO,SAAS;CACxB,IAAI,WAA4B;CAEhC,KAAK,MAAM,UAAU,CAAC,QAAQ,QAAQ,GAAG;EACvC,MAAM,YAAY,MAAM,cACtB,gCAAgC,MAAM,GAAG,KAAK,WAAW,UACzD;GACE,SAAS,EAAE,cAAc,iBAAiB;GAC1C,UAAU;GACV,SAAS;EACX,CACF;EACA,IAAI,UAAU,IAAI;GAChB,WAAW;GACX;EACF;EACA,IAAI,UAAU,WAAW,KACvB,MAAM,IAAI,MACR,mCAAmC,UAAU,OAAO,GAAG,UAAU,YACnE;CAEJ;CAEA,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,sCAAsC,QAAQ,wBAAwB;CAGxF,IAAI,CAAC,SAAS,MACZ,MAAM,IAAI,MAAM,6CAA6C;CAG/D,MAAM,SAAS,SAAS,mBAAmB;CAC3C,MAAM,cAAc,KAAK,QAAQ,eAAe;CAEhD,MAAM,aAAa,kBAAkB,WAAW;CAChD,MAAM,SAAS,SAAS;CACxB,MAAM,SAAS,QAAQ,UAAU;CAEjC,MAAM,aAAa,SAAS,mBAAmB;CAC/C,IAAI;EACF,MAAMC,QAAW;GAAE,KAAK;GAAY,MAAM;GAAa,OAAO;EAAE,CAAC;CACnE,QAAQ;EACN,MAAM,YAAY,OAAO;GAAC;GAAQ;GAAa;GAAwB;GAAM;EAAU,CAAC;CAC1F;CAEA,OAAO,QAAQ;EAAE,WAAW;EAAM,OAAO;CAAK,CAAC;CAE/C,OAAO;EACL,KAAK;EACL,SAAS,YAAY;GACnB,OAAO,YAAY;IAAE,WAAW;IAAM,OAAO;GAAK,CAAC;EACrD;CACF;AACF;AAEA,SAAS,eAAe,KAAqD;CAC3E,MAAM,aAAa,IAAI,MAAM,gEAAgE;CAC7F,IAAI,aAAa,MAAM,WAAW,IAChC,OAAO;EAAE,OAAO,WAAW;EAAI,MAAM,WAAW;CAAG;CAGrD,MAAM,WAAW,IAAI,MAAM,+CAA+C;CAC1E,IAAI,WAAW,MAAM,SAAS,IAC5B,OAAO;EAAE,OAAO,SAAS;EAAI,MAAM,SAAS;CAAG;CAGjD,OAAO;AACT;AAEA,eAAsB,kBACpB,WACA,aACA,UACA,SAKiB;CACjB,IAAI,SAAS,WAAW,GACtB,OAAO;CAGT,MAAM,aAAa;EAAC;EAAsB;EAAc;EAAc;CAAY;CAClF,MAAM,SAAS,QAAQ,SAAS,CAAC,GAAG,YAAY,GAAG,QAAQ,MAAM,IAAI;CAErE,MAAM,2BAAW,IAAI,IAAY;CACjC,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,UAAU,MAAM,KAAK,SAAS;GAClC,KAAK;GACL,OAAO;GACP,KAAK;GACL,UAAU;GACV;EACF,CAAC;EACD,KAAK,MAAM,SAAS,SAClB,SAAS,IAAI,KAAK;CAEtB;CACA,IAAI,CAAC,QAAQ,UAAU,SAAS,KAAK,GACnC;OAAK,MAAM,SAAS,UAClB,IAAI,kBAAkB,KAAK,GAAG,SAAS,OAAO,KAAK;CACrD;CAEF,IAAI,CAAC,QAAQ,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,UAAU,SAAS,MAAM,GAC1E;OAAK,MAAM,SAAS,UAClB,IAAI,sBAAsB,KAAK,GAAG,SAAS,OAAO,KAAK;CACzD;CAGF,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;CAE1C,IAAI,QAAQ;CACZ,KAAK,MAAM,YAAY,UAAU;EAC/B,MAAM,MAAM,KAAK,WAAW,QAAQ;EAEpC,IAAI,CADS,UAAU,GACf,CAAC,CAAC,OAAO,GAAG;EAEpB,MAAM,WAAW,4BAA4B,QAAQ;EACrD,MAAM,OAAO,KAAK,aAAa,QAAQ;EACvC,UAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;EAC5C,MAAM,UAAU,aAAa,GAAG;EAChC,cAAc,MAAM,OAAO;EAC3B;CACF;CAEA,OAAO;AACT;AAEA,SAAS,sBAAsB,OAAsC;CACnE,OAAO,MAAM;CACb,OAAO,MAAM;CACb,OAAO,MAAM;CACb,OAAO,MAAM;CACb,OAAO,MAAM;AACf;;;;;;;;;AAUA,eAAsB,4BACpB,aACgC;CAChC,MAAM,aAAa,KAAK,aAAa,iBAAiB;CACtD,IAAI,CAAC,WAAW,UAAU,GAAG,OAAO;CACpC,MAAM,SAAS,KAAK,MAAM,aAAa,YAAY,OAAO,CAAC;CAC3D,cAAc,KAAK,aAAa,YAAY,GAAG,6BAA6B,MAAM,CAAC;CACnF,OAAO,UAAU;CACjB,OAAO;AACT;;;;;;AAOA,SAAgB,wBACd,aACA,OAAgC,CAAC,GAC3B;CACN,MAAM,cAAc,KAAK,aAAa,YAAY;CAClD,IAAI,WAAW,WAAW,GAAG;CAC7B,MAAM,cAAc,KAAK,aAAa,wBAAwB,KAAK,WAAW,MAAM;CACpF,cACE,aACA;EACF,YAAY;;;;;;;;;;CAWZ;AACF;AAEA,SAAS,yBAAyB,UAKvB;CACT,MAAM,WAAW,CAAC,oBAAoB;CAEtC,IAAI,SAAS,IACX,SAAS,KAAK,oDAAoD;CAEpE,IAAI,SAAS,KACX,SAAS,KAAK,sDAAsD;CAEtE,IAAI,SAAS,MACX,SAAS,KAAK,wDAAwD;CAExE,IAAI,SAAS,SACX,SAAS,KACP,wIACF;CAGF,OAAO,SAAS,KAAK,MAAM;AAC7B;AAEA,SAAgB,wBAAwB,YAA8B;CACpE,MAAM,gBAAgB,KAAK,YAAY,gBAAgB,kBAAkB,cAAc;CACvF,IAAI,CAAC,WAAW,aAAa,GAAG,OAAO,CAAC;CAExC,IAAI;EAEF,MAAM,gBADY,KAAK,MAAM,aAAa,eAAe,OAAO,CACjC,CAAC,CAAC,WAAW,CAAC;EAE7C,MAAM,eAAe,IAAI,IACvB,OAAO,KAAK,sBAAsB;GAAE,IAAI;GAAM,KAAK;GAAM,MAAM;GAAM,SAAS;EAAK,CAAC,CAAC,CACvF;EACA,aAAa,IAAI,kBAAkB;EAEnC,OAAO,OAAO,KAAK,aAAa,CAAC,CAAC,QAAQ,QAAQ,CAAC,aAAa,IAAI,GAAG,CAAC;CAC1E,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAgB,sBAAsB,UAKX;CACzB,MAAM,UAAkC;EACtC,KAAK;EACL,aAAa;EACb,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO;EACP,WAAW,yBAAyB,QAAQ;EAC5C,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,gBAAgB;EAChB,WAAW;EACX,SAAS;EACT,SAAS;EACT,aAAa;EACb,KAAK;CACP;CAEA,IAAI,SAAS,KAAK;EAChB,QAAQ,aAAa;EACrB,QAAQ,eAAe;EACvB,QAAQ,eAAe;EACvB,QAAQ,eAAe;EACvB,QAAQ,iBAAiB;EACzB,QAAQ,gBAAgB;EACxB,QAAQ,cAAc;EACtB,QAAQ,sBAAsB;CAChC;CAEA,IAAI,SAAS,MACX,QAAQ,cAAc;CAGxB,MAAM,cAAwB,CAAC;CAC/B,IAAI,SAAS,KAAK,YAAY,KAAK,sCAAsC;CACzE,IAAI,SAAS,MAAM,YAAY,KAAK,uCAAuC;CAC3E,IAAI,SAAS,IAAI,YAAY,KAAK,qCAAqC;CACvE,IAAI,SAAS,SACX,YAAY,KACV,oGACF;CAEF,QAAQ,OACN,YAAY,SAAS,IACjB,YAAY,KAAK,MAAM,IACvB;CAIN,IAAI,SAAS,OAAO,SAAS,MAAM;EACjC,QAAQ,kBAAkB;EAC1B,QAAQ,uBAAuB;EAC/B,QAAQ,wBAAwB;CAClC;CAEA,IAAI,SAAS,IACX,QAAQ,YAAY;CAEtB,IAAI,SAAS,KACX,QAAQ,aAAa;CAGvB,OAAO;AACT;AAEA,eAAsB,kBACpB,aACA,MAkBe;CACf,MAAM,OAAO,YAA6B,KAAK,UAAU,SAAS,OAAO;CAKzE,MAAM,iBAHJ,KAAK,SAAS,UAAU,KAAK,gBAAgB,OAAO,OAAO,KAAK,eAAe,QAAQ,WAClF,KAAK,eAAe,MACrB,OAC2B,EAAE;CACnC,MAAM,gBAAgB,WAA0C;EAC9D,IAAI,KAAK,SACP,OAAO,UAAU,KAAK;OACjB,IAAI,KAAK,SAAS,QACvB,OAAO,OAAO;CAElB;CAEA,MAAM,mBAAmB,IAAI,IAC3B,OAAO,QAAQ,IAAI,CAAC,CACjB,QACE,CAAC,KAAK,WACL,UAAU,UACV,CAAC;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,SAAS,GAAG,CAClB,CAAC,CACA,KAAK,CAAC,SAAS,GAAG,CACvB;CAEA,MAAM,iBAAiB,KAAK,aAAa,iBAAiB;CAC1D,MAAM,gBAAgB,KAAK,aAAa,YAAY;CAGpD,IAFe,CAAC,WAAW,cAAc,KAAK,WAAW,aAAa,GAE1D;EACV,MAAM,SAAU,MAAM,wBAAwB,aAAa;EAE3D,OAAO,UAAU,SAAS,KAAK,eAAe,GAAG,KAAK;EAEtD,IAAI,KAAK,SACP,OAAO,UAAU,KAAK;EAExB,IAAI,KAAK,QACP,OAAO,SAAS,KAAK;EAEvB,IAAI,KAAK,YACP,OAAO,aAAa,KAAK;OAEzB,OAAO,OAAO;EAIhB,KAAK,MAAM,SAAS;GADO;GAAS;GAAe;GAAW;EAC1B,GAClC,IAAI,EAAE,SAAS,OACb,OAAO,OAAO;EAIlB,aAAa,MAAM;EAEnB,IAAI,OAAO,OAAO,OAAO,OAAO,QAAQ,UAAU;GAChD,MAAM,MAAM,OAAO;GAEnB,KAAK,MAAM,YAAY,OAAO,KAAK,GAAG,GAAG;IACvC,IACE,CAAC,IAAI,QAA2B,MAC/B,aAAa,UAAU,aAAa,QAAQ,aAAa,QAC1D;KACA,OAAO,IAAI;KACX;IACF;IACA,IAAI,aAAa,QAAQ;KACvB,OAAO,IAAI;KACX;IACF;IACA,MAAM,QAAQ,IAAI;IAClB,IAAI,SAAS,OAAO,UAAU,UAC5B,sBAAsB,KAAgC;GAE1D;GAEA,IAAI,kBAAkB,QACpB,IAAI,OAAO;GAGb,IAAI,OAAO,KAAK,GAAG,CAAC,CAAC,WAAW,GAC9B,OAAO,OAAO;EAElB;EAEA,IAAI,IAAI,SAAS,GACf;OAAI,OAAO,WAAW,OAAO,OAAO,YAAY,UAAU;IACxD,MAAM,UAAU,OAAO;IAEvB,IAAI,KAAK,YAAY,QACnB;UAAK,MAAM,aAAa,OAAO,KAAK,OAAO,GACzC,IAAI,CAAC,KAAK,QAAQ,SAAS,SAAS,GAClC,OAAO,QAAQ;IAEnB;IAGF,KAAK,MAAM,aAAa,OAAO,KAAK,OAAO,GAAG;KAC5C,MAAM,SAAS,QAAQ;KACvB,IAAI;KAEJ,IAAI,OAAO,WAAW,UAAU;MAC9B,YAAY,EAAE,SAAS,OAAO;MAC9B,QAAQ,aAAa;KACvB,OAAO,IAAI,UAAU,OAAO,WAAW,UAAU;MAC/C,YAAY,EAAE,GAAI,OAAmC;MACrD,QAAQ,aAAa;KACvB,OACE;KAGF,sBAAsB,SAAS;IACjC;IAEA,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,GAClC,OAAO,UAAU,CAAC;GAEtB;SAEA,OAAO,UAAU,CAAC;EAGpB,cAAc,eAAe,6BAA6B,MAAwB,CAAC;EACnF;CACF;CAEA,MAAM,aAAa,KAAK,aAAa,iBAAiB;CACtD,IAAI,WAAW,UAAU,GAAG;EAC1B,MAAM,SAAS,KAAK,MAAM,aAAa,YAAY,OAAO,CAAC;EAE3D,OAAO,UAAU,SAAS,KAAK,eAAe,GAAG,KAAK;EAEtD,IAAI,KAAK,SACP,OAAO,UAAU,KAAK;EAExB,IAAI,KAAK,QACP,OAAO,SAAS,KAAK;EAEvB,IAAI,KAAK,YACP,OAAO,aAAa,KAAK;OAEzB,OAAO,OAAO;EAIhB,KAAK,MAAM,SAAS;GADO;GAAS;GAAe;GAAW;EAC1B,GAClC,IAAI,EAAE,SAAS,OACb,OAAO,OAAO;EAIlB,aAAa,MAAM;EAEnB,IAAI,OAAO,OAAO,OAAO,OAAO,QAAQ,UAAU;GAChD,MAAM,MAAM,OAAO;GAEnB,KAAK,MAAM,YAAY,OAAO,KAAK,GAAG,GAAG;IACvC,IACE,CAAC,IAAI,QAA2B,MAC/B,aAAa,UAAU,aAAa,QAAQ,aAAa,QAC1D;KACA,OAAO,IAAI;KACX;IACF;IACA,IAAI,aAAa,QAAQ;KACvB,OAAO,IAAI;KACX;IACF;IACA,MAAM,QAAQ,IAAI;IAClB,IAAI,SAAS,OAAO,UAAU,UAC5B,sBAAsB,KAAgC;GAE1D;GAEA,IAAI,kBAAkB,QACpB,IAAI,OAAO;GAGb,IAAI,OAAO,KAAK,GAAG,CAAC,CAAC,WAAW,GAC9B,OAAO,OAAO;EAElB;EAEA,IAAI,IAAI,SAAS,GACf;OAAI,OAAO,WAAW,OAAO,OAAO,YAAY,UAAU;IACxD,MAAM,UAAU,OAAO;IAEvB,IAAI,KAAK,YAAY,QACnB;UAAK,MAAM,aAAa,OAAO,KAAK,OAAO,GACzC,IAAI,CAAC,KAAK,QAAQ,SAAS,SAAS,GAClC,OAAO,QAAQ;IAEnB;IAGF,KAAK,MAAM,aAAa,OAAO,KAAK,OAAO,GAAG;KAC5C,MAAM,SAAS,QAAQ;KACvB,IAAI;KAEJ,IAAI,OAAO,WAAW,UAAU;MAC9B,YAAY,EAAE,SAAS,OAAO;MAC9B,QAAQ,aAAa;KACvB,OAAO,IAAI,UAAU,OAAO,WAAW,UAAU;MAC/C,YAAY,EAAE,GAAI,OAAmC;MACrD,QAAQ,aAAa;KACvB,OACE;KAGF,sBAAsB,SAAS;IACjC;IAEA,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,GAClC,OAAO,UAAU,CAAC;GAEtB;SAEA,OAAO,UAAU,CAAC;EAGpB,IAAI,KAAK,SAAS,UAAU,KAAK,gBAAgB;GAC/C,MAAM,kCAAkB,IAAI,IAAI;IAAC;IAAW;IAAW;IAAU;IAAO;GAAS,CAAC;GAClF,MAAM,oCAAoB,IAAI,IAAI;IAChC,GAAG;IACH,GAAG,OAAO,KAAK,KAAK,cAAc;IAClC,GAAG;GACL,CAAC;GAED,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAClC,IAAI,CAAC,kBAAkB,IAAI,GAAG,GAC5B,OAAO,OAAO;GAIlB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,cAAc,GAC3D,IAAI,EAAE,OAAO,WAAW,CAAC,gBAAgB,IAAI,GAAG,KAAK,CAAC,iBAAiB,IAAI,GAAG,GAC5E,OAAO,OAAO;EAGpB;EAEA,MAAM,cAAc,aAAa,MAAM;CACzC;CAEA,KAAK,MAAM,WAAW,CAAC,+BAA+B,kCAAkC,GAAG;EACzF,MAAM,eAAe,KAAK,aAAa,OAAO;EAC9C,IAAI;GACF,OAAO,cAAc,EAAE,OAAO,KAAK,CAAC;EACtC,QAAQ,CAAC;CACX;CAEA,MAAM,UAAU,KAAK,aAAa,cAAc;CAChD,IAAI,WAAW,OAAO,GAAG;EACvB,MAAM,MAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;EACrD,MAAM,eAAe,sBAAsB;GACzC,IAAI,IAAI,IAAI;GACZ,KAAK,IAAI,KAAK;GACd,MAAM,IAAI,MAAM;GAChB,SAAS,IAAI,SAAS;EACxB,CAAC;EAED,IAAI,OAAO,IAAI,SAAS,YAAY,IAAI,KAAK,WAAW,GACtD,IAAI,OAAO;EAEb,IAAI,UAAU;EACd,IAAI,OAAO;EACX,IAAI,iBAAiB;EACrB,OAAO,IAAI;EACX,OAAO,IAAI;EACX,OAAO,IAAI;EAEX,MAAM,kBAA4B,CAAC;EACnC,IAAI,IAAI,MAAM,GAAG,gBAAgB,KAAK,MAAM;EAC5C,IAAI,IAAI,IAAI,GAAG,gBAAgB,KAAK,IAAI;EACxC,IAAI,IAAI,KAAK,GAAG,gBAAgB,KAAK,KAAK;EAC1C,IAAI,IAAI,SAAS,GAAG,gBAAgB,KAAK,WAAW;EACpD,MAAM,eACJ,IAAI,cAAc,OAAO,IAAI,eAAe,WACtC,IAAI,WAAoD,WAAW,CAAC,IACtE,CAAC;EACP,OAAO,IAAI;EAEX,IAAI,CAAC,IAAI,WAAW,OAAO,IAAI,YAAY,UACzC,IAAI,UAAU,CAAC;EAEjB,MAAM,UAAU,IAAI;EACpB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,YAAY,GACpD,QAAQ,OAAO;EAEjB,KAAK,MAAM,kBAAkB;GAC3B,GAAG,wBAAwB,WAAW;GACtC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,GACE,IAAI,EAAE,kBAAkB,eACtB,OAAO,QAAQ;EAInB,IAAI,IAAI,mBAAmB,OAAO,IAAI,oBAAoB,UAAU;GAClE,MAAM,OAAO,IAAI;GACjB,OAAO,KAAK;GACZ,OAAO,KAAK;EACd;EAEA,MAAM,UAAkC,EAAE,GAAG,aAAa;EAK1D,IAAI,eAAe;GACjB,kBAAkB;GAClB,gBAAgB;EAClB;EACA,MAAM,OAAO,IAAI;EACjB,MAAM,OAAO,KAAK,eAAe,YAC7B,8BAA8B,KAAK,cAAc,SAAS,IAC1D;EACJ,IAAI,MAAM;GACR,MAAM,2BAA2B,KAAK,YAAY;GAClD,MAAM,yBAAyB,KAAK,YAAY;GAChD,IAAI,0BACF,QAAQ,oBAAoB;GAE9B,IAAI,wBACF,QAAQ,kBAAkB;EAE9B;EACA,MAAM,oBACJ,MAAM,0BAA0B;GAC9B,gBAAgB,KAAK;GACrB,gBAAgB,KAAK;GACrB,WAAW,KAAK,eAAe;EACjC,CAAC,EAAC,CACF;EACF,KAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,gBAAgB,GAC3D,QAAQ,QAAQ;EAElB,IAAI,CAAC,KAAK,mBAAmB,KAAK,oBAAoB;EACtD,IAAI,CAAC,KAAK,iBAAiB,KAAK,kBAAkB;EAElD,cAAc,SAAS,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,GAAG;EAE1D,wBAAwB,aAAa;GAAE,UAAU;GAAiB;EAAQ,CAAC;CAC7E;CAEA,MAAM,kBAAkB,KAAK,aAAa,OAAO,eAAe;CAChE,IAAI,WAAW,eAAe,GAAG;EAC/B,MAAM,cAAc,KAAK,MAAM,aAAa,iBAAiB,OAAO,CAAC;EAIrE,IAAI,YAAY,OAAO;GACrB,MAAM,aAAa,YAAY,MAAM,QAAQ,MAAM,WAAW,KAAK,aAAa,OAAO,CAAC,CAAC,CAAC;GAC1F,IAAI,WAAW,WAAW,YAAY,MAAM,QAAQ;IAClD,IAAI,WAAW,WAAW,GACxB,OAAO,YAAY;SAEnB,YAAY,QAAQ;IAEtB,cAAc,iBAAiB,GAAG,KAAK,UAAU,aAAa,MAAM,CAAC,EAAE,GAAG;GAC5E;EACF;CACF;CAEA,MAAM,qBAAqB,aAAa,KAAK,aAAa;CAE1D,IAAI,IAAI,IAAI,GAAG;EACb,MAAM,kBAAkB,KAAK,aAAa,MAAM,OAAO,OAAO,kBAAkB;EAChF,IAAI,CAAC,WAAW,eAAe,GAAG;GAChC,UAAU,QAAQ,eAAe,GAAG,EAAE,WAAW,KAAK,CAAC;GACvD,cAAc,iBAAiB,oDAAoD;EACrF;EAEA,MAAM,YAAY,KAAK,aAAa,MAAM,QAAQ;EAClD,IAAI,CAAC,WAAW,SAAS,GACvB,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;EAG1C,MAAM,cAAc,KAAK,WAAW,UAAU;EAC9C,IAAI,CAAC,WAAW,WAAW,GAAG;GAC5B,MAAM,QAAQ,KAAK,SAAS,KAAK,WAAW;GAC5C,cAAc,aAAa,kBAAkB,KAAK,CAAC;EACrD;EAEA,MAAM,cAAc,KAAK,WAAW,UAAU;EAC9C,IAAI,CAAC,WAAW,WAAW,GAAG;GAC5B,MAAM,QAAQ,KAAK,SAAS,KAAK,WAAW;GAC5C,MAAM,aAAa,KAAK,cAAc;GACtC,cAAc,aAAa,kBAAkB,OAAO,UAAU,CAAC;EACjE;EAEA,KAAK,MAAM,iBAAiB,CAAC,aAAa,WAAW,GAAG;GACtD,MAAM,UAAU,aAAa,eAAe,OAAO;GACnD,IAAI,QAAQ,SAAS,sBAAsB,GAAG;GAC9C,cAAc,eAAe,GAAG,QAAQ,QAAQ,QAAQ,IAAI,IAAI,sBAAsB;EACxF;CACF;CAEA,IAAI,IAAI,KAAK,GAAG;EACd,MAAM,uBAAuB,KAAK,aAAa,OAAO,OAAO,OAAO,sBAAsB;EAC1F,IAAI,CAAC,WAAW,oBAAoB,GAAG;GACrC,UAAU,QAAQ,oBAAoB,GAAG,EAAE,WAAW,KAAK,CAAC;GAC5D,cACE,sBACA,mPACF;EACF;CACF;CAEA,MAAM,iBAA2B,CAAC;CAClC,IAAI,IAAI,IAAI,GACV,eAAe,KAAK,KAAK,aAAa,MAAM,OAAO,OAAO,mBAAmB,CAAC;CAEhF,IAAI,IAAI,KAAK,GACX,eAAe,KAAK,KAAK,aAAa,OAAO,OAAO,OAAO,mBAAmB,CAAC;CAEjF,IAAI,IAAI,MAAM,KAAK,WAAW,KAAK,aAAa,QAAQ,KAAK,CAAC,GAC5D,eAAe,KAAK,KAAK,aAAa,QAAQ,OAAO,OAAO,mBAAmB,CAAC;CAElF,KAAK,MAAM,oBAAoB,gBAC7B,IAAI,CAAC,WAAW,gBAAgB,GAAG;EACjC,UAAU,QAAQ,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;EACxD,MAAM,gBAAgB,qBACpB,KAAK,aAAa,QAAQ,aAAa,QAAQ,kBAAkB,GACjE,gBACF;EACA,MAAM,cAAc,qBAClB,KAAK,aAAa,QAAQ,aAAa,QAAQ,eAAe,GAC9D,gBACF;EACA,cAAc,kBAAkB,yBAAyB,eAAe,WAAW,CAAC;CACtF;CAGF,IAAI,eAAe,SAAS,GAAG;EAC7B,MAAM,UAAU,KAAK,aAAa,QAAQ,aAAa,MAAM;EAC7D,IAAI,CAAC,WAAW,OAAO,GACrB,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;EAExC,MAAM,qBAAqB,KAAK,SAAS,kBAAkB;EAC3D,IAAI,CAAC,WAAW,kBAAkB,GAChC,cAAc,oBAAoB,oBAAoB,CAAC;EAEzD,MAAM,mBAAmB,KAAK,SAAS,eAAe;EACtD,IAAI,CAAC,WAAW,gBAAgB,GAC9B,cAAc,kBAAkB,sBAAsB,CAAC;CAE3D;CAEA,IAAI,IAAI,SAAS,GACf,KAAK,MAAM,UAAU,KAAK,WAAW,CAAC,GAAG;EACvC,MAAM,eAAe,KAAK,aAAa,WAAW,QAAQ,KAAK;EAC/D,MAAM,kBAAkB,KAAK,cAAc,UAAU;EACrD,MAAM,sBAAsB,KAAK,cAAc,OAAO,uBAAuB;EAC7E,IAAI,CAAC,WAAW,eAAe,KAAK,WAAW,mBAAmB,GAChE;EAGF,IAAI,CADgB,aAAa,iBAAiB,OACnC,CAAC,CAAC,SAAS,0BAA0B,GAClD;EAEF,cAAc,qBAAqB,sDAAsD;CAC3F;AAEJ;AAEA,SAAS,qBAAqB,UAAkB,QAAwB;CACtE,MAAM,MAAM,SAAS,QAAQ,MAAM,GAAG,QAAQ;CAC9C,OAAO,IAAI,WAAW,GAAG,IAAI,MAAM,KAAK;AAC1C;AAEA,eAAsB,eACpB,aACA,MAGe;CACf,MAAM,gBACJ,QACA,CAAC,WAAW,kBAAkB,GAC9B,aACA,MAAM,SACN,yBACF;AACF;AAEA,eAAsB,yBACpB,aACA,MAGe;CACf,MAAM,gBACJ,QACA,CAAC,WAAW,SAAS,GACrB,aACA,MAAM,SACN,yBACF;AACF;AAEA,eAAsB,YACpB,aACA,MAIe;CACf,MAAM,YAAY,KAAK,aAAa,gBAAgB,kBAAkB,QAAQ,SAAS;CACvF,IAAI,WAAW,SAAS,GAAG;EACzB,MAAM,OAAO;GAAC;GAAW;GAAS;EAAK;EACvC,IAAI,MAAM,iBAAiB,KAAK,cAAc,SAAS,GACrD,KAAK,KAAK,oBAAoB,KAAK,cAAc,KAAK,GAAG,CAAC;EAE5D,MAAM,gBAAgB,QAAQ,UAAU,MAAM,aAAa,MAAM,SAAS,kBAAkB;EAC5F;CACF;CAEA,MAAM,IAAI,MAAM,+CAA+C;AACjE;AAIA,eAAe,gBACb,SACA,MACA,KACA,SACA,OACe;CACf,MAAM,UAAU,iBAAiB,YAAY;CAC7C,MAAM,QAAQ,MAAM,SAAS,MAAM;EACjC;EACA,OAAO;EACP;EACA,KAAK;GAAE,GAAG,QAAQ;GAAK,eAAe;EAAI;CAC5C,CAAC;CAED,IAAI,SAAS;EACX,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,WAAW,kBAAkB;GACjC,MAAM,UAAU,KAAK,OAAO,KAAK,IAAI,IAAI,SAAS,GAAI;GACtD,QAAQ,QAAQ,GAAG,MAAM,OAAO,QAAQ,GAAG;EAC7C,GAAG,GAAI;EACP,IAAI;GACF,MAAM;EACR,UAAU;GACR,cAAc,QAAQ;EACxB;CACF,OACE,MAAM;AAEV;AAEA,eAAsB,uBACpB,aACA,cACA,MAciB;CACjB,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;CAE1C,MAAM,OAAO,YAA6B,KAAK,UAAU,SAAS,OAAO;CAEzE,MAAM,SAAkC;EACtC,SAAS,SAAS,KAAK,eAAe,GAAG,KAAK;EAC9C,SAAS,KAAK,WAAW,KAAK;EAC9B,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;EAC7C,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;EACzD,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;EAC1C,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;EAC5D,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;CAClD;CAEA,IAAI,aAAa,OAAO,OAAO,aAAa,QAAQ,UAAU;EAC5D,MAAM,MAA+B,CAAC;EACtC,MAAM,YAAY,aAAa;EAE/B,IAAI,IAAI,MAAM,KAAK,UAAU,MAAM;GACjC,IAAI,OAAO,EAAE,GAAG,UAAU,KAAK;GAC/B,sBAAsB,IAAI,IAA+B;EAC3D;EAEA,IAAI,IAAI,IAAI,KAAK,UAAU,IAAI;GAC7B,IAAI,KAAK,EAAE,GAAG,UAAU,GAAG;GAC3B,sBAAsB,IAAI,EAA6B;EACzD;EAEA,IAAI,IAAI,KAAK,KAAK,UAAU,KAAK;GAC/B,IAAI,MAAM,EAAE,GAAG,UAAU,IAAI;GAC7B,sBAAsB,IAAI,GAA8B;EAC1D;EAEA,IAAI,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,GAC5B,OAAO,MAAM;CAEjB;CAEA,IAAI,IAAI,SAAS,KAAK,KAAK,WAAW,KAAK,QAAQ,SAAS,KAAK,aAAa,SAAS;EACrF,MAAM,UAAmC,CAAC;EAC1C,KAAK,MAAM,OAAO,KAAK,SAAS;GAC9B,MAAM,eAAgB,aAAa,UAAsC;GACzE,IAAI,cAAc;IAChB,IAAI,OAAO,iBAAiB,UAC1B,QAAQ,OAAO,EAAE,SAAS,aAAa;SAClC;KACL,MAAM,aAAa,EAAE,GAAI,aAAyC;KAClE,sBAAsB,UAAU;KAChC,QAAQ,OAAO;IACjB;GACF;EACF;EACA,OAAO,UAAU;CACnB,OAAO,IAAI,IAAI,SAAS,GACtB,OAAO,UAAU,CAAC;CAGpB,MAAM,cAAc,aAAa,MAAM;CAEvC,MAAM,oBAA8B,CAAC;CACrC,KAAK,MAAM,WAAW,KAAK,WACzB,kBAAkB,KAAK,GAAG,uBAAuB,QAAQ;CAE3D,IAAI,IAAI,SAAS,GACf,kBAAkB,KAAK,WAAW;CAGpC,MAAM,WACJ,MAAM,0BAA0B;EAC9B,gBAAgB,KAAK;EACrB,gBAAgB,KAAK;EACrB,WAAW,KAAK;CAClB,CAAC,EAAC,CACF;CAEF,MAAM,MAA+B;EACnC,MAAM;EACN,SAAS;EACT,MAAM;EACN,gBAAgB;EAChB,SAAS,sBAAsB;GAC7B,IAAI,IAAI,IAAI;GACZ,KAAK,IAAI,KAAK;GACd,MAAM,IAAI,MAAM;GAChB,SAAS,IAAI,SAAS;EACxB,CAAC;EACD,cAAc;GACZ,kBAAkB;GAClB,gBAAgB;EAClB;EACA,iBAAiB,CAAC;CACpB;CACA,cAAc,KAAK,aAAa,cAAc,GAAG,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,GAAG;CAEpF,wBAAwB,aAAa;EAAE,UAAU;EAAmB;CAAQ,CAAC;CAE7E,cAAc,KAAK,aAAa,YAAY,GAAG,kBAAkB,CAAC;CAElE,OAAO;AACT;AAEA,eAAe,qBACb,aACA,SACe;CACf,MAAM,gCAAgC;EACpC,eAAe,SAAS,aAAa;EACrC,WAAW;EACX,oBAAoB;EACpB,qBAAqB;EACrB,qBAAqB,CAAC,MAAM;CAC9B,CAAC;AACH;AAEA,eAAsB,kBACpB,aACA,gBACA,gBACA,WACA,UACA,SAMe;CACf,MAAM,aAAa;EAAC;EAAsB;EAAc;EAAc;CAAY;CAClF,MAAM,SAAS,QAAQ,SAAS,CAAC,GAAG,YAAY,GAAG,QAAQ,MAAM,IAAI;CAErE,MAAM,2BAAW,IAAI,IAAY;CACjC,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,UAAU,MAAM,KAAK,SAAS;GAClC,KAAK;GACL,OAAO;GACP,KAAK;GACL,UAAU;GACV;EACF,CAAC;EACD,KAAK,MAAM,SAAS,SAClB,SAAS,IAAI,KAAK;CAEtB;CACA,IAAI,CAAC,QAAQ,UAAU,SAAS,KAAK,GACnC;OAAK,MAAM,SAAS,UAClB,IAAI,kBAAkB,KAAK,GAAG,SAAS,OAAO,KAAK;CACrD;CAEF,IAAI,CAAC,QAAQ,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,UAAU,SAAS,MAAM,GAC1E;OAAK,MAAM,SAAS,UAClB,IAAI,sBAAsB,KAAK,GAAG,SAAS,OAAO,KAAK;CACzD;CAGF,MAAM,aAAqC,CAAC;CAC5C,KAAK,MAAM,YAAY,UAAU;EAC/B,MAAM,MAAM,KAAK,WAAW,QAAQ;EAEpC,IAAI,CADS,UAAU,GACf,CAAC,CAAC,OAAO,GAAG;EACpB,MAAM,WAAW,4BAA4B,QAAQ;EAGrD,IAAI,CAAC,WAAW,KAAK,aAAa,QAAQ,CAAC,GAAG;EAC9C,MAAM,UAAU,aAAa,GAAG;EAChC,WAAW,YAAYC,oBAAY,OAAO;CAC5C;CAEA,MAAM,cAAc,aAAa;EAC/B,WAAW,SAAS,eAAe,GAAG;EACtC,OAAO;EACP,SAAS,QAAQ;CACnB,CAAC;AACH;AAEA,SAAS,SAAS,QAAwB;CACxC,OAAO,YAAY,KAAK,OAAO,GAAG,GAAG,OAAO,EAAE,CAAC;AACjD;AAEA,eAAsB,2BAA2B,aAAoC;CACnF,MAAM,iBAAiB,MAAM,KAAK,wBAAwB;EACxD,KAAK;EACL,OAAO;EACP,KAAK;EACL,UAAU;EACV,QAAQ,CAAC,oBAAoB;CAC/B,CAAC;CAED,KAAK,MAAM,cAAc,gBAAgB;EACvC,MAAM,eAAe,QAAQ,UAAU;EACvC,MAAM,UAAU,KAAK,aAAa,cAAc,cAAc;EAC9D,IAAI,CAAC,WAAW,OAAO,GAAG;EAI1B,IAAI,CAFQ,KAAK,MAAM,aAAa,SAAS,OAAO,CAClC,CAAC,CAAC,UACL,gBAAgB;EAG/B,MAAM,YAAY,QAAQ;GAAC;GAAS;GAAO;GAAQ;GAAe;EAAU,GADhE,KAAK,aAAa,YACmD,CAAC;CACpF;AACF;AAEA,MAAM,mBAA2C;CAC/C,MAAM;CACN,QAAQ;CACR,cAAc;CACd,KAAK;AACP;AAEA,eAAsB,YACpB,SACA,MACA,KACA,SACe;CACf,MAAM,UAAU,iBAAiB,YAAY;CAC7C,MAAM,MAAM,SAAS,MAAM;EAAE;EAAK,OAAO,SAAS,SAAS;EAAQ;CAAQ,CAAC;AAC9E;AAEA,SAAgB,mBAAmB,SAAyB;CAC1D,MAAM,QAAQ,QAAQ,MAAM,gEAAgE;CAC5F,OAAO,QAAQ,MAAM,KAAK;AAC5B;AAEA,SAAS,6BAA6B,MAG3B;CACT,MAAM,OAAO,YAA6B,KAAK,UAAU,SAAS,OAAO;CACzE,MAAM,QAAkB,CAAC;CAEzB,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oQA6DuP;CAElQ,MAAM,YAAY,CAChB,uFACF;CACA,IAAI,IAAI,IAAI,GACV,UAAU,KAAK,8EAA8E;CAC/F,IAAI,IAAI,KAAK,GAAG,UAAU,KAAK,yDAAyD;CACxF,IAAI,IAAI,MAAM,GACZ,UAAU,KAAK,uEAAuE;CACxF,IAAI,IAAI,SAAS,GACf,UAAU,KAAK,2EAA2E;CAC5F,UAAU,KACR,IACA,2FACF;CACA,MAAM,KAAK,sBAAsB,UAAU,KAAK,IAAI,GAAG;CAEvD,MAAM,KAAK;;;;;0GAK6F;CAExG,MAAM,KAAK;;;;;;;;;;;;6BAYgB;CAE3B,MAAM,cAAwB,CAAC,oBAAoB;CACnD,IAAI,IAAI,IAAI,GACV,YAAY,KAAK,mEAAmE;CACtF,IAAI,IAAI,KAAK,GACX,YAAY,KAAK,qEAAqE;CACxF,IAAI,IAAI,MAAM,GACZ,YAAY,KACV,uHACF;CACF,YAAY,KACV,mGACF;CACA,YAAY,KACV,wFACF;CACA,MAAM,KAAK,sBAAsB,YAAY,KAAK,IAAI,GAAG;CAEzD,MAAM,KAAK;;;;;gDAKmC;CAE9C,IAAI,IAAI,KAAK,GACX,MAAM,KAAK;;;oEAGqD;CAGlE,IAAI,IAAI,SAAS,GACf,MAAM,KAAK;;;;;;;;;;;;;;;;;6FAiB8E;CAG3F,MAAM,eAAyB,CAAC;CAChC,IAAI,IAAI,KAAK,KAAK,IAAI,MAAM,KAAK,IAAI,IAAI,GAAG;EAC1C,aAAa,KAAK,kCAAkC;EACpD,aAAa,KAAK,gDAAgD;EAClE,aAAa,KAAK,oCAAoC;CACxD;CACA,IAAI,aAAa,SAAS,GACxB,MAAM,KAAK;;;;EAIb,aAAa,KAAK,IAAI,EAAE;OACnB;CAGL,MAAM,KAAK;;;;;;;;;;;;;;OAcN;CAEL,IAAI,IAAI,IAAI,GACV,MAAM,KAAK;;;;;;;;OAQR;CAGL,MAAM,KAAK;;;;;;;;;;kHAUqG;CAEhH,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;uSAqB0R;CAErS,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;qDAwBwC;CAEnD,OAAO,GAAG,MAAM,KAAK,MAAM,EAAE;AAC/B;AAEA,SAAgB,mBACd,aACA,MAIQ;CACR,OAAO,GAAG,YAAY,MAAM,6BAA6B,IAAI;AAC/D;AAEA,eAAsB,oBACpB,aACA,MAIe;CACf,MAAM,eAAe,KAAK,aAAa,WAAW;CAClD,IAAI,CAAC,WAAW,YAAY,GAAG;CAG/B,MAAM,cAAc,mBADJ,aAAa,cAAc,OACE,CAAC;CAC9C,IAAI,CAAC,aAAa;CAElB,MAAM,eAAe,mBAAmB,aAAa,IAAI;CACzD,cAAc,cAAc,YAAY;AAC1C;AAEA,SAAS,oBAA4B;CACnC,OAAO;;;;;;;;AAQT;AAEA,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;;;;;;AAO7B,SAAgB,kBAAkB,OAAuB;CACvD,OAAO,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCpB;AAEA,SAAgB,kBAAkB,OAAe,YAA4B;CAK3E,OAAO,KAAK,MAAM;;8DAE0C,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EANjD,aACb,kBAAkB,WAAW,sEAC7B,mFAuEK;;AAEX"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "everything-dev",
3
- "version": "2.0.0-rc.0",
3
+ "version": "2.0.0-rc.1",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=20.11"