assistant-ui 0.0.116 → 0.0.118

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 (127) hide show
  1. package/dist/codemods/utils/createTransformer.d.ts +13 -16
  2. package/dist/codemods/utils/createTransformer.d.ts.map +1 -1
  3. package/dist/codemods/utils/resolveBinding.d.ts +3 -0
  4. package/dist/codemods/utils/resolveBinding.d.ts.map +1 -0
  5. package/dist/codemods/utils/resolveBinding.js +78 -0
  6. package/dist/codemods/utils/resolveBinding.js.map +1 -0
  7. package/dist/codemods/v0-11/content-part-to-message-part.d.ts +1 -3
  8. package/dist/codemods/v0-11/content-part-to-message-part.d.ts.map +1 -1
  9. package/dist/codemods/v0-12/assistant-api-to-aui.d.ts +1 -3
  10. package/dist/codemods/v0-12/assistant-api-to-aui.d.ts.map +1 -1
  11. package/dist/codemods/v0-12/assistant-api-to-aui.js +51 -99
  12. package/dist/codemods/v0-12/assistant-api-to-aui.js.map +1 -1
  13. package/dist/codemods/v0-12/event-names-to-camelcase.d.ts +1 -3
  14. package/dist/codemods/v0-12/event-names-to-camelcase.d.ts.map +1 -1
  15. package/dist/codemods/v0-12/primitive-if-to-aui-if.d.ts +1 -3
  16. package/dist/codemods/v0-12/primitive-if-to-aui-if.d.ts.map +1 -1
  17. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.d.ts +1 -3
  18. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.d.ts.map +1 -1
  19. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.js +33 -5
  20. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.js.map +1 -1
  21. package/dist/codemods/v0-8/ui-package-split.d.ts +1 -3
  22. package/dist/codemods/v0-8/ui-package-split.d.ts.map +1 -1
  23. package/dist/codemods/v0-9/edge-package-split.d.ts +1 -3
  24. package/dist/codemods/v0-9/edge-package-split.d.ts.map +1 -1
  25. package/dist/commands/add.d.ts +13 -16
  26. package/dist/commands/add.d.ts.map +1 -1
  27. package/dist/commands/add.js +3 -3
  28. package/dist/commands/agent.d.ts +1 -4
  29. package/dist/commands/agent.d.ts.map +1 -1
  30. package/dist/commands/agent.js +16 -13
  31. package/dist/commands/agent.js.map +1 -1
  32. package/dist/commands/create.d.ts +43 -39
  33. package/dist/commands/create.d.ts.map +1 -1
  34. package/dist/commands/create.js +40 -26
  35. package/dist/commands/create.js.map +1 -1
  36. package/dist/commands/doctor.d.ts +17 -20
  37. package/dist/commands/doctor.d.ts.map +1 -1
  38. package/dist/commands/info.d.ts +4 -6
  39. package/dist/commands/info.d.ts.map +1 -1
  40. package/dist/commands/info.js +3 -3
  41. package/dist/commands/init.d.ts +8 -10
  42. package/dist/commands/init.d.ts.map +1 -1
  43. package/dist/commands/init.js +3 -4
  44. package/dist/commands/init.js.map +1 -1
  45. package/dist/commands/mcp.d.ts +1 -4
  46. package/dist/commands/mcp.d.ts.map +1 -1
  47. package/dist/commands/mcp.js +2 -2
  48. package/dist/commands/update.d.ts +1 -4
  49. package/dist/commands/update.d.ts.map +1 -1
  50. package/dist/commands/update.js +1 -1
  51. package/dist/commands/upgrade.d.ts +7 -10
  52. package/dist/commands/upgrade.d.ts.map +1 -1
  53. package/dist/index.d.ts +3 -1
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/lib/agent-skill.d.ts +11 -10
  56. package/dist/lib/agent-skill.d.ts.map +1 -1
  57. package/dist/lib/agent-skill.js +78 -2
  58. package/dist/lib/agent-skill.js.map +1 -1
  59. package/dist/lib/create-project.d.ts +33 -32
  60. package/dist/lib/create-project.d.ts.map +1 -1
  61. package/dist/lib/create-project.js +91 -5
  62. package/dist/lib/create-project.js.map +1 -1
  63. package/dist/lib/handle-cli-error.d.ts +1 -4
  64. package/dist/lib/handle-cli-error.d.ts.map +1 -1
  65. package/dist/lib/install-ai-sdk-lib.d.ts +1 -4
  66. package/dist/lib/install-ai-sdk-lib.d.ts.map +1 -1
  67. package/dist/lib/install-edge-lib.d.ts +1 -4
  68. package/dist/lib/install-edge-lib.d.ts.map +1 -1
  69. package/dist/lib/run-spawn.d.ts +17 -19
  70. package/dist/lib/run-spawn.d.ts.map +1 -1
  71. package/dist/lib/run-spawn.js +25 -10
  72. package/dist/lib/run-spawn.js.map +1 -1
  73. package/dist/lib/transform-options.d.ts +5 -8
  74. package/dist/lib/transform-options.d.ts.map +1 -1
  75. package/dist/lib/transform.d.ts +13 -16
  76. package/dist/lib/transform.d.ts.map +1 -1
  77. package/dist/lib/transform.js +19 -35
  78. package/dist/lib/transform.js.map +1 -1
  79. package/dist/lib/upgrade.d.ts +3 -6
  80. package/dist/lib/upgrade.d.ts.map +1 -1
  81. package/dist/lib/upgrade.js +6 -11
  82. package/dist/lib/upgrade.js.map +1 -1
  83. package/dist/lib/utils/config.d.ts +18 -21
  84. package/dist/lib/utils/config.d.ts.map +1 -1
  85. package/dist/lib/utils/file-scanner.d.ts +12 -15
  86. package/dist/lib/utils/file-scanner.d.ts.map +1 -1
  87. package/dist/lib/utils/logger.d.ts +7 -10
  88. package/dist/lib/utils/logger.d.ts.map +1 -1
  89. package/dist/lib/utils/package-installer.d.ts +7 -10
  90. package/dist/lib/utils/package-installer.d.ts.map +1 -1
  91. package/dist/lib/utils/package-json.d.ts +1 -4
  92. package/dist/lib/utils/package-json.d.ts.map +1 -1
  93. package/dist/lib/utils/package-manager.d.ts +9 -12
  94. package/dist/lib/utils/package-manager.d.ts.map +1 -1
  95. package/dist/lib/utils/package-manager.js +13 -2
  96. package/dist/lib/utils/package-manager.js.map +1 -1
  97. package/dist/lib/utils/registry.d.ts +5 -8
  98. package/dist/lib/utils/registry.d.ts.map +1 -1
  99. package/dist/lib/utils/workspace.d.ts +2 -5
  100. package/dist/lib/utils/workspace.d.ts.map +1 -1
  101. package/dist/program.d.ts +1 -4
  102. package/dist/program.d.ts.map +1 -1
  103. package/dist/program.js +6 -6
  104. package/dist/run.d.ts +1 -4
  105. package/dist/run.d.ts.map +1 -1
  106. package/package.json +8 -8
  107. package/src/codemods/utils/resolveBinding.test.ts +107 -0
  108. package/src/codemods/utils/resolveBinding.ts +130 -0
  109. package/src/codemods/v0-12/__tests__/assistant-api-to-aui.test.ts +256 -0
  110. package/src/codemods/v0-12/assistant-api-to-aui.ts +125 -225
  111. package/src/codemods/v0-15/__tests__/aui-accessor-calls-to-properties.test.ts +101 -0
  112. package/src/codemods/v0-15/aui-accessor-calls-to-properties.ts +60 -5
  113. package/src/commands/agent.ts +15 -22
  114. package/src/commands/create.ts +53 -20
  115. package/src/commands/init.ts +1 -2
  116. package/src/lib/agent-skill.ts +103 -1
  117. package/src/lib/create-project.ts +99 -4
  118. package/src/lib/run-spawn.test.ts +47 -0
  119. package/src/lib/run-spawn.ts +29 -17
  120. package/src/lib/transform-files.test.ts +71 -0
  121. package/src/lib/transform.test.ts +69 -1
  122. package/src/lib/transform.ts +23 -38
  123. package/src/lib/upgrade.ts +9 -13
  124. package/src/lib/utils/package-manager.ts +24 -1
  125. package/plugin/.claude-plugin/plugin.json +0 -8
  126. package/plugin/skills/assistant-ui/SKILL.md +0 -199
  127. package/plugin/skills/assistant-ui/shipables.json +0 -22
