assistant-ui 0.0.112 → 0.0.113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/codemods/v0-12/assistant-api-to-aui.d.ts.map +1 -1
  2. package/dist/codemods/v0-12/assistant-api-to-aui.js +87 -62
  3. package/dist/codemods/v0-12/assistant-api-to-aui.js.map +1 -1
  4. package/dist/codemods/v0-12/primitive-if-to-aui-if.d.ts.map +1 -1
  5. package/dist/codemods/v0-12/primitive-if-to-aui-if.js +31 -45
  6. package/dist/codemods/v0-12/primitive-if-to-aui-if.js.map +1 -1
  7. package/dist/commands/add.d.ts +1 -1
  8. package/dist/commands/add.d.ts.map +1 -1
  9. package/dist/commands/add.js +4 -2
  10. package/dist/commands/add.js.map +1 -1
  11. package/dist/commands/create.d.ts.map +1 -1
  12. package/dist/commands/create.js +33 -10
  13. package/dist/commands/create.js.map +1 -1
  14. package/dist/commands/info.d.ts.map +1 -1
  15. package/dist/commands/info.js +2 -1
  16. package/dist/commands/info.js.map +1 -1
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +4 -2
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/mcp.d.ts.map +1 -1
  21. package/dist/commands/mcp.js +25 -28
  22. package/dist/commands/mcp.js.map +1 -1
  23. package/dist/commands/update.js +6 -7
  24. package/dist/commands/update.js.map +1 -1
  25. package/dist/commands/upgrade.d.ts.map +1 -1
  26. package/dist/commands/upgrade.js +5 -2
  27. package/dist/commands/upgrade.js.map +1 -1
  28. package/dist/index.js +2 -6
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/agent-skill.d.ts +1 -1
  31. package/dist/lib/agent-skill.d.ts.map +1 -1
  32. package/dist/lib/agent-skill.js.map +1 -1
  33. package/dist/lib/create-project.d.ts +2 -3
  34. package/dist/lib/create-project.d.ts.map +1 -1
  35. package/dist/lib/create-project.js +17 -42
  36. package/dist/lib/create-project.js.map +1 -1
  37. package/dist/lib/handle-cli-error.d.ts +5 -0
  38. package/dist/lib/handle-cli-error.d.ts.map +1 -0
  39. package/dist/lib/handle-cli-error.js +17 -0
  40. package/dist/lib/handle-cli-error.js.map +1 -0
  41. package/dist/lib/install-ai-sdk-lib.js +8 -1
  42. package/dist/lib/install-ai-sdk-lib.js.map +1 -1
  43. package/dist/lib/install-edge-lib.js +4 -8
  44. package/dist/lib/install-edge-lib.js.map +1 -1
  45. package/dist/lib/run-spawn.d.ts +16 -2
  46. package/dist/lib/run-spawn.d.ts.map +1 -1
  47. package/dist/lib/run-spawn.js +87 -9
  48. package/dist/lib/run-spawn.js.map +1 -1
  49. package/dist/lib/transform.d.ts +1 -1
  50. package/dist/lib/transform.d.ts.map +1 -1
  51. package/dist/lib/transform.js +12 -25
  52. package/dist/lib/transform.js.map +1 -1
  53. package/dist/lib/upgrade.js +20 -16
  54. package/dist/lib/upgrade.js.map +1 -1
  55. package/dist/lib/utils/file-scanner.d.ts +9 -1
  56. package/dist/lib/utils/file-scanner.d.ts.map +1 -1
  57. package/dist/lib/utils/file-scanner.js +22 -20
  58. package/dist/lib/utils/file-scanner.js.map +1 -1
  59. package/dist/lib/utils/package-installer.js +1 -1
  60. package/dist/lib/utils/package-manager.d.ts +3 -1
  61. package/dist/lib/utils/package-manager.d.ts.map +1 -1
  62. package/dist/lib/utils/package-manager.js +22 -10
  63. package/dist/lib/utils/package-manager.js.map +1 -1
  64. package/package.json +6 -6
  65. package/plugin/skills/assistant-ui/SKILL.md +3 -3
  66. package/src/codemods/v0-12/__tests__/assistant-api-to-aui.test.ts +370 -0
  67. package/src/codemods/v0-12/__tests__/primitive-if-to-aui-if.test.ts +100 -0
  68. package/src/codemods/v0-12/assistant-api-to-aui.ts +227 -134
  69. package/src/codemods/v0-12/primitive-if-to-aui-if.ts +44 -72
  70. package/src/commands/add.ts +5 -5
  71. package/src/commands/create.ts +41 -7
  72. package/src/commands/info.ts +1 -0
  73. package/src/commands/init.ts +4 -6
  74. package/src/commands/mcp.ts +20 -29
  75. package/src/commands/update.ts +6 -8
  76. package/src/commands/upgrade.ts +5 -2
  77. package/src/index.ts +2 -7
  78. package/src/lib/agent-skill.ts +2 -1
  79. package/src/lib/create-project.ts +24 -58
  80. package/src/lib/handle-cli-error.test.ts +67 -0
  81. package/src/lib/handle-cli-error.ts +17 -0
  82. package/src/lib/install-ai-sdk-lib.ts +13 -1
  83. package/src/lib/install-edge-lib.ts +7 -8
  84. package/src/lib/run-spawn.test.ts +148 -0
  85. package/src/lib/run-spawn.ts +121 -11
  86. package/src/lib/transform.test.ts +62 -0
  87. package/src/lib/transform.ts +21 -37
  88. package/src/lib/upgrade.ts +23 -19
  89. package/src/lib/utils/file-scanner.ts +26 -20
  90. package/src/lib/utils/package-manager.ts +29 -12
@@ -1,10 +1,10 @@
1
+ import { SpawnExitError, SpawnSignalError, runSpawn } from "../lib/run-spawn.js";
1
2
  import { logger } from "../lib/utils/logger.js";
2
3
  import { getInstallCommand } from "../lib/utils/package-manager.js";
3
4
  import { logPackageJsonParseError } from "../lib/utils/package-json.js";
4
5
  import { Command } from "commander";
5
6
  import fs from "node:fs";
6
7
  import path from "node:path";
7
- import { sync } from "cross-spawn";
8
8
  //#region src/commands/update.ts
