@agent-native/core 0.111.2 → 0.111.4

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.
@@ -1,3 +1,4 @@
1
+ import { spawnSync } from "node:child_process";
1
2
  import fs from "node:fs";
2
3
  import { createRequire } from "node:module";
3
4
  import path from "node:path";
@@ -52,6 +53,70 @@ function packageNameFromSpecifier(specifier) {
52
53
  const [name] = specifier.split("/");
53
54
  return name && !name.startsWith(".") ? name : null;
54
55
  }
56
+ function isPackageInstalled(requireFromProject, packageName) {
57
+ const searchPaths = requireFromProject.resolve.paths(packageName) ?? [];
58
+ return searchPaths.some((searchPath) => fs.existsSync(path.join(searchPath, packageName, "package.json")));
59
+ }
60
+ export function createMigrationPlanningTargetResolver(projectRoot) {
61
+ const fallbackPath = path.join(path.resolve(projectRoot), "package.json");
62
+ return (specifier, sourceFile = fallbackPath) => {
63
+ const requireFromSource = createRequire(sourceFile);
64
+ try {
65
+ requireFromSource.resolve(specifier);
66
+ return true;
67
+ }
68
+ catch {
69
+ const packageName = packageNameFromSpecifier(specifier);
70
+ return Boolean(packageName && !isPackageInstalled(requireFromSource, packageName));
71
+ }
72
+ };
73
+ }
74
+ const FRESH_RESOLVE_SCRIPT = [
75
+ 'const { createRequire } = require("node:module");',
76
+ "try {",
77
+ " createRequire(process.argv[1]).resolve(process.argv[2]);",
78
+ "} catch {",
79
+ " process.exitCode = 1;",
80
+ "}",
81
+ ].join("\n");
82
+ function nodeConditionArgs() {
83
+ const conditions = [];
84
+ for (let index = 0; index < process.execArgv.length; index += 1) {
85
+ const argument = process.execArgv[index];
86
+ if (argument === "--conditions" || argument === "-C") {
87
+ const value = process.execArgv[index + 1];
88
+ if (value) {
89
+ conditions.push(argument, value);
90
+ index += 1;
91
+ }
92
+ }
93
+ else if (argument.startsWith("--conditions=") ||
94
+ argument.startsWith("-C=")) {
95
+ conditions.push(argument);
96
+ }
97
+ }
98
+ return conditions;
99
+ }
100
+ function createFreshMigrationTargetResolver(projectRoot) {
101
+ const fallbackPath = path.join(path.resolve(projectRoot), "package.json");
102
+ const cache = new Map();
103
+ return (specifier, sourceFile = fallbackPath) => {
104
+ const resolutionBase = nearestPackageFile(sourceFile, projectRoot) ?? sourceFile;
105
+ const key = `${resolutionBase}\0${specifier}`;
106
+ const cached = cache.get(key);
107
+ if (cached !== undefined)
108
+ return cached;
109
+ const resolved = spawnSync(process.execPath, [
110
+ ...nodeConditionArgs(),
111
+ "-e",
112
+ FRESH_RESOLVE_SCRIPT,
113
+ resolutionBase,
114
+ specifier,
115
+ ], { stdio: "ignore" }).status === 0;
116
+ cache.set(key, resolved);
117
+ return resolved;
118
+ };
119
+ }
55
120
  function nearestPackageFile(file, root) {
56
121
  let directory = path.dirname(file);
57
122
  const boundary = path.resolve(root);
@@ -104,7 +169,7 @@ function rewriteImportDeclaration(declaration, move, root, pendingDependencies,
104
169
  warnSkippedTarget(warnings, sourceFile.getFilePath(), move.to, "planned");
105
170
  return false;
106
171
  }
107
- if (!targetExists(move.to)) {
172
+ if (!targetExists(move.to, sourceFile.getFilePath())) {
108
173
  warnSkippedTarget(warnings, sourceFile.getFilePath(), move.to, "unresolved");
109
174
  return false;
110
175
  }
@@ -127,7 +192,7 @@ function rewriteImportDeclaration(declaration, move, root, pendingDependencies,
127
192
  warnSkippedTarget(warnings, sourceFile.getFilePath(), resolved.to, "planned");
128
193
  continue;
129
194
  }
130
- if (!targetExists(resolved.to)) {
195
+ if (!targetExists(resolved.to, sourceFile.getFilePath())) {
131
196
  warnSkippedTarget(warnings, sourceFile.getFilePath(), resolved.to, "unresolved");
132
197
  continue;
133
198
  }
@@ -173,7 +238,7 @@ function rewriteExportDeclarations(sourceFile, moves, root, pendingDependencies,
173
238
  warnSkippedTarget(warnings, sourceFile.getFilePath(), move.to, "planned");
174
239
  continue;
175
240
  }
176
- if (!targetExists(move.to)) {
241
+ if (!targetExists(move.to, sourceFile.getFilePath())) {
177
242
  warnSkippedTarget(warnings, sourceFile.getFilePath(), move.to, "unresolved");
178
243
  continue;
179
244
  }
@@ -196,7 +261,7 @@ function rewriteExportDeclarations(sourceFile, moves, root, pendingDependencies,
196
261
  warnSkippedTarget(warnings, sourceFile.getFilePath(), resolved.to, "planned");
197
262
  continue;
198
263
  }
199
- if (!targetExists(resolved.to)) {
264
+ if (!targetExists(resolved.to, sourceFile.getFilePath())) {
200
265
  warnSkippedTarget(warnings, sourceFile.getFilePath(), resolved.to, "unresolved");
201
266
  continue;
202
267
  }
@@ -287,17 +352,7 @@ export function runMigrationCodemods(options) {
287
352
  const root = path.resolve(options.root);
288
353
  const manifests = options.manifests ?? loadMigrationManifests(root);
289
354
  const moves = mergeManifestMoves(manifests);
290
- const requireFromProject = createRequire(path.join(root, "package.json"));
291
- const targetExists = options.targetExists ??
292
- ((specifier) => {
293
- try {
294
- requireFromProject.resolve(specifier);
295
- return true;
296
- }
297
- catch {
298
- return false;
299
- }
300
- });
355
+ const targetExists = options.targetExists ?? createFreshMigrationTargetResolver(root);
301
356
  const project = new Project({
302
357
  skipAddingFilesFromTsConfig: true,
303
358
  manipulationSettings: { quoteKind: QuoteKind.Double },
@@ -1 +1 @@
1
- {"version":3,"file":"migration-codemod.js","sourceRoot":"","sources":["../../src/cli/migration-codemod.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport {\n Project,\n QuoteKind,\n type ImportDeclaration,\n type ImportSpecifierStructure,\n type SourceFile,\n} from \"ts-morph\";\n\nimport {\n bundledCorePackageVersion,\n isMigrationManifestActive,\n loadMigrationManifestsForProject,\n migrationMoveStatus,\n resolveMigrationSymbolMove,\n type MigrationManifest,\n type MigrationMove,\n} from \"../package-lifecycle/migration-manifest.js\";\n\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\"]);\nconst SKIP_DIRECTORIES = new Set([\n \".git\",\n \".next\",\n \".output\",\n \".turbo\",\n \"build\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n]);\n\nexport interface MigrationCodemodFileChange {\n file: string;\n before: string;\n after: string;\n}\n\nexport interface MigrationCodemodResult {\n changes: MigrationCodemodFileChange[];\n dependencyFiles: string[];\n warnings: string[];\n}\n\nexport interface RunMigrationCodemodsOptions {\n root: string;\n manifests?: MigrationManifest[];\n apply?: boolean;\n targetExists?: (specifier: string) => boolean;\n}\n\ninterface PendingDependency {\n packageFile: string;\n packageName: string;\n}\n\nfunction collectSourceFiles(root: string): string[] {\n const files: string[] = [];\n const visit = (directory: string): void => {\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n if (entry.isDirectory() && SKIP_DIRECTORIES.has(entry.name)) continue;\n const entryPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n visit(entryPath);\n } else if (\n SOURCE_EXTENSIONS.has(path.extname(entry.name)) &&\n !entry.name.endsWith(\".d.ts\")\n ) {\n files.push(entryPath);\n }\n }\n };\n visit(root);\n return files.sort();\n}\n\nfunction mergeManifestMoves(\n manifests: MigrationManifest[],\n): Record<string, MigrationMove> {\n const moves: Record<string, MigrationMove> = {};\n for (const manifest of manifests) {\n Object.assign(moves, manifest.moves);\n }\n return moves;\n}\n\nexport function loadMigrationManifests(\n projectRoot: string,\n): MigrationManifest[] {\n const packageVersion = bundledCorePackageVersion();\n return loadMigrationManifestsForProject(projectRoot).filter((manifest) =>\n isMigrationManifestActive(manifest, packageVersion),\n );\n}\n\nfunction packageNameFromSpecifier(specifier: string): string | null {\n if (specifier.startsWith(\"@\")) {\n const [scope, name] = specifier.split(\"/\");\n return scope && name ? `${scope}/${name}` : null;\n }\n const [name] = specifier.split(\"/\");\n return name && !name.startsWith(\".\") ? name : null;\n}\n\nfunction nearestPackageFile(file: string, root: string): string | null {\n let directory = path.dirname(file);\n const boundary = path.resolve(root);\n while (directory.startsWith(boundary)) {\n const packageFile = path.join(directory, \"package.json\");\n if (fs.existsSync(packageFile)) return packageFile;\n if (directory === boundary) break;\n directory = path.dirname(directory);\n }\n return null;\n}\n\nfunction recordIntroducedDependency(\n pending: PendingDependency[],\n sourceFile: string,\n root: string,\n from: string,\n to: string,\n): void {\n const fromPackage = packageNameFromSpecifier(from);\n const toPackage = packageNameFromSpecifier(to);\n if (!toPackage || toPackage === fromPackage) return;\n const packageFile = nearestPackageFile(sourceFile, root);\n if (!packageFile) return;\n if (\n !pending.some(\n (entry) =>\n entry.packageFile === packageFile && entry.packageName === toPackage,\n )\n ) {\n pending.push({ packageFile, packageName: toPackage });\n }\n}\n\nfunction importedNameStructure(\n importedName: string,\n localName: string,\n nextName: string,\n typeOnly: boolean,\n): ImportSpecifierStructure {\n return {\n name: nextName,\n alias:\n localName !== nextName\n ? localName\n : importedName !== nextName\n ? importedName\n : undefined,\n isTypeOnly: typeOnly,\n };\n}\n\nfunction warnSkippedTarget(\n warnings: string[],\n sourceFile: string,\n target: string,\n reason: \"planned\" | \"unresolved\",\n): void {\n const message =\n reason === \"planned\"\n ? `${sourceFile}: migration to ${target} is planned but not active; no rewrite was applied`\n : `${sourceFile}: migration target ${target} is not exported by an installed package; no rewrite was applied`;\n if (!warnings.includes(message)) warnings.push(message);\n}\n\nfunction rewriteImportDeclaration(\n declaration: ImportDeclaration,\n move: MigrationMove,\n root: string,\n pendingDependencies: PendingDependency[],\n warnings: string[],\n targetExists: (specifier: string) => boolean,\n): boolean {\n const originalSpecifier = declaration.getModuleSpecifierValue();\n const sourceFile = declaration.getSourceFile();\n const namedImports = declaration.getNamedImports();\n\n if (!move.symbols) {\n if (migrationMoveStatus(move) === \"planned\") {\n warnSkippedTarget(warnings, sourceFile.getFilePath(), move.to, \"planned\");\n return false;\n }\n if (!targetExists(move.to)) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"unresolved\",\n );\n return false;\n }\n declaration.setModuleSpecifier(move.to);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n move.to,\n );\n return originalSpecifier !== move.to;\n }\n\n if (namedImports.length === 0) {\n warnings.push(\n `${sourceFile.getFilePath()}: cannot split default, namespace, or side-effect import from ${originalSpecifier}`,\n );\n return false;\n }\n\n const groups = new Map<string, ImportSpecifierStructure[]>();\n const movedImports = new Set<(typeof namedImports)[number]>();\n for (const namedImport of namedImports) {\n const importedName = namedImport.getName();\n const resolved = resolveMigrationSymbolMove(move, importedName);\n if (!resolved || resolved.to === originalSpecifier) continue;\n if (resolved.status === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(resolved.to)) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"unresolved\",\n );\n continue;\n }\n const localName = namedImport.getAliasNode()?.getText() ?? importedName;\n const group = groups.get(resolved.to) ?? [];\n group.push(\n importedNameStructure(\n importedName,\n localName,\n resolved.name,\n !declaration.isTypeOnly() && namedImport.isTypeOnly(),\n ),\n );\n groups.set(resolved.to, group);\n movedImports.add(namedImport);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n resolved.to,\n );\n }\n if (groups.size === 0) return false;\n\n const declarationIndex = declaration.getChildIndex();\n for (const namedImport of movedImports) namedImport.remove();\n let offset = 1;\n for (const [target, imports] of groups) {\n sourceFile.insertImportDeclaration(declarationIndex + offset, {\n moduleSpecifier: target,\n isTypeOnly: declaration.isTypeOnly(),\n namedImports: imports,\n });\n offset += 1;\n }\n if (\n declaration.getNamedImports().length === 0 &&\n !declaration.getDefaultImport() &&\n !declaration.getNamespaceImport()\n ) {\n declaration.remove();\n }\n return true;\n}\n\nfunction rewriteExportDeclarations(\n sourceFile: SourceFile,\n moves: Record<string, MigrationMove>,\n root: string,\n pendingDependencies: PendingDependency[],\n warnings: string[],\n targetExists: (specifier: string) => boolean,\n): void {\n for (const declaration of [...sourceFile.getExportDeclarations()]) {\n const originalSpecifier = declaration.getModuleSpecifierValue();\n if (!originalSpecifier) continue;\n const move = moves[originalSpecifier];\n if (!move) continue;\n const namedExports = declaration.getNamedExports();\n\n if (!move.symbols) {\n if (migrationMoveStatus(move) === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(move.to)) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"unresolved\",\n );\n continue;\n }\n declaration.setModuleSpecifier(move.to);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n move.to,\n );\n continue;\n }\n if (namedExports.length === 0) {\n warnings.push(\n `${sourceFile.getFilePath()}: cannot split export star from ${originalSpecifier}`,\n );\n continue;\n }\n\n const groups = new Map<\n string,\n Array<{ name: string; alias?: string; isTypeOnly?: boolean }>\n >();\n const movedExports = new Set<(typeof namedExports)[number]>();\n for (const namedExport of namedExports) {\n const exportedFromName = namedExport.getName();\n const resolved = resolveMigrationSymbolMove(move, exportedFromName);\n if (!resolved || resolved.to === originalSpecifier) continue;\n if (resolved.status === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(resolved.to)) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"unresolved\",\n );\n continue;\n }\n const publicName =\n namedExport.getAliasNode()?.getText() ?? exportedFromName;\n const group = groups.get(resolved.to) ?? [];\n group.push({\n name: resolved.name,\n alias:\n publicName !== resolved.name\n ? publicName\n : exportedFromName !== resolved.name\n ? exportedFromName\n : undefined,\n isTypeOnly:\n !declaration.isTypeOnly() && namedExport.isTypeOnly()\n ? true\n : undefined,\n });\n groups.set(resolved.to, group);\n movedExports.add(namedExport);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n resolved.to,\n );\n }\n if (groups.size === 0) continue;\n\n const declarationIndex = declaration.getChildIndex();\n for (const namedExport of movedExports) namedExport.remove();\n let offset = 1;\n for (const [target, exports] of groups) {\n sourceFile.insertExportDeclaration(declarationIndex + offset, {\n moduleSpecifier: target,\n isTypeOnly: declaration.isTypeOnly(),\n namedExports: exports,\n });\n offset += 1;\n }\n if (declaration.getNamedExports().length === 0) declaration.remove();\n }\n}\n\nfunction readPackageJson(packageFile: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(packageFile, \"utf-8\")) as Record<\n string,\n unknown\n >;\n } catch {\n return null;\n }\n}\n\nfunction addDependencies(\n pending: PendingDependency[],\n apply: boolean,\n): MigrationCodemodFileChange[] {\n const changes: MigrationCodemodFileChange[] = [];\n const byFile = new Map<string, Set<string>>();\n for (const entry of pending) {\n const packages = byFile.get(entry.packageFile) ?? new Set<string>();\n packages.add(entry.packageName);\n byFile.set(entry.packageFile, packages);\n }\n for (const [packageFile, packageNames] of byFile) {\n const packageJson = readPackageJson(packageFile);\n if (!packageJson) continue;\n const allDependencySections = [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"peerDependencies\",\n ];\n const missing = [...packageNames].filter(\n (packageName) =>\n !allDependencySections.some((section) => {\n const dependencies = packageJson[section];\n return (\n dependencies &&\n typeof dependencies === \"object\" &&\n packageName in dependencies\n );\n }),\n );\n if (missing.length === 0) continue;\n const before = `${JSON.stringify(packageJson, null, 2)}\\n`;\n const dependencies =\n packageJson.dependencies && typeof packageJson.dependencies === \"object\"\n ? (packageJson.dependencies as Record<string, string>)\n : {};\n for (const packageName of missing.sort())\n dependencies[packageName] = \"latest\";\n packageJson.dependencies = Object.fromEntries(\n Object.entries(dependencies).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n const after = `${JSON.stringify(packageJson, null, 2)}\\n`;\n changes.push({ file: packageFile, before, after });\n if (apply) fs.writeFileSync(packageFile, after);\n }\n return changes;\n}\n\nexport function runMigrationCodemods(\n options: RunMigrationCodemodsOptions,\n): MigrationCodemodResult {\n const root = path.resolve(options.root);\n const manifests = options.manifests ?? loadMigrationManifests(root);\n const moves = mergeManifestMoves(manifests);\n const requireFromProject = createRequire(path.join(root, \"package.json\"));\n const targetExists =\n options.targetExists ??\n ((specifier: string): boolean => {\n try {\n requireFromProject.resolve(specifier);\n return true;\n } catch {\n return false;\n }\n });\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: { quoteKind: QuoteKind.Double },\n });\n const sourceFiles = project.addSourceFilesAtPaths(collectSourceFiles(root));\n const pendingDependencies: PendingDependency[] = [];\n const warnings: string[] = [];\n const changes: MigrationCodemodFileChange[] = [];\n\n for (const sourceFile of sourceFiles) {\n const before = sourceFile.getFullText();\n for (const declaration of [...sourceFile.getImportDeclarations()]) {\n const move = moves[declaration.getModuleSpecifierValue()];\n if (!move) continue;\n rewriteImportDeclaration(\n declaration,\n move,\n root,\n pendingDependencies,\n warnings,\n targetExists,\n );\n }\n rewriteExportDeclarations(\n sourceFile,\n moves,\n root,\n pendingDependencies,\n warnings,\n targetExists,\n );\n const after = sourceFile.getFullText();\n if (before === after) continue;\n changes.push({ file: sourceFile.getFilePath(), before, after });\n if (options.apply) sourceFile.saveSync();\n }\n\n const dependencyChanges = addDependencies(\n pendingDependencies,\n Boolean(options.apply),\n );\n return {\n changes: [...changes, ...dependencyChanges],\n dependencyFiles: dependencyChanges.map((change) => change.file),\n warnings,\n };\n}\n\nfunction focusedDiff(change: MigrationCodemodFileChange, root: string): string {\n const beforeLines = change.before.split(\"\\n\");\n const afterLines = change.after.split(\"\\n\");\n let prefix = 0;\n while (\n prefix < beforeLines.length &&\n prefix < afterLines.length &&\n beforeLines[prefix] === afterLines[prefix]\n ) {\n prefix += 1;\n }\n let suffix = 0;\n while (\n suffix < beforeLines.length - prefix &&\n suffix < afterLines.length - prefix &&\n beforeLines[beforeLines.length - 1 - suffix] ===\n afterLines[afterLines.length - 1 - suffix]\n ) {\n suffix += 1;\n }\n const beforeChanged = beforeLines.slice(prefix, beforeLines.length - suffix);\n const afterChanged = afterLines.slice(prefix, afterLines.length - suffix);\n return [\n `--- ${path.relative(root, change.file)}`,\n `+++ ${path.relative(root, change.file)}`,\n `@@ -${prefix + 1} +${prefix + 1} @@`,\n ...beforeChanged.map((line) => `-${line}`),\n ...afterChanged.map((line) => `+${line}`),\n ].join(\"\\n\");\n}\n\nexport function formatMigrationCodemodDiff(\n result: MigrationCodemodResult,\n root: string,\n): string {\n return result.changes\n .map((change) => focusedDiff(change, path.resolve(root)))\n .join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"migration-codemod.js","sourceRoot":"","sources":["../../src/cli/migration-codemod.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport {\n Project,\n QuoteKind,\n type ImportDeclaration,\n type ImportSpecifierStructure,\n type SourceFile,\n} from \"ts-morph\";\n\nimport {\n bundledCorePackageVersion,\n isMigrationManifestActive,\n loadMigrationManifestsForProject,\n migrationMoveStatus,\n resolveMigrationSymbolMove,\n type MigrationManifest,\n type MigrationMove,\n} from \"../package-lifecycle/migration-manifest.js\";\n\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\"]);\nconst SKIP_DIRECTORIES = new Set([\n \".git\",\n \".next\",\n \".output\",\n \".turbo\",\n \"build\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n]);\n\nexport interface MigrationCodemodFileChange {\n file: string;\n before: string;\n after: string;\n}\n\nexport interface MigrationCodemodResult {\n changes: MigrationCodemodFileChange[];\n dependencyFiles: string[];\n warnings: string[];\n}\n\nexport interface RunMigrationCodemodsOptions {\n root: string;\n manifests?: MigrationManifest[];\n apply?: boolean;\n targetExists?: (specifier: string, sourceFile?: string) => boolean;\n}\n\ninterface PendingDependency {\n packageFile: string;\n packageName: string;\n}\n\nfunction collectSourceFiles(root: string): string[] {\n const files: string[] = [];\n const visit = (directory: string): void => {\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n if (entry.isDirectory() && SKIP_DIRECTORIES.has(entry.name)) continue;\n const entryPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n visit(entryPath);\n } else if (\n SOURCE_EXTENSIONS.has(path.extname(entry.name)) &&\n !entry.name.endsWith(\".d.ts\")\n ) {\n files.push(entryPath);\n }\n }\n };\n visit(root);\n return files.sort();\n}\n\nfunction mergeManifestMoves(\n manifests: MigrationManifest[],\n): Record<string, MigrationMove> {\n const moves: Record<string, MigrationMove> = {};\n for (const manifest of manifests) {\n Object.assign(moves, manifest.moves);\n }\n return moves;\n}\n\nexport function loadMigrationManifests(\n projectRoot: string,\n): MigrationManifest[] {\n const packageVersion = bundledCorePackageVersion();\n return loadMigrationManifestsForProject(projectRoot).filter((manifest) =>\n isMigrationManifestActive(manifest, packageVersion),\n );\n}\n\nfunction packageNameFromSpecifier(specifier: string): string | null {\n if (specifier.startsWith(\"@\")) {\n const [scope, name] = specifier.split(\"/\");\n return scope && name ? `${scope}/${name}` : null;\n }\n const [name] = specifier.split(\"/\");\n return name && !name.startsWith(\".\") ? name : null;\n}\n\nfunction isPackageInstalled(\n requireFromProject: ReturnType<typeof createRequire>,\n packageName: string,\n): boolean {\n const searchPaths = requireFromProject.resolve.paths(packageName) ?? [];\n return searchPaths.some((searchPath) =>\n fs.existsSync(path.join(searchPath, packageName, \"package.json\")),\n );\n}\n\nexport function createMigrationPlanningTargetResolver(\n projectRoot: string,\n): (specifier: string, sourceFile?: string) => boolean {\n const fallbackPath = path.join(path.resolve(projectRoot), \"package.json\");\n return (specifier: string, sourceFile = fallbackPath): boolean => {\n const requireFromSource = createRequire(sourceFile);\n try {\n requireFromSource.resolve(specifier);\n return true;\n } catch {\n const packageName = packageNameFromSpecifier(specifier);\n return Boolean(\n packageName && !isPackageInstalled(requireFromSource, packageName),\n );\n }\n };\n}\n\nconst FRESH_RESOLVE_SCRIPT = [\n 'const { createRequire } = require(\"node:module\");',\n \"try {\",\n \" createRequire(process.argv[1]).resolve(process.argv[2]);\",\n \"} catch {\",\n \" process.exitCode = 1;\",\n \"}\",\n].join(\"\\n\");\n\nfunction nodeConditionArgs(): string[] {\n const conditions: string[] = [];\n for (let index = 0; index < process.execArgv.length; index += 1) {\n const argument = process.execArgv[index];\n if (argument === \"--conditions\" || argument === \"-C\") {\n const value = process.execArgv[index + 1];\n if (value) {\n conditions.push(argument, value);\n index += 1;\n }\n } else if (\n argument.startsWith(\"--conditions=\") ||\n argument.startsWith(\"-C=\")\n ) {\n conditions.push(argument);\n }\n }\n return conditions;\n}\n\nfunction createFreshMigrationTargetResolver(\n projectRoot: string,\n): (specifier: string, sourceFile?: string) => boolean {\n const fallbackPath = path.join(path.resolve(projectRoot), \"package.json\");\n const cache = new Map<string, boolean>();\n return (specifier: string, sourceFile = fallbackPath): boolean => {\n const resolutionBase =\n nearestPackageFile(sourceFile, projectRoot) ?? sourceFile;\n const key = `${resolutionBase}\\0${specifier}`;\n const cached = cache.get(key);\n if (cached !== undefined) return cached;\n const resolved =\n spawnSync(\n process.execPath,\n [\n ...nodeConditionArgs(),\n \"-e\",\n FRESH_RESOLVE_SCRIPT,\n resolutionBase,\n specifier,\n ],\n { stdio: \"ignore\" },\n ).status === 0;\n cache.set(key, resolved);\n return resolved;\n };\n}\n\nfunction nearestPackageFile(file: string, root: string): string | null {\n let directory = path.dirname(file);\n const boundary = path.resolve(root);\n while (directory.startsWith(boundary)) {\n const packageFile = path.join(directory, \"package.json\");\n if (fs.existsSync(packageFile)) return packageFile;\n if (directory === boundary) break;\n directory = path.dirname(directory);\n }\n return null;\n}\n\nfunction recordIntroducedDependency(\n pending: PendingDependency[],\n sourceFile: string,\n root: string,\n from: string,\n to: string,\n): void {\n const fromPackage = packageNameFromSpecifier(from);\n const toPackage = packageNameFromSpecifier(to);\n if (!toPackage || toPackage === fromPackage) return;\n const packageFile = nearestPackageFile(sourceFile, root);\n if (!packageFile) return;\n if (\n !pending.some(\n (entry) =>\n entry.packageFile === packageFile && entry.packageName === toPackage,\n )\n ) {\n pending.push({ packageFile, packageName: toPackage });\n }\n}\n\nfunction importedNameStructure(\n importedName: string,\n localName: string,\n nextName: string,\n typeOnly: boolean,\n): ImportSpecifierStructure {\n return {\n name: nextName,\n alias:\n localName !== nextName\n ? localName\n : importedName !== nextName\n ? importedName\n : undefined,\n isTypeOnly: typeOnly,\n };\n}\n\nfunction warnSkippedTarget(\n warnings: string[],\n sourceFile: string,\n target: string,\n reason: \"planned\" | \"unresolved\",\n): void {\n const message =\n reason === \"planned\"\n ? `${sourceFile}: migration to ${target} is planned but not active; no rewrite was applied`\n : `${sourceFile}: migration target ${target} is not exported by an installed package; no rewrite was applied`;\n if (!warnings.includes(message)) warnings.push(message);\n}\n\nfunction rewriteImportDeclaration(\n declaration: ImportDeclaration,\n move: MigrationMove,\n root: string,\n pendingDependencies: PendingDependency[],\n warnings: string[],\n targetExists: (specifier: string, sourceFile?: string) => boolean,\n): boolean {\n const originalSpecifier = declaration.getModuleSpecifierValue();\n const sourceFile = declaration.getSourceFile();\n const namedImports = declaration.getNamedImports();\n\n if (!move.symbols) {\n if (migrationMoveStatus(move) === \"planned\") {\n warnSkippedTarget(warnings, sourceFile.getFilePath(), move.to, \"planned\");\n return false;\n }\n if (!targetExists(move.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"unresolved\",\n );\n return false;\n }\n declaration.setModuleSpecifier(move.to);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n move.to,\n );\n return originalSpecifier !== move.to;\n }\n\n if (namedImports.length === 0) {\n warnings.push(\n `${sourceFile.getFilePath()}: cannot split default, namespace, or side-effect import from ${originalSpecifier}`,\n );\n return false;\n }\n\n const groups = new Map<string, ImportSpecifierStructure[]>();\n const movedImports = new Set<(typeof namedImports)[number]>();\n for (const namedImport of namedImports) {\n const importedName = namedImport.getName();\n const resolved = resolveMigrationSymbolMove(move, importedName);\n if (!resolved || resolved.to === originalSpecifier) continue;\n if (resolved.status === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(resolved.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"unresolved\",\n );\n continue;\n }\n const localName = namedImport.getAliasNode()?.getText() ?? importedName;\n const group = groups.get(resolved.to) ?? [];\n group.push(\n importedNameStructure(\n importedName,\n localName,\n resolved.name,\n !declaration.isTypeOnly() && namedImport.isTypeOnly(),\n ),\n );\n groups.set(resolved.to, group);\n movedImports.add(namedImport);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n resolved.to,\n );\n }\n if (groups.size === 0) return false;\n\n const declarationIndex = declaration.getChildIndex();\n for (const namedImport of movedImports) namedImport.remove();\n let offset = 1;\n for (const [target, imports] of groups) {\n sourceFile.insertImportDeclaration(declarationIndex + offset, {\n moduleSpecifier: target,\n isTypeOnly: declaration.isTypeOnly(),\n namedImports: imports,\n });\n offset += 1;\n }\n if (\n declaration.getNamedImports().length === 0 &&\n !declaration.getDefaultImport() &&\n !declaration.getNamespaceImport()\n ) {\n declaration.remove();\n }\n return true;\n}\n\nfunction rewriteExportDeclarations(\n sourceFile: SourceFile,\n moves: Record<string, MigrationMove>,\n root: string,\n pendingDependencies: PendingDependency[],\n warnings: string[],\n targetExists: (specifier: string, sourceFile?: string) => boolean,\n): void {\n for (const declaration of [...sourceFile.getExportDeclarations()]) {\n const originalSpecifier = declaration.getModuleSpecifierValue();\n if (!originalSpecifier) continue;\n const move = moves[originalSpecifier];\n if (!move) continue;\n const namedExports = declaration.getNamedExports();\n\n if (!move.symbols) {\n if (migrationMoveStatus(move) === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(move.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n move.to,\n \"unresolved\",\n );\n continue;\n }\n declaration.setModuleSpecifier(move.to);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n move.to,\n );\n continue;\n }\n if (namedExports.length === 0) {\n warnings.push(\n `${sourceFile.getFilePath()}: cannot split export star from ${originalSpecifier}`,\n );\n continue;\n }\n\n const groups = new Map<\n string,\n Array<{ name: string; alias?: string; isTypeOnly?: boolean }>\n >();\n const movedExports = new Set<(typeof namedExports)[number]>();\n for (const namedExport of namedExports) {\n const exportedFromName = namedExport.getName();\n const resolved = resolveMigrationSymbolMove(move, exportedFromName);\n if (!resolved || resolved.to === originalSpecifier) continue;\n if (resolved.status === \"planned\") {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"planned\",\n );\n continue;\n }\n if (!targetExists(resolved.to, sourceFile.getFilePath())) {\n warnSkippedTarget(\n warnings,\n sourceFile.getFilePath(),\n resolved.to,\n \"unresolved\",\n );\n continue;\n }\n const publicName =\n namedExport.getAliasNode()?.getText() ?? exportedFromName;\n const group = groups.get(resolved.to) ?? [];\n group.push({\n name: resolved.name,\n alias:\n publicName !== resolved.name\n ? publicName\n : exportedFromName !== resolved.name\n ? exportedFromName\n : undefined,\n isTypeOnly:\n !declaration.isTypeOnly() && namedExport.isTypeOnly()\n ? true\n : undefined,\n });\n groups.set(resolved.to, group);\n movedExports.add(namedExport);\n recordIntroducedDependency(\n pendingDependencies,\n sourceFile.getFilePath(),\n root,\n originalSpecifier,\n resolved.to,\n );\n }\n if (groups.size === 0) continue;\n\n const declarationIndex = declaration.getChildIndex();\n for (const namedExport of movedExports) namedExport.remove();\n let offset = 1;\n for (const [target, exports] of groups) {\n sourceFile.insertExportDeclaration(declarationIndex + offset, {\n moduleSpecifier: target,\n isTypeOnly: declaration.isTypeOnly(),\n namedExports: exports,\n });\n offset += 1;\n }\n if (declaration.getNamedExports().length === 0) declaration.remove();\n }\n}\n\nfunction readPackageJson(packageFile: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(packageFile, \"utf-8\")) as Record<\n string,\n unknown\n >;\n } catch {\n return null;\n }\n}\n\nfunction addDependencies(\n pending: PendingDependency[],\n apply: boolean,\n): MigrationCodemodFileChange[] {\n const changes: MigrationCodemodFileChange[] = [];\n const byFile = new Map<string, Set<string>>();\n for (const entry of pending) {\n const packages = byFile.get(entry.packageFile) ?? new Set<string>();\n packages.add(entry.packageName);\n byFile.set(entry.packageFile, packages);\n }\n for (const [packageFile, packageNames] of byFile) {\n const packageJson = readPackageJson(packageFile);\n if (!packageJson) continue;\n const allDependencySections = [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"peerDependencies\",\n ];\n const missing = [...packageNames].filter(\n (packageName) =>\n !allDependencySections.some((section) => {\n const dependencies = packageJson[section];\n return (\n dependencies &&\n typeof dependencies === \"object\" &&\n packageName in dependencies\n );\n }),\n );\n if (missing.length === 0) continue;\n const before = `${JSON.stringify(packageJson, null, 2)}\\n`;\n const dependencies =\n packageJson.dependencies && typeof packageJson.dependencies === \"object\"\n ? (packageJson.dependencies as Record<string, string>)\n : {};\n for (const packageName of missing.sort())\n dependencies[packageName] = \"latest\";\n packageJson.dependencies = Object.fromEntries(\n Object.entries(dependencies).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n const after = `${JSON.stringify(packageJson, null, 2)}\\n`;\n changes.push({ file: packageFile, before, after });\n if (apply) fs.writeFileSync(packageFile, after);\n }\n return changes;\n}\n\nexport function runMigrationCodemods(\n options: RunMigrationCodemodsOptions,\n): MigrationCodemodResult {\n const root = path.resolve(options.root);\n const manifests = options.manifests ?? loadMigrationManifests(root);\n const moves = mergeManifestMoves(manifests);\n const targetExists =\n options.targetExists ?? createFreshMigrationTargetResolver(root);\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: { quoteKind: QuoteKind.Double },\n });\n const sourceFiles = project.addSourceFilesAtPaths(collectSourceFiles(root));\n const pendingDependencies: PendingDependency[] = [];\n const warnings: string[] = [];\n const changes: MigrationCodemodFileChange[] = [];\n\n for (const sourceFile of sourceFiles) {\n const before = sourceFile.getFullText();\n for (const declaration of [...sourceFile.getImportDeclarations()]) {\n const move = moves[declaration.getModuleSpecifierValue()];\n if (!move) continue;\n rewriteImportDeclaration(\n declaration,\n move,\n root,\n pendingDependencies,\n warnings,\n targetExists,\n );\n }\n rewriteExportDeclarations(\n sourceFile,\n moves,\n root,\n pendingDependencies,\n warnings,\n targetExists,\n );\n const after = sourceFile.getFullText();\n if (before === after) continue;\n changes.push({ file: sourceFile.getFilePath(), before, after });\n if (options.apply) sourceFile.saveSync();\n }\n\n const dependencyChanges = addDependencies(\n pendingDependencies,\n Boolean(options.apply),\n );\n return {\n changes: [...changes, ...dependencyChanges],\n dependencyFiles: dependencyChanges.map((change) => change.file),\n warnings,\n };\n}\n\nfunction focusedDiff(change: MigrationCodemodFileChange, root: string): string {\n const beforeLines = change.before.split(\"\\n\");\n const afterLines = change.after.split(\"\\n\");\n let prefix = 0;\n while (\n prefix < beforeLines.length &&\n prefix < afterLines.length &&\n beforeLines[prefix] === afterLines[prefix]\n ) {\n prefix += 1;\n }\n let suffix = 0;\n while (\n suffix < beforeLines.length - prefix &&\n suffix < afterLines.length - prefix &&\n beforeLines[beforeLines.length - 1 - suffix] ===\n afterLines[afterLines.length - 1 - suffix]\n ) {\n suffix += 1;\n }\n const beforeChanged = beforeLines.slice(prefix, beforeLines.length - suffix);\n const afterChanged = afterLines.slice(prefix, afterLines.length - suffix);\n return [\n `--- ${path.relative(root, change.file)}`,\n `+++ ${path.relative(root, change.file)}`,\n `@@ -${prefix + 1} +${prefix + 1} @@`,\n ...beforeChanged.map((line) => `-${line}`),\n ...afterChanged.map((line) => `+${line}`),\n ].join(\"\\n\");\n}\n\nexport function formatMigrationCodemodDiff(\n result: MigrationCodemodResult,\n root: string,\n): string {\n return result.changes\n .map((change) => focusedDiff(change, path.resolve(root)))\n .join(\"\\n\");\n}\n"]}
@@ -2,6 +2,7 @@ export declare const STARTER_APP_NAME = "builder-agent-native-starter";
2
2
  export declare const CHAT_TEMPLATE = "chat";
3
3
  /** Toolchain files that must track templates/chat or typecheck/build drift. */
4
4
  export declare const STARTER_TOOLCHAIN_SYNC_PATHS: readonly ["react-router.config.ts", "vite.config.ts", "tsconfig.json", "ssr-entry.ts", "app/vite-env.d.ts", "app/routes.ts", "server/routes/[...page].get.ts", "server/middleware/auth.ts", "components.json", ".oxfmtrc.json", "netlify.toml"];
5
+ export declare const STARTER_SOURCE_MIGRATION_PATHS: readonly [":(glob)**/*.ts", ":(glob)**/*.tsx"];
5
6
  export type StarterToolchainSyncPath = (typeof STARTER_TOOLCHAIN_SYNC_PATHS)[number];
6
7
  type PackageJson = Record<string, unknown>;
7
8
  export type StandaloneChatSnapshot = {
@@ -12,6 +13,16 @@ export type StandaloneChatSnapshot = {
12
13
  toolchainFiles: Map<StarterToolchainSyncPath, string>;
13
14
  };
14
15
  export declare function listStarterSyncPaths(): string[];
16
+ export declare function migrateStarterSources(options: {
17
+ starterDir: string;
18
+ repoRoot: string;
19
+ coreVersion: string | null;
20
+ write?: boolean;
21
+ }): {
22
+ changedPaths: string[];
23
+ warnings: string[];
24
+ };
25
+ export declare function resolveStarterCoreVersion(starterPackageJson: PackageJson, repoRoot: string): string | null;
15
26
  export declare function findAgentNativeRoot(startDir?: string): string;
16
27
  export declare function collectStarterToolchainFiles(canonicalDir: string): Map<StarterToolchainSyncPath, string>;
17
28
  export declare function createStandaloneChatSnapshot(repoRoot?: string): StandaloneChatSnapshot;
@@ -36,6 +47,8 @@ export type SyncStarterManifestResult = {
36
47
  pnpmWorkspaceYaml: string | null;
37
48
  toolchainChanges: StarterToolchainSyncChange[];
38
49
  changedToolchainPaths: StarterToolchainSyncPath[];
50
+ changedSourceMigrationPaths: string[];
51
+ sourceMigrationWarnings: string[];
39
52
  };
40
53
  export declare function resolveStarterPaths(options: {
41
54
  starterDir?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"sync-builder-starter-manifest.d.ts","sourceRoot":"","sources":["../../src/cli/sync-builder-starter-manifest.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAC/D,eAAO,MAAM,aAAa,SAAS,CAAC;AAEpC,+EAA+E;AAC/E,eAAO,MAAM,4BAA4B,YACvC,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,gCAAgC,EAGhC,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,cAAc,CACN,CAAC;AAgBX,MAAM,MAAM,wBAAwB,GAClC,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;CACvD,CAAC;AAEF,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAO/C;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,SAAgB,GAAG,MAAM,CAmBpE;AAED,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,MAAM,GACnB,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAQvC;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,CAAC,EAAE,MAAM,GAChB,sBAAsB,CAgCxB;AAYD,wBAAgB,8BAA8B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG;IACjE,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAUA;AAsBD,wBAAgB,oBAAoB,CAClC,kBAAkB,EAAE,WAAW,EAC/B,oBAAoB,EAAE,WAAW,GAChC,WAAW,CAgCb;AAED,wBAAgB,wBAAwB,CACtC,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAChC,OAAO,CAKT;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAChC,IAAI,CAQN;AAMD,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,EAAE,wBAAwB,CAAC;IACvC,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,GACpD,0BAA0B,EAAE,CAY9B;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,GACpD,0BAA0B,EAAE,CAsB9B;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,0BAA0B,EAAE,CAAC;IAC/C,qBAAqB,EAAE,wBAAwB,EAAE,CAAC;CACnD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC,GAAG;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,wBAAwB,EAAE,MAAM,CAAC;CAClC,CAyBA;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,yBAAyB,CA6D5B;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAC5D,OAAO,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAqDA;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CA+ChE"}
1
+ {"version":3,"file":"sync-builder-starter-manifest.d.ts","sourceRoot":"","sources":["../../src/cli/sync-builder-starter-manifest.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,9 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
+ import { isMigrationManifestActive, readMigrationManifest, } from "../package-lifecycle/migration-manifest.js";
5
6
  import { _postProcessStandalone } from "./create.js";
7
+ import { runMigrationCodemods } from "./migration-codemod.js";
6
8
  export const STARTER_APP_NAME = "builder-agent-native-starter";
7
9
  export const CHAT_TEMPLATE = "chat";
8
10
  /** Toolchain files that must track templates/chat or typecheck/build drift. */
@@ -21,6 +23,10 @@ export const STARTER_TOOLCHAIN_SYNC_PATHS = [
21
23
  ".oxfmtrc.json",
22
24
  "netlify.toml",
23
25
  ];
26
+ export const STARTER_SOURCE_MIGRATION_PATHS = [
27
+ ":(glob)**/*.ts",
28
+ ":(glob)**/*.tsx",
29
+ ];
24
30
  const STANDALONE_SNAPSHOT_EXCLUDED_TOP_LEVEL = new Set([
25
31
  ".deploy-tmp",
26
32
  ".env",
@@ -40,8 +46,53 @@ export function listStarterSyncPaths() {
40
46
  "pnpm-lock.yaml",
41
47
  "pnpm-workspace.yaml",
42
48
  ...STARTER_TOOLCHAIN_SYNC_PATHS,
49
+ ...STARTER_SOURCE_MIGRATION_PATHS,
43
50
  ];
44
51
  }
52
+ export function migrateStarterSources(options) {
53
+ const manifestPath = path.join(options.repoRoot, "packages/core/migration-manifest.json");
54
+ const manifest = readMigrationManifest(manifestPath);
55
+ if (!manifest) {
56
+ throw new Error(`Could not read migration manifest at ${manifestPath}.`);
57
+ }
58
+ if (!isMigrationManifestActive(manifest, options.coreVersion)) {
59
+ return { changedPaths: [], warnings: [] };
60
+ }
61
+ const result = runMigrationCodemods({
62
+ root: options.starterDir,
63
+ manifests: [manifest],
64
+ apply: options.write,
65
+ // Checked-in migration targets are validated by the manifest guard before
66
+ // this source sync runs; starter dependencies are installed afterward.
67
+ targetExists: () => true,
68
+ });
69
+ return {
70
+ changedPaths: [
71
+ ...new Set(result.changes.map((change) => path.relative(options.starterDir, change.file))),
72
+ ].sort(),
73
+ warnings: result.warnings,
74
+ };
75
+ }
76
+ export function resolveStarterCoreVersion(starterPackageJson, repoRoot) {
77
+ const dependencies = starterPackageJson.dependencies;
78
+ if (dependencies && typeof dependencies === "object") {
79
+ const declared = dependencies["@agent-native/core"];
80
+ if (typeof declared === "string") {
81
+ const version = declared.match(/\d+\.\d+\.\d+/)?.[0];
82
+ if (version)
83
+ return version;
84
+ }
85
+ }
86
+ try {
87
+ const corePackageJson = JSON.parse(fs.readFileSync(path.join(repoRoot, "packages/core/package.json"), "utf-8"));
88
+ return typeof corePackageJson.version === "string"
89
+ ? corePackageJson.version
90
+ : null;
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ }
45
96
  export function findAgentNativeRoot(startDir = process.cwd()) {
46
97
  let dir = path.resolve(startDir);
47
98
  for (let i = 0; i < 12; i++) {
@@ -222,6 +273,14 @@ export function syncStarterManifestFiles(options) {
222
273
  const { starterDir, starterPackageJsonPath, starterPnpmWorkspacePath } = resolveStarterPaths(options);
223
274
  const snapshot = createStandaloneChatSnapshot(options.repoRoot);
224
275
  try {
276
+ const repoRoot = options.repoRoot ?? findAgentNativeRoot();
277
+ const initialStarterPackageJson = JSON.parse(fs.readFileSync(starterPackageJsonPath, "utf-8"));
278
+ const sourceMigration = migrateStarterSources({
279
+ starterDir,
280
+ repoRoot,
281
+ coreVersion: resolveStarterCoreVersion(initialStarterPackageJson, repoRoot),
282
+ write: options.write,
283
+ });
225
284
  const starterPackageJson = JSON.parse(fs.readFileSync(starterPackageJsonPath, "utf-8"));
226
285
  const mergedPackageJson = mergeStarterManifest(starterPackageJson, snapshot.packageJson);
227
286
  const existingWorkspace = fs.existsSync(starterPnpmWorkspacePath)
@@ -233,7 +292,10 @@ export function syncStarterManifestFiles(options) {
233
292
  const changedToolchainPaths = toolchainChanges
234
293
  .filter((change) => change.changed)
235
294
  .map((change) => change.relativePath);
236
- const changed = packageChanged || workspaceChanged || changedToolchainPaths.length > 0;
295
+ const changed = packageChanged ||
296
+ workspaceChanged ||
297
+ changedToolchainPaths.length > 0 ||
298
+ sourceMigration.changedPaths.length > 0;
237
299
  if (options.write && changed) {
238
300
  if (packageChanged) {
239
301
  fs.writeFileSync(starterPackageJsonPath, stableJson(mergedPackageJson));
@@ -253,6 +315,8 @@ export function syncStarterManifestFiles(options) {
253
315
  pnpmWorkspaceYaml: snapshot.pnpmWorkspaceYaml,
254
316
  toolchainChanges,
255
317
  changedToolchainPaths,
318
+ changedSourceMigrationPaths: sourceMigration.changedPaths,
319
+ sourceMigrationWarnings: sourceMigration.warnings,
256
320
  };
257
321
  }
258
322
  finally {
@@ -331,11 +395,17 @@ export function runSyncStarterManifestCli(argv) {
331
395
  repoRoot: args.repoRoot,
332
396
  write: args.write,
333
397
  });
398
+ for (const warning of result.sourceMigrationWarnings) {
399
+ console.warn(`[starter migration] ${warning}`);
400
+ }
334
401
  if (result.changed) {
335
402
  const updatedPaths = [
336
- ...(result.packageChanged ? ["package.json"] : []),
337
- ...(result.workspaceChanged ? ["pnpm-workspace.yaml"] : []),
338
- ...result.changedToolchainPaths,
403
+ ...new Set([
404
+ ...(result.packageChanged ? ["package.json"] : []),
405
+ ...(result.workspaceChanged ? ["pnpm-workspace.yaml"] : []),
406
+ ...result.changedToolchainPaths,
407
+ ...result.changedSourceMigrationPaths,
408
+ ]),
339
409
  ];
340
410
  const summary = updatedPaths.length ? ` (${updatedPaths.join(", ")})` : "";
341
411
  console.log(args.write
@@ -1 +1 @@
1
- {"version":3,"file":"sync-builder-starter-manifest.js","sourceRoot":"","sources":["../../src/cli/sync-builder-starter-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { _postProcessStandalone } from \"./create.js\";\n\nexport const STARTER_APP_NAME = \"builder-agent-native-starter\";\nexport const CHAT_TEMPLATE = \"chat\";\n\n/** Toolchain files that must track templates/chat or typecheck/build drift. */\nexport const STARTER_TOOLCHAIN_SYNC_PATHS = [\n \"react-router.config.ts\",\n \"vite.config.ts\",\n \"tsconfig.json\",\n \"ssr-entry.ts\",\n \"app/vite-env.d.ts\",\n \"app/routes.ts\",\n \"server/routes/[...page].get.ts\",\n // server/plugins/* are intentionally excluded: starter keeps its own\n // systemPrompt and auth marketing copy; post-process only rewrites appId/title.\n \"server/middleware/auth.ts\",\n \"components.json\",\n \".oxfmtrc.json\",\n \"netlify.toml\",\n] as const;\n\nconst STANDALONE_SNAPSHOT_EXCLUDED_TOP_LEVEL = new Set([\n \".deploy-tmp\",\n \".env\",\n \".env.local\",\n \".generated\",\n \".netlify\",\n \".output\",\n \".react-router\",\n \"build\",\n \"data\",\n \"dist\",\n \"node_modules\",\n]);\n\nexport type StarterToolchainSyncPath =\n (typeof STARTER_TOOLCHAIN_SYNC_PATHS)[number];\n\ntype PackageJson = Record<string, unknown>;\n\nexport type StandaloneChatSnapshot = {\n cleanup: () => void;\n dir: string;\n packageJson: PackageJson;\n pnpmWorkspaceYaml: string | null;\n toolchainFiles: Map<StarterToolchainSyncPath, string>;\n};\n\nexport function listStarterSyncPaths(): string[] {\n return [\n \"package.json\",\n \"pnpm-lock.yaml\",\n \"pnpm-workspace.yaml\",\n ...STARTER_TOOLCHAIN_SYNC_PATHS,\n ];\n}\n\nexport function findAgentNativeRoot(startDir = process.cwd()): string {\n let dir = path.resolve(startDir);\n for (let i = 0; i < 12; i++) {\n const chatPackageJson = path.join(\n dir,\n \"templates\",\n CHAT_TEMPLATE,\n \"package.json\",\n );\n if (fs.existsSync(chatPackageJson)) {\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(\n \"Could not find agent-native repo root (expected templates/chat/package.json).\",\n );\n}\n\nexport function collectStarterToolchainFiles(\n canonicalDir: string,\n): Map<StarterToolchainSyncPath, string> {\n const files = new Map<StarterToolchainSyncPath, string>();\n for (const relativePath of STARTER_TOOLCHAIN_SYNC_PATHS) {\n const absolutePath = path.join(canonicalDir, relativePath);\n if (!fs.existsSync(absolutePath)) continue;\n files.set(relativePath, fs.readFileSync(absolutePath, \"utf-8\"));\n }\n return files;\n}\n\nexport function createStandaloneChatSnapshot(\n repoRoot?: string,\n): StandaloneChatSnapshot {\n const root = repoRoot ?? findAgentNativeRoot();\n const chatTemplateDir = path.join(root, \"templates\", CHAT_TEMPLATE);\n const tempDir = fs.mkdtempSync(\n path.join(os.tmpdir(), \"an-builder-starter-sync-\"),\n );\n\n fs.cpSync(chatTemplateDir, tempDir, {\n recursive: true,\n filter: (source) =>\n shouldCopyStandaloneSnapshotPath(source, chatTemplateDir),\n });\n _postProcessStandalone(STARTER_APP_NAME, tempDir, CHAT_TEMPLATE);\n\n const packageJson = JSON.parse(\n fs.readFileSync(path.join(tempDir, \"package.json\"), \"utf-8\"),\n ) as PackageJson;\n\n const workspacePath = path.join(tempDir, \"pnpm-workspace.yaml\");\n const pnpmWorkspaceYaml = fs.existsSync(workspacePath)\n ? fs.readFileSync(workspacePath, \"utf-8\")\n : null;\n\n return {\n cleanup: () => {\n fs.rmSync(tempDir, { recursive: true, force: true });\n },\n dir: tempDir,\n packageJson,\n pnpmWorkspaceYaml,\n toolchainFiles: collectStarterToolchainFiles(tempDir),\n };\n}\n\nfunction shouldCopyStandaloneSnapshotPath(\n source: string,\n root: string,\n): boolean {\n const relative = path.relative(root, source);\n if (!relative) return true;\n const topLevel = relative.split(path.sep)[0];\n return !STANDALONE_SNAPSHOT_EXCLUDED_TOP_LEVEL.has(topLevel);\n}\n\nexport function generateStandaloneChatManifest(repoRoot?: string): {\n packageJson: PackageJson;\n pnpmWorkspaceYaml: string | null;\n} {\n const snapshot = createStandaloneChatSnapshot(repoRoot);\n try {\n return {\n packageJson: snapshot.packageJson,\n pnpmWorkspaceYaml: snapshot.pnpmWorkspaceYaml,\n };\n } finally {\n snapshot.cleanup();\n }\n}\n\nfunction mergePackageJsonRecords(\n canonical: Record<string, string> | undefined,\n starter: Record<string, string> | undefined,\n starterPinnedKeys: string[] = [],\n): Record<string, string> {\n const merged = { ...(canonical ?? {}) };\n for (const [key, value] of Object.entries(starter ?? {})) {\n if (!(key in merged)) {\n merged[key] = value;\n }\n }\n for (const key of starterPinnedKeys) {\n const pinned = starter?.[key];\n if (pinned) {\n merged[key] = pinned;\n }\n }\n return merged;\n}\n\nexport function mergeStarterManifest(\n starterPackageJson: PackageJson,\n canonicalPackageJson: PackageJson,\n): PackageJson {\n const merged = structuredClone(canonicalPackageJson) as PackageJson;\n\n merged.name = starterPackageJson.name ?? STARTER_APP_NAME;\n if (typeof starterPackageJson.displayName === \"string\") {\n merged.displayName = starterPackageJson.displayName;\n }\n if (typeof starterPackageJson.description === \"string\") {\n merged.description = starterPackageJson.description;\n }\n if (starterPackageJson.private !== undefined) {\n merged.private = starterPackageJson.private;\n }\n if (typeof starterPackageJson.packageManager === \"string\") {\n merged.packageManager = starterPackageJson.packageManager;\n }\n\n merged.dependencies = mergePackageJsonRecords(\n canonicalPackageJson.dependencies as Record<string, string> | undefined,\n starterPackageJson.dependencies as Record<string, string> | undefined,\n [\"@agent-native/core\", \"@agent-native/toolkit\"],\n );\n merged.devDependencies = mergePackageJsonRecords(\n canonicalPackageJson.devDependencies as Record<string, string> | undefined,\n starterPackageJson.devDependencies as Record<string, string> | undefined,\n );\n merged.scripts = mergePackageJsonRecords(\n canonicalPackageJson.scripts as Record<string, string> | undefined,\n starterPackageJson.scripts as Record<string, string> | undefined,\n );\n\n return merged;\n}\n\nexport function workspaceFileSyncChanged(\n existingWorkspace: string | null,\n canonicalWorkspace: string | null,\n): boolean {\n if (canonicalWorkspace === null) {\n return existingWorkspace !== null;\n }\n return existingWorkspace !== canonicalWorkspace;\n}\n\nexport function applyWorkspaceFileSync(\n targetPath: string,\n canonicalWorkspace: string | null,\n): void {\n if (canonicalWorkspace === null) {\n if (fs.existsSync(targetPath)) {\n fs.unlinkSync(targetPath);\n }\n return;\n }\n fs.writeFileSync(targetPath, canonicalWorkspace);\n}\n\nfunction stableJson(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n\nexport type StarterToolchainSyncChange = {\n relativePath: StarterToolchainSyncPath;\n changed: boolean;\n};\n\nexport function diffStarterToolchainFiles(\n starterDir: string,\n canonicalFiles: Map<StarterToolchainSyncPath, string>,\n): StarterToolchainSyncChange[] {\n return STARTER_TOOLCHAIN_SYNC_PATHS.map((relativePath) => {\n const canonicalContent = canonicalFiles.get(relativePath) ?? null;\n const targetPath = path.join(starterDir, relativePath);\n const existingContent = fs.existsSync(targetPath)\n ? fs.readFileSync(targetPath, \"utf-8\")\n : null;\n return {\n relativePath,\n changed: existingContent !== canonicalContent,\n };\n });\n}\n\nexport function applyStarterToolchainSync(\n starterDir: string,\n canonicalFiles: Map<StarterToolchainSyncPath, string>,\n): StarterToolchainSyncChange[] {\n const changes: StarterToolchainSyncChange[] = [];\n for (const relativePath of STARTER_TOOLCHAIN_SYNC_PATHS) {\n const canonicalContent = canonicalFiles.get(relativePath) ?? null;\n const targetPath = path.join(starterDir, relativePath);\n const existingContent = fs.existsSync(targetPath)\n ? fs.readFileSync(targetPath, \"utf-8\")\n : null;\n const changed = existingContent !== canonicalContent;\n if (changed) {\n if (canonicalContent === null) {\n if (fs.existsSync(targetPath)) {\n fs.unlinkSync(targetPath);\n }\n } else {\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n fs.writeFileSync(targetPath, canonicalContent);\n }\n }\n changes.push({ relativePath, changed });\n }\n return changes;\n}\n\nexport type SyncStarterManifestResult = {\n changed: boolean;\n packageChanged: boolean;\n workspaceChanged: boolean;\n packageJson: PackageJson;\n pnpmWorkspaceYaml: string | null;\n toolchainChanges: StarterToolchainSyncChange[];\n changedToolchainPaths: StarterToolchainSyncPath[];\n};\n\nexport function resolveStarterPaths(options: {\n starterDir?: string;\n starterPackageJsonPath?: string;\n starterPnpmWorkspacePath?: string;\n}): {\n starterDir: string;\n starterPackageJsonPath: string;\n starterPnpmWorkspacePath: string;\n} {\n if (options.starterDir) {\n return {\n starterDir: path.resolve(options.starterDir),\n starterPackageJsonPath: path.join(\n path.resolve(options.starterDir),\n \"package.json\",\n ),\n starterPnpmWorkspacePath: path.join(\n path.resolve(options.starterDir),\n \"pnpm-workspace.yaml\",\n ),\n };\n }\n if (!options.starterPackageJsonPath) {\n throw new Error(\"Provide --starter-dir or --starter-package-json.\");\n }\n const starterPackageJsonPath = path.resolve(options.starterPackageJsonPath);\n return {\n starterDir: path.dirname(starterPackageJsonPath),\n starterPackageJsonPath,\n starterPnpmWorkspacePath:\n options.starterPnpmWorkspacePath ??\n path.join(path.dirname(starterPackageJsonPath), \"pnpm-workspace.yaml\"),\n };\n}\n\nexport function syncStarterManifestFiles(options: {\n starterDir?: string;\n starterPackageJsonPath?: string;\n starterPnpmWorkspacePath?: string;\n repoRoot?: string;\n write?: boolean;\n}): SyncStarterManifestResult {\n const { starterDir, starterPackageJsonPath, starterPnpmWorkspacePath } =\n resolveStarterPaths(options);\n const snapshot = createStandaloneChatSnapshot(options.repoRoot);\n\n try {\n const starterPackageJson = JSON.parse(\n fs.readFileSync(starterPackageJsonPath, \"utf-8\"),\n ) as PackageJson;\n const mergedPackageJson = mergeStarterManifest(\n starterPackageJson,\n snapshot.packageJson,\n );\n\n const existingWorkspace = fs.existsSync(starterPnpmWorkspacePath)\n ? fs.readFileSync(starterPnpmWorkspacePath, \"utf-8\")\n : null;\n\n const workspaceChanged = workspaceFileSyncChanged(\n existingWorkspace,\n snapshot.pnpmWorkspaceYaml,\n );\n const packageChanged =\n stableJson(starterPackageJson) !== stableJson(mergedPackageJson);\n const toolchainChanges = diffStarterToolchainFiles(\n starterDir,\n snapshot.toolchainFiles,\n );\n const changedToolchainPaths = toolchainChanges\n .filter((change) => change.changed)\n .map((change) => change.relativePath);\n const changed =\n packageChanged || workspaceChanged || changedToolchainPaths.length > 0;\n\n if (options.write && changed) {\n if (packageChanged) {\n fs.writeFileSync(starterPackageJsonPath, stableJson(mergedPackageJson));\n }\n if (workspaceChanged) {\n applyWorkspaceFileSync(\n starterPnpmWorkspacePath,\n snapshot.pnpmWorkspaceYaml,\n );\n }\n if (changedToolchainPaths.length > 0) {\n applyStarterToolchainSync(starterDir, snapshot.toolchainFiles);\n }\n }\n\n return {\n changed,\n packageChanged,\n workspaceChanged,\n packageJson: mergedPackageJson,\n pnpmWorkspaceYaml: snapshot.pnpmWorkspaceYaml,\n toolchainChanges,\n changedToolchainPaths,\n };\n } finally {\n snapshot.cleanup();\n }\n}\n\nexport function parseSyncStarterManifestArgs(argv: string[]): {\n command: \"merge\" | \"generate\" | \"paths\";\n starterDir?: string;\n starterPackageJsonPath?: string;\n starterPnpmWorkspacePath?: string;\n write: boolean;\n repoRoot?: string;\n} {\n const [commandRaw, ...rest] = argv;\n const command =\n commandRaw === \"generate\"\n ? \"generate\"\n : commandRaw === \"paths\"\n ? \"paths\"\n : \"merge\";\n let starterDir: string | undefined;\n let starterPackageJsonPath: string | undefined;\n let starterPnpmWorkspacePath: string | undefined;\n let write = false;\n let repoRoot: string | undefined;\n\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i];\n if (arg === \"--write\") {\n write = true;\n continue;\n }\n if (arg === \"--starter-dir\") {\n starterDir = rest[++i];\n continue;\n }\n if (arg === \"--starter-package-json\") {\n starterPackageJsonPath = rest[++i];\n continue;\n }\n if (arg === \"--starter-pnpm-workspace\") {\n starterPnpmWorkspacePath = rest[++i];\n continue;\n }\n if (arg === \"--repo-root\") {\n repoRoot = rest[++i];\n continue;\n }\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n if (command === \"merge\" && !starterDir && !starterPackageJsonPath) {\n throw new Error(\n \"merge requires --starter-dir <path> or --starter-package-json <path> [--starter-pnpm-workspace <path>] [--write] [--repo-root <path>]\",\n );\n }\n\n return {\n command,\n starterDir,\n starterPackageJsonPath,\n starterPnpmWorkspacePath,\n write,\n repoRoot,\n };\n}\n\nexport function runSyncStarterManifestCli(argv: string[]): number {\n const args = parseSyncStarterManifestArgs(argv);\n\n if (args.command === \"generate\") {\n const { packageJson, pnpmWorkspaceYaml } = generateStandaloneChatManifest(\n args.repoRoot,\n );\n process.stdout.write(stableJson(packageJson));\n if (pnpmWorkspaceYaml) {\n process.stdout.write(\"\\n--- pnpm-workspace.yaml ---\\n\");\n process.stdout.write(pnpmWorkspaceYaml);\n }\n return 0;\n }\n\n if (args.command === \"paths\") {\n for (const syncPath of listStarterSyncPaths()) {\n process.stdout.write(`${syncPath}\\n`);\n }\n return 0;\n }\n\n const result = syncStarterManifestFiles({\n starterDir: args.starterDir,\n starterPackageJsonPath: args.starterPackageJsonPath,\n starterPnpmWorkspacePath: args.starterPnpmWorkspacePath,\n repoRoot: args.repoRoot,\n write: args.write,\n });\n\n if (result.changed) {\n const updatedPaths = [\n ...(result.packageChanged ? [\"package.json\"] : []),\n ...(result.workspaceChanged ? [\"pnpm-workspace.yaml\"] : []),\n ...result.changedToolchainPaths,\n ];\n const summary = updatedPaths.length ? ` (${updatedPaths.join(\", \")})` : \"\";\n console.log(\n args.write\n ? `Updated builder-agent-native-starter from templates/chat${summary}.`\n : `builder-agent-native-starter is out of date with templates/chat${summary}.`,\n );\n return args.write ? 0 : 1;\n }\n\n console.log(\"builder-agent-native-starter already matches templates/chat.\");\n return 0;\n}\n\nconst isDirectRun =\n process.argv[1] &&\n path.resolve(process.argv[1]) ===\n path.resolve(fileURLToPath(import.meta.url));\n\nif (isDirectRun) {\n const exitCode = runSyncStarterManifestCli(process.argv.slice(2));\n process.exit(exitCode);\n}\n"]}
1
+ {"version":3,"file":"sync-builder-starter-manifest.js","sourceRoot":"","sources":["../../src/cli/sync-builder-starter-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n isMigrationManifestActive,\n readMigrationManifest,\n} from \"../package-lifecycle/migration-manifest.js\";\nimport { _postProcessStandalone } from \"./create.js\";\nimport { runMigrationCodemods } from \"./migration-codemod.js\";\n\nexport const STARTER_APP_NAME = \"builder-agent-native-starter\";\nexport const CHAT_TEMPLATE = \"chat\";\n\n/** Toolchain files that must track templates/chat or typecheck/build drift. */\nexport const STARTER_TOOLCHAIN_SYNC_PATHS = [\n \"react-router.config.ts\",\n \"vite.config.ts\",\n \"tsconfig.json\",\n \"ssr-entry.ts\",\n \"app/vite-env.d.ts\",\n \"app/routes.ts\",\n \"server/routes/[...page].get.ts\",\n // server/plugins/* are intentionally excluded: starter keeps its own\n // systemPrompt and auth marketing copy; post-process only rewrites appId/title.\n \"server/middleware/auth.ts\",\n \"components.json\",\n \".oxfmtrc.json\",\n \"netlify.toml\",\n] as const;\n\nexport const STARTER_SOURCE_MIGRATION_PATHS = [\n \":(glob)**/*.ts\",\n \":(glob)**/*.tsx\",\n] as const;\n\nconst STANDALONE_SNAPSHOT_EXCLUDED_TOP_LEVEL = new Set([\n \".deploy-tmp\",\n \".env\",\n \".env.local\",\n \".generated\",\n \".netlify\",\n \".output\",\n \".react-router\",\n \"build\",\n \"data\",\n \"dist\",\n \"node_modules\",\n]);\n\nexport type StarterToolchainSyncPath =\n (typeof STARTER_TOOLCHAIN_SYNC_PATHS)[number];\n\ntype PackageJson = Record<string, unknown>;\n\nexport type StandaloneChatSnapshot = {\n cleanup: () => void;\n dir: string;\n packageJson: PackageJson;\n pnpmWorkspaceYaml: string | null;\n toolchainFiles: Map<StarterToolchainSyncPath, string>;\n};\n\nexport function listStarterSyncPaths(): string[] {\n return [\n \"package.json\",\n \"pnpm-lock.yaml\",\n \"pnpm-workspace.yaml\",\n ...STARTER_TOOLCHAIN_SYNC_PATHS,\n ...STARTER_SOURCE_MIGRATION_PATHS,\n ];\n}\n\nexport function migrateStarterSources(options: {\n starterDir: string;\n repoRoot: string;\n coreVersion: string | null;\n write?: boolean;\n}): { changedPaths: string[]; warnings: string[] } {\n const manifestPath = path.join(\n options.repoRoot,\n \"packages/core/migration-manifest.json\",\n );\n const manifest = readMigrationManifest(manifestPath);\n if (!manifest) {\n throw new Error(`Could not read migration manifest at ${manifestPath}.`);\n }\n if (!isMigrationManifestActive(manifest, options.coreVersion)) {\n return { changedPaths: [], warnings: [] };\n }\n\n const result = runMigrationCodemods({\n root: options.starterDir,\n manifests: [manifest],\n apply: options.write,\n // Checked-in migration targets are validated by the manifest guard before\n // this source sync runs; starter dependencies are installed afterward.\n targetExists: () => true,\n });\n\n return {\n changedPaths: [\n ...new Set(\n result.changes.map((change) =>\n path.relative(options.starterDir, change.file),\n ),\n ),\n ].sort(),\n warnings: result.warnings,\n };\n}\n\nexport function resolveStarterCoreVersion(\n starterPackageJson: PackageJson,\n repoRoot: string,\n): string | null {\n const dependencies = starterPackageJson.dependencies;\n if (dependencies && typeof dependencies === \"object\") {\n const declared = (dependencies as Record<string, unknown>)[\n \"@agent-native/core\"\n ];\n if (typeof declared === \"string\") {\n const version = declared.match(/\\d+\\.\\d+\\.\\d+/)?.[0];\n if (version) return version;\n }\n }\n\n try {\n const corePackageJson = JSON.parse(\n fs.readFileSync(\n path.join(repoRoot, \"packages/core/package.json\"),\n \"utf-8\",\n ),\n ) as { version?: unknown };\n return typeof corePackageJson.version === \"string\"\n ? corePackageJson.version\n : null;\n } catch {\n return null;\n }\n}\n\nexport function findAgentNativeRoot(startDir = process.cwd()): string {\n let dir = path.resolve(startDir);\n for (let i = 0; i < 12; i++) {\n const chatPackageJson = path.join(\n dir,\n \"templates\",\n CHAT_TEMPLATE,\n \"package.json\",\n );\n if (fs.existsSync(chatPackageJson)) {\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(\n \"Could not find agent-native repo root (expected templates/chat/package.json).\",\n );\n}\n\nexport function collectStarterToolchainFiles(\n canonicalDir: string,\n): Map<StarterToolchainSyncPath, string> {\n const files = new Map<StarterToolchainSyncPath, string>();\n for (const relativePath of STARTER_TOOLCHAIN_SYNC_PATHS) {\n const absolutePath = path.join(canonicalDir, relativePath);\n if (!fs.existsSync(absolutePath)) continue;\n files.set(relativePath, fs.readFileSync(absolutePath, \"utf-8\"));\n }\n return files;\n}\n\nexport function createStandaloneChatSnapshot(\n repoRoot?: string,\n): StandaloneChatSnapshot {\n const root = repoRoot ?? findAgentNativeRoot();\n const chatTemplateDir = path.join(root, \"templates\", CHAT_TEMPLATE);\n const tempDir = fs.mkdtempSync(\n path.join(os.tmpdir(), \"an-builder-starter-sync-\"),\n );\n\n fs.cpSync(chatTemplateDir, tempDir, {\n recursive: true,\n filter: (source) =>\n shouldCopyStandaloneSnapshotPath(source, chatTemplateDir),\n });\n _postProcessStandalone(STARTER_APP_NAME, tempDir, CHAT_TEMPLATE);\n\n const packageJson = JSON.parse(\n fs.readFileSync(path.join(tempDir, \"package.json\"), \"utf-8\"),\n ) as PackageJson;\n\n const workspacePath = path.join(tempDir, \"pnpm-workspace.yaml\");\n const pnpmWorkspaceYaml = fs.existsSync(workspacePath)\n ? fs.readFileSync(workspacePath, \"utf-8\")\n : null;\n\n return {\n cleanup: () => {\n fs.rmSync(tempDir, { recursive: true, force: true });\n },\n dir: tempDir,\n packageJson,\n pnpmWorkspaceYaml,\n toolchainFiles: collectStarterToolchainFiles(tempDir),\n };\n}\n\nfunction shouldCopyStandaloneSnapshotPath(\n source: string,\n root: string,\n): boolean {\n const relative = path.relative(root, source);\n if (!relative) return true;\n const topLevel = relative.split(path.sep)[0];\n return !STANDALONE_SNAPSHOT_EXCLUDED_TOP_LEVEL.has(topLevel);\n}\n\nexport function generateStandaloneChatManifest(repoRoot?: string): {\n packageJson: PackageJson;\n pnpmWorkspaceYaml: string | null;\n} {\n const snapshot = createStandaloneChatSnapshot(repoRoot);\n try {\n return {\n packageJson: snapshot.packageJson,\n pnpmWorkspaceYaml: snapshot.pnpmWorkspaceYaml,\n };\n } finally {\n snapshot.cleanup();\n }\n}\n\nfunction mergePackageJsonRecords(\n canonical: Record<string, string> | undefined,\n starter: Record<string, string> | undefined,\n starterPinnedKeys: string[] = [],\n): Record<string, string> {\n const merged = { ...(canonical ?? {}) };\n for (const [key, value] of Object.entries(starter ?? {})) {\n if (!(key in merged)) {\n merged[key] = value;\n }\n }\n for (const key of starterPinnedKeys) {\n const pinned = starter?.[key];\n if (pinned) {\n merged[key] = pinned;\n }\n }\n return merged;\n}\n\nexport function mergeStarterManifest(\n starterPackageJson: PackageJson,\n canonicalPackageJson: PackageJson,\n): PackageJson {\n const merged = structuredClone(canonicalPackageJson) as PackageJson;\n\n merged.name = starterPackageJson.name ?? STARTER_APP_NAME;\n if (typeof starterPackageJson.displayName === \"string\") {\n merged.displayName = starterPackageJson.displayName;\n }\n if (typeof starterPackageJson.description === \"string\") {\n merged.description = starterPackageJson.description;\n }\n if (starterPackageJson.private !== undefined) {\n merged.private = starterPackageJson.private;\n }\n if (typeof starterPackageJson.packageManager === \"string\") {\n merged.packageManager = starterPackageJson.packageManager;\n }\n\n merged.dependencies = mergePackageJsonRecords(\n canonicalPackageJson.dependencies as Record<string, string> | undefined,\n starterPackageJson.dependencies as Record<string, string> | undefined,\n [\"@agent-native/core\", \"@agent-native/toolkit\"],\n );\n merged.devDependencies = mergePackageJsonRecords(\n canonicalPackageJson.devDependencies as Record<string, string> | undefined,\n starterPackageJson.devDependencies as Record<string, string> | undefined,\n );\n merged.scripts = mergePackageJsonRecords(\n canonicalPackageJson.scripts as Record<string, string> | undefined,\n starterPackageJson.scripts as Record<string, string> | undefined,\n );\n\n return merged;\n}\n\nexport function workspaceFileSyncChanged(\n existingWorkspace: string | null,\n canonicalWorkspace: string | null,\n): boolean {\n if (canonicalWorkspace === null) {\n return existingWorkspace !== null;\n }\n return existingWorkspace !== canonicalWorkspace;\n}\n\nexport function applyWorkspaceFileSync(\n targetPath: string,\n canonicalWorkspace: string | null,\n): void {\n if (canonicalWorkspace === null) {\n if (fs.existsSync(targetPath)) {\n fs.unlinkSync(targetPath);\n }\n return;\n }\n fs.writeFileSync(targetPath, canonicalWorkspace);\n}\n\nfunction stableJson(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n\nexport type StarterToolchainSyncChange = {\n relativePath: StarterToolchainSyncPath;\n changed: boolean;\n};\n\nexport function diffStarterToolchainFiles(\n starterDir: string,\n canonicalFiles: Map<StarterToolchainSyncPath, string>,\n): StarterToolchainSyncChange[] {\n return STARTER_TOOLCHAIN_SYNC_PATHS.map((relativePath) => {\n const canonicalContent = canonicalFiles.get(relativePath) ?? null;\n const targetPath = path.join(starterDir, relativePath);\n const existingContent = fs.existsSync(targetPath)\n ? fs.readFileSync(targetPath, \"utf-8\")\n : null;\n return {\n relativePath,\n changed: existingContent !== canonicalContent,\n };\n });\n}\n\nexport function applyStarterToolchainSync(\n starterDir: string,\n canonicalFiles: Map<StarterToolchainSyncPath, string>,\n): StarterToolchainSyncChange[] {\n const changes: StarterToolchainSyncChange[] = [];\n for (const relativePath of STARTER_TOOLCHAIN_SYNC_PATHS) {\n const canonicalContent = canonicalFiles.get(relativePath) ?? null;\n const targetPath = path.join(starterDir, relativePath);\n const existingContent = fs.existsSync(targetPath)\n ? fs.readFileSync(targetPath, \"utf-8\")\n : null;\n const changed = existingContent !== canonicalContent;\n if (changed) {\n if (canonicalContent === null) {\n if (fs.existsSync(targetPath)) {\n fs.unlinkSync(targetPath);\n }\n } else {\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n fs.writeFileSync(targetPath, canonicalContent);\n }\n }\n changes.push({ relativePath, changed });\n }\n return changes;\n}\n\nexport type SyncStarterManifestResult = {\n changed: boolean;\n packageChanged: boolean;\n workspaceChanged: boolean;\n packageJson: PackageJson;\n pnpmWorkspaceYaml: string | null;\n toolchainChanges: StarterToolchainSyncChange[];\n changedToolchainPaths: StarterToolchainSyncPath[];\n changedSourceMigrationPaths: string[];\n sourceMigrationWarnings: string[];\n};\n\nexport function resolveStarterPaths(options: {\n starterDir?: string;\n starterPackageJsonPath?: string;\n starterPnpmWorkspacePath?: string;\n}): {\n starterDir: string;\n starterPackageJsonPath: string;\n starterPnpmWorkspacePath: string;\n} {\n if (options.starterDir) {\n return {\n starterDir: path.resolve(options.starterDir),\n starterPackageJsonPath: path.join(\n path.resolve(options.starterDir),\n \"package.json\",\n ),\n starterPnpmWorkspacePath: path.join(\n path.resolve(options.starterDir),\n \"pnpm-workspace.yaml\",\n ),\n };\n }\n if (!options.starterPackageJsonPath) {\n throw new Error(\"Provide --starter-dir or --starter-package-json.\");\n }\n const starterPackageJsonPath = path.resolve(options.starterPackageJsonPath);\n return {\n starterDir: path.dirname(starterPackageJsonPath),\n starterPackageJsonPath,\n starterPnpmWorkspacePath:\n options.starterPnpmWorkspacePath ??\n path.join(path.dirname(starterPackageJsonPath), \"pnpm-workspace.yaml\"),\n };\n}\n\nexport function syncStarterManifestFiles(options: {\n starterDir?: string;\n starterPackageJsonPath?: string;\n starterPnpmWorkspacePath?: string;\n repoRoot?: string;\n write?: boolean;\n}): SyncStarterManifestResult {\n const { starterDir, starterPackageJsonPath, starterPnpmWorkspacePath } =\n resolveStarterPaths(options);\n const snapshot = createStandaloneChatSnapshot(options.repoRoot);\n\n try {\n const repoRoot = options.repoRoot ?? findAgentNativeRoot();\n const initialStarterPackageJson = JSON.parse(\n fs.readFileSync(starterPackageJsonPath, \"utf-8\"),\n ) as PackageJson;\n const sourceMigration = migrateStarterSources({\n starterDir,\n repoRoot,\n coreVersion: resolveStarterCoreVersion(\n initialStarterPackageJson,\n repoRoot,\n ),\n write: options.write,\n });\n const starterPackageJson = JSON.parse(\n fs.readFileSync(starterPackageJsonPath, \"utf-8\"),\n ) as PackageJson;\n const mergedPackageJson = mergeStarterManifest(\n starterPackageJson,\n snapshot.packageJson,\n );\n\n const existingWorkspace = fs.existsSync(starterPnpmWorkspacePath)\n ? fs.readFileSync(starterPnpmWorkspacePath, \"utf-8\")\n : null;\n\n const workspaceChanged = workspaceFileSyncChanged(\n existingWorkspace,\n snapshot.pnpmWorkspaceYaml,\n );\n const packageChanged =\n stableJson(starterPackageJson) !== stableJson(mergedPackageJson);\n const toolchainChanges = diffStarterToolchainFiles(\n starterDir,\n snapshot.toolchainFiles,\n );\n const changedToolchainPaths = toolchainChanges\n .filter((change) => change.changed)\n .map((change) => change.relativePath);\n const changed =\n packageChanged ||\n workspaceChanged ||\n changedToolchainPaths.length > 0 ||\n sourceMigration.changedPaths.length > 0;\n\n if (options.write && changed) {\n if (packageChanged) {\n fs.writeFileSync(starterPackageJsonPath, stableJson(mergedPackageJson));\n }\n if (workspaceChanged) {\n applyWorkspaceFileSync(\n starterPnpmWorkspacePath,\n snapshot.pnpmWorkspaceYaml,\n );\n }\n if (changedToolchainPaths.length > 0) {\n applyStarterToolchainSync(starterDir, snapshot.toolchainFiles);\n }\n }\n\n return {\n changed,\n packageChanged,\n workspaceChanged,\n packageJson: mergedPackageJson,\n pnpmWorkspaceYaml: snapshot.pnpmWorkspaceYaml,\n toolchainChanges,\n changedToolchainPaths,\n changedSourceMigrationPaths: sourceMigration.changedPaths,\n sourceMigrationWarnings: sourceMigration.warnings,\n };\n } finally {\n snapshot.cleanup();\n }\n}\n\nexport function parseSyncStarterManifestArgs(argv: string[]): {\n command: \"merge\" | \"generate\" | \"paths\";\n starterDir?: string;\n starterPackageJsonPath?: string;\n starterPnpmWorkspacePath?: string;\n write: boolean;\n repoRoot?: string;\n} {\n const [commandRaw, ...rest] = argv;\n const command =\n commandRaw === \"generate\"\n ? \"generate\"\n : commandRaw === \"paths\"\n ? \"paths\"\n : \"merge\";\n let starterDir: string | undefined;\n let starterPackageJsonPath: string | undefined;\n let starterPnpmWorkspacePath: string | undefined;\n let write = false;\n let repoRoot: string | undefined;\n\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i];\n if (arg === \"--write\") {\n write = true;\n continue;\n }\n if (arg === \"--starter-dir\") {\n starterDir = rest[++i];\n continue;\n }\n if (arg === \"--starter-package-json\") {\n starterPackageJsonPath = rest[++i];\n continue;\n }\n if (arg === \"--starter-pnpm-workspace\") {\n starterPnpmWorkspacePath = rest[++i];\n continue;\n }\n if (arg === \"--repo-root\") {\n repoRoot = rest[++i];\n continue;\n }\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n if (command === \"merge\" && !starterDir && !starterPackageJsonPath) {\n throw new Error(\n \"merge requires --starter-dir <path> or --starter-package-json <path> [--starter-pnpm-workspace <path>] [--write] [--repo-root <path>]\",\n );\n }\n\n return {\n command,\n starterDir,\n starterPackageJsonPath,\n starterPnpmWorkspacePath,\n write,\n repoRoot,\n };\n}\n\nexport function runSyncStarterManifestCli(argv: string[]): number {\n const args = parseSyncStarterManifestArgs(argv);\n\n if (args.command === \"generate\") {\n const { packageJson, pnpmWorkspaceYaml } = generateStandaloneChatManifest(\n args.repoRoot,\n );\n process.stdout.write(stableJson(packageJson));\n if (pnpmWorkspaceYaml) {\n process.stdout.write(\"\\n--- pnpm-workspace.yaml ---\\n\");\n process.stdout.write(pnpmWorkspaceYaml);\n }\n return 0;\n }\n\n if (args.command === \"paths\") {\n for (const syncPath of listStarterSyncPaths()) {\n process.stdout.write(`${syncPath}\\n`);\n }\n return 0;\n }\n\n const result = syncStarterManifestFiles({\n starterDir: args.starterDir,\n starterPackageJsonPath: args.starterPackageJsonPath,\n starterPnpmWorkspacePath: args.starterPnpmWorkspacePath,\n repoRoot: args.repoRoot,\n write: args.write,\n });\n\n for (const warning of result.sourceMigrationWarnings) {\n console.warn(`[starter migration] ${warning}`);\n }\n\n if (result.changed) {\n const updatedPaths = [\n ...new Set([\n ...(result.packageChanged ? [\"package.json\"] : []),\n ...(result.workspaceChanged ? [\"pnpm-workspace.yaml\"] : []),\n ...result.changedToolchainPaths,\n ...result.changedSourceMigrationPaths,\n ]),\n ];\n const summary = updatedPaths.length ? ` (${updatedPaths.join(\", \")})` : \"\";\n console.log(\n args.write\n ? `Updated builder-agent-native-starter from templates/chat${summary}.`\n : `builder-agent-native-starter is out of date with templates/chat${summary}.`,\n );\n return args.write ? 0 : 1;\n }\n\n console.log(\"builder-agent-native-starter already matches templates/chat.\");\n return 0;\n}\n\nconst isDirectRun =\n process.argv[1] &&\n path.resolve(process.argv[1]) ===\n path.resolve(fileURLToPath(import.meta.url));\n\nif (isDirectRun) {\n const exitCode = runSyncStarterManifestCli(process.argv.slice(2));\n process.exit(exitCode);\n}\n"]}