@@ -14,12 +14,11 @@ const bundle = [
14
14
  "v0-15/aui-accessor-calls-to-properties"
15
15
  ];
16
16
  const log = debug("codemod:upgrade");
17
- const error = debug("codemod:upgrade:error");
18
17
  /**
19
18
  * Runs the upgrade cycle:
20
19
  * - Runs each codemod in the bundle.
21
20
  * - Displays progress using cli-progress.
22
- * - After codemods run, checks if any file now imports from the new packages and prompts for install.
21
+ * - Outside dry mode, checks for new package imports and prompts for install.
23
22
  */
24
23
  async function upgrade(options) {
25
24
  const cwd = process.cwd();
@@ -36,11 +35,10 @@ async function upgrade(options) {
36
35
  gracefulExit: true
37
36
  }, Presets.shades_classic);
38
37
  bar.start(totalWork, 0, { status: "Starting..." });
39
- const allErrors = [];
40
38
  try {
41
39
  for (const codemod of bundle) {
42
40
  bar.update(completedWork, { status: `Running ${codemod}...` });
43
- const errors = await transform(codemod, cwd, options, {
41
+ await transform(codemod, cwd, options, {
44
42
  logStatus: false,
45
43
  onProgress: (processedFiles) => {
46
44
  completedWork = bundle.indexOf(codemod) * fileCount + processedFiles;
@@ -48,19 +46,16 @@ async function upgrade(options) {
48
46
  },
49
47
  relevantFiles
50
48
  });
51
- allErrors.push(...errors);
52
49
  completedWork = (bundle.indexOf(codemod) + 1) * fileCount;
53
50
  bar.update(completedWork, { status: `Completed ${codemod}` });
54
51
  }
55
- bar.update(totalWork, { status: "Checking dependencies..." });
52
+ bar.update(totalWork, { status: options.dry ? "Preview complete" : "Checking dependencies..." });
56
53
  } finally {
57
54
  bar.stop();
58
55
  }
59
- if (allErrors.length > 0) {
60
- log("Some codemods did not apply successfully to all files. Details:");
61
- allErrors.forEach(({ transform, filename, summary }) => {
62
- error(`codemod=${transform}, path=${filename}, summary=${summary}`);
63
- });
56
+ if (options.dry) {
57
+ logger.success("Dry run complete. No files were changed.");
58
+ return;
64
59
  }
65
60
  logger.info("Checking for package dependencies...");
66
61
  await installEdgeLib();
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","names":[],"sources":["../../src/lib/upgrade.ts"],"sourcesContent":["import debug from \"debug\";\nimport { transform, type TransformErrors, getRelevantFiles } from \"./transform\";\nimport type { TransformOptions } from \"./transform-options\";\nimport { SingleBar, Presets } from \"cli-progress\";\nimport installEdgeLib from \"./install-edge-lib\";\nimport installAiSdkLib from \"./install-ai-sdk-lib\";\nimport { logger } from \"./utils/logger\";\n\nconst bundle = [\n \"v0-9/edge-package-split\",\n \"v0-11/content-part-to-message-part\",\n \"v0-12/assistant-api-to-aui\",\n \"v0-12/event-names-to-camelcase\",\n \"v0-12/primitive-if-to-aui-if\",\n \"v0-15/aui-accessor-calls-to-properties\",\n];\n\nconst log = debug(\"codemod:upgrade\");\nconst error = debug(\"codemod:upgrade:error\");\n\n/**\n * Runs the upgrade cycle:\n * - Runs each codemod in the bundle.\n * - Displays progress using cli-progress.\n * - After codemods run, checks if any file now imports from the new packages and prompts for install.\n */\nexport async function upgrade(options: TransformOptions) {\n const cwd = process.cwd();\n log(\"Starting upgrade...\");\n\n // Find relevant files once to avoid duplicate work\n logger.info(\"Analyzing codebase...\");\n const relevantFiles = getRelevantFiles(cwd);\n const fileCount = relevantFiles.length;\n logger.info(`Found ${fileCount} files to process.`);\n\n // Calculate total work units (files × codemods)\n const totalWork = fileCount * bundle.length;\n let completedWork = 0;\n\n const bar = new SingleBar(\n {\n format: \"Progress |{bar}| {percentage}% | ETA: {eta}s || {status}\",\n hideCursor: true,\n gracefulExit: true,\n },\n Presets.shades_classic,\n );\n\n bar.start(totalWork, 0, { status: \"Starting...\" });\n const allErrors: TransformErrors = [];\n\n try {\n for (const codemod of bundle) {\n bar.update(completedWork, { status: `Running ${codemod}...` });\n\n // Use a custom progress callback to update the progress bar\n const errors = await transform(codemod, cwd, options, {\n logStatus: false,\n onProgress: (processedFiles: number) => {\n completedWork = bundle.indexOf(codemod) * fileCount + processedFiles;\n bar.update(Math.min(completedWork, totalWork), {\n status: `Running ${codemod} (${processedFiles}/${fileCount} files)`,\n });\n },\n relevantFiles, // Pass the pre-computed relevant files\n });\n\n allErrors.push(...errors);\n completedWork = (bundle.indexOf(codemod) + 1) * fileCount;\n bar.update(completedWork, { status: `Completed ${codemod}` });\n }\n\n bar.update(totalWork, { status: \"Checking dependencies...\" });\n } finally {\n bar.stop();\n }\n\n if (allErrors.length > 0) {\n log(\"Some codemods did not apply successfully to all files. Details:\");\n allErrors.forEach(({ transform, filename, summary }) => {\n error(`codemod=${transform}, path=${filename}, summary=${summary}`);\n });\n }\n\n // After codemods run, check if files import from the new packages and prompt for install.\n logger.info(\"Checking for package dependencies...\");\n await installEdgeLib();\n await installAiSdkLib();\n\n log(\"Upgrade complete.\");\n logger.success(\"Upgrade complete!\");\n}\n"],"mappings":";;;;;;;AAQA,MAAM,SAAS;CACb;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,MAAM,MAAM,iBAAiB;AACnC,MAAM,QAAQ,MAAM,uBAAuB;;;;;;;AAQ3C,eAAsB,QAAQ,SAA2B;CACvD,MAAM,MAAM,QAAQ,IAAI;CACxB,IAAI,qBAAqB;CAGzB,OAAO,KAAK,uBAAuB;CACnC,MAAM,gBAAgB,iBAAiB,GAAG;CAC1C,MAAM,YAAY,cAAc;CAChC,OAAO,KAAK,SAAS,UAAU,mBAAmB;CAGlD,MAAM,YAAY,YAAY,OAAO;CACrC,IAAI,gBAAgB;CAEpB,MAAM,MAAM,IAAI,UACd;EACE,QAAQ;EACR,YAAY;EACZ,cAAc;CAChB,GACA,QAAQ,cACV;CAEA,IAAI,MAAM,WAAW,GAAG,EAAE,QAAQ,cAAc,CAAC;CACjD,MAAM,YAA6B,CAAC;CAEpC,IAAI;EACF,KAAK,MAAM,WAAW,QAAQ;GAC5B,IAAI,OAAO,eAAe,EAAE,QAAQ,WAAW,QAAQ,KAAK,CAAC;GAG7D,MAAM,SAAS,MAAM,UAAU,SAAS,KAAK,SAAS;IACpD,WAAW;IACX,aAAa,mBAA2B;KACtC,gBAAgB,OAAO,QAAQ,OAAO,IAAI,YAAY;KACtD,IAAI,OAAO,KAAK,IAAI,eAAe,SAAS,GAAG,EAC7C,QAAQ,WAAW,QAAQ,IAAI,eAAe,GAAG,UAAU,SAC7D,CAAC;IACH;IACA;GACF,CAAC;GAED,UAAU,KAAK,GAAG,MAAM;GACxB,iBAAiB,OAAO,QAAQ,OAAO,IAAI,KAAK;GAChD,IAAI,OAAO,eAAe,EAAE,QAAQ,aAAa,UAAU,CAAC;EAC9D;EAEA,IAAI,OAAO,WAAW,EAAE,QAAQ,2BAA2B,CAAC;CAC9D,UAAU;EACR,IAAI,KAAK;CACX;CAEA,IAAI,UAAU,SAAS,GAAG;EACxB,IAAI,iEAAiE;EACrE,UAAU,SAAS,EAAE,WAAW,UAAU,cAAc;GACtD,MAAM,WAAW,UAAU,SAAS,SAAS,YAAY,SAAS;EACpE,CAAC;CACH;CAGA,OAAO,KAAK,sCAAsC;CAClD,MAAM,eAAe;CACrB,MAAM,gBAAgB;CAEtB,IAAI,mBAAmB;CACvB,OAAO,QAAQ,mBAAmB;AACpC"}
1
+ {"version":3,"file":"upgrade.js","names":[],"sources":["../../src/lib/upgrade.ts"],"sourcesContent":["import debug from \"debug\";\nimport { transform, getRelevantFiles } from \"./transform\";\nimport type { TransformOptions } from \"./transform-options\";\nimport { SingleBar, Presets } from \"cli-progress\";\nimport installEdgeLib from \"./install-edge-lib\";\nimport installAiSdkLib from \"./install-ai-sdk-lib\";\nimport { logger } from \"./utils/logger\";\n\nconst bundle = [\n \"v0-9/edge-package-split\",\n \"v0-11/content-part-to-message-part\",\n \"v0-12/assistant-api-to-aui\",\n \"v0-12/event-names-to-camelcase\",\n \"v0-12/primitive-if-to-aui-if\",\n \"v0-15/aui-accessor-calls-to-properties\",\n];\n\nconst log = debug(\"codemod:upgrade\");\n\n/**\n * Runs the upgrade cycle:\n * - Runs each codemod in the bundle.\n * - Displays progress using cli-progress.\n * - Outside dry mode, checks for new package imports and prompts for install.\n */\nexport async function upgrade(options: TransformOptions) {\n const cwd = process.cwd();\n log(\"Starting upgrade...\");\n\n // Find relevant files once to avoid duplicate work\n logger.info(\"Analyzing codebase...\");\n const relevantFiles = getRelevantFiles(cwd);\n const fileCount = relevantFiles.length;\n logger.info(`Found ${fileCount} files to process.`);\n\n // Calculate total work units (files × codemods)\n const totalWork = fileCount * bundle.length;\n let completedWork = 0;\n\n const bar = new SingleBar(\n {\n format: \"Progress |{bar}| {percentage}% | ETA: {eta}s || {status}\",\n hideCursor: true,\n gracefulExit: true,\n },\n Presets.shades_classic,\n );\n\n bar.start(totalWork, 0, { status: \"Starting...\" });\n\n try {\n for (const codemod of bundle) {\n bar.update(completedWork, { status: `Running ${codemod}...` });\n\n // Use a custom progress callback to update the progress bar\n await transform(codemod, cwd, options, {\n logStatus: false,\n onProgress: (processedFiles: number) => {\n completedWork = bundle.indexOf(codemod) * fileCount + processedFiles;\n bar.update(Math.min(completedWork, totalWork), {\n status: `Running ${codemod} (${processedFiles}/${fileCount} files)`,\n });\n },\n relevantFiles, // Pass the pre-computed relevant files\n });\n\n completedWork = (bundle.indexOf(codemod) + 1) * fileCount;\n bar.update(completedWork, { status: `Completed ${codemod}` });\n }\n\n bar.update(totalWork, {\n status: options.dry ? \"Preview complete\" : \"Checking dependencies...\",\n });\n } finally {\n bar.stop();\n }\n\n if (options.dry) {\n logger.success(\"Dry run complete. No files were changed.\");\n return;\n }\n\n logger.info(\"Checking for package dependencies...\");\n await installEdgeLib();\n await installAiSdkLib();\n\n log(\"Upgrade complete.\");\n logger.success(\"Upgrade complete!\");\n}\n"],"mappings":";;;;;;;AAQA,MAAM,SAAS;CACb;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,MAAM,MAAM,iBAAiB;;;;;;;AAQnC,eAAsB,QAAQ,SAA2B;CACvD,MAAM,MAAM,QAAQ,IAAI;CACxB,IAAI,qBAAqB;CAGzB,OAAO,KAAK,uBAAuB;CACnC,MAAM,gBAAgB,iBAAiB,GAAG;CAC1C,MAAM,YAAY,cAAc;CAChC,OAAO,KAAK,SAAS,UAAU,mBAAmB;CAGlD,MAAM,YAAY,YAAY,OAAO;CACrC,IAAI,gBAAgB;CAEpB,MAAM,MAAM,IAAI,UACd;EACE,QAAQ;EACR,YAAY;EACZ,cAAc;CAChB,GACA,QAAQ,cACV;CAEA,IAAI,MAAM,WAAW,GAAG,EAAE,QAAQ,cAAc,CAAC;CAEjD,IAAI;EACF,KAAK,MAAM,WAAW,QAAQ;GAC5B,IAAI,OAAO,eAAe,EAAE,QAAQ,WAAW,QAAQ,KAAK,CAAC;GAG7D,MAAM,UAAU,SAAS,KAAK,SAAS;IACrC,WAAW;IACX,aAAa,mBAA2B;KACtC,gBAAgB,OAAO,QAAQ,OAAO,IAAI,YAAY;KACtD,IAAI,OAAO,KAAK,IAAI,eAAe,SAAS,GAAG,EAC7C,QAAQ,WAAW,QAAQ,IAAI,eAAe,GAAG,UAAU,SAC7D,CAAC;IACH;IACA;GACF,CAAC;GAED,iBAAiB,OAAO,QAAQ,OAAO,IAAI,KAAK;GAChD,IAAI,OAAO,eAAe,EAAE,QAAQ,aAAa,UAAU,CAAC;EAC9D;EAEA,IAAI,OAAO,WAAW,EACpB,QAAQ,QAAQ,MAAM,qBAAqB,2BAC7C,CAAC;CACH,UAAU;EACR,IAAI,KAAK;CACX;CAEA,IAAI,QAAQ,KAAK;EACf,OAAO,QAAQ,0CAA0C;EACzD;CACF;CAEA,OAAO,KAAK,sCAAsC;CAClD,MAAM,eAAe;CACrB,MAAM,gBAAgB;CAEtB,IAAI,mBAAmB;CACvB,OAAO,QAAQ,mBAAmB;AACpC"}
@@ -1,23 +1,20 @@
1
- //#region src/lib/utils/config.d.ts
2
- interface AssistantUIConfig {
3
- $schema?: string;
4
- style?: string;
5
- tailwind?: {
6
- config?: string;
7
- css?: string;
8
- baseColor?: string;
9
- cssVariables?: boolean;
10
- };
11
- aliases?: {
12
- components?: string;
13
- utils?: string;
14
- ui?: string;
15
- lib?: string;
16
- };
1
+ export interface AssistantUIConfig {
2
+ $schema?: string;
3
+ style?: string;
4
+ tailwind?: {
5
+ config?: string;
6
+ css?: string;
7
+ baseColor?: string;
8
+ cssVariables?: boolean;
9
+ };
10
+ aliases?: {
11
+ components?: string;
12
+ utils?: string;
13
+ ui?: string;
14
+ lib?: string;
15
+ };
17
16
  }
18
- declare function getConfig(cwd?: string): AssistantUIConfig | null;
19
- declare function saveConfig(config: AssistantUIConfig, cwd?: string): void;
20
- declare function hasConfig(cwd?: string): boolean;
21
- //#endregion
22
- export { AssistantUIConfig, getConfig, hasConfig, saveConfig };
17
+ export declare function getConfig(cwd?: string): AssistantUIConfig | null;
18
+ export declare function saveConfig(config: AssistantUIConfig, cwd?: string): void;
19
+ export declare function hasConfig(cwd?: string): boolean;
23
20
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","names":[],"sources":["../../../src/lib/utils/config.ts"],"mappings":";UAIiB;EACf;EACA;EACA;IACE;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA;;;iBASY,UACd,eACC;iBAmBa,WACd,QAAQ,mBACR;iBAMc,UAAU"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAOD,wBAAgB,SAAS,CACvB,GAAG,GAAE,MAAsB,GAC1B,iBAAiB,GAAG,IAAI,CAiB1B;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,iBAAiB,EACzB,GAAG,GAAE,MAAsB,GAC1B,IAAI,CAGN;AAED,wBAAgB,SAAS,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAI9D"}
@@ -1,19 +1,16 @@
1
- //#region src/lib/utils/file-scanner.d.ts
2
- interface ScanOptions {
3
- cwd?: string;
4
- pattern?: string;
5
- ignore?: string[];
1
+ export interface ScanOptions {
2
+ cwd?: string;
3
+ pattern?: string;
4
+ ignore?: string[];
6
5
  }
7
- declare function readProjectFiles(pattern: string, options: {
8
- cwd: string;
9
- ignore?: string[];
6
+ export declare function readProjectFiles(pattern: string, options: {
7
+ cwd: string;
8
+ ignore?: string[];
10
9
  }): Generator<{
11
- file: string;
12
- fullPath: string;
13
- content: string;
10
+ file: string;
11
+ fullPath: string;
12
+ content: string;
14
13
  }>;
15
- declare function scanForImport(importPattern: string | string[], options?: ScanOptions): boolean;
16
- declare function getFilesContaining(searchString: string, options?: ScanOptions): string[];
17
- //#endregion
18
- export { ScanOptions, getFilesContaining, readProjectFiles, scanForImport };
14
+ export declare function scanForImport(importPattern: string | string[], options?: ScanOptions): boolean;
15
+ export declare function getFilesContaining(searchString: string, options?: ScanOptions): string[];
19
16
  //# sourceMappingURL=file-scanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-scanner.d.ts","names":[],"sources":["../../../src/lib/utils/file-scanner.ts"],"mappings":";UAIiB;EACf;EACA;EACA;;iBAGe,iBACf,iBACA;EAAW;EAAa;IACvB;EAAY;EAAc;EAAkB;;iBAc/B,cACd,kCACA,UAAS;iBAuBK,mBACd,sBACA,UAAS"}
1
+ {"version":3,"file":"file-scanner.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/file-scanner.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAiB,gBAAgB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1C,SAAS,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAYhE;AAED,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,EAChC,OAAO,GAAE,WAAgB,GACxB,OAAO,CAoBT;AAED,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,WAAgB,GACxB,MAAM,EAAE,CAqBV"}
@@ -1,12 +1,9 @@
1
- //#region src/lib/utils/logger.d.ts
2
- declare const logger: {
3
- info: (message: string) => void;
4
- success: (message: string) => void;
5
- error: (message: string) => void;
6
- warn: (message: string) => void;
7
- step: (message: string) => void;
8
- break: () => void;
1
+ export declare const logger: {
2
+ info: (message: string) => void;
3
+ success: (message: string) => void;
4
+ error: (message: string) => void;
5
+ warn: (message: string) => void;
6
+ step: (message: string) => void;
7
+ break: () => void;
9
8
  };
10
- //#endregion
11
- export { logger };
12
9
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","names":[],"sources":["../../../src/lib/utils/logger.ts"],"mappings":";cAEa;EACK,OAAA;EAGG,UAAA;EAGF,QAAA;EAGD,OAAA;EAGA,OAAA"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;oBACD,MAAM;uBAGH,MAAM;qBAGR,MAAM;oBAGP,MAAM;oBAGN,MAAM;;CAMvB,CAAC"}
@@ -1,12 +1,9 @@
1
- //#region src/lib/utils/package-installer.d.ts
2
- interface PackageInstallConfig {
3
- packageName: string;
4
- importPatterns: string[];
5
- promptMessage: string;
6
- skipMessage: string;
7
- notFoundMessage: string;
1
+ export interface PackageInstallConfig {
2
+ packageName: string;
3
+ importPatterns: string[];
4
+ promptMessage: string;
5
+ skipMessage: string;
6
+ notFoundMessage: string;
8
7
  }
9
- declare function installPackageIfNeeded(config: PackageInstallConfig): Promise<void>;
10
- //#endregion
11
- export { PackageInstallConfig, installPackageIfNeeded };
8
+ export declare function installPackageIfNeeded(config: PackageInstallConfig): Promise<void>;
12
9
  //# sourceMappingURL=package-installer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-installer.d.ts","names":[],"sources":["../../../src/lib/utils/package-installer.ts"],"mappings":";UAQiB;EACf;EACA;EACA;EACA;EACA;;iBAGoB,uBACpB,QAAQ,uBACP"}
1
+ {"version":3,"file":"package-installer.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/package-installer.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -1,5 +1,2 @@
1
- //#region src/lib/utils/package-json.d.ts
2
- declare function logPackageJsonParseError(packageJsonPath: string, commandName: string): void;
3
- //#endregion
4
- export { logPackageJsonParseError };
1
+ export declare function logPackageJsonParseError(packageJsonPath: string, commandName: string): void;
5
2
  //# sourceMappingURL=package-json.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-json.d.ts","names":[],"sources":["../../../src/lib/utils/package-json.ts"],"mappings":";iBAEgB,yBACd,yBACA"}
1
+ {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/package-json.ts"],"names":[],"mappings":"AAEA,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,QAOpB"}
@@ -1,14 +1,11 @@
1
- //#region src/lib/utils/package-manager.d.ts
2
- type PackageManagerName = "npm" | "pnpm" | "yarn" | "bun";
3
- declare function askQuestion(query: string): Promise<string>;
4
- declare function isPackageInstalled(pkg: string, cwd?: string): boolean;
5
- interface InstallCommand {
6
- command: string;
7
- args: string[];
1
+ export type PackageManagerName = "npm" | "pnpm" | "yarn" | "bun";
2
+ export declare function askQuestion(query: string): Promise<string>;
3
+ export declare function isPackageInstalled(pkg: string, cwd?: string): boolean;
4
+ export interface InstallCommand {
5
+ command: string;
6
+ args: string[];
8
7
  }
9
- declare function getInstallCommand(packageName: string | string[], cwd?: string): Promise<InstallCommand>;
10
- declare function resolvePackageManagerForCwd(cwd: string, packageManager?: PackageManagerName): Promise<PackageManagerName>;
11
- declare function installPackage(packageName: string, cwd?: string): Promise<boolean>;
12
- //#endregion
13
- export { InstallCommand, PackageManagerName, askQuestion, getInstallCommand, installPackage, isPackageInstalled, resolvePackageManagerForCwd };
8
+ export declare function getInstallCommand(packageName: string | string[], cwd?: string): Promise<InstallCommand>;
9
+ export declare function resolvePackageManagerForCwd(cwd: string, packageManager?: PackageManagerName): Promise<PackageManagerName>;
10
+ export declare function installPackage(packageName: string, cwd?: string): Promise<boolean>;
14
11
  //# sourceMappingURL=package-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.d.ts","names":[],"sources":["../../../src/lib/utils/package-manager.ts"],"mappings":";KAOY;iBAEI,YAAY,gBAAgB;iBAa5B,mBACd,aACA;UAmBe;EACf;EACA;;iBAGoB,kBACpB,gCACA,eACC,QAAQ;iBAyBW,4BACpB,aACA,iBAAiB,qBAChB,QAAQ;iBAWW,eACpB,qBACA,eACC"}
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/package-manager.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEjE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC1D;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAgBT;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,EAC9B,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,CAAC,CAazB;AAYD,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,MAAM,EACX,cAAc,CAAC,EAAE,kBAAkB,GAClC,OAAO,CAAC,kBAAkB,CAAC,CAS7B;AAED,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAUlB"}
@@ -1,5 +1,5 @@
1
- import { SpawnSignalError, runSpawn } from "../run-spawn.js";
2
1
  import { logger } from "./logger.js";
2
+ import { SpawnSignalError, runSpawn } from "../run-spawn.js";
3
3
  import * as fs$1 from "node:fs";
4
4
  import * as path$1 from "node:path";
5
5
  import { detect } from "detect-package-manager";
@@ -7,13 +7,24 @@ import * as readline from "node:readline";
7
7
  //#region src/lib/utils/package-manager.ts
8
8
  function askQuestion(query) {
9
9
  return new Promise((resolve) => {
10
+ if (process.stdin.readableEnded) {
11
+ resolve("");
12
+ return;
13
+ }
10
14
  const rl = readline.createInterface({
11
15
  input: process.stdin,
12
16
  output: process.stdout
13
17
  });
14
- rl.question(query, (answer) => {
18
+ let cancelled = false;
19
+ rl.on("SIGINT", () => {
20
+ cancelled = true;
15
21
  rl.close();
22
+ });
23
+ rl.on("line", resolve);
24
+ rl.on("close", () => resolve(cancelled ? "n" : ""));
25
+ rl.question(query, (answer) => {
16
26
  resolve(answer);
27
+ rl.close();
17
28
  });
18
29
  });
19
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.js","names":["path","fs"],"sources":["../../../src/lib/utils/package-manager.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { detect } from \"detect-package-manager\";\nimport * as readline from \"node:readline\";\nimport { logger } from \"./logger\";\nimport { runSpawn, SpawnSignalError } from \"../run-spawn\";\n\nexport type PackageManagerName = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\nexport function askQuestion(query: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(query, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n\nexport function isPackageInstalled(\n pkg: string,\n cwd: string = process.cwd(),\n): boolean {\n try {\n const pkgJsonPath = path.join(cwd, \"package.json\");\n if (fs.existsSync(pkgJsonPath)) {\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, \"utf8\"));\n const deps = pkgJson.dependencies || {};\n const devDeps = pkgJson.devDependencies || {};\n if (deps[pkg] || devDeps[pkg]) {\n return true;\n }\n }\n } catch {\n // Fall back to node_modules check below.\n }\n const modulePath = path.join(cwd, \"node_modules\", ...pkg.split(\"/\"));\n return fs.existsSync(modulePath);\n}\n\nexport interface InstallCommand {\n command: string;\n args: string[];\n}\n\nexport async function getInstallCommand(\n packageName: string | string[],\n cwd?: string,\n): Promise<InstallCommand> {\n const pm = await detect({ cwd });\n const packages = Array.isArray(packageName) ? packageName : [packageName];\n switch (pm) {\n case \"yarn\":\n return { command: \"yarn\", args: [\"add\", ...packages] };\n case \"pnpm\":\n return { command: \"pnpm\", args: [\"add\", ...packages] };\n case \"bun\":\n return { command: \"bun\", args: [\"add\", ...packages] };\n default:\n return { command: \"npm\", args: [\"install\", ...packages] };\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 async function installPackage(\n packageName: string,\n cwd?: string,\n): Promise<boolean> {\n try {\n const { command, args } = await getInstallCommand(packageName, cwd);\n await runSpawn(command, args, cwd);\n return true;\n } catch (e) {\n if (e instanceof SpawnSignalError) throw e;\n logger.error(`Installation failed: ${String(e)}`);\n return false;\n }\n}\n"],"mappings":";;;;;;;AASA,SAAgB,YAAY,OAAgC;CAC1D,OAAO,IAAI,SAAS,YAAY;EAC9B,MAAM,KAAK,SAAS,gBAAgB;GAClC,OAAO,QAAQ;GACf,QAAQ,QAAQ;EAClB,CAAC;EACD,GAAG,SAAS,QAAQ,WAAW;GAC7B,GAAG,MAAM;GACT,QAAQ,MAAM;EAChB,CAAC;CACH,CAAC;AACH;AAEA,SAAgB,mBACd,KACA,MAAc,QAAQ,IAAI,GACjB;CACT,IAAI;EACF,MAAM,cAAcA,OAAK,KAAK,KAAK,cAAc;EACjD,IAAIC,KAAG,WAAW,WAAW,GAAG;GAC9B,MAAM,UAAU,KAAK,MAAMA,KAAG,aAAa,aAAa,MAAM,CAAC;GAC/D,MAAM,OAAO,QAAQ,gBAAgB,CAAC;GACtC,MAAM,UAAU,QAAQ,mBAAmB,CAAC;GAC5C,IAAI,KAAK,QAAQ,QAAQ,MACvB,OAAO;EAEX;CACF,QAAQ,CAER;CACA,MAAM,aAAaD,OAAK,KAAK,KAAK,gBAAgB,GAAG,IAAI,MAAM,GAAG,CAAC;CACnE,OAAOC,KAAG,WAAW,UAAU;AACjC;AAOA,eAAsB,kBACpB,aACA,KACyB;CACzB,MAAM,KAAK,MAAM,OAAO,EAAE,IAAI,CAAC;CAC/B,MAAM,WAAW,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,WAAW;CACxE,QAAQ,IAAR;EACE,KAAK,QACH,OAAO;GAAE,SAAS;GAAQ,MAAM,CAAC,OAAO,GAAG,QAAQ;EAAE;EACvD,KAAK,QACH,OAAO;GAAE,SAAS;GAAQ,MAAM,CAAC,OAAO,GAAG,QAAQ;EAAE;EACvD,KAAK,OACH,OAAO;GAAE,SAAS;GAAO,MAAM,CAAC,OAAO,GAAG,QAAQ;EAAE;EACtD,SACE,OAAO;GAAE,SAAS;GAAO,MAAM,CAAC,WAAW,GAAG,QAAQ;EAAE;CAC5D;AACF;AAEA,SAAS,sBAAsD;CAC7D,MAAM,KAAK,QAAQ,IAAI;CACvB,IAAI,CAAC,IAAI,OAAO,KAAA;CAChB,IAAI,GAAG,WAAW,MAAM,GAAG,OAAO;CAClC,IAAI,GAAG,WAAW,OAAO,GAAG,OAAO;CACnC,IAAI,GAAG,WAAW,OAAO,GAAG,OAAO;CACnC,IAAI,GAAG,WAAW,MAAM,GAAG,OAAO;AAEpC;AAEA,eAAsB,4BACpB,KACA,gBAC6B;CAC7B,IAAI,gBAAgB,OAAO;CAC3B,MAAM,YAAY,oBAAoB;CACtC,IAAI,WAAW,OAAO;CACtB,IAAI;EACF,OAAO,MAAM,OAAO,EAAE,IAAI,CAAC;CAC7B,QAAQ;EACN,OAAO;CACT;AACF;AAEA,eAAsB,eACpB,aACA,KACkB;CAClB,IAAI;EACF,MAAM,EAAE,SAAS,SAAS,MAAM,kBAAkB,aAAa,GAAG;EAClE,MAAM,SAAS,SAAS,MAAM,GAAG;EACjC,OAAO;CACT,SAAS,GAAG;EACV,IAAI,aAAa,kBAAkB,MAAM;EACzC,OAAO,MAAM,wBAAwB,OAAO,CAAC,GAAG;EAChD,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"package-manager.js","names":["path","fs"],"sources":["../../../src/lib/utils/package-manager.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { detect } from \"detect-package-manager\";\nimport * as readline from \"node:readline\";\nimport { logger } from \"./logger\";\nimport { runSpawn, SpawnSignalError } from \"../run-spawn\";\n\nexport type PackageManagerName = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\nexport function askQuestion(query: string): Promise<string> {\n return new Promise((resolve) => {\n // A stream only reaches EOF once, so a run that already consumed stdin gets\n // no further `end` and an interface built over it would wait on a `close`\n // that cannot arrive. An upgrade asks up to three questions.\n if (process.stdin.readableEnded) {\n resolve(\"\");\n return;\n }\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n // stdin at EOF (a piped or CI run) emits `close` without a `line`, so the\n // question callback alone would leave this pending forever and the process\n // would exit 0 with the remaining work silently skipped. An empty answer is\n // what pressing Enter sends, so EOF lands on the prompt's own default.\n // A final answer with no trailing newline arrives as `line` instead of\n // through the callback, and has to win over that default.\n // Ctrl-C in raw mode is delivered as this event rather than as a signal,\n // and without a listener readline answers it by closing — which the EOF\n // default would then read as approval. A cancelled prompt declines.\n let cancelled = false;\n rl.on(\"SIGINT\", () => {\n cancelled = true;\n rl.close();\n });\n rl.on(\"line\", resolve);\n rl.on(\"close\", () => resolve(cancelled ? \"n\" : \"\"));\n rl.question(query, (answer) => {\n resolve(answer);\n rl.close();\n });\n });\n}\n\nexport function isPackageInstalled(\n pkg: string,\n cwd: string = process.cwd(),\n): boolean {\n try {\n const pkgJsonPath = path.join(cwd, \"package.json\");\n if (fs.existsSync(pkgJsonPath)) {\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, \"utf8\"));\n const deps = pkgJson.dependencies || {};\n const devDeps = pkgJson.devDependencies || {};\n if (deps[pkg] || devDeps[pkg]) {\n return true;\n }\n }\n } catch {\n // Fall back to node_modules check below.\n }\n const modulePath = path.join(cwd, \"node_modules\", ...pkg.split(\"/\"));\n return fs.existsSync(modulePath);\n}\n\nexport interface InstallCommand {\n command: string;\n args: string[];\n}\n\nexport async function getInstallCommand(\n packageName: string | string[],\n cwd?: string,\n): Promise<InstallCommand> {\n const pm = await detect({ cwd });\n const packages = Array.isArray(packageName) ? packageName : [packageName];\n switch (pm) {\n case \"yarn\":\n return { command: \"yarn\", args: [\"add\", ...packages] };\n case \"pnpm\":\n return { command: \"pnpm\", args: [\"add\", ...packages] };\n case \"bun\":\n return { command: \"bun\", args: [\"add\", ...packages] };\n default:\n return { command: \"npm\", args: [\"install\", ...packages] };\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 async function installPackage(\n packageName: string,\n cwd?: string,\n): Promise<boolean> {\n try {\n const { command, args } = await getInstallCommand(packageName, cwd);\n await runSpawn(command, args, cwd);\n return true;\n } catch (e) {\n if (e instanceof SpawnSignalError) throw e;\n logger.error(`Installation failed: ${String(e)}`);\n return false;\n }\n}\n"],"mappings":";;;;;;;AASA,SAAgB,YAAY,OAAgC;CAC1D,OAAO,IAAI,SAAS,YAAY;EAI9B,IAAI,QAAQ,MAAM,eAAe;GAC/B,QAAQ,EAAE;GACV;EACF;EACA,MAAM,KAAK,SAAS,gBAAgB;GAClC,OAAO,QAAQ;GACf,QAAQ,QAAQ;EAClB,CAAC;EAUD,IAAI,YAAY;EAChB,GAAG,GAAG,gBAAgB;GACpB,YAAY;GACZ,GAAG,MAAM;EACX,CAAC;EACD,GAAG,GAAG,QAAQ,OAAO;EACrB,GAAG,GAAG,eAAe,QAAQ,YAAY,MAAM,EAAE,CAAC;EAClD,GAAG,SAAS,QAAQ,WAAW;GAC7B,QAAQ,MAAM;GACd,GAAG,MAAM;EACX,CAAC;CACH,CAAC;AACH;AAEA,SAAgB,mBACd,KACA,MAAc,QAAQ,IAAI,GACjB;CACT,IAAI;EACF,MAAM,cAAcA,OAAK,KAAK,KAAK,cAAc;EACjD,IAAIC,KAAG,WAAW,WAAW,GAAG;GAC9B,MAAM,UAAU,KAAK,MAAMA,KAAG,aAAa,aAAa,MAAM,CAAC;GAC/D,MAAM,OAAO,QAAQ,gBAAgB,CAAC;GACtC,MAAM,UAAU,QAAQ,mBAAmB,CAAC;GAC5C,IAAI,KAAK,QAAQ,QAAQ,MACvB,OAAO;EAEX;CACF,QAAQ,CAER;CACA,MAAM,aAAaD,OAAK,KAAK,KAAK,gBAAgB,GAAG,IAAI,MAAM,GAAG,CAAC;CACnE,OAAOC,KAAG,WAAW,UAAU;AACjC;AAOA,eAAsB,kBACpB,aACA,KACyB;CACzB,MAAM,KAAK,MAAM,OAAO,EAAE,IAAI,CAAC;CAC/B,MAAM,WAAW,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,WAAW;CACxE,QAAQ,IAAR;EACE,KAAK,QACH,OAAO;GAAE,SAAS;GAAQ,MAAM,CAAC,OAAO,GAAG,QAAQ;EAAE;EACvD,KAAK,QACH,OAAO;GAAE,SAAS;GAAQ,MAAM,CAAC,OAAO,GAAG,QAAQ;EAAE;EACvD,KAAK,OACH,OAAO;GAAE,SAAS;GAAO,MAAM,CAAC,OAAO,GAAG,QAAQ;EAAE;EACtD,SACE,OAAO;GAAE,SAAS;GAAO,MAAM,CAAC,WAAW,GAAG,QAAQ;EAAE;CAC5D;AACF;AAEA,SAAS,sBAAsD;CAC7D,MAAM,KAAK,QAAQ,IAAI;CACvB,IAAI,CAAC,IAAI,OAAO,KAAA;CAChB,IAAI,GAAG,WAAW,MAAM,GAAG,OAAO;CAClC,IAAI,GAAG,WAAW,OAAO,GAAG,OAAO;CACnC,IAAI,GAAG,WAAW,OAAO,GAAG,OAAO;CACnC,IAAI,GAAG,WAAW,MAAM,GAAG,OAAO;AAEpC;AAEA,eAAsB,4BACpB,KACA,gBAC6B;CAC7B,IAAI,gBAAgB,OAAO;CAC3B,MAAM,YAAY,oBAAoB;CACtC,IAAI,WAAW,OAAO;CACtB,IAAI;EACF,OAAO,MAAM,OAAO,EAAE,IAAI,CAAC;CAC7B,QAAQ;EACN,OAAO;CACT;AACF;AAEA,eAAsB,eACpB,aACA,KACkB;CAClB,IAAI;EACF,MAAM,EAAE,SAAS,SAAS,MAAM,kBAAkB,aAAa,GAAG;EAClE,MAAM,SAAS,SAAS,MAAM,GAAG;EACjC,OAAO;CACT,SAAS,GAAG;EACV,IAAI,aAAa,kBAAkB,MAAM;EACzC,OAAO,MAAM,wBAAwB,OAAO,CAAC,GAAG;EAChD,OAAO;CACT;AACF"}
@@ -1,9 +1,6 @@
1
- //#region src/lib/utils/registry.d.ts
2
- declare const SHARED_REGISTRY_ITEMS: Set<string>;
3
- declare function detectRegistryPlatform(cwd: string): "web" | "native";
4
- declare function getComponentsJsonStyle(cwd: string): string | undefined;
5
- declare function resolveQuickStartRegistryUrl(style?: string): string;
6
- declare function resolveRegistryItemUrl(component: string, style?: string, platform?: "web" | "native"): string;
7
- //#endregion
8
- export { SHARED_REGISTRY_ITEMS, detectRegistryPlatform, getComponentsJsonStyle, resolveQuickStartRegistryUrl, resolveRegistryItemUrl };
1
+ export declare const SHARED_REGISTRY_ITEMS: Set<string>;
2
+ export declare function detectRegistryPlatform(cwd: string): "web" | "native";
3
+ export declare function getComponentsJsonStyle(cwd: string): string | undefined;
4
+ export declare function resolveQuickStartRegistryUrl(style?: string): string;
5
+ export declare function resolveRegistryItemUrl(component: string, style?: string, platform?: "web" | "native"): string;
9
6
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","names":[],"sources":["../../../src/lib/utils/registry.ts"],"mappings":";cAIa,uBAAqB;iBAElB,uBAAuB;iBA2BvB,uBAAuB;iBAavB,6BAA6B;iBAW7B,uBACd,mBACA,gBACA"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/registry.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,aAAqB,CAAC;AAExD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAyBpE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWtE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CASnE;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,GAAE,KAAK,GAAG,QAAgB,GACjC,MAAM,CAgBR"}
@@ -1,6 +1,3 @@
1
- //#region src/lib/utils/workspace.d.ts
2
- declare function resolveRealPath(inputPath: string): string;
3
- declare function findWorkspaceRoot(cwd: string): string | null;
4
- //#endregion
5
- export { findWorkspaceRoot, resolveRealPath };
1
+ export declare function resolveRealPath(inputPath: string): string;
2
+ export declare function findWorkspaceRoot(cwd: string): string | null;
6
3
  //# sourceMappingURL=workspace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.d.ts","names":[],"sources":["../../../src/lib/utils/workspace.ts"],"mappings":";iBAGgB,gBAAgB;iBAUhB,kBAAkB"}
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/workspace.ts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoB5D"}
package/dist/program.d.ts CHANGED
@@ -1,6 +1,3 @@
1
1
  import { Command } from "commander";
2
- //#region src/program.d.ts
3
- declare function buildProgram(): Command;
4
- //#endregion
5
- export { buildProgram };
2
+ export declare function buildProgram(): Command;
6
3
  //# sourceMappingURL=program.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"program.d.ts","names":[],"sources":["../src/program.ts"],"mappings":";;iBAWgB,gBAAY"}
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,YAAY,YAc3B"}
package/dist/program.js CHANGED
@@ -1,12 +1,12 @@
1
- import { create } from "./commands/create.js";
2
1
  import { add } from "./commands/add.js";
3
- import { codemodCommand, upgradeCommand } from "./commands/upgrade.js";
4
- import { init } from "./commands/init.js";
5
- import { update } from "./commands/update.js";
6
- import { mcp } from "./commands/mcp.js";
7
2
  import { agent } from "./commands/agent.js";
8
- import { info } from "./commands/info.js";
3
+ import { create } from "./commands/create.js";
9
4
  import { doctor } from "./commands/doctor.js";
5
+ import { info } from "./commands/info.js";
6
+ import { init } from "./commands/init.js";
7
+ import { mcp } from "./commands/mcp.js";
8
+ import { update } from "./commands/update.js";
9
+ import { codemodCommand, upgradeCommand } from "./commands/upgrade.js";
10
10
  import { Command } from "commander";
11
11
  //#region src/program.ts
12
12
  function buildProgram() {
package/dist/run.d.ts CHANGED
@@ -1,5 +1,2 @@
1
- //#region src/run.d.ts
2
- declare function runCli(): Promise<void>;
3
- //#endregion
4
- export { runCli };
1
+ export declare function runCli(): Promise<void>;
5
2
  //# sourceMappingURL=run.d.ts.map
package/dist/run.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","names":[],"sources":["../src/run.ts"],"mappings":";iBAEsB,UAAU"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "assistant-ui",
3
- "version": "0.0.116",
3
+ "version": "0.0.118",
4
4
  "description": "CLI for assistant-ui",
5
5
  "keywords": [
6
6
  "cli",
@@ -20,14 +20,13 @@
20
20
  "files": [
21
21
  "bin",
22
22
  "dist",
23
- "plugin",
24
23
  "src",
25
24
  "README.md"
26
25
  ],
27
26
  "sideEffects": false,
28
27
  "dependencies": {
29
- "@assistant-ui/agent-launcher": "^0.1.15",
30
- "@clack/prompts": "^1.7.0",
28
+ "@assistant-ui/agent-launcher": "^0.1.16",
29
+ "@clack/prompts": "^1.8.1",
31
30
  "chalk": "^6.0.0",
32
31
  "cli-progress": "^3.12.0",
33
32
  "commander": "^15.0.0",
@@ -41,15 +40,15 @@
41
40
  "semver": "^7.8.5"
42
41
  },
43
42
  "devDependencies": {
44
- "@assistant-ui/x-buildutils": "0.0.27",
43
+ "@assistant-ui/x-buildutils": "0.0.29",
45
44
  "@types/cli-progress": "^3.11.6",
46
45
  "@types/cross-spawn": "^6.0.6",
47
46
  "@types/debug": "^4.1.13",
48
47
  "@types/jscodeshift": "^17.3.0",
49
- "@types/node": "^26.4.1",
48
+ "@types/node": "^26.5.1",
50
49
  "@types/semver": "^7.8.0",
51
- "@vitest/coverage-v8": "^5.0.0",
52
- "vitest": "^5.0.0"
50
+ "@vitest/coverage-v8": "^5.0.1",
51
+ "vitest": "^5.0.1"
53
52
  },
54
53
  "publishConfig": {
55
54
  "access": "public",
@@ -67,6 +66,7 @@
67
66
  "scripts": {
68
67
  "build": "aui-build",
69
68
  "test": "vitest run",
69
+ "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.test.json",
70
70
  "test:watch": "vitest",
71
71
  "test:coverage": "vitest run --coverage"
72
72
  }
@@ -0,0 +1,107 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import jscodeshift from "jscodeshift";
3
+ import { resolveBinding } from "./resolveBinding";
4
+
5
+ const j = jscodeshift.withParser("tsx");
6
+
7
+ describe("resolveBinding", () => {
8
+ it.each([
9
+ ["const", "of"],
10
+ ["let", "of"],
11
+ ["const", "in"],
12
+ ["let", "in"],
13
+ ])(
14
+ "resolves the uninitialized %s binding in a for-%s right-hand side",
15
+ (kind, operator) => {
16
+ const root = j(
17
+ `const client = outer(); for (${kind} client ${operator} read(client)) {}`,
18
+ );
19
+ const reference = root
20
+ .find(j.CallExpression, { callee: { name: "read" } })
21
+ .paths()[0]!
22
+ .get("arguments", 0);
23
+ const loopBinding = root.find(j.VariableDeclarator).nodes()[1]!.id;
24
+ expect(resolveBinding(j, reference, "client")).toBe(loopBinding);
25
+ },
26
+ );
27
+
28
+ it.each([
29
+ ["namespace Local { const client = inner(); read(client); }", "inner"],
30
+ [
31
+ "namespace Local { if (ready) { var client = inner(); } read(client); }",
32
+ "inner",
33
+ ],
34
+ ["namespace Local { var client = inner(); } read(client);", "outer"],
35
+ [
36
+ "function worker() { if (ready) { var client = inner(); } read(client); }",
37
+ "inner",
38
+ ],
39
+ [
40
+ "function worker(value = read(client)) { var client = inner(); }",
41
+ "outer",
42
+ ],
43
+ ["{ const client = inner(); read(client); }", "inner"],
44
+ ["{ const { client } = inner(); read(client); }", "inner"],
45
+ ["{ const [client] = inner(); read(client); }", "inner"],
46
+ [
47
+ "function worker() { { const client = inner(); } read(client); }",
48
+ "outer",
49
+ ],
50
+ ["switch (read(client)) { case 1: const client = inner(); }", "outer"],
51
+ [
52
+ "switch (value) { case 1: const client = inner(); read(client); }",
53
+ "inner",
54
+ ],
55
+ ["for (const client = inner(); ready;) { read(client); }", "inner"],
56
+ [
57
+ "function worker() { function other() { var client = inner(); } read(client); }",
58
+ "outer",
59
+ ],
60
+ ["{ type client = Other; read(client); }", "outer"],
61
+ ])("resolves %s", (scope, expected) => {
62
+ const root = j(`const client = outer(); ${scope}`);
63
+ const reference = root
64
+ .find(j.CallExpression, { callee: { name: "read" } })
65
+ .paths()[0]!
66
+ .get("arguments", 0);
67
+ const binding = resolveBinding(j, reference, "client");
68
+ const declaration = root
69
+ .find(j.VariableDeclarator, { init: { callee: { name: expected } } })
70
+ .nodes()[0]!;
71
+ const identifiers = j(declaration.id)
72
+ .find(j.Identifier, { name: "client" })
73
+ .nodes();
74
+ expect(binding).toBe(
75
+ j.Identifier.check(declaration.id) ? declaration.id : identifiers.at(-1),
76
+ );
77
+ });
78
+
79
+ it.each([
80
+ "function worker(client) { read(client); }",
81
+ "function worker({ client }) { read(client); }",
82
+ "function worker(client = fallback) { read(client); }",
83
+ "try {} catch (client) { read(client); }",
84
+ "class Reader { constructor(private client: Client) { read(client); } }",
85
+ ])("resolves a parameter binding: %s", (source) => {
86
+ const root = j(source);
87
+ const reference = root
88
+ .find(j.CallExpression, { callee: { name: "read" } })
89
+ .paths()[0]!
90
+ .get("arguments", 0);
91
+ const binding = resolveBinding(j, reference, "client");
92
+ expect(binding?.name).toBe("client");
93
+ expect(binding).not.toBe(reference.value);
94
+ });
95
+
96
+ it("resolves imports and distinguishes an unbound identifier", () => {
97
+ const root = j('import { client } from "./client"; read(client);');
98
+ const reference = root
99
+ .find(j.CallExpression)
100
+ .paths()[0]!
101
+ .get("arguments", 0);
102
+ expect(resolveBinding(j, reference, "client")).toBe(
103
+ root.find(j.ImportSpecifier).nodes()[0]!.local,
104
+ );
105
+ expect(resolveBinding(j, reference, "missing")).toBeUndefined();
106
+ });
107
+ });