9
9
  const update = new Command().name("update").description("Update all '@assistant-ui/*' and 'assistant-*' packages in package.json to latest versions using your package manager.").option("--dry", "Print the package manager command instead of running it.").option("-c, --cwd <cwd>", "the working directory. defaults to the current directory.", process.cwd()).action(async (opts) => {
10
10
  const packageJsonPath = path.join(opts.cwd, "package.json");
@@ -43,13 +43,12 @@ const update = new Command().name("update").description("Update all '@assistant-
43
43
  return;
44
44
  }
45
45
  logger.step("Updating packages...");
46
- const result = sync(installCmd.command, installCmd.args, {
47
- stdio: "inherit",
48
- cwd: opts.cwd
49
- });
50
- if (result.status !== 0) {
46
+ try {
47
+ await runSpawn(installCmd.command, installCmd.args, opts.cwd);
48
+ } catch (error) {
49
+ if (error instanceof SpawnSignalError) throw error;
51
50
  logger.error("Package manager update failed.");
52
- process.exit(result.status || 1);
51
+ process.exit(error instanceof SpawnExitError ? error.code : 1);
53
52
  }
54
53
  logger.break();
55
54
  logger.success("All packages updated to latest version!");
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","names":["spawnSync"],"sources":["../../src/commands/update.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { sync as spawnSync } from \"cross-spawn\";\nimport { logger } from \"../lib/utils/logger\";\nimport { logPackageJsonParseError } from \"../lib/utils/package-json\";\nimport { getInstallCommand } from \"../lib/utils/package-manager\";\n\nexport const update = new Command()\n .name(\"update\")\n .description(\n \"Update all '@assistant-ui/*' and 'assistant-*' packages in package.json to latest versions using your package manager.\",\n )\n .option(\"--dry\", \"Print the package manager command instead of running it.\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .action(async (opts) => {\n const packageJsonPath = path.join(opts.cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) {\n logger.error(\"No package.json found in the current directory.\");\n process.exit(1);\n }\n\n const packageJsonContent = fs.readFileSync(packageJsonPath, \"utf-8\");\n let pkg: Record<string, Record<string, string> | undefined>;\n try {\n pkg = JSON.parse(packageJsonContent);\n } catch {\n logPackageJsonParseError(packageJsonPath, \"update\");\n console.error(\"No changes were written.\");\n process.exit(1);\n }\n const sections = [\"dependencies\", \"devDependencies\"];\n const targets: string[] = [];\n\n for (const section of sections) {\n if (!pkg[section]) continue;\n for (const dep in pkg[section]) {\n if (\n dep.startsWith(\"@assistant-ui/\") ||\n dep === \"assistant-stream\" ||\n dep === \"assistant-cloud\"\n ) {\n targets.push(dep);\n }\n }\n }\n\n if (!targets.length) {\n logger.warn(\"No matching packages found to update.\");\n return;\n }\n\n logger.info(`Found ${targets.length} package(s) to update:`);\n targets.forEach((pkg) => {\n logger.info(` - ${pkg}`);\n });\n logger.break();\n\n // Build command using the utility\n const installCmd = await getInstallCommand(\n targets.map((d) => `${d}@latest`),\n opts.cwd,\n );\n\n if (opts.dry) {\n logger.info(\"Dry run: would run the following command:\");\n logger.info(` ${installCmd.command} ${installCmd.args.join(\" \")}`);\n return;\n }\n\n logger.step(\"Updating packages...\");\n const result = spawnSync(installCmd.command, installCmd.args, {\n stdio: \"inherit\",\n cwd: opts.cwd,\n });\n\n if (result.status !== 0) {\n logger.error(\"Package manager update failed.\");\n process.exit(result.status || 1);\n }\n\n logger.break();\n logger.success(\"All packages updated to latest version!\");\n });\n"],"mappings":";;;;;;;;AAQA,MAAa,SAAS,IAAI,QAAQ,CAAC,CAChC,KAAK,QAAQ,CAAC,CACd,YACC,wHACF,CAAC,CACA,OAAO,SAAS,0DAA0D,CAAC,CAC3E,OACC,mBACA,6DACA,QAAQ,IAAI,CACd,CAAC,CACA,OAAO,OAAO,SAAS;CACtB,MAAM,kBAAkB,KAAK,KAAK,KAAK,KAAK,cAAc;CAC1D,IAAI,CAAC,GAAG,WAAW,eAAe,GAAG;EACnC,OAAO,MAAM,iDAAiD;EAC9D,QAAQ,KAAK,CAAC;CAChB;CAEA,MAAM,qBAAqB,GAAG,aAAa,iBAAiB,OAAO;CACnE,IAAI;CACJ,IAAI;EACF,MAAM,KAAK,MAAM,kBAAkB;CACrC,QAAQ;EACN,yBAAyB,iBAAiB,QAAQ;EAClD,QAAQ,MAAM,0BAA0B;EACxC,QAAQ,KAAK,CAAC;CAChB;CACA,MAAM,WAAW,CAAC,gBAAgB,iBAAiB;CACnD,MAAM,UAAoB,CAAC;CAE3B,KAAK,MAAM,WAAW,UAAU;EAC9B,IAAI,CAAC,IAAI,UAAU;EACnB,KAAK,MAAM,OAAO,IAAI,UACpB,IACE,IAAI,WAAW,gBAAgB,KAC/B,QAAQ,sBACR,QAAQ,mBAER,QAAQ,KAAK,GAAG;CAGtB;CAEA,IAAI,CAAC,QAAQ,QAAQ;EACnB,OAAO,KAAK,uCAAuC;EACnD;CACF;CAEA,OAAO,KAAK,SAAS,QAAQ,OAAO,uBAAuB;CAC3D,QAAQ,SAAS,QAAQ;EACvB,OAAO,KAAK,OAAO,KAAK;CAC1B,CAAC;CACD,OAAO,MAAM;CAGb,MAAM,aAAa,MAAM,kBACvB,QAAQ,KAAK,MAAM,GAAG,EAAE,QAAQ,GAChC,KAAK,GACP;CAEA,IAAI,KAAK,KAAK;EACZ,OAAO,KAAK,2CAA2C;EACvD,OAAO,KAAK,KAAK,WAAW,QAAQ,GAAG,WAAW,KAAK,KAAK,GAAG,GAAG;EAClE;CACF;CAEA,OAAO,KAAK,sBAAsB;CAClC,MAAM,SAASA,KAAU,WAAW,SAAS,WAAW,MAAM;EAC5D,OAAO;EACP,KAAK,KAAK;CACZ,CAAC;CAED,IAAI,OAAO,WAAW,GAAG;EACvB,OAAO,MAAM,gCAAgC;EAC7C,QAAQ,KAAK,OAAO,UAAU,CAAC;CACjC;CAEA,OAAO,MAAM;CACb,OAAO,QAAQ,yCAAyC;AAC1D,CAAC"}
1
+ {"version":3,"file":"update.js","names":[],"sources":["../../src/commands/update.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { logger } from \"../lib/utils/logger\";\nimport { logPackageJsonParseError } from \"../lib/utils/package-json\";\nimport { getInstallCommand } from \"../lib/utils/package-manager\";\nimport { runSpawn, SpawnExitError, SpawnSignalError } from \"../lib/run-spawn\";\n\nexport const update = new Command()\n .name(\"update\")\n .description(\n \"Update all '@assistant-ui/*' and 'assistant-*' packages in package.json to latest versions using your package manager.\",\n )\n .option(\"--dry\", \"Print the package manager command instead of running it.\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .action(async (opts) => {\n const packageJsonPath = path.join(opts.cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) {\n logger.error(\"No package.json found in the current directory.\");\n process.exit(1);\n }\n\n const packageJsonContent = fs.readFileSync(packageJsonPath, \"utf-8\");\n let pkg: Record<string, Record<string, string> | undefined>;\n try {\n pkg = JSON.parse(packageJsonContent);\n } catch {\n logPackageJsonParseError(packageJsonPath, \"update\");\n console.error(\"No changes were written.\");\n process.exit(1);\n }\n const sections = [\"dependencies\", \"devDependencies\"];\n const targets: string[] = [];\n\n for (const section of sections) {\n if (!pkg[section]) continue;\n for (const dep in pkg[section]) {\n if (\n dep.startsWith(\"@assistant-ui/\") ||\n dep === \"assistant-stream\" ||\n dep === \"assistant-cloud\"\n ) {\n targets.push(dep);\n }\n }\n }\n\n if (!targets.length) {\n logger.warn(\"No matching packages found to update.\");\n return;\n }\n\n logger.info(`Found ${targets.length} package(s) to update:`);\n targets.forEach((pkg) => {\n logger.info(` - ${pkg}`);\n });\n logger.break();\n\n // Build command using the utility\n const installCmd = await getInstallCommand(\n targets.map((d) => `${d}@latest`),\n opts.cwd,\n );\n\n if (opts.dry) {\n logger.info(\"Dry run: would run the following command:\");\n logger.info(` ${installCmd.command} ${installCmd.args.join(\" \")}`);\n return;\n }\n\n logger.step(\"Updating packages...\");\n try {\n await runSpawn(installCmd.command, installCmd.args, opts.cwd);\n } catch (error) {\n if (error instanceof SpawnSignalError) throw error;\n logger.error(\"Package manager update failed.\");\n process.exit(error instanceof SpawnExitError ? error.code : 1);\n }\n\n logger.break();\n logger.success(\"All packages updated to latest version!\");\n });\n"],"mappings":";;;;;;;;AAQA,MAAa,SAAS,IAAI,QAAQ,CAAC,CAChC,KAAK,QAAQ,CAAC,CACd,YACC,wHACF,CAAC,CACA,OAAO,SAAS,0DAA0D,CAAC,CAC3E,OACC,mBACA,6DACA,QAAQ,IAAI,CACd,CAAC,CACA,OAAO,OAAO,SAAS;CACtB,MAAM,kBAAkB,KAAK,KAAK,KAAK,KAAK,cAAc;CAC1D,IAAI,CAAC,GAAG,WAAW,eAAe,GAAG;EACnC,OAAO,MAAM,iDAAiD;EAC9D,QAAQ,KAAK,CAAC;CAChB;CAEA,MAAM,qBAAqB,GAAG,aAAa,iBAAiB,OAAO;CACnE,IAAI;CACJ,IAAI;EACF,MAAM,KAAK,MAAM,kBAAkB;CACrC,QAAQ;EACN,yBAAyB,iBAAiB,QAAQ;EAClD,QAAQ,MAAM,0BAA0B;EACxC,QAAQ,KAAK,CAAC;CAChB;CACA,MAAM,WAAW,CAAC,gBAAgB,iBAAiB;CACnD,MAAM,UAAoB,CAAC;CAE3B,KAAK,MAAM,WAAW,UAAU;EAC9B,IAAI,CAAC,IAAI,UAAU;EACnB,KAAK,MAAM,OAAO,IAAI,UACpB,IACE,IAAI,WAAW,gBAAgB,KAC/B,QAAQ,sBACR,QAAQ,mBAER,QAAQ,KAAK,GAAG;CAGtB;CAEA,IAAI,CAAC,QAAQ,QAAQ;EACnB,OAAO,KAAK,uCAAuC;EACnD;CACF;CAEA,OAAO,KAAK,SAAS,QAAQ,OAAO,uBAAuB;CAC3D,QAAQ,SAAS,QAAQ;EACvB,OAAO,KAAK,OAAO,KAAK;CAC1B,CAAC;CACD,OAAO,MAAM;CAGb,MAAM,aAAa,MAAM,kBACvB,QAAQ,KAAK,MAAM,GAAG,EAAE,QAAQ,GAChC,KAAK,GACP;CAEA,IAAI,KAAK,KAAK;EACZ,OAAO,KAAK,2CAA2C;EACvD,OAAO,KAAK,KAAK,WAAW,QAAQ,GAAG,WAAW,KAAK,KAAK,GAAG,GAAG;EAClE;CACF;CAEA,OAAO,KAAK,sBAAsB;CAClC,IAAI;EACF,MAAM,SAAS,WAAW,SAAS,WAAW,MAAM,KAAK,GAAG;CAC9D,SAAS,OAAO;EACd,IAAI,iBAAiB,kBAAkB,MAAM;EAC7C,OAAO,MAAM,gCAAgC;EAC7C,QAAQ,KAAK,iBAAiB,iBAAiB,MAAM,OAAO,CAAC;CAC/D;CAEA,OAAO,MAAM;CACb,OAAO,QAAQ,yCAAyC;AAC1D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","names":[],"sources":["../../src/commands/upgrade.ts"],"mappings":";;UAKiB;EACf;EACA;EACA;EACA;;cAiBW,gBAAc;cAoBd,gBAAc"}
1
+ {"version":3,"file":"upgrade.d.ts","names":[],"sources":["../../src/commands/upgrade.ts"],"mappings":";;UAMiB;EACf;EACA;EACA;EACA;;cAiBW,gBAAc;cAqBd,gBAAc"}
@@ -1,3 +1,4 @@
1
+ import { SpawnSignalError } from "../lib/run-spawn.js";
1
2
  import { transform } from "../lib/transform.js";
2
3
  import { upgrade } from "../lib/upgrade.js";
3
4
  import { Command } from "commander";
@@ -8,10 +9,11 @@ debug.enable("codemod:*");
8
9
  const addTransformOptions = (command) => {
9
10
  return command.option("-d, --dry", "Dry run (no changes are made to files)").option("-p, --print", "Print transformed files to stdout").option("--verbose", "Show more information about the transform process").option("-j, --jscodeshift <options>", "Pass options directly to jscodeshift");
10
11
  };
11
- const codemodCommand = addTransformOptions(new Command().name("codemod").description("CLI tool for running codemods").argument("<codemod>", "Codemod to run (e.g., rewrite-framework-imports)").argument("<source>", "Path to source files or directory to transform")).action((codemod, source, options) => {
12
+ const codemodCommand = addTransformOptions(new Command().name("codemod").description("CLI tool for running codemods").argument("<codemod>", "Codemod to run (e.g., rewrite-framework-imports)").argument("<source>", "Path to source files or directory to transform")).action(async (codemod, source, options) => {
12
13
  try {
13
- transform(codemod, source, options);
14
+ await transform(codemod, source, options);
14
15
  } catch (err) {
16
+ if (err instanceof SpawnSignalError) throw err;
15
17
  const errorMessage = err instanceof Error ? err.message : String(err);
16
18
  const errorStack = err instanceof Error ? err.stack : void 0;
17
19
  error(`Error transforming: ${errorMessage}`);
@@ -23,6 +25,7 @@ const upgradeCommand = addTransformOptions(new Command().command("upgrade").desc
23
25
  try {
24
26
  await upgrade(options);
25
27
  } catch (err) {
28
+ if (err instanceof SpawnSignalError) throw err;
26
29
  const errorMessage = err instanceof Error ? err.message : String(err);
27
30
  const errorStack = err instanceof Error ? err.stack : void 0;
28
31
  error(`Error upgrading: ${errorMessage}`);
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","names":[],"sources":["../../src/commands/upgrade.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { transform } from \"../lib/transform\";\nimport { upgrade } from \"../lib/upgrade\";\nimport debug from \"debug\";\n\nexport interface TransformOptions {\n dry?: boolean;\n print?: boolean;\n verbose?: boolean;\n jscodeshift?: string;\n}\n\nconst error = debug(\"codemod:error\");\ndebug.enable(\"codemod:*\");\n\nconst addTransformOptions = (command: Command): Command => {\n return command\n .option(\"-d, --dry\", \"Dry run (no changes are made to files)\")\n .option(\"-p, --print\", \"Print transformed files to stdout\")\n .option(\"--verbose\", \"Show more information about the transform process\")\n .option(\n \"-j, --jscodeshift <options>\",\n \"Pass options directly to jscodeshift\",\n );\n};\n\nexport const codemodCommand = addTransformOptions(\n new Command()\n .name(\"codemod\")\n .description(\"CLI tool for running codemods\")\n .argument(\"<codemod>\", \"Codemod to run (e.g., rewrite-framework-imports)\")\n .argument(\"<source>\", \"Path to source files or directory to transform\"),\n).action((codemod, source, options: TransformOptions) => {\n try {\n transform(codemod, source, options);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : undefined;\n error(`Error transforming: ${errorMessage}`);\n if (errorStack) {\n error(errorStack);\n }\n process.exit(1);\n }\n});\n\nexport const upgradeCommand = addTransformOptions(\n new Command()\n .command(\"upgrade\")\n .description(\"Upgrade ai package dependencies and apply codemods\"),\n).action(async (options: TransformOptions) => {\n try {\n await upgrade(options);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : undefined;\n error(`Error upgrading: ${errorMessage}`);\n if (errorStack) {\n error(errorStack);\n }\n process.exit(1);\n }\n});\n"],"mappings":";;;;;AAYA,MAAM,QAAQ,MAAM,eAAe;AACnC,MAAM,OAAO,WAAW;AAExB,MAAM,uBAAuB,YAA8B;CACzD,OAAO,QACJ,OAAO,aAAa,wCAAwC,CAAC,CAC7D,OAAO,eAAe,mCAAmC,CAAC,CAC1D,OAAO,aAAa,mDAAmD,CAAC,CACxE,OACC,+BACA,sCACF;AACJ;AAEA,MAAa,iBAAiB,oBAC5B,IAAI,QAAQ,CAAC,CACV,KAAK,SAAS,CAAC,CACf,YAAY,+BAA+B,CAAC,CAC5C,SAAS,aAAa,kDAAkD,CAAC,CACzE,SAAS,YAAY,gDAAgD,CAC1E,CAAC,CAAC,QAAQ,SAAS,QAAQ,YAA8B;CACvD,IAAI;EACF,UAAU,SAAS,QAAQ,OAAO;CACpC,SAAS,KAAK;EACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EACpE,MAAM,aAAa,eAAe,QAAQ,IAAI,QAAQ,KAAA;EACtD,MAAM,uBAAuB,cAAc;EAC3C,IAAI,YACF,MAAM,UAAU;EAElB,QAAQ,KAAK,CAAC;CAChB;AACF,CAAC;AAED,MAAa,iBAAiB,oBAC5B,IAAI,QAAQ,CAAC,CACV,QAAQ,SAAS,CAAC,CAClB,YAAY,oDAAoD,CACrE,CAAC,CAAC,OAAO,OAAO,YAA8B;CAC5C,IAAI;EACF,MAAM,QAAQ,OAAO;CACvB,SAAS,KAAK;EACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EACpE,MAAM,aAAa,eAAe,QAAQ,IAAI,QAAQ,KAAA;EACtD,MAAM,oBAAoB,cAAc;EACxC,IAAI,YACF,MAAM,UAAU;EAElB,QAAQ,KAAK,CAAC;CAChB;AACF,CAAC"}
1
+ {"version":3,"file":"upgrade.js","names":[],"sources":["../../src/commands/upgrade.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { transform } from \"../lib/transform\";\nimport { upgrade } from \"../lib/upgrade\";\nimport { SpawnSignalError } from \"../lib/run-spawn\";\nimport debug from \"debug\";\n\nexport interface TransformOptions {\n dry?: boolean;\n print?: boolean;\n verbose?: boolean;\n jscodeshift?: string;\n}\n\nconst error = debug(\"codemod:error\");\ndebug.enable(\"codemod:*\");\n\nconst addTransformOptions = (command: Command): Command => {\n return command\n .option(\"-d, --dry\", \"Dry run (no changes are made to files)\")\n .option(\"-p, --print\", \"Print transformed files to stdout\")\n .option(\"--verbose\", \"Show more information about the transform process\")\n .option(\n \"-j, --jscodeshift <options>\",\n \"Pass options directly to jscodeshift\",\n );\n};\n\nexport const codemodCommand = addTransformOptions(\n new Command()\n .name(\"codemod\")\n .description(\"CLI tool for running codemods\")\n .argument(\"<codemod>\", \"Codemod to run (e.g., rewrite-framework-imports)\")\n .argument(\"<source>\", \"Path to source files or directory to transform\"),\n).action(async (codemod, source, options: TransformOptions) => {\n try {\n await transform(codemod, source, options);\n } catch (err) {\n if (err instanceof SpawnSignalError) throw err;\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : undefined;\n error(`Error transforming: ${errorMessage}`);\n if (errorStack) {\n error(errorStack);\n }\n process.exit(1);\n }\n});\n\nexport const upgradeCommand = addTransformOptions(\n new Command()\n .command(\"upgrade\")\n .description(\"Upgrade ai package dependencies and apply codemods\"),\n).action(async (options: TransformOptions) => {\n try {\n await upgrade(options);\n } catch (err) {\n if (err instanceof SpawnSignalError) throw err;\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : undefined;\n error(`Error upgrading: ${errorMessage}`);\n if (errorStack) {\n error(errorStack);\n }\n process.exit(1);\n }\n});\n"],"mappings":";;;;;;AAaA,MAAM,QAAQ,MAAM,eAAe;AACnC,MAAM,OAAO,WAAW;AAExB,MAAM,uBAAuB,YAA8B;CACzD,OAAO,QACJ,OAAO,aAAa,wCAAwC,CAAC,CAC7D,OAAO,eAAe,mCAAmC,CAAC,CAC1D,OAAO,aAAa,mDAAmD,CAAC,CACxE,OACC,+BACA,sCACF;AACJ;AAEA,MAAa,iBAAiB,oBAC5B,IAAI,QAAQ,CAAC,CACV,KAAK,SAAS,CAAC,CACf,YAAY,+BAA+B,CAAC,CAC5C,SAAS,aAAa,kDAAkD,CAAC,CACzE,SAAS,YAAY,gDAAgD,CAC1E,CAAC,CAAC,OAAO,OAAO,SAAS,QAAQ,YAA8B;CAC7D,IAAI;EACF,MAAM,UAAU,SAAS,QAAQ,OAAO;CAC1C,SAAS,KAAK;EACZ,IAAI,eAAe,kBAAkB,MAAM;EAC3C,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EACpE,MAAM,aAAa,eAAe,QAAQ,IAAI,QAAQ,KAAA;EACtD,MAAM,uBAAuB,cAAc;EAC3C,IAAI,YACF,MAAM,UAAU;EAElB,QAAQ,KAAK,CAAC;CAChB;AACF,CAAC;AAED,MAAa,iBAAiB,oBAC5B,IAAI,QAAQ,CAAC,CACV,QAAQ,SAAS,CAAC,CAClB,YAAY,oDAAoD,CACrE,CAAC,CAAC,OAAO,OAAO,YAA8B;CAC5C,IAAI;EACF,MAAM,QAAQ,OAAO;CACvB,SAAS,KAAK;EACZ,IAAI,eAAe,kBAAkB,MAAM;EAC3C,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EACpE,MAAM,aAAa,eAAe,QAAQ,IAAI,QAAQ,KAAA;EACtD,MAAM,oBAAoB,cAAc;EACxC,IAAI,YACF,MAAM,UAAU;EAElB,QAAQ,KAAK,CAAC;CAChB;AACF,CAAC"}
package/dist/index.js CHANGED
@@ -1,12 +1,8 @@
1
1
  #!/usr/bin/env node
2
+ import { handleCliError } from "./lib/handle-cli-error.js";
2
3
  import { runCli } from "./run.js";
3
4
  //#region src/index.ts
4
- process.on("SIGINT", () => process.exit(0));
5
- process.on("SIGTERM", () => process.exit(0));
6
- runCli().catch((error) => {
7
- console.error(error);
8
- process.exitCode = 1;
9
- });
5
+ runCli().catch(handleCliError);
10
6
  //#endregion
11
7
 
12
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { runCli } from \"./run\";\n\nprocess.on(\"SIGINT\", () => process.exit(0));\nprocess.on(\"SIGTERM\", () => process.exit(0));\n\nvoid runCli().catch((error: unknown) => {\n console.error(error);\n process.exitCode = 1;\n});\n"],"mappings":";;;AAIA,QAAQ,GAAG,gBAAgB,QAAQ,KAAK,CAAC,CAAC;AAC1C,QAAQ,GAAG,iBAAiB,QAAQ,KAAK,CAAC,CAAC;AAEtC,OAAO,CAAC,CAAC,OAAO,UAAmB;CACtC,QAAQ,MAAM,KAAK;CACnB,QAAQ,WAAW;AACrB,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { handleCliError } from \"./lib/handle-cli-error\";\nimport { runCli } from \"./run\";\n\nvoid runCli().catch(handleCliError);\n"],"mappings":";;;;AAKK,OAAO,CAAC,CAAC,MAAM,cAAc"}
@@ -1,4 +1,4 @@
1
- import { PackageManagerName } from "./create-project.js";
1
+ import { PackageManagerName } from "./utils/package-manager.js";
2
2
  //#region src/lib/agent-skill.d.ts
3
3
  declare const SKILLS_PACKAGE = "assistant-ui/skills";
4
4
  declare function resolveSkillsInstall(params: {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-skill.d.ts","names":[],"sources":["../../src/lib/agent-skill.ts"],"mappings":";;cAEa;iBAEG,qBAAqB;EACnC;EACA;;iBAQc,sBACd,IAAI,oBACJ;EAAU"}
1
+ {"version":3,"file":"agent-skill.d.ts","names":[],"sources":["../../src/lib/agent-skill.ts"],"mappings":";;cAGa;iBAEG,qBAAqB;EACnC;EACA;;iBAQc,sBACd,IAAI,oBACJ;EAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-skill.js","names":[],"sources":["../../src/lib/agent-skill.ts"],"sourcesContent":["import { dlxCommand, type PackageManagerName } from \"./create-project\";\n\nexport const SKILLS_PACKAGE = \"assistant-ui/skills\";\n\nexport function resolveSkillsInstall(params: {\n skills?: boolean;\n stdinIsTTY?: boolean;\n}): boolean | undefined {\n const { skills, stdinIsTTY = process.stdin.isTTY } = params;\n if (skills !== undefined) return skills;\n if (!stdinIsTTY) return true;\n return undefined;\n}\n\nexport function buildSkillsAddCommand(\n pm: PackageManagerName,\n params: { stdinIsTTY?: boolean } = {},\n): [string, string[]] {\n const { stdinIsTTY = process.stdin.isTTY } = params;\n const [command, dlxArgs] = dlxCommand(pm);\n const args = [...dlxArgs, \"skills\", \"add\", SKILLS_PACKAGE];\n\n // Without a TTY the skills CLI cannot prompt for agent platforms, so skip its\n // confirmation; with a TTY it owns the platform selection interactively.\n if (!stdinIsTTY) args.push(\"--yes\");\n\n return [command, args];\n}\n"],"mappings":";;AAEA,MAAa,iBAAiB;AAE9B,SAAgB,qBAAqB,QAGb;CACtB,MAAM,EAAE,QAAQ,aAAa,QAAQ,MAAM,UAAU;CACrD,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,IAAI,CAAC,YAAY,OAAO;AAE1B;AAEA,SAAgB,sBACd,IACA,SAAmC,CAAC,GAChB;CACpB,MAAM,EAAE,aAAa,QAAQ,MAAM,UAAU;CAC7C,MAAM,CAAC,SAAS,WAAW,WAAW,EAAE;CACxC,MAAM,OAAO;EAAC,GAAG;EAAS;EAAU;EAAO;CAAc;CAIzD,IAAI,CAAC,YAAY,KAAK,KAAK,OAAO;CAElC,OAAO,CAAC,SAAS,IAAI;AACvB"}
1
+ {"version":3,"file":"agent-skill.js","names":[],"sources":["../../src/lib/agent-skill.ts"],"sourcesContent":["import { dlxCommand } from \"./create-project\";\nimport { type PackageManagerName } from \"./utils/package-manager\";\n\nexport const SKILLS_PACKAGE = \"assistant-ui/skills\";\n\nexport function resolveSkillsInstall(params: {\n skills?: boolean;\n stdinIsTTY?: boolean;\n}): boolean | undefined {\n const { skills, stdinIsTTY = process.stdin.isTTY } = params;\n if (skills !== undefined) return skills;\n if (!stdinIsTTY) return true;\n return undefined;\n}\n\nexport function buildSkillsAddCommand(\n pm: PackageManagerName,\n params: { stdinIsTTY?: boolean } = {},\n): [string, string[]] {\n const { stdinIsTTY = process.stdin.isTTY } = params;\n const [command, dlxArgs] = dlxCommand(pm);\n const args = [...dlxArgs, \"skills\", \"add\", SKILLS_PACKAGE];\n\n // Without a TTY the skills CLI cannot prompt for agent platforms, so skip its\n // confirmation; with a TTY it owns the platform selection interactively.\n if (!stdinIsTTY) args.push(\"--yes\");\n\n return [command, args];\n}\n"],"mappings":";;AAGA,MAAa,iBAAiB;AAE9B,SAAgB,qBAAqB,QAGb;CACtB,MAAM,EAAE,QAAQ,aAAa,QAAQ,MAAM,UAAU;CACrD,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,IAAI,CAAC,YAAY,OAAO;AAE1B;AAEA,SAAgB,sBACd,IACA,SAAmC,CAAC,GAChB;CACpB,MAAM,EAAE,aAAa,QAAQ,MAAM,UAAU;CAC7C,MAAM,CAAC,SAAS,WAAW,WAAW,EAAE;CACxC,MAAM,OAAO;EAAC,GAAG;EAAS;EAAU;EAAO;CAAc;CAIzD,IAAI,CAAC,YAAY,KAAK,KAAK,OAAO;CAElC,OAAO,CAAC,SAAS,IAAI;AACvB"}
@@ -1,5 +1,5 @@
1
+ import { PackageManagerName } from "./utils/package-manager.js";
1
2
  //#region src/lib/create-project.d.ts
2
- type PackageManagerName = "npm" | "pnpm" | "yarn" | "bun";
3
3
  declare function dlxCommand(pm: PackageManagerName): [string, string[]];
4
4
  interface TransformOptions {
5
5
  hasLocalComponents: boolean;
@@ -22,7 +22,6 @@ declare function resolvePackageManager(opts: {
22
22
  declare function resolveLatestReleaseRef(): Promise<string | undefined>;
23
23
  declare function downloadProject(repoPath: string, destDir: string, ref?: string): Promise<void>;
24
24
  declare function scaffoldProject(repoPath: string, destDir: string, source: ProjectSource): Promise<void>;
25
- declare function resolvePackageManagerForCwd(cwd: string, packageManager?: PackageManagerName): Promise<PackageManagerName>;
26
25
  interface TransformResult {
27
26
  registryInstallFailure?: {
28
27
  retryCommand: string;
@@ -30,5 +29,5 @@ interface TransformResult {
30
29
  }
31
30
  declare function transformProject(projectDir: string, opts: TransformOptions): Promise<TransformResult>;
32
31
  //#endregion
33
- export { PackageManagerName, ProjectSource, TransformOptions, TransformResult, dlxCommand, downloadProject, resolveLatestReleaseRef, resolvePackageManager, resolvePackageManagerForCwd, scaffoldProject, transformProject };
32
+ export { ProjectSource, TransformOptions, TransformResult, dlxCommand, downloadProject, resolveLatestReleaseRef, resolvePackageManager, scaffoldProject, transformProject };
34
33
  //# sourceMappingURL=create-project.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-project.d.ts","names":[],"sources":["../../src/lib/create-project.ts"],"mappings":";KAaY;iBAEI,WAAW,IAAI;UAad;EACf;EACA;EACA,gBAAgB;;KAGN;EAEN;EACA;;EAGA;EACA;;iBAcU,sBAAsB;EACpC;EACA;EACA;EACA;IACE;iBAmBkB,2BAA2B;iBAmB3B,gBACpB,kBACA,iBACA,eACC;iBAuDmB,gBACpB,kBACA,iBACA,QAAQ,gBACP;iBAqCmB,4BACpB,aACA,iBAAiB,qBAChB,QAAQ;UAWM;EACf;IAA2B;;;iBAGP,iBACpB,oBACA,MAAM,mBACL,QAAQ"}
1
+ {"version":3,"file":"create-project.d.ts","names":[],"sources":["../../src/lib/create-project.ts"],"mappings":";;iBAagB,WAAW,IAAI;UAad;EACf;EACA;EACA,gBAAgB;;KAGN;EAEN;EACA;;EAGA;EACA;;iBAcU,sBAAsB;EACpC;EACA;EACA;EACA;IACE;iBAmBkB,2BAA2B;iBAmB3B,gBACpB,kBACA,iBACA,eACC;iBAuDmB,gBACpB,kBACA,iBACA,QAAQ,gBACP;UA2Bc;EACf;IAA2B;;;iBAGP,iBACpB,oBACA,MAAM,mBACL,QAAQ"}
@@ -1,10 +1,9 @@
1
+ import { SpawnExitError, SpawnSignalError, runSpawn } from "./run-spawn.js";
1
2
  import { logger } from "./utils/logger.js";
2
- import { SpawnExitError, runSpawn } from "./run-spawn.js";
3
+ import { readProjectFiles } from "./utils/file-scanner.js";
3
4
  import * as fs$1 from "node:fs";
4
5
  import * as path$1 from "node:path";
5
6
  import { downloadTemplate } from "giget";
6
- import { sync } from "glob";
7
- import { detect } from "detect-package-manager";
8
7
  import { parse, printParseErrorCode } from "jsonc-parser";
9
8
  //#region src/lib/create-project.ts
10
9
  function dlxCommand(pm) {
@@ -92,24 +91,6 @@ async function scaffoldProject(repoPath, destDir, source) {
92
91
  throw error;
93
92
  }
94
93
  }
95
- function detectFromUserAgent() {
96
- const ua = process.env.npm_config_user_agent;
97
- if (!ua) return void 0;
98
- if (ua.startsWith("bun/")) return "bun";
99
- if (ua.startsWith("pnpm/")) return "pnpm";
100
- if (ua.startsWith("yarn/")) return "yarn";
101
- if (ua.startsWith("npm/")) return "npm";
102
- }
103
- async function resolvePackageManagerForCwd(cwd, packageManager) {
104
- if (packageManager) return packageManager;
105
- const fromAgent = detectFromUserAgent();
106
- if (fromAgent) return fromAgent;
107
- try {
108
- return await detect({ cwd });
109
- } catch {
110
- return "npm";
111
- }
112
- }
113
94
  async function transformProject(projectDir, opts) {
114
95
  logger.step("Transforming package.json...");
115
96
  transformPackageJson(projectDir);
@@ -208,36 +189,28 @@ function transformTsConfig(projectDir) {
208
189
  fs$1.writeFileSync(tsconfigPath, `${JSON.stringify(tsconfig, null, 2)}\n`);
209
190
  }
210
191
  function transformCssFiles(projectDir) {
211
- const cssFiles = sync("**/*.css", {
192
+ for (const { fullPath, content } of readProjectFiles("**/*.css", {
212
193
  cwd: projectDir,
213
194
  ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES
214
- });
215
- for (const file of cssFiles) {
216
- const fullPath = path$1.join(projectDir, file);
217
- try {
218
- const content = fs$1.readFileSync(fullPath, "utf-8");
219
- const newContent = content.replace(/@source\s+["'][^"']*packages\/ui\/src[^"']*["'];\s*\n?/g, "");
220
- if (newContent !== content) fs$1.writeFileSync(fullPath, newContent);
221
- } catch {}
195
+ })) try {
196
+ const newContent = content.replace(/@source\s+["'][^"']*packages\/ui\/src[^"']*["'];\s*\n?/g, "");
197
+ if (newContent !== content) fs$1.writeFileSync(fullPath, newContent);
198
+ } catch {
199
+ continue;
222
200
  }
223
201
  }
224
202
  function stripImportExtension(component) {
225
203
  return component.replace(/\.[cm]?[tj]sx?$/, "");
226
204
  }
227
205
  function scanRequiredComponents(projectDir) {
228
- const files = sync("**/*.{ts,tsx}", {
229
- cwd: projectDir,
230
- ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES
231
- });
232
206
  const assistantUIComponents = /* @__PURE__ */ new Set();
233
207
  const shadcnUIComponents = /* @__PURE__ */ new Set();
234
- for (const file of files) {
235
- const fullPath = path$1.join(projectDir, file);
236
- try {
237
- const content = fs$1.readFileSync(fullPath, "utf-8");
238
- for (const match of content.matchAll(/from\s+["']@\/components\/assistant-ui\/([^"']+)["']/g)) assistantUIComponents.add(stripImportExtension(match[1]));
239
- for (const match of content.matchAll(/from\s+["']@\/components\/ui\/([^"']+)["']/g)) shadcnUIComponents.add(stripImportExtension(match[1]));
240
- } catch {}
208
+ for (const { content } of readProjectFiles("**/*.{ts,tsx}", {
209
+ cwd: projectDir,
210
+ ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES
211
+ })) {
212
+ for (const match of content.matchAll(/from\s+["']@\/components\/assistant-ui\/([^"']+)["']/g)) assistantUIComponents.add(stripImportExtension(match[1]));
213
+ for (const match of content.matchAll(/from\s+["']@\/components\/ui\/([^"']+)["']/g)) shadcnUIComponents.add(stripImportExtension(match[1]));
241
214
  }
242
215
  return {
243
216
  assistantUI: Array.from(assistantUIComponents),
@@ -249,6 +222,7 @@ async function installDependencies(projectDir, pm) {
249
222
  try {
250
223
  await runSpawn(pm, args, projectDir);
251
224
  } catch (error) {
225
+ if (error instanceof SpawnSignalError) throw error;
252
226
  if (error instanceof SpawnExitError) throw new Error(`${pm} install exited with code ${error.code}`);
253
227
  const message = error instanceof Error ? error.message : String(error);
254
228
  throw new Error(`Failed to install dependencies: ${message}`);
@@ -267,6 +241,7 @@ async function installShadcnRegistry(projectDir, components, label, pm) {
267
241
  await runSpawn(cmd, addArgs, projectDir);
268
242
  return;
269
243
  } catch (error) {
244
+ if (error instanceof SpawnSignalError) throw error;
270
245
  if (error instanceof SpawnExitError) {
271
246
  logger.warn(`shadcn exited with code ${error.code}.`);
272
247
  return { retryCommand: `${cmd} ${retryArgs.join(" ")}` };
@@ -276,6 +251,6 @@ async function installShadcnRegistry(projectDir, components, label, pm) {
276
251
  }
277
252
  }
278
253
  //#endregion
279
- export { dlxCommand, downloadProject, resolveLatestReleaseRef, resolvePackageManager, resolvePackageManagerForCwd, scaffoldProject, transformProject };
254
+ export { dlxCommand, downloadProject, resolveLatestReleaseRef, resolvePackageManager, scaffoldProject, transformProject };
280
255
 
281
256
  //# sourceMappingURL=create-project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-project.js","names":["path","fs","parseJsonc","globSync"],"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { downloadTemplate } from \"giget\";\nimport { sync as globSync } from \"glob\";\nimport { detect } from \"detect-package-manager\";\nimport {\n parse as parseJsonc,\n printParseErrorCode,\n type ParseError,\n} from \"jsonc-parser\";\nimport { logger } from \"./utils/logger\";\nimport { runSpawn, SpawnExitError } from \"./run-spawn\";\n\nexport type PackageManagerName = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\nexport function dlxCommand(pm: PackageManagerName): [string, string[]] {\n switch (pm) {\n case \"pnpm\":\n return [\"pnpm\", [\"dlx\"]];\n case \"yarn\":\n return [\"yarn\", [\"dlx\"]];\n case \"bun\":\n return [\"bunx\", []];\n case \"npm\":\n return [\"npx\", [\"--yes\"]];\n }\n}\n\nexport interface TransformOptions {\n hasLocalComponents: boolean;\n skipInstall?: boolean;\n packageManager: PackageManagerName;\n}\n\nexport type ProjectSource =\n | {\n kind: \"github\";\n ref: string | undefined;\n }\n | {\n kind: \"local\";\n rootDir: string;\n };\n\nconst LOCAL_PROJECT_ARTIFACT_DIRS: readonly string[] = [\n \"node_modules\",\n \".next\",\n \"dist\",\n \"build\",\n];\n\nconst LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES = LOCAL_PROJECT_ARTIFACT_DIRS.map(\n (dir) => `**/${dir}/**`,\n);\n\nexport function resolvePackageManager(opts: {\n useNpm?: boolean;\n usePnpm?: boolean;\n useYarn?: boolean;\n useBun?: boolean;\n}): PackageManagerName | undefined {\n if (opts.useNpm) return \"npm\";\n if (opts.usePnpm) return \"pnpm\";\n if (opts.useYarn) return \"yarn\";\n if (opts.useBun) return \"bun\";\n return undefined;\n}\n\nfunction resolveGitHubAuthToken(): string | undefined {\n const token =\n process.env.GIGET_AUTH ?? process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;\n const trimmed = token?.trim();\n return trimmed || undefined;\n}\n\nfunction toBearerAuthHeader(token: string): string {\n return token.toLowerCase().startsWith(\"bearer \") ? token : `Bearer ${token}`;\n}\n\nexport async function resolveLatestReleaseRef(): Promise<string | undefined> {\n try {\n const authToken = resolveGitHubAuthToken();\n const res = await fetch(\n \"https://api.github.com/repos/assistant-ui/assistant-ui/releases/latest\",\n authToken\n ? { headers: { Authorization: toBearerAuthHeader(authToken) } }\n : undefined,\n );\n if (!res.ok) return undefined;\n const release = (await res.json()) as { tag_name: string };\n return release.tag_name || undefined;\n } catch {\n return undefined;\n }\n}\n\nconst DOWNLOAD_TIMEOUT_MS = 30_000;\n\nexport async function downloadProject(\n repoPath: string,\n destDir: string,\n ref?: string,\n): Promise<void> {\n const source = ref\n ? `gh:assistant-ui/assistant-ui/${repoPath}#${ref}`\n : `gh:assistant-ui/assistant-ui/${repoPath}`;\n\n // Suppress giget's debug output. The `debug` package (used by the upgrade\n // command) sets process.env.DEBUG at module-load time, and giget logs to\n // console.debug whenever that env var is truthy — even for unrelated\n // namespaces. Temporarily unsetting it targets the root cause.\n const origDebug = process.env.DEBUG;\n delete process.env.DEBUG;\n try {\n const authToken = resolveGitHubAuthToken();\n const downloadPromise = downloadTemplate(source, {\n dir: destDir,\n force: true,\n silent: true,\n ...(authToken ? { auth: authToken } : {}),\n });\n\n let timer: ReturnType<typeof setTimeout>;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () =>\n reject(\n new Error(\n \"Download timed out. This may be due to GitHub rate limiting or a network issue. Try again in a few minutes.\",\n ),\n ),\n DOWNLOAD_TIMEOUT_MS,\n );\n });\n\n try {\n await Promise.race([downloadPromise, timeoutPromise]);\n } finally {\n clearTimeout(timer!);\n }\n } finally {\n if (origDebug !== undefined) {\n process.env.DEBUG = origDebug;\n }\n }\n}\n\nfunction shouldCopyLocalProjectPath(src: string, projectDir: string): boolean {\n const relative = path.relative(projectDir, src);\n if (!relative) return true;\n\n const segments = relative.split(path.sep);\n return !segments.some((segment) =>\n LOCAL_PROJECT_ARTIFACT_DIRS.includes(segment),\n );\n}\n\nexport async function scaffoldProject(\n repoPath: string,\n destDir: string,\n source: ProjectSource,\n): Promise<void> {\n if (source.kind === \"github\") {\n await downloadProject(repoPath, destDir, source.ref);\n return;\n }\n\n const localProjectDir = path.resolve(source.rootDir, repoPath);\n try {\n fs.cpSync(localProjectDir, destDir, {\n recursive: true,\n force: true,\n filter: (src) => shouldCopyLocalProjectPath(src, localProjectDir),\n });\n } catch (error) {\n const code =\n error instanceof Error\n ? (error as NodeJS.ErrnoException).code\n : undefined;\n if (code === \"ENOENT\") {\n throw new Error(\n `Local project source does not exist: ${localProjectDir}`,\n );\n }\n throw error;\n }\n}\n\nfunction detectFromUserAgent(): PackageManagerName | undefined {\n const ua = process.env.npm_config_user_agent;\n if (!ua) return undefined;\n if (ua.startsWith(\"bun/\")) return \"bun\";\n if (ua.startsWith(\"pnpm/\")) return \"pnpm\";\n if (ua.startsWith(\"yarn/\")) return \"yarn\";\n if (ua.startsWith(\"npm/\")) return \"npm\";\n return undefined;\n}\n\nexport async function resolvePackageManagerForCwd(\n cwd: string,\n packageManager?: PackageManagerName,\n): Promise<PackageManagerName> {\n if (packageManager) return packageManager;\n const fromAgent = detectFromUserAgent();\n if (fromAgent) return fromAgent;\n try {\n return await detect({ cwd });\n } catch {\n return \"npm\";\n }\n}\n\nexport interface TransformResult {\n registryInstallFailure?: { retryCommand: string };\n}\n\nexport async function transformProject(\n projectDir: string,\n opts: TransformOptions,\n): Promise<TransformResult> {\n logger.step(\"Transforming package.json...\");\n transformPackageJson(projectDir);\n\n logger.step(\"Transforming project files...\");\n transformTsConfig(projectDir);\n transformCssFiles(projectDir);\n\n let assistantUI: string[] | undefined;\n let shadcnUI: string[] | undefined;\n\n if (!opts.hasLocalComponents) {\n const components = scanRequiredComponents(projectDir);\n assistantUI = components.assistantUI;\n shadcnUI = components.shadcnUI;\n }\n\n const pm = opts.packageManager;\n if (!opts.skipInstall) {\n logger.step(\"Installing dependencies...\");\n await installDependencies(projectDir, pm);\n }\n\n if (\n !opts.skipInstall &&\n !opts.hasLocalComponents &&\n shadcnUI &&\n assistantUI\n ) {\n const allShadcn = shadcnUI.includes(\"utils\")\n ? shadcnUI\n : [...shadcnUI, \"utils\"];\n const auiComponents = assistantUI.map((c) => `@assistant-ui/${c}`);\n const components = [...allShadcn, ...auiComponents];\n logger.step(`Installing components: ${components.join(\", \")}...`);\n const failure = await installShadcnRegistry(\n projectDir,\n components,\n \"components\",\n pm,\n );\n if (failure) return { registryInstallFailure: failure };\n }\n return {};\n}\n\nfunction transformPackageJson(projectDir: string): void {\n const pkgPath = path.join(projectDir, \"package.json\");\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n\n // Remove @assistant-ui/ui dependency\n if (pkg.dependencies?.[\"@assistant-ui/ui\"]) {\n delete pkg.dependencies[\"@assistant-ui/ui\"];\n }\n\n // Transform workspace dependencies to latest\n for (const depType of [\"dependencies\", \"devDependencies\"] as const) {\n const deps = pkg[depType];\n if (!deps) continue;\n\n for (const [name, version] of Object.entries(deps)) {\n if (String(version).includes(\"workspace:\")) {\n deps[name] = \"latest\";\n }\n }\n }\n\n // Remove devDependencies that are workspace-only\n if (pkg.devDependencies?.[\"@assistant-ui/x-buildutils\"]) {\n delete pkg.devDependencies[\"@assistant-ui/x-buildutils\"];\n }\n\n // Update package name to be unique\n const dirName = path.basename(projectDir);\n pkg.name = dirName;\n\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n}\n\nfunction parseTsConfig(content: string): any {\n const errors: ParseError[] = [];\n const tsconfig = parseJsonc(content, errors, { allowTrailingComma: true });\n const error = errors[0];\n if (error) {\n throw new SyntaxError(\n `Invalid tsconfig.json: ${printParseErrorCode(error.error)} at offset ${error.offset}`,\n );\n }\n return tsconfig;\n}\n\nfunction transformTsConfig(projectDir: string): void {\n const tsconfigPath = path.join(projectDir, \"tsconfig.json\");\n\n if (!fs.existsSync(tsconfigPath)) {\n return;\n }\n\n const content = fs.readFileSync(tsconfigPath, \"utf-8\");\n const tsconfig = parseTsConfig(content);\n\n // Remove workspace paths\n if (tsconfig.compilerOptions?.paths) {\n const workspaceKeys = new Set([\n \"@/components/assistant-ui/*\",\n \"@/components/icons/*\",\n \"@/components/ui/*\",\n \"@/components/ui/radix/*\",\n \"@/hooks/*\",\n \"@/lib/utils\",\n \"@assistant-ui/ui/*\",\n ]);\n for (const [key, targets] of Object.entries(\n tsconfig.compilerOptions.paths as Record<string, unknown>,\n )) {\n const targetsWorkspace =\n Array.isArray(targets) &&\n targets.some(\n (target) =>\n typeof target === \"string\" &&\n (target.includes(\"packages/ui/\") || target.startsWith(\"../\")),\n );\n if (workspaceKeys.has(key) || targetsWorkspace) {\n delete tsconfig.compilerOptions.paths[key];\n }\n }\n\n if (Object.keys(tsconfig.compilerOptions.paths).length === 0) {\n delete tsconfig.compilerOptions.paths;\n }\n }\n\n // If extends uses @assistant-ui/x-buildutils, replace with inline config\n if (tsconfig.extends?.includes(\"@assistant-ui/x-buildutils\")) {\n const isNext = tsconfig.extends.includes(\"ts/next\");\n delete tsconfig.extends;\n\n const inlinedCompilerOptions = {\n target: \"ESNext\",\n lib: [\"dom\", \"dom.iterable\", \"ES2023\"],\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: \"react-jsx\",\n ...(isNext ? { plugins: [{ name: \"next\" }] } : {}),\n };\n\n tsconfig.compilerOptions = {\n ...inlinedCompilerOptions,\n ...tsconfig.compilerOptions,\n paths: {\n \"@/*\": [\"./*\"],\n ...(tsconfig.compilerOptions?.paths || {}),\n },\n };\n }\n\n fs.writeFileSync(tsconfigPath, `${JSON.stringify(tsconfig, null, 2)}\\n`);\n}\n\nfunction transformCssFiles(projectDir: string): void {\n const cssFiles = globSync(\"**/*.css\", {\n cwd: projectDir,\n ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES,\n });\n\n for (const file of cssFiles) {\n const fullPath = path.join(projectDir, file);\n try {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n\n const newContent = content.replace(\n /@source\\s+[\"'][^\"']*packages\\/ui\\/src[^\"']*[\"'];\\s*\\n?/g,\n \"\",\n );\n\n if (newContent !== content) {\n fs.writeFileSync(fullPath, newContent);\n }\n } catch {\n // Ignore files that cannot be read/written\n }\n }\n}\n\ninterface RequiredComponents {\n assistantUI: string[];\n shadcnUI: string[];\n}\n\nfunction stripImportExtension(component: string): string {\n return component.replace(/\\.[cm]?[tj]sx?$/, \"\");\n}\n\nfunction scanRequiredComponents(projectDir: string): RequiredComponents {\n const files = globSync(\"**/*.{ts,tsx}\", {\n cwd: projectDir,\n ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES,\n });\n\n const assistantUIComponents = new Set<string>();\n const shadcnUIComponents = new Set<string>();\n\n for (const file of files) {\n const fullPath = path.join(projectDir, file);\n try {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n\n const assistantUIRegex =\n /from\\s+[\"']@\\/components\\/assistant-ui\\/([^\"']+)[\"']/g;\n for (const match of content.matchAll(assistantUIRegex)) {\n assistantUIComponents.add(stripImportExtension(match[1]!));\n }\n\n const uiRegex = /from\\s+[\"']@\\/components\\/ui\\/([^\"']+)[\"']/g;\n for (const match of content.matchAll(uiRegex)) {\n shadcnUIComponents.add(stripImportExtension(match[1]!));\n }\n } catch {\n // Ignore files that cannot be read\n }\n }\n\n return {\n assistantUI: Array.from(assistantUIComponents),\n shadcnUI: Array.from(shadcnUIComponents),\n };\n}\n\nasync function installDependencies(\n projectDir: string,\n pm: PackageManagerName,\n): Promise<void> {\n const args = pm === \"yarn\" ? [] : [\"install\"];\n try {\n await runSpawn(pm, args, projectDir);\n } catch (error) {\n if (error instanceof SpawnExitError) {\n throw new Error(`${pm} install exited with code ${error.code}`);\n }\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to install dependencies: ${message}`);\n }\n}\n\nasync function installShadcnRegistry(\n projectDir: string,\n components: string[],\n label: string,\n pm: PackageManagerName,\n): Promise<{ retryCommand: string } | undefined> {\n const [cmd, dlxArgs] = dlxCommand(pm);\n // For npm, dlxArgs may already include `--yes` for npx auto-install.\n // The trailing `--yes` is for shadcn's own confirmation prompt.\n const retryArgs = [...dlxArgs, \"shadcn@latest\", \"add\", ...components];\n const addArgs = [...retryArgs, \"--yes\"];\n\n try {\n await runSpawn(cmd, addArgs, projectDir);\n return undefined;\n } catch (error) {\n if (error instanceof SpawnExitError) {\n logger.warn(`shadcn exited with code ${error.code}.`);\n return { retryCommand: `${cmd} ${retryArgs.join(\" \")}` };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to install ${label}: ${message}`);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"create-project.js","names":["path","fs","parseJsonc"],"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { downloadTemplate } from \"giget\";\nimport {\n parse as parseJsonc,\n printParseErrorCode,\n type ParseError,\n} from \"jsonc-parser\";\nimport { logger } from \"./utils/logger\";\nimport { runSpawn, SpawnExitError, SpawnSignalError } from \"./run-spawn\";\nimport { type PackageManagerName } from \"./utils/package-manager\";\nimport { readProjectFiles } from \"./utils/file-scanner\";\n\nexport function dlxCommand(pm: PackageManagerName): [string, string[]] {\n switch (pm) {\n case \"pnpm\":\n return [\"pnpm\", [\"dlx\"]];\n case \"yarn\":\n return [\"yarn\", [\"dlx\"]];\n case \"bun\":\n return [\"bunx\", []];\n case \"npm\":\n return [\"npx\", [\"--yes\"]];\n }\n}\n\nexport interface TransformOptions {\n hasLocalComponents: boolean;\n skipInstall?: boolean;\n packageManager: PackageManagerName;\n}\n\nexport type ProjectSource =\n | {\n kind: \"github\";\n ref: string | undefined;\n }\n | {\n kind: \"local\";\n rootDir: string;\n };\n\nconst LOCAL_PROJECT_ARTIFACT_DIRS: readonly string[] = [\n \"node_modules\",\n \".next\",\n \"dist\",\n \"build\",\n];\n\nconst LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES = LOCAL_PROJECT_ARTIFACT_DIRS.map(\n (dir) => `**/${dir}/**`,\n);\n\nexport function resolvePackageManager(opts: {\n useNpm?: boolean;\n usePnpm?: boolean;\n useYarn?: boolean;\n useBun?: boolean;\n}): PackageManagerName | undefined {\n if (opts.useNpm) return \"npm\";\n if (opts.usePnpm) return \"pnpm\";\n if (opts.useYarn) return \"yarn\";\n if (opts.useBun) return \"bun\";\n return undefined;\n}\n\nfunction resolveGitHubAuthToken(): string | undefined {\n const token =\n process.env.GIGET_AUTH ?? process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;\n const trimmed = token?.trim();\n return trimmed || undefined;\n}\n\nfunction toBearerAuthHeader(token: string): string {\n return token.toLowerCase().startsWith(\"bearer \") ? token : `Bearer ${token}`;\n}\n\nexport async function resolveLatestReleaseRef(): Promise<string | undefined> {\n try {\n const authToken = resolveGitHubAuthToken();\n const res = await fetch(\n \"https://api.github.com/repos/assistant-ui/assistant-ui/releases/latest\",\n authToken\n ? { headers: { Authorization: toBearerAuthHeader(authToken) } }\n : undefined,\n );\n if (!res.ok) return undefined;\n const release = (await res.json()) as { tag_name: string };\n return release.tag_name || undefined;\n } catch {\n return undefined;\n }\n}\n\nconst DOWNLOAD_TIMEOUT_MS = 30_000;\n\nexport async function downloadProject(\n repoPath: string,\n destDir: string,\n ref?: string,\n): Promise<void> {\n const source = ref\n ? `gh:assistant-ui/assistant-ui/${repoPath}#${ref}`\n : `gh:assistant-ui/assistant-ui/${repoPath}`;\n\n // Suppress giget's debug output. The `debug` package (used by the upgrade\n // command) sets process.env.DEBUG at module-load time, and giget logs to\n // console.debug whenever that env var is truthy — even for unrelated\n // namespaces. Temporarily unsetting it targets the root cause.\n const origDebug = process.env.DEBUG;\n delete process.env.DEBUG;\n try {\n const authToken = resolveGitHubAuthToken();\n const downloadPromise = downloadTemplate(source, {\n dir: destDir,\n force: true,\n silent: true,\n ...(authToken ? { auth: authToken } : {}),\n });\n\n let timer: ReturnType<typeof setTimeout>;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () =>\n reject(\n new Error(\n \"Download timed out. This may be due to GitHub rate limiting or a network issue. Try again in a few minutes.\",\n ),\n ),\n DOWNLOAD_TIMEOUT_MS,\n );\n });\n\n try {\n await Promise.race([downloadPromise, timeoutPromise]);\n } finally {\n clearTimeout(timer!);\n }\n } finally {\n if (origDebug !== undefined) {\n process.env.DEBUG = origDebug;\n }\n }\n}\n\nfunction shouldCopyLocalProjectPath(src: string, projectDir: string): boolean {\n const relative = path.relative(projectDir, src);\n if (!relative) return true;\n\n const segments = relative.split(path.sep);\n return !segments.some((segment) =>\n LOCAL_PROJECT_ARTIFACT_DIRS.includes(segment),\n );\n}\n\nexport async function scaffoldProject(\n repoPath: string,\n destDir: string,\n source: ProjectSource,\n): Promise<void> {\n if (source.kind === \"github\") {\n await downloadProject(repoPath, destDir, source.ref);\n return;\n }\n\n const localProjectDir = path.resolve(source.rootDir, repoPath);\n try {\n fs.cpSync(localProjectDir, destDir, {\n recursive: true,\n force: true,\n filter: (src) => shouldCopyLocalProjectPath(src, localProjectDir),\n });\n } catch (error) {\n const code =\n error instanceof Error\n ? (error as NodeJS.ErrnoException).code\n : undefined;\n if (code === \"ENOENT\") {\n throw new Error(\n `Local project source does not exist: ${localProjectDir}`,\n );\n }\n throw error;\n }\n}\n\nexport interface TransformResult {\n registryInstallFailure?: { retryCommand: string };\n}\n\nexport async function transformProject(\n projectDir: string,\n opts: TransformOptions,\n): Promise<TransformResult> {\n logger.step(\"Transforming package.json...\");\n transformPackageJson(projectDir);\n\n logger.step(\"Transforming project files...\");\n transformTsConfig(projectDir);\n transformCssFiles(projectDir);\n\n let assistantUI: string[] | undefined;\n let shadcnUI: string[] | undefined;\n\n if (!opts.hasLocalComponents) {\n const components = scanRequiredComponents(projectDir);\n assistantUI = components.assistantUI;\n shadcnUI = components.shadcnUI;\n }\n\n const pm = opts.packageManager;\n if (!opts.skipInstall) {\n logger.step(\"Installing dependencies...\");\n await installDependencies(projectDir, pm);\n }\n\n if (\n !opts.skipInstall &&\n !opts.hasLocalComponents &&\n shadcnUI &&\n assistantUI\n ) {\n const allShadcn = shadcnUI.includes(\"utils\")\n ? shadcnUI\n : [...shadcnUI, \"utils\"];\n const auiComponents = assistantUI.map((c) => `@assistant-ui/${c}`);\n const components = [...allShadcn, ...auiComponents];\n logger.step(`Installing components: ${components.join(\", \")}...`);\n const failure = await installShadcnRegistry(\n projectDir,\n components,\n \"components\",\n pm,\n );\n if (failure) return { registryInstallFailure: failure };\n }\n return {};\n}\n\nfunction transformPackageJson(projectDir: string): void {\n const pkgPath = path.join(projectDir, \"package.json\");\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n\n // Remove @assistant-ui/ui dependency\n if (pkg.dependencies?.[\"@assistant-ui/ui\"]) {\n delete pkg.dependencies[\"@assistant-ui/ui\"];\n }\n\n // Transform workspace dependencies to latest\n for (const depType of [\"dependencies\", \"devDependencies\"] as const) {\n const deps = pkg[depType];\n if (!deps) continue;\n\n for (const [name, version] of Object.entries(deps)) {\n if (String(version).includes(\"workspace:\")) {\n deps[name] = \"latest\";\n }\n }\n }\n\n // Remove devDependencies that are workspace-only\n if (pkg.devDependencies?.[\"@assistant-ui/x-buildutils\"]) {\n delete pkg.devDependencies[\"@assistant-ui/x-buildutils\"];\n }\n\n // Update package name to be unique\n const dirName = path.basename(projectDir);\n pkg.name = dirName;\n\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n}\n\nfunction parseTsConfig(content: string): any {\n const errors: ParseError[] = [];\n const tsconfig = parseJsonc(content, errors, { allowTrailingComma: true });\n const error = errors[0];\n if (error) {\n throw new SyntaxError(\n `Invalid tsconfig.json: ${printParseErrorCode(error.error)} at offset ${error.offset}`,\n );\n }\n return tsconfig;\n}\n\nfunction transformTsConfig(projectDir: string): void {\n const tsconfigPath = path.join(projectDir, \"tsconfig.json\");\n\n if (!fs.existsSync(tsconfigPath)) {\n return;\n }\n\n const content = fs.readFileSync(tsconfigPath, \"utf-8\");\n const tsconfig = parseTsConfig(content);\n\n // Remove workspace paths\n if (tsconfig.compilerOptions?.paths) {\n const workspaceKeys = new Set([\n \"@/components/assistant-ui/*\",\n \"@/components/icons/*\",\n \"@/components/ui/*\",\n \"@/components/ui/radix/*\",\n \"@/hooks/*\",\n \"@/lib/utils\",\n \"@assistant-ui/ui/*\",\n ]);\n for (const [key, targets] of Object.entries(\n tsconfig.compilerOptions.paths as Record<string, unknown>,\n )) {\n const targetsWorkspace =\n Array.isArray(targets) &&\n targets.some(\n (target) =>\n typeof target === \"string\" &&\n (target.includes(\"packages/ui/\") || target.startsWith(\"../\")),\n );\n if (workspaceKeys.has(key) || targetsWorkspace) {\n delete tsconfig.compilerOptions.paths[key];\n }\n }\n\n if (Object.keys(tsconfig.compilerOptions.paths).length === 0) {\n delete tsconfig.compilerOptions.paths;\n }\n }\n\n // If extends uses @assistant-ui/x-buildutils, replace with inline config\n if (tsconfig.extends?.includes(\"@assistant-ui/x-buildutils\")) {\n const isNext = tsconfig.extends.includes(\"ts/next\");\n delete tsconfig.extends;\n\n const inlinedCompilerOptions = {\n target: \"ESNext\",\n lib: [\"dom\", \"dom.iterable\", \"ES2023\"],\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: \"react-jsx\",\n ...(isNext ? { plugins: [{ name: \"next\" }] } : {}),\n };\n\n tsconfig.compilerOptions = {\n ...inlinedCompilerOptions,\n ...tsconfig.compilerOptions,\n paths: {\n \"@/*\": [\"./*\"],\n ...(tsconfig.compilerOptions?.paths || {}),\n },\n };\n }\n\n fs.writeFileSync(tsconfigPath, `${JSON.stringify(tsconfig, null, 2)}\\n`);\n}\n\nfunction transformCssFiles(projectDir: string): void {\n for (const { fullPath, content } of readProjectFiles(\"**/*.css\", {\n cwd: projectDir,\n ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES,\n })) {\n try {\n const newContent = content.replace(\n /@source\\s+[\"'][^\"']*packages\\/ui\\/src[^\"']*[\"'];\\s*\\n?/g,\n \"\",\n );\n\n if (newContent !== content) {\n fs.writeFileSync(fullPath, newContent);\n }\n } catch {\n continue;\n }\n }\n}\n\ninterface RequiredComponents {\n assistantUI: string[];\n shadcnUI: string[];\n}\n\nfunction stripImportExtension(component: string): string {\n return component.replace(/\\.[cm]?[tj]sx?$/, \"\");\n}\n\nfunction scanRequiredComponents(projectDir: string): RequiredComponents {\n const assistantUIComponents = new Set<string>();\n const shadcnUIComponents = new Set<string>();\n\n for (const { content } of readProjectFiles(\"**/*.{ts,tsx}\", {\n cwd: projectDir,\n ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES,\n })) {\n const assistantUIRegex =\n /from\\s+[\"']@\\/components\\/assistant-ui\\/([^\"']+)[\"']/g;\n for (const match of content.matchAll(assistantUIRegex)) {\n assistantUIComponents.add(stripImportExtension(match[1]!));\n }\n\n const uiRegex = /from\\s+[\"']@\\/components\\/ui\\/([^\"']+)[\"']/g;\n for (const match of content.matchAll(uiRegex)) {\n shadcnUIComponents.add(stripImportExtension(match[1]!));\n }\n }\n\n return {\n assistantUI: Array.from(assistantUIComponents),\n shadcnUI: Array.from(shadcnUIComponents),\n };\n}\n\nasync function installDependencies(\n projectDir: string,\n pm: PackageManagerName,\n): Promise<void> {\n const args = pm === \"yarn\" ? [] : [\"install\"];\n try {\n await runSpawn(pm, args, projectDir);\n } catch (error) {\n if (error instanceof SpawnSignalError) {\n throw error;\n }\n if (error instanceof SpawnExitError) {\n throw new Error(`${pm} install exited with code ${error.code}`);\n }\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to install dependencies: ${message}`);\n }\n}\n\nasync function installShadcnRegistry(\n projectDir: string,\n components: string[],\n label: string,\n pm: PackageManagerName,\n): Promise<{ retryCommand: string } | undefined> {\n const [cmd, dlxArgs] = dlxCommand(pm);\n // For npm, dlxArgs may already include `--yes` for npx auto-install.\n // The trailing `--yes` is for shadcn's own confirmation prompt.\n const retryArgs = [...dlxArgs, \"shadcn@latest\", \"add\", ...components];\n const addArgs = [...retryArgs, \"--yes\"];\n\n try {\n await runSpawn(cmd, addArgs, projectDir);\n return undefined;\n } catch (error) {\n if (error instanceof SpawnSignalError) {\n throw error;\n }\n if (error instanceof SpawnExitError) {\n logger.warn(`shadcn exited with code ${error.code}.`);\n return { retryCommand: `${cmd} ${retryArgs.join(\" \")}` };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to install ${label}: ${message}`);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ //#region src/lib/handle-cli-error.d.ts
2
+ declare function handleCliError(error: unknown): void;
3
+ //#endregion
4
+ export { handleCliError };
5
+ //# sourceMappingURL=handle-cli-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-cli-error.d.ts","names":[],"sources":["../../src/lib/handle-cli-error.ts"],"mappings":";iBAGgB,eAAe"}
@@ -0,0 +1,17 @@
1
+ import { SpawnSignalError } from "./run-spawn.js";
2
+ import { constants } from "node:os";
3
+ //#region src/lib/handle-cli-error.ts
4
+ function handleCliError(error) {
5
+ if (error instanceof SpawnSignalError) {
6
+ process.exitCode = 128 + (constants.signals[error.signal] ?? 0);
7
+ if (error.forwarded) process.kill(process.pid, error.signal);
8
+ else console.error(error.message);
9
+ return;
10
+ }
11
+ console.error(error);
12
+ process.exitCode = 1;
13
+ }
14
+ //#endregion
15
+ export { handleCliError };
16
+
17
+ //# sourceMappingURL=handle-cli-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-cli-error.js","names":[],"sources":["../../src/lib/handle-cli-error.ts"],"sourcesContent":["import { constants } from \"node:os\";\nimport { SpawnSignalError } from \"./run-spawn\";\n\nexport function handleCliError(error: unknown): void {\n if (error instanceof SpawnSignalError) {\n process.exitCode = 128 + (constants.signals[error.signal] ?? 0);\n if (error.forwarded) {\n process.kill(process.pid, error.signal);\n } else {\n console.error(error.message);\n }\n return;\n }\n\n console.error(error);\n process.exitCode = 1;\n}\n"],"mappings":";;;AAGA,SAAgB,eAAe,OAAsB;CACnD,IAAI,iBAAiB,kBAAkB;EACrC,QAAQ,WAAW,OAAO,UAAU,QAAQ,MAAM,WAAW;EAC7D,IAAI,MAAM,WACR,QAAQ,KAAK,QAAQ,KAAK,MAAM,MAAM;OAEtC,QAAQ,MAAM,MAAM,OAAO;EAE7B;CACF;CAEA,QAAQ,MAAM,KAAK;CACnB,QAAQ,WAAW;AACrB"}
@@ -1,12 +1,19 @@
1
1
  import { installPackageIfNeeded } from "./utils/package-installer.js";
2
2
  //#region src/lib/install-ai-sdk-lib.ts
3
3
  async function installAiSdkLib() {
4
+ await installPackageIfNeeded({
5
+ packageName: "@assistant-ui/ai-sdk",
6
+ importPatterns: ["@assistant-ui/ai-sdk"],
7
+ promptMessage: "AI SDK imports were added but @assistant-ui/ai-sdk is not installed. Do you want to install it? (Y/n) ",
8
+ skipMessage: "@assistant-ui/ai-sdk is already installed. Skipping installation.",
9
+ notFoundMessage: "No AI SDK imports found; skipping installation."
10
+ });
4
11
  await installPackageIfNeeded({
5
12
  packageName: "@assistant-ui/react-ai-sdk",
6
13
  importPatterns: ["@assistant-ui/react-ai-sdk"],
7
14
  promptMessage: "AI SDK imports were added but @assistant-ui/react-ai-sdk is not installed. Do you want to install it? (Y/n) ",
8
15
  skipMessage: "@assistant-ui/react-ai-sdk is already installed. Skipping installation.",
9
- notFoundMessage: "No AI SDK imports found; skipping installation."
16
+ notFoundMessage: "No legacy AI SDK imports found; skipping installation."
10
17
  });
11
18
  }
12
19
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"install-ai-sdk-lib.js","names":[],"sources":["../../src/lib/install-ai-sdk-lib.ts"],"sourcesContent":["import { installPackageIfNeeded } from \"./utils/package-installer\";\n\nexport default async function installAiSdkLib(): Promise<void> {\n await installPackageIfNeeded({\n packageName: \"@assistant-ui/react-ai-sdk\",\n importPatterns: [\"@assistant-ui/react-ai-sdk\"],\n promptMessage:\n \"AI SDK imports were added but @assistant-ui/react-ai-sdk is not installed. Do you want to install it? (Y/n) \",\n skipMessage:\n \"@assistant-ui/react-ai-sdk is already installed. Skipping installation.\",\n notFoundMessage: \"No AI SDK imports found; skipping installation.\",\n });\n}\n"],"mappings":";;AAEA,eAA8B,kBAAiC;CAC7D,MAAM,uBAAuB;EAC3B,aAAa;EACb,gBAAgB,CAAC,4BAA4B;EAC7C,eACE;EACF,aACE;EACF,iBAAiB;CACnB,CAAC;AACH"}
1
+ {"version":3,"file":"install-ai-sdk-lib.js","names":[],"sources":["../../src/lib/install-ai-sdk-lib.ts"],"sourcesContent":["import { installPackageIfNeeded } from \"./utils/package-installer\";\n\nexport default async function installAiSdkLib(): Promise<void> {\n await installPackageIfNeeded({\n packageName: \"@assistant-ui/ai-sdk\",\n importPatterns: [\"@assistant-ui/ai-sdk\"],\n promptMessage:\n \"AI SDK imports were added but @assistant-ui/ai-sdk is not installed. Do you want to install it? (Y/n) \",\n skipMessage:\n \"@assistant-ui/ai-sdk is already installed. Skipping installation.\",\n notFoundMessage: \"No AI SDK imports found; skipping installation.\",\n });\n\n // The previous name is a separate package, so an import of it needs that\n // package installed; the neutral one would not make it resolvable.\n await installPackageIfNeeded({\n packageName: \"@assistant-ui/react-ai-sdk\",\n importPatterns: [\"@assistant-ui/react-ai-sdk\"],\n promptMessage:\n \"AI SDK imports were added but @assistant-ui/react-ai-sdk is not installed. Do you want to install it? (Y/n) \",\n skipMessage:\n \"@assistant-ui/react-ai-sdk is already installed. Skipping installation.\",\n notFoundMessage: \"No legacy AI SDK imports found; skipping installation.\",\n });\n}\n"],"mappings":";;AAEA,eAA8B,kBAAiC;CAC7D,MAAM,uBAAuB;EAC3B,aAAa;EACb,gBAAgB,CAAC,sBAAsB;EACvC,eACE;EACF,aACE;EACF,iBAAiB;CACnB,CAAC;CAID,MAAM,uBAAuB;EAC3B,aAAa;EACb,gBAAgB,CAAC,4BAA4B;EAC7C,eACE;EACF,aACE;EACF,iBAAiB;CACnB,CAAC;AACH"}
@@ -2,14 +2,10 @@ import { installPackageIfNeeded } from "./utils/package-installer.js";
2
2
  //#region src/lib/install-edge-lib.ts
3
3
  async function installEdgeLib() {
4
4
  await installPackageIfNeeded({
5
- packageName: "@assistant-ui/react-ai-sdk",
6
- importPatterns: [
7
- "@assistant-ui/react-edge",
8
- "@assistant-ui/react-ai-sdk",
9
- "useChatRuntime"
10
- ],
11
- promptMessage: "Edge Runtime imports were detected but @assistant-ui/react-ai-sdk is not installed. Do you want to install it? (Y/n) ",
12
- skipMessage: "@assistant-ui/react-ai-sdk is already installed. Skipping installation.",
5
+ packageName: "@assistant-ui/ai-sdk",
6
+ importPatterns: ["@assistant-ui/react-edge"],
7
+ promptMessage: "Edge Runtime imports were detected but @assistant-ui/ai-sdk is not installed. Do you want to install it? (Y/n) ",
8
+ skipMessage: "@assistant-ui/ai-sdk is already installed. Skipping installation.",
13
9
  notFoundMessage: "No Edge Runtime imports found; skipping installation."
14
10
  });
15
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"install-edge-lib.js","names":[],"sources":["../../src/lib/install-edge-lib.ts"],"sourcesContent":["import { installPackageIfNeeded } from \"./utils/package-installer\";\n\nexport default async function installEdgeLib(): Promise<void> {\n await installPackageIfNeeded({\n packageName: \"@assistant-ui/react-ai-sdk\",\n importPatterns: [\n \"@assistant-ui/react-edge\",\n \"@assistant-ui/react-ai-sdk\",\n \"useChatRuntime\",\n ],\n promptMessage:\n \"Edge Runtime imports were detected but @assistant-ui/react-ai-sdk is not installed. Do you want to install it? (Y/n) \",\n skipMessage:\n \"@assistant-ui/react-ai-sdk is already installed. Skipping installation.\",\n notFoundMessage: \"No Edge Runtime imports found; skipping installation.\",\n });\n}\n"],"mappings":";;AAEA,eAA8B,iBAAgC;CAC5D,MAAM,uBAAuB;EAC3B,aAAa;EACb,gBAAgB;GACd;GACA;GACA;EACF;EACA,eACE;EACF,aACE;EACF,iBAAiB;CACnB,CAAC;AACH"}
1
+ {"version":3,"file":"install-edge-lib.js","names":[],"sources":["../../src/lib/install-edge-lib.ts"],"sourcesContent":["import { installPackageIfNeeded } from \"./utils/package-installer\";\n\nexport default async function installEdgeLib(): Promise<void> {\n // Only the retired edge specifier is unambiguous here. `useChatRuntime` and\n // the AI SDK package specifiers are shared by both AI SDK packages, so\n // installAiSdkLib resolves those by the specifier the file actually imports.\n await installPackageIfNeeded({\n packageName: \"@assistant-ui/ai-sdk\",\n importPatterns: [\"@assistant-ui/react-edge\"],\n promptMessage:\n \"Edge Runtime imports were detected but @assistant-ui/ai-sdk is not installed. Do you want to install it? (Y/n) \",\n skipMessage:\n \"@assistant-ui/ai-sdk is already installed. Skipping installation.\",\n notFoundMessage: \"No Edge Runtime imports found; skipping installation.\",\n });\n}\n"],"mappings":";;AAEA,eAA8B,iBAAgC;CAI5D,MAAM,uBAAuB;EAC3B,aAAa;EACb,gBAAgB,CAAC,0BAA0B;EAC3C,eACE;EACF,aACE;EACF,iBAAiB;CACnB,CAAC;AACH"}
@@ -1,9 +1,23 @@
1
1
  //#region src/lib/run-spawn.d.ts
2
2
  declare class SpawnExitError extends Error {
3
3
  code: number;
4
- constructor(code: number);
4
+ stderr: string;
5
+ constructor(code: number, stderr?: string);
5
6
  }
7
+ declare class SpawnSignalError extends Error {
8
+ signal: NodeJS.Signals;
9
+ forwarded: boolean;
10
+ constructor(signal: NodeJS.Signals, forwarded: boolean);
11
+ }
12
+ interface SpawnResult {
13
+ code: number | null;
14
+ signal: NodeJS.Signals | null;
15
+ stdout: string;
16
+ stderr: string;
17
+ }
18
+ declare const hasActiveSpawn: () => boolean;
6
19
  declare function runSpawn(command: string, args: string[], cwd?: string): Promise<void>;
20
+ declare function runSpawnCapture(command: string, args: string[], cwd?: string): Promise<SpawnResult>;
7
21
  //#endregion
8
- export { SpawnExitError, runSpawn };
22
+ export { SpawnExitError, SpawnResult, SpawnSignalError, hasActiveSpawn, runSpawn, runSpawnCapture };
9
23
  //# sourceMappingURL=run-spawn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-spawn.d.ts","names":[],"sources":["../../src/lib/run-spawn.ts"],"mappings":";cAEa,uBAAuB;EAClC;EAEY,YAAA;;iBAME,SACd,iBACA,gBACA,eACC"}
1
+ {"version":3,"file":"run-spawn.d.ts","names":[],"sources":["../../src/lib/run-spawn.ts"],"mappings":";cAEa,uBAAuB;EAClC;EACA;EAEY,YAAA,cAAc;;cAWf,yBAAyB;EACpC,QAAQ,OAAO;EACf;EAEY,YAAA,QAAQ,OAAO,SAAS;;UAOrB;EACf;EACA,QAAQ,OAAO;EACf;EACA;;cAOW;iBAiFG,SACd,iBACA,gBACA,eACC;iBAWa,gBACd,iBACA,gBACA,eACC,QAAQ"}