assistant-ui 0.0.117 → 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 (125) hide show
  1. package/dist/codemods/utils/createTransformer.d.ts +10 -12
  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 +10 -12
  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 +0 -2
  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 +33 -28
  33. package/dist/commands/create.d.ts.map +1 -1
  34. package/dist/commands/create.js +19 -15
  35. package/dist/commands/create.js.map +1 -1
  36. package/dist/commands/doctor.d.ts +8 -10
  37. package/dist/commands/doctor.d.ts.map +1 -1
  38. package/dist/commands/info.d.ts +2 -4
  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 +5 -6
  42. package/dist/commands/init.d.ts.map +1 -1
  43. package/dist/commands/init.js +2 -2
  44. package/dist/commands/mcp.d.ts +0 -2
  45. package/dist/commands/mcp.d.ts.map +1 -1
  46. package/dist/commands/mcp.js +2 -2
  47. package/dist/commands/update.d.ts +0 -2
  48. package/dist/commands/update.d.ts.map +1 -1
  49. package/dist/commands/update.js +1 -1
  50. package/dist/commands/upgrade.d.ts +4 -6
  51. package/dist/commands/upgrade.d.ts.map +1 -1
  52. package/dist/index.d.ts +3 -1
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/lib/agent-skill.d.ts +8 -6
  55. package/dist/lib/agent-skill.d.ts.map +1 -1
  56. package/dist/lib/agent-skill.js +78 -2
  57. package/dist/lib/agent-skill.js.map +1 -1
  58. package/dist/lib/create-project.d.ts +22 -20
  59. package/dist/lib/create-project.d.ts.map +1 -1
  60. package/dist/lib/create-project.js +91 -5
  61. package/dist/lib/create-project.js.map +1 -1
  62. package/dist/lib/handle-cli-error.d.ts +0 -2
  63. package/dist/lib/handle-cli-error.d.ts.map +1 -1
  64. package/dist/lib/install-ai-sdk-lib.d.ts +0 -2
  65. package/dist/lib/install-ai-sdk-lib.d.ts.map +1 -1
  66. package/dist/lib/install-edge-lib.d.ts +0 -2
  67. package/dist/lib/install-edge-lib.d.ts.map +1 -1
  68. package/dist/lib/run-spawn.d.ts +11 -12
  69. package/dist/lib/run-spawn.d.ts.map +1 -1
  70. package/dist/lib/run-spawn.js +25 -10
  71. package/dist/lib/run-spawn.js.map +1 -1
  72. package/dist/lib/transform-options.d.ts +4 -6
  73. package/dist/lib/transform-options.d.ts.map +1 -1
  74. package/dist/lib/transform.d.ts +11 -13
  75. package/dist/lib/transform.d.ts.map +1 -1
  76. package/dist/lib/transform.js +19 -35
  77. package/dist/lib/transform.js.map +1 -1
  78. package/dist/lib/upgrade.d.ts +2 -4
  79. package/dist/lib/upgrade.d.ts.map +1 -1
  80. package/dist/lib/upgrade.js +6 -11
  81. package/dist/lib/upgrade.js.map +1 -1
  82. package/dist/lib/utils/config.d.ts +14 -16
  83. package/dist/lib/utils/config.d.ts.map +1 -1
  84. package/dist/lib/utils/file-scanner.d.ts +8 -10
  85. package/dist/lib/utils/file-scanner.d.ts.map +1 -1
  86. package/dist/lib/utils/logger.d.ts +6 -8
  87. package/dist/lib/utils/logger.d.ts.map +1 -1
  88. package/dist/lib/utils/package-installer.d.ts +5 -7
  89. package/dist/lib/utils/package-installer.d.ts.map +1 -1
  90. package/dist/lib/utils/package-json.d.ts +0 -2
  91. package/dist/lib/utils/package-json.d.ts.map +1 -1
  92. package/dist/lib/utils/package-manager.d.ts +2 -4
  93. package/dist/lib/utils/package-manager.d.ts.map +1 -1
  94. package/dist/lib/utils/package-manager.js +13 -2
  95. package/dist/lib/utils/package-manager.js.map +1 -1
  96. package/dist/lib/utils/registry.d.ts +0 -2
  97. package/dist/lib/utils/registry.d.ts.map +1 -1
  98. package/dist/lib/utils/workspace.d.ts +0 -2
  99. package/dist/lib/utils/workspace.d.ts.map +1 -1
  100. package/dist/program.d.ts +0 -2
  101. package/dist/program.d.ts.map +1 -1
  102. package/dist/program.js +6 -6
  103. package/dist/run.d.ts +0 -2
  104. package/dist/run.d.ts.map +1 -1
  105. package/package.json +2 -3
  106. package/src/codemods/utils/resolveBinding.test.ts +107 -0
  107. package/src/codemods/utils/resolveBinding.ts +130 -0
  108. package/src/codemods/v0-12/__tests__/assistant-api-to-aui.test.ts +256 -0
  109. package/src/codemods/v0-12/assistant-api-to-aui.ts +125 -225
  110. package/src/codemods/v0-15/__tests__/aui-accessor-calls-to-properties.test.ts +101 -0
  111. package/src/codemods/v0-15/aui-accessor-calls-to-properties.ts +60 -5
  112. package/src/commands/agent.ts +15 -22
  113. package/src/commands/create.ts +24 -15
  114. package/src/lib/agent-skill.ts +103 -1
  115. package/src/lib/create-project.ts +99 -4
  116. package/src/lib/run-spawn.test.ts +47 -0
  117. package/src/lib/run-spawn.ts +29 -17
  118. package/src/lib/transform-files.test.ts +71 -0
  119. package/src/lib/transform.test.ts +69 -1
  120. package/src/lib/transform.ts +23 -38
  121. package/src/lib/upgrade.ts +9 -13
  122. package/src/lib/utils/package-manager.ts +24 -1
  123. package/plugin/.claude-plugin/plugin.json +0 -8
  124. package/plugin/skills/assistant-ui/SKILL.md +0 -199
  125. package/plugin/skills/assistant-ui/shipables.json +0 -22
@@ -1,5 +1,3 @@
1
1
  import { Command } from "commander";
2
- //#region src/commands/update.d.ts
3
2
  export declare const update: Command;
4
- //#endregion
5
3
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","names":[],"sources":["../../src/commands/update.ts"],"mappings":";;qBAQa,QAAM"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,MAAM,SA6Ef,CAAC"}
@@ -1,5 +1,5 @@
1
- import { SpawnExitError, SpawnSignalError, runSpawn } from "../lib/run-spawn.js";
2
1
  import { logger } from "../lib/utils/logger.js";
2
+ import { SpawnExitError, SpawnSignalError, runSpawn } from "../lib/run-spawn.js";
3
3
  import { getInstallCommand } from "../lib/utils/package-manager.js";
4
4
  import { logPackageJsonParseError } from "../lib/utils/package-json.js";
5
5
  import { Command } from "commander";
@@ -1,12 +1,10 @@
1
1
  import { Command } from "commander";
2
- //#region src/commands/upgrade.d.ts
3
2
  export interface TransformOptions {
4
- dry?: boolean;
5
- print?: boolean;
6
- verbose?: boolean;
7
- jscodeshift?: string;
3
+ dry?: boolean;
4
+ print?: boolean;
5
+ verbose?: boolean;
6
+ jscodeshift?: string;
8
7
  }
9
8
  export declare const codemodCommand: Command;
10
9
  export declare const upgradeCommand: Command;
11
- //#endregion
12
10
  //# sourceMappingURL=upgrade.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","names":[],"sources":["../../src/commands/upgrade.ts"],"mappings":";;iBAMiB;EACf;EACA;EACA;EACA;;qBAiBW,gBAAc;qBAqBd,gBAAc"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgBD,eAAO,MAAM,cAAc,SAmBzB,CAAC;AAEH,eAAO,MAAM,cAAc,SAiBzB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1 +1,3 @@
1
- export {}
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -1,12 +1,14 @@
1
- import { PackageManagerName } from "./utils/package-manager.js";
2
- //#region src/lib/agent-skill.d.ts
1
+ import { type PackageManagerName } from "./utils/package-manager.js";
3
2
  export declare const SKILLS_PACKAGE = "assistant-ui/skills";
3
+ export declare const SKILLS_COMMIT = "66befc4468ce0691c9203442d70cbbdcb5562ea1";
4
+ export declare const SKILLS_PLUGIN_SOURCE = "gh:assistant-ui/skills/assistant-ui#66befc4468ce0691c9203442d70cbbdcb5562ea1";
4
5
  export declare function resolveSkillsInstall(params: {
5
- skills?: boolean;
6
- stdinIsTTY?: boolean;
6
+ skills?: boolean;
7
+ stdinIsTTY?: boolean;
7
8
  }): boolean | undefined;
8
9
  export declare function buildSkillsAddCommand(pm: PackageManagerName, params?: {
9
- stdinIsTTY?: boolean;
10
+ stdinIsTTY?: boolean;
10
11
  }): [string, string[]];
11
- //#endregion
12
+ export declare function skillsPluginDir(): string;
13
+ export declare function ensureSkillsPlugin(): Promise<string>;
12
14
  //# sourceMappingURL=agent-skill.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-skill.d.ts","names":[],"sources":["../../src/lib/agent-skill.ts"],"mappings":";;qBAGa;wBAEG,qBAAqB;EACnC;EACA;;wBAQc,sBACd,IAAI,oBACJ;EAAU"}
1
+ {"version":3,"file":"agent-skill.d.ts","sourceRoot":"","sources":["../../src/lib/agent-skill.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,kBAAkB,EAAE,mCAAgC;AAElE,eAAO,MAAM,cAAc,wBAAwB,CAAC;AACpD,eAAO,MAAM,aAAa,6CAA6C,CAAC;AACxE,eAAO,MAAM,oBAAoB,iFAAuD,CAAC;AAEzF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,GAAG,SAAS,CAKtB;AAED,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,kBAAkB,EACtB,MAAM,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAUpB;AAED,wBAAgB,eAAe,IAAI,MAAM,CAIxC;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgE1D"}
@@ -1,6 +1,12 @@
1
- import { dlxCommand } from "./create-project.js";
1
+ import { DOWNLOAD_TIMEOUT_MS, dlxCommand, resolveGitHubAuthToken } from "./create-project.js";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ import { downloadTemplate } from "giget";
2
6
  //#region src/lib/agent-skill.ts
3
7
  const SKILLS_PACKAGE = "assistant-ui/skills";
8
+ const SKILLS_COMMIT = "66befc4468ce0691c9203442d70cbbdcb5562ea1";
9
+ const SKILLS_PLUGIN_SOURCE = `gh:${SKILLS_PACKAGE}/assistant-ui#${SKILLS_COMMIT}`;
4
10
  function resolveSkillsInstall(params) {
5
11
  const { skills, stdinIsTTY = process.stdin.isTTY } = params;
6
12
  if (skills !== void 0) return skills;
@@ -18,7 +24,77 @@ function buildSkillsAddCommand(pm, params = {}) {
18
24
  if (!stdinIsTTY) args.push("--yes");
19
25
  return [command, args];
20
26
  }
27
+ function skillsPluginDir() {
28
+ const cacheHome = process.env.XDG_CACHE_HOME || path.join(os.homedir(), ".cache");
29
+ return path.join(cacheHome, "assistant-ui", "skills", SKILLS_COMMIT);
30
+ }
31
+ async function ensureSkillsPlugin() {
32
+ const dir = skillsPluginDir();
33
+ const marker = path.join(dir, ".claude-plugin", "plugin.json");
34
+ if (fs.existsSync(marker)) return dir;
35
+ const parent = path.dirname(dir);
36
+ await fs.promises.mkdir(parent, { recursive: true });
37
+ const staging = await fs.promises.mkdtemp(path.join(parent, ".staging-"));
38
+ const removeStaging = () => {
39
+ process.removeListener("exit", removeStaging);
40
+ process.removeListener("SIGINT", removeStagingOnSignal);
41
+ process.removeListener("SIGTERM", removeStagingOnSignal);
42
+ fs.rmSync(staging, {
43
+ recursive: true,
44
+ force: true
45
+ });
46
+ };
47
+ const removeStagingOnSignal = (signal) => {
48
+ removeStaging();
49
+ process.kill(process.pid, signal);
50
+ };
51
+ process.once("exit", removeStaging);
52
+ process.once("SIGINT", removeStagingOnSignal);
53
+ process.once("SIGTERM", removeStagingOnSignal);
54
+ const origDebug = process.env.DEBUG;
55
+ delete process.env.DEBUG;
56
+ let timer;
57
+ let downloadSettled = false;
58
+ let download;
59
+ try {
60
+ const authToken = resolveGitHubAuthToken();
61
+ download = downloadTemplate(SKILLS_PLUGIN_SOURCE, {
62
+ dir: staging,
63
+ preferOffline: true,
64
+ silent: true,
65
+ ...authToken ? { auth: authToken } : {}
66
+ }).finally(() => {
67
+ downloadSettled = true;
68
+ });
69
+ const timeout = new Promise((_, reject) => {
70
+ timer = setTimeout(() => reject(/* @__PURE__ */ new Error("Download timed out.")), DOWNLOAD_TIMEOUT_MS);
71
+ });
72
+ await Promise.race([download, timeout]).catch((error) => {
73
+ throw new Error("Could not fetch the assistant-ui skills from GitHub. Check your network, or set GITHUB_TOKEN if you are rate limited.", { cause: error });
74
+ });
75
+ await publish(staging, dir, marker);
76
+ } finally {
77
+ clearTimeout(timer);
78
+ if (origDebug !== void 0) process.env.DEBUG = origDebug;
79
+ if (!download || downloadSettled) removeStaging();
80
+ else download.then(removeStaging, removeStaging);
81
+ }
82
+ return dir;
83
+ }
84
+ async function publish(staging, dir, marker, retry = true) {
85
+ try {
86
+ await fs.promises.rename(staging, dir);
87
+ } catch (error) {
88
+ if (fs.existsSync(marker)) return;
89
+ if (!retry) throw error;
90
+ await fs.promises.rm(dir, {
91
+ recursive: true,
92
+ force: true
93
+ });
94
+ await publish(staging, dir, marker, false);
95
+ }
96
+ }
21
97
  //#endregion
22
- export { SKILLS_PACKAGE, buildSkillsAddCommand, resolveSkillsInstall };
98
+ export { SKILLS_COMMIT, SKILLS_PACKAGE, SKILLS_PLUGIN_SOURCE, buildSkillsAddCommand, ensureSkillsPlugin, resolveSkillsInstall, skillsPluginDir };
23
99
 
24
100
  //# sourceMappingURL=agent-skill.js.map
@@ -1 +1 @@
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
+ {"version":3,"file":"agent-skill.js","names":[],"sources":["../../src/lib/agent-skill.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { downloadTemplate } from \"giget\";\nimport {\n DOWNLOAD_TIMEOUT_MS,\n dlxCommand,\n resolveGitHubAuthToken,\n} from \"./create-project\";\nimport { type PackageManagerName } from \"./utils/package-manager\";\n\nexport const SKILLS_PACKAGE = \"assistant-ui/skills\";\nexport const SKILLS_COMMIT = \"66befc4468ce0691c9203442d70cbbdcb5562ea1\";\nexport const SKILLS_PLUGIN_SOURCE = `gh:${SKILLS_PACKAGE}/assistant-ui#${SKILLS_COMMIT}`;\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\nexport function skillsPluginDir(): string {\n const cacheHome =\n process.env.XDG_CACHE_HOME || path.join(os.homedir(), \".cache\");\n return path.join(cacheHome, \"assistant-ui\", \"skills\", SKILLS_COMMIT);\n}\n\nexport async function ensureSkillsPlugin(): Promise<string> {\n const dir = skillsPluginDir();\n const marker = path.join(dir, \".claude-plugin\", \"plugin.json\");\n if (fs.existsSync(marker)) return dir;\n\n const parent = path.dirname(dir);\n await fs.promises.mkdir(parent, { recursive: true });\n const staging = await fs.promises.mkdtemp(path.join(parent, \".staging-\"));\n // Node emits no \"exit\" when a signal kills the process, so the staging\n // directory is removed on the signal and the signal re-raised. The\n // listeners stay armed until the removal runs, which a download that\n // outlives the timeout defers past the caller's own exit.\n const removeStaging = () => {\n process.removeListener(\"exit\", removeStaging);\n process.removeListener(\"SIGINT\", removeStagingOnSignal);\n process.removeListener(\"SIGTERM\", removeStagingOnSignal);\n fs.rmSync(staging, { recursive: true, force: true });\n };\n const removeStagingOnSignal = (signal: NodeJS.Signals) => {\n removeStaging();\n process.kill(process.pid, signal);\n };\n process.once(\"exit\", removeStaging);\n process.once(\"SIGINT\", removeStagingOnSignal);\n process.once(\"SIGTERM\", removeStagingOnSignal);\n\n // giget logs to console.debug whenever DEBUG is set, which the `debug`\n // package does at module load for an unrelated namespace.\n const origDebug = process.env.DEBUG;\n delete process.env.DEBUG;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let downloadSettled = false;\n let download: Promise<unknown> | undefined;\n try {\n const authToken = resolveGitHubAuthToken();\n download = downloadTemplate(SKILLS_PLUGIN_SOURCE, {\n dir: staging,\n preferOffline: true,\n silent: true,\n ...(authToken ? { auth: authToken } : {}),\n }).finally(() => {\n downloadSettled = true;\n });\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(\"Download timed out.\")),\n DOWNLOAD_TIMEOUT_MS,\n );\n });\n await Promise.race([download, timeout]).catch((error: unknown) => {\n throw new Error(\n \"Could not fetch the assistant-ui skills from GitHub. Check your network, or set GITHUB_TOKEN if you are rate limited.\",\n { cause: error },\n );\n });\n await publish(staging, dir, marker);\n } finally {\n clearTimeout(timer);\n if (origDebug !== undefined) process.env.DEBUG = origDebug;\n if (!download || downloadSettled) removeStaging();\n else void download.then(removeStaging, removeStaging);\n }\n\n return dir;\n}\n\n// A rename fails when the target directory exists and is not empty. A\n// concurrent invocation that published the same commit meanwhile wins and\n// the staged copy is dropped; a directory without the marker is a stale\n// partial cache and is replaced.\nasync function publish(\n staging: string,\n dir: string,\n marker: string,\n retry = true,\n): Promise<void> {\n try {\n await fs.promises.rename(staging, dir);\n } catch (error) {\n if (fs.existsSync(marker)) return;\n if (!retry) throw error;\n await fs.promises.rm(dir, { recursive: true, force: true });\n await publish(staging, dir, marker, false);\n }\n}\n"],"mappings":"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"}
@@ -1,37 +1,39 @@
1
- import { PackageManagerName } from "./utils/package-manager.js";
2
- //#region src/lib/create-project.d.ts
1
+ import { type PackageManagerName } from "./utils/package-manager.js";
3
2
  export declare function dlxCommand(pm: PackageManagerName): [string, string[]];
4
3
  export interface TransformOptions {
5
- hasLocalComponents: boolean;
6
- skipInstall?: boolean;
7
- packageManager: PackageManagerName;
4
+ hasLocalComponents: boolean;
5
+ skipInstall?: boolean;
6
+ packageManager: PackageManagerName;
8
7
  }
9
8
  export type ProjectSource = {
10
- kind: "github";
11
- ref: string | undefined;
9
+ kind: "github";
10
+ ref: string | undefined;
12
11
  } | {
13
- kind: "local";
14
- rootDir: string;
12
+ kind: "local";
13
+ rootDir: string;
15
14
  };
16
15
  export declare function resolvePackageManager(opts: {
17
- useNpm?: boolean;
18
- usePnpm?: boolean;
19
- useYarn?: boolean;
20
- useBun?: boolean;
16
+ useNpm?: boolean;
17
+ usePnpm?: boolean;
18
+ useYarn?: boolean;
19
+ useBun?: boolean;
21
20
  }): PackageManagerName | undefined;
21
+ export declare function resolveGitHubAuthToken(): string | undefined;
22
22
  export declare function resolveLatestReleaseRef(): Promise<string | undefined>;
23
+ export declare const DOWNLOAD_TIMEOUT_MS = 30000;
24
+ export declare function cleanupPendingProjectDownloads(): void;
23
25
  export declare function downloadProject(repoPath: string, destDir: string, ref?: string): Promise<void>;
24
26
  export declare function scaffoldProject(repoPath: string, destDir: string, source: ProjectSource): Promise<void>;
25
27
  export interface TransformResult {
26
- registryInstallFailure?: {
27
- retryCommand: string;
28
- };
29
- registryInstallCommand?: string;
28
+ registryInstallFailure?: {
29
+ retryCommand: string;
30
+ };
31
+ registryInstallCommand?: string;
30
32
  }
31
33
  export declare function transformProject(projectDir: string, opts: TransformOptions): Promise<TransformResult>;
32
34
  interface RequiredComponents {
33
- assistantUI: string[];
34
- shadcnUI: string[];
35
+ assistantUI: string[];
36
+ shadcnUI: string[];
35
37
  }
36
38
  /**
37
39
  * Example snapshots are downloaded at a release tag while the shadcn registry
@@ -43,5 +45,5 @@ interface RequiredComponents {
43
45
  */
44
46
  export declare function reconcileAssistantUIImportLayout(projectDir: string): Promise<void>;
45
47
  export declare function scanRequiredComponents(projectDir: string): RequiredComponents;
46
- //#endregion
48
+ export {};
47
49
  //# sourceMappingURL=create-project.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-project.d.ts","names":[],"sources":["../../src/lib/create-project.ts"],"mappings":";;wBAiBgB,WAAW,IAAI;iBAad;EACf;EACA;EACA,gBAAgB;;YAGN;EAEN;EACA;;EAGA;EACA;;wBAcU,sBAAsB;EACpC;EACA;EACA;EACA;IACE;wBAmBkB,2BAA2B;wBAmB3B,gBACpB,kBACA,iBACA,eACC;wBAuDmB,gBACpB,kBACA,iBACA,QAAQ,gBACP;iBA2Bc;EACf;IAA2B;;EAC3B;;wBAGoB,iBACpB,oBACA,MAAM,mBACL,QAAQ;UAiMD;EACR;EACA;;;;;;;;;;wBAqDoB,iCACpB,qBACC;wBAgHa,uBAAuB,qBAAqB"}
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,kBAAkB,EAAE,mCAAgC;AAOlE,wBAAgB,UAAU,CAAC,EAAE,EAAE,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAWrE;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,kBAAkB,CAAC;CACpC;AAED,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAaN,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,kBAAkB,GAAG,SAAS,CAMjC;AAED,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAK3D;AAMD,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAe3E;AAED,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAG1C,wBAAgB,8BAA8B,IAAI,IAAI,CAMrD;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAgIf;AAYD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,MAAM,WAAW,eAAe;IAC9B,sBAAsB,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,eAAe,CAAC,CAoC1B;AA6JD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA4CD;;;;;;;GAOG;AACH,wBAAsB,gCAAgC,CACpD,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA8Gf;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,CA8B7E"}
@@ -1,9 +1,10 @@
1
- import { SpawnExitError, SpawnSignalError, runSpawn } from "./run-spawn.js";
2
1
  import { logger } from "./utils/logger.js";
3
- import { readProjectFiles } from "./utils/file-scanner.js";
4
2
  import { detectRegistryPlatform, resolveRegistryItemUrl } from "./utils/registry.js";
3
+ import { SpawnExitError, SpawnSignalError, runSpawn } from "./run-spawn.js";
4
+ import { readProjectFiles } from "./utils/file-scanner.js";
5
5
  import * as fs$1 from "node:fs";
6
6
  import * as path$1 from "node:path";
7
+ import * as os$1 from "node:os";
7
8
  import { downloadTemplate } from "giget";
8
9
  import { parse, printParseErrorCode } from "jsonc-parser";
9
10
  //#region src/lib/create-project.ts
@@ -45,17 +46,75 @@ async function resolveLatestReleaseRef() {
45
46
  }
46
47
  }
47
48
  const DOWNLOAD_TIMEOUT_MS = 3e4;
49
+ const pendingDownloadCleanups = /* @__PURE__ */ new Set();
50
+ function cleanupPendingProjectDownloads() {
51
+ for (const cleanup of pendingDownloadCleanups) {
52
+ pendingDownloadCleanups.delete(cleanup);
53
+ process.removeListener("exit", cleanup);
54
+ cleanup();
55
+ }
56
+ }
48
57
  async function downloadProject(repoPath, destDir, ref) {
49
58
  const source = ref ? `gh:assistant-ui/assistant-ui/${repoPath}#${ref}` : `gh:assistant-ui/assistant-ui/${repoPath}`;
50
59
  const origDebug = process.env.DEBUG;
51
60
  delete process.env.DEBUG;
61
+ let destinationCreated = false;
62
+ let stagingDir;
63
+ let downloadPromise;
64
+ let downloadFinished = false;
65
+ let downloadCommitted = false;
66
+ let cleanupRequested = false;
67
+ const removeCleanupListeners = () => {
68
+ process.removeListener("exit", cleanupOnExit);
69
+ pendingDownloadCleanups.delete(cleanupOnExit);
70
+ };
71
+ const attemptSyncCleanup = (cleanup) => {
72
+ try {
73
+ cleanup();
74
+ } catch {
75
+ return;
76
+ }
77
+ };
78
+ const cleanupOnExit = () => {
79
+ cleanupRequested = true;
80
+ const currentStagingDir = stagingDir;
81
+ if (currentStagingDir) attemptSyncCleanup(() => {
82
+ fs$1.rmSync(currentStagingDir, {
83
+ recursive: true,
84
+ force: true
85
+ });
86
+ });
87
+ if (destinationCreated && !downloadCommitted) attemptSyncCleanup(() => {
88
+ fs$1.rmdirSync(destDir);
89
+ });
90
+ };
91
+ const removeStagingDir = async () => {
92
+ if (stagingDir) await fs$1.promises.rm(stagingDir, {
93
+ recursive: true,
94
+ force: true
95
+ }).catch(() => void 0);
96
+ removeCleanupListeners();
97
+ if (destinationCreated && !downloadCommitted) await fs$1.promises.rmdir(destDir).catch(() => void 0);
98
+ };
52
99
  try {
100
+ await fs$1.promises.mkdir(path$1.dirname(destDir), { recursive: true });
101
+ try {
102
+ stagingDir = await fs$1.promises.mkdtemp(path$1.join(path$1.dirname(destDir), ".assistant-ui-download-"));
103
+ } catch (error) {
104
+ const code = error.code;
105
+ if (code !== "EACCES" && code !== "EPERM" && code !== "EROFS") throw error;
106
+ stagingDir = await fs$1.promises.mkdtemp(path$1.join(os$1.tmpdir(), ".assistant-ui-download-"));
107
+ }
108
+ process.once("exit", cleanupOnExit);
109
+ pendingDownloadCleanups.add(cleanupOnExit);
53
110
  const authToken = resolveGitHubAuthToken();
54
- const downloadPromise = downloadTemplate(source, {
55
- dir: destDir,
111
+ downloadPromise = downloadTemplate(source, {
112
+ dir: stagingDir,
56
113
  force: true,
57
114
  silent: true,
58
115
  ...authToken ? { auth: authToken } : {}
116
+ }).finally(() => {
117
+ downloadFinished = true;
59
118
  });
60
119
  let timer;
61
120
  const timeoutPromise = new Promise((_, reject) => {
@@ -63,10 +122,37 @@ async function downloadProject(repoPath, destDir, ref) {
63
122
  });
64
123
  try {
65
124
  await Promise.race([downloadPromise, timeoutPromise]);
125
+ if (cleanupRequested) throw new Error("Download was interrupted.");
126
+ destinationCreated = !fs$1.existsSync(destDir);
127
+ await fs$1.promises.mkdir(destDir, { recursive: true });
128
+ for (const entry of await fs$1.promises.readdir(stagingDir)) {
129
+ const target = path$1.join(destDir, entry);
130
+ const sourceEntry = path$1.join(stagingDir, entry);
131
+ await fs$1.promises.rm(target, {
132
+ recursive: true,
133
+ force: true
134
+ });
135
+ try {
136
+ await fs$1.promises.rename(sourceEntry, target);
137
+ } catch (error) {
138
+ if (error.code !== "EXDEV") throw error;
139
+ await fs$1.promises.cp(sourceEntry, target, {
140
+ recursive: true,
141
+ force: true
142
+ });
143
+ await fs$1.promises.rm(sourceEntry, {
144
+ recursive: true,
145
+ force: true
146
+ });
147
+ }
148
+ }
149
+ downloadCommitted = true;
66
150
  } finally {
67
151
  clearTimeout(timer);
68
152
  }
69
153
  } finally {
154
+ if (!downloadPromise || downloadFinished) await removeStagingDir();
155
+ else downloadPromise.then(removeStagingDir, removeStagingDir);
70
156
  if (origDebug !== void 0) process.env.DEBUG = origDebug;
71
157
  }
72
158
  }
@@ -369,6 +455,6 @@ async function installShadcnRegistry(projectDir, components, label, pm) {
369
455
  }
370
456
  }
371
457
  //#endregion
372
- export { dlxCommand, downloadProject, reconcileAssistantUIImportLayout, resolveLatestReleaseRef, resolvePackageManager, scaffoldProject, scanRequiredComponents, transformProject };
458
+ export { DOWNLOAD_TIMEOUT_MS, cleanupPendingProjectDownloads, dlxCommand, downloadProject, reconcileAssistantUIImportLayout, resolveGitHubAuthToken, resolveLatestReleaseRef, resolvePackageManager, scaffoldProject, scanRequiredComponents, transformProject };
373
459
 
374
460
  //# sourceMappingURL=create-project.js.map
@@ -1 +1 @@
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\";\nimport {\n detectRegistryPlatform,\n resolveRegistryItemUrl,\n} from \"./utils/registry\";\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 registryInstallCommand?: 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 const components = opts.hasLocalComponents\n ? undefined\n : resolveRegistryComponents(projectDir, scanRequiredComponents(projectDir));\n\n const pm = opts.packageManager;\n if (opts.skipInstall) {\n if (!components) return {};\n const [cmd, dlxArgs] = dlxCommand(pm);\n return {\n registryInstallCommand: `${cmd} ${[...dlxArgs, \"shadcn@latest\", \"add\", ...components].join(\" \")}`,\n };\n }\n\n logger.step(\"Installing dependencies...\");\n await installDependencies(projectDir, pm);\n\n if (components) {\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 await reconcileAssistantUIImportLayout(projectDir);\n }\n return {};\n}\n\nfunction resolveRegistryComponents(\n projectDir: string,\n { assistantUI, shadcnUI }: RequiredComponents,\n): string[] {\n if (detectRegistryPlatform(projectDir) === \"native\") {\n return [\"utils\", ...shadcnUI, ...assistantUI].map((component) =>\n resolveRegistryItemUrl(component, undefined, \"native\"),\n );\n }\n return [\n \"@assistant-ui/utils\",\n ...shadcnUI,\n ...assistantUI.map((component) => `@assistant-ui/${component}`),\n ];\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\nconst ASSISTANT_UI_OWNED_UI = new Set([\n \"accordion\",\n \"badge\",\n \"diff-viewer\",\n \"direction\",\n \"dot-matrix\",\n \"number-roll\",\n \"select\",\n \"tabs\",\n]);\n\nconst BARE_ELEMENT_ITEMS = new Set([\n \"file\",\n \"generative-ui\",\n \"heat-graph\",\n \"image\",\n \"logos\",\n \"markdown-text\",\n \"syntax-highlighter\",\n \"tooltip-icon-button\",\n]);\n\nfunction toAssistantUIItem(specifier: string): string | null {\n let name = stripImportExtension(specifier);\n const inElements = name.startsWith(\"elements/\");\n if (inElements) {\n name = name.slice(\"elements/\".length);\n } else if (name.includes(\"/\")) {\n return null;\n }\n if (name.endsWith(\".aui\")) {\n return name.slice(0, -\".aui\".length);\n }\n return inElements && !BARE_ELEMENT_ITEMS.has(name)\n ? `elements-${name}`\n : name;\n}\n\n/**\n * Example snapshots are downloaded at a release tag while the shadcn registry\n * is live, so a snapshot may import components at the legacy flat path\n * (`@/components/assistant-ui/<name>`) after the registry has moved the file\n * to `components/assistant-ui/elements/<name>.aui.tsx`. Resolve each legacy\n * specifier against the files the registry actually installed and rewrite it\n * only when the legacy path is absent and the elements layout has it.\n */\nexport async function reconcileAssistantUIImportLayout(\n projectDir: string,\n): Promise<void> {\n const componentRoots = [\"components\", \"src/components\"]\n .map((dir) => path.join(projectDir, dir, \"assistant-ui\"))\n .filter((dir) => fs.existsSync(dir));\n if (componentRoots.length === 0) return;\n\n const resolvesAtLegacyPath = (name: string) =>\n componentRoots.some((root) =>\n [\".tsx\", \".ts\", \"/index.tsx\", \"/index.ts\"].some((suffix) =>\n fs.existsSync(path.join(root, `${name}${suffix}`)),\n ),\n );\n\n // Index the installed tree by import name so the rewrite follows whatever\n // layout the registry delivered — some items install as\n // elements/<name>.aui.tsx, others as elements/<name>.tsx, and a future\n // layout move should not require new knowledge here.\n const installedByName = new Map<string, string>();\n for (const root of componentRoots) {\n for (const { file } of readProjectFiles(\"**/*.{ts,tsx}\", { cwd: root })) {\n const normalized = file.split(path.sep).join(\"/\");\n if (!normalized.includes(\"/\")) continue;\n const specifier = normalized.replace(/\\.[cm]?[tj]sx?$/, \"\");\n const name = path.posix.basename(specifier).replace(/\\.aui$/, \"\");\n // A flat legacy import maps to the registry's `<name>` item, which is\n // the `.aui` file; a colliding bare file with the same basename belongs\n // to the distinct `elements-<name>` item, so the `.aui` variant wins.\n const existing = installedByName.get(name);\n if (\n existing === undefined ||\n (!existing.endsWith(\".aui\") && specifier.endsWith(\".aui\"))\n ) {\n installedByName.set(name, specifier);\n }\n }\n }\n if (installedByName.size === 0) return;\n\n const { default: jscodeshift } = await import(\"jscodeshift\");\n const parsers = {\n ts: jscodeshift.withParser(\"ts\"),\n tsx: jscodeshift.withParser(\"tsx\"),\n };\n\n for (const { fullPath, content } of readProjectFiles(\"**/*.{ts,tsx}\", {\n cwd: projectDir,\n ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES,\n })) {\n if (!content.includes(\"@/components/assistant-ui/\")) continue;\n\n const replacements: Array<{ start: number; end: number; value: string }> =\n [];\n const collectReplacement = (source: {\n value?: unknown;\n start?: number | null;\n end?: number | null;\n }) => {\n if (\n typeof source.value !== \"string\" ||\n source.start == null ||\n source.end == null\n ) {\n return;\n }\n\n const prefix = \"@/components/assistant-ui/\";\n if (!source.value.startsWith(prefix)) return;\n const specifier = source.value.slice(prefix.length);\n if (specifier.includes(\"/\")) return;\n\n const name = stripImportExtension(specifier);\n const installed = installedByName.get(name);\n if (resolvesAtLegacyPath(name) || installed === undefined) return;\n\n const raw = content.slice(source.start, source.end);\n const quote = raw[0];\n if ((quote !== '\"' && quote !== \"'\") || raw.at(-1) !== quote) return;\n replacements.push({\n start: source.start,\n end: source.end,\n value: `${quote}@/components/assistant-ui/${installed}${quote}`,\n });\n };\n\n const j = fullPath.endsWith(\".tsx\") ? parsers.tsx : parsers.ts;\n let root;\n try {\n root = j(content);\n } catch {\n continue;\n }\n root\n .find(j.ImportDeclaration)\n .forEach(({ node }) => collectReplacement(node.source));\n root\n .find(j.ExportNamedDeclaration)\n .forEach(({ node }) => node.source && collectReplacement(node.source));\n root\n .find(j.ExportAllDeclaration)\n .forEach(({ node }) => collectReplacement(node.source));\n\n let next = content;\n for (const replacement of replacements.sort((a, b) => b.start - a.start)) {\n next =\n next.slice(0, replacement.start) +\n replacement.value +\n next.slice(replacement.end);\n }\n if (next !== content) fs.writeFileSync(fullPath, next);\n }\n}\n\nexport function 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 const item = toAssistantUIItem(match[1]!);\n if (item) assistantUIComponents.add(item);\n }\n\n const uiRegex = /from\\s+[\"']@\\/components\\/ui\\/([^\"']+)[\"']/g;\n for (const match of content.matchAll(uiRegex)) {\n const name = stripImportExtension(match[1]!);\n if (ASSISTANT_UI_OWNED_UI.has(name)) {\n assistantUIComponents.add(name);\n } else {\n shadcnUIComponents.add(name);\n }\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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"}
1
+ {"version":3,"file":"create-project.js","names":["fs","path","os","parseJsonc"],"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\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\";\nimport {\n detectRegistryPlatform,\n resolveRegistryItemUrl,\n} from \"./utils/registry\";\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\nexport function 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\nexport const DOWNLOAD_TIMEOUT_MS = 30_000;\nconst pendingDownloadCleanups = new Set<() => void>();\n\nexport function cleanupPendingProjectDownloads(): void {\n for (const cleanup of pendingDownloadCleanups) {\n pendingDownloadCleanups.delete(cleanup);\n process.removeListener(\"exit\", cleanup);\n cleanup();\n }\n}\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 let destinationCreated = false;\n let stagingDir: string | undefined;\n let downloadPromise: Promise<unknown> | undefined;\n let downloadFinished = false;\n let downloadCommitted = false;\n let cleanupRequested = false;\n const removeCleanupListeners = () => {\n process.removeListener(\"exit\", cleanupOnExit);\n pendingDownloadCleanups.delete(cleanupOnExit);\n };\n const attemptSyncCleanup = (cleanup: () => void) => {\n try {\n cleanup();\n } catch {\n return;\n }\n };\n const cleanupOnExit = () => {\n cleanupRequested = true;\n const currentStagingDir = stagingDir;\n if (currentStagingDir) {\n attemptSyncCleanup(() => {\n fs.rmSync(currentStagingDir, { recursive: true, force: true });\n });\n }\n if (destinationCreated && !downloadCommitted) {\n attemptSyncCleanup(() => {\n fs.rmdirSync(destDir);\n });\n }\n };\n const removeStagingDir = async () => {\n if (stagingDir) {\n await fs.promises\n .rm(stagingDir, { recursive: true, force: true })\n .catch(() => undefined);\n }\n removeCleanupListeners();\n if (destinationCreated && !downloadCommitted) {\n await fs.promises.rmdir(destDir).catch(() => undefined);\n }\n };\n try {\n await fs.promises.mkdir(path.dirname(destDir), { recursive: true });\n try {\n stagingDir = await fs.promises.mkdtemp(\n path.join(path.dirname(destDir), \".assistant-ui-download-\"),\n );\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EACCES\" && code !== \"EPERM\" && code !== \"EROFS\") {\n throw error;\n }\n stagingDir = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), \".assistant-ui-download-\"),\n );\n }\n process.once(\"exit\", cleanupOnExit);\n pendingDownloadCleanups.add(cleanupOnExit);\n\n const authToken = resolveGitHubAuthToken();\n downloadPromise = downloadTemplate(source, {\n dir: stagingDir,\n force: true,\n silent: true,\n ...(authToken ? { auth: authToken } : {}),\n }).finally(() => {\n downloadFinished = true;\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 if (cleanupRequested) throw new Error(\"Download was interrupted.\");\n destinationCreated = !fs.existsSync(destDir);\n await fs.promises.mkdir(destDir, { recursive: true });\n for (const entry of await fs.promises.readdir(stagingDir)) {\n const target = path.join(destDir, entry);\n const sourceEntry = path.join(stagingDir, entry);\n await fs.promises.rm(target, { recursive: true, force: true });\n try {\n await fs.promises.rename(sourceEntry, target);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EXDEV\") throw error;\n await fs.promises.cp(sourceEntry, target, {\n recursive: true,\n force: true,\n });\n await fs.promises.rm(sourceEntry, { recursive: true, force: true });\n }\n }\n downloadCommitted = true;\n } finally {\n clearTimeout(timer!);\n }\n } finally {\n if (!downloadPromise || downloadFinished) {\n await removeStagingDir();\n } else {\n void downloadPromise.then(removeStagingDir, removeStagingDir);\n }\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 registryInstallCommand?: 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 const components = opts.hasLocalComponents\n ? undefined\n : resolveRegistryComponents(projectDir, scanRequiredComponents(projectDir));\n\n const pm = opts.packageManager;\n if (opts.skipInstall) {\n if (!components) return {};\n const [cmd, dlxArgs] = dlxCommand(pm);\n return {\n registryInstallCommand: `${cmd} ${[...dlxArgs, \"shadcn@latest\", \"add\", ...components].join(\" \")}`,\n };\n }\n\n logger.step(\"Installing dependencies...\");\n await installDependencies(projectDir, pm);\n\n if (components) {\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 await reconcileAssistantUIImportLayout(projectDir);\n }\n return {};\n}\n\nfunction resolveRegistryComponents(\n projectDir: string,\n { assistantUI, shadcnUI }: RequiredComponents,\n): string[] {\n if (detectRegistryPlatform(projectDir) === \"native\") {\n return [\"utils\", ...shadcnUI, ...assistantUI].map((component) =>\n resolveRegistryItemUrl(component, undefined, \"native\"),\n );\n }\n return [\n \"@assistant-ui/utils\",\n ...shadcnUI,\n ...assistantUI.map((component) => `@assistant-ui/${component}`),\n ];\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\nconst ASSISTANT_UI_OWNED_UI = new Set([\n \"accordion\",\n \"badge\",\n \"diff-viewer\",\n \"direction\",\n \"dot-matrix\",\n \"number-roll\",\n \"select\",\n \"tabs\",\n]);\n\nconst BARE_ELEMENT_ITEMS = new Set([\n \"file\",\n \"generative-ui\",\n \"heat-graph\",\n \"image\",\n \"logos\",\n \"markdown-text\",\n \"syntax-highlighter\",\n \"tooltip-icon-button\",\n]);\n\nfunction toAssistantUIItem(specifier: string): string | null {\n let name = stripImportExtension(specifier);\n const inElements = name.startsWith(\"elements/\");\n if (inElements) {\n name = name.slice(\"elements/\".length);\n } else if (name.includes(\"/\")) {\n return null;\n }\n if (name.endsWith(\".aui\")) {\n return name.slice(0, -\".aui\".length);\n }\n return inElements && !BARE_ELEMENT_ITEMS.has(name)\n ? `elements-${name}`\n : name;\n}\n\n/**\n * Example snapshots are downloaded at a release tag while the shadcn registry\n * is live, so a snapshot may import components at the legacy flat path\n * (`@/components/assistant-ui/<name>`) after the registry has moved the file\n * to `components/assistant-ui/elements/<name>.aui.tsx`. Resolve each legacy\n * specifier against the files the registry actually installed and rewrite it\n * only when the legacy path is absent and the elements layout has it.\n */\nexport async function reconcileAssistantUIImportLayout(\n projectDir: string,\n): Promise<void> {\n const componentRoots = [\"components\", \"src/components\"]\n .map((dir) => path.join(projectDir, dir, \"assistant-ui\"))\n .filter((dir) => fs.existsSync(dir));\n if (componentRoots.length === 0) return;\n\n const resolvesAtLegacyPath = (name: string) =>\n componentRoots.some((root) =>\n [\".tsx\", \".ts\", \"/index.tsx\", \"/index.ts\"].some((suffix) =>\n fs.existsSync(path.join(root, `${name}${suffix}`)),\n ),\n );\n\n // Index the installed tree by import name so the rewrite follows whatever\n // layout the registry delivered — some items install as\n // elements/<name>.aui.tsx, others as elements/<name>.tsx, and a future\n // layout move should not require new knowledge here.\n const installedByName = new Map<string, string>();\n for (const root of componentRoots) {\n for (const { file } of readProjectFiles(\"**/*.{ts,tsx}\", { cwd: root })) {\n const normalized = file.split(path.sep).join(\"/\");\n if (!normalized.includes(\"/\")) continue;\n const specifier = normalized.replace(/\\.[cm]?[tj]sx?$/, \"\");\n const name = path.posix.basename(specifier).replace(/\\.aui$/, \"\");\n // A flat legacy import maps to the registry's `<name>` item, which is\n // the `.aui` file; a colliding bare file with the same basename belongs\n // to the distinct `elements-<name>` item, so the `.aui` variant wins.\n const existing = installedByName.get(name);\n if (\n existing === undefined ||\n (!existing.endsWith(\".aui\") && specifier.endsWith(\".aui\"))\n ) {\n installedByName.set(name, specifier);\n }\n }\n }\n if (installedByName.size === 0) return;\n\n const { default: jscodeshift } = await import(\"jscodeshift\");\n const parsers = {\n ts: jscodeshift.withParser(\"ts\"),\n tsx: jscodeshift.withParser(\"tsx\"),\n };\n\n for (const { fullPath, content } of readProjectFiles(\"**/*.{ts,tsx}\", {\n cwd: projectDir,\n ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES,\n })) {\n if (!content.includes(\"@/components/assistant-ui/\")) continue;\n\n const replacements: Array<{ start: number; end: number; value: string }> =\n [];\n const collectReplacement = (source: {\n value?: unknown;\n start?: number | null;\n end?: number | null;\n }) => {\n if (\n typeof source.value !== \"string\" ||\n source.start == null ||\n source.end == null\n ) {\n return;\n }\n\n const prefix = \"@/components/assistant-ui/\";\n if (!source.value.startsWith(prefix)) return;\n const specifier = source.value.slice(prefix.length);\n if (specifier.includes(\"/\")) return;\n\n const name = stripImportExtension(specifier);\n const installed = installedByName.get(name);\n if (resolvesAtLegacyPath(name) || installed === undefined) return;\n\n const raw = content.slice(source.start, source.end);\n const quote = raw[0];\n if ((quote !== '\"' && quote !== \"'\") || raw.at(-1) !== quote) return;\n replacements.push({\n start: source.start,\n end: source.end,\n value: `${quote}@/components/assistant-ui/${installed}${quote}`,\n });\n };\n\n const j = fullPath.endsWith(\".tsx\") ? parsers.tsx : parsers.ts;\n let root;\n try {\n root = j(content);\n } catch {\n continue;\n }\n root\n .find(j.ImportDeclaration)\n .forEach(({ node }) => collectReplacement(node.source));\n root\n .find(j.ExportNamedDeclaration)\n .forEach(({ node }) => node.source && collectReplacement(node.source));\n root\n .find(j.ExportAllDeclaration)\n .forEach(({ node }) => collectReplacement(node.source));\n\n let next = content;\n for (const replacement of replacements.sort((a, b) => b.start - a.start)) {\n next =\n next.slice(0, replacement.start) +\n replacement.value +\n next.slice(replacement.end);\n }\n if (next !== content) fs.writeFileSync(fullPath, next);\n }\n}\n\nexport function 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 const item = toAssistantUIItem(match[1]!);\n if (item) assistantUIComponents.add(item);\n }\n\n const uiRegex = /from\\s+[\"']@\\/components\\/ui\\/([^\"']+)[\"']/g;\n for (const match of content.matchAll(uiRegex)) {\n const name = stripImportExtension(match[1]!);\n if (ASSISTANT_UI_OWNED_UI.has(name)) {\n assistantUIComponents.add(name);\n } else {\n shadcnUIComponents.add(name);\n }\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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"}
@@ -1,4 +1,2 @@
1
- //#region src/lib/handle-cli-error.d.ts
2
1
  export declare function handleCliError(error: unknown): void;
3
- //#endregion
4
2
  //# sourceMappingURL=handle-cli-error.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handle-cli-error.d.ts","names":[],"sources":["../../src/lib/handle-cli-error.ts"],"mappings":";wBAGgB,eAAe"}
1
+ {"version":3,"file":"handle-cli-error.d.ts","sourceRoot":"","sources":["../../src/lib/handle-cli-error.ts"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAanD"}
@@ -1,4 +1,2 @@
1
- //#region src/lib/install-ai-sdk-lib.d.ts
2
1
  export default function installAiSdkLib(): Promise<void>;
3
- //#endregion
4
2
  //# sourceMappingURL=install-ai-sdk-lib.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"install-ai-sdk-lib.d.ts","names":[],"sources":["../../src/lib/install-ai-sdk-lib.ts"],"mappings":";wBAE8B,mBAAmB"}
1
+ {"version":3,"file":"install-ai-sdk-lib.d.ts","sourceRoot":"","sources":["../../src/lib/install-ai-sdk-lib.ts"],"names":[],"mappings":"AAEA,wBAA8B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB7D"}
@@ -1,4 +1,2 @@
1
- //#region src/lib/install-edge-lib.d.ts
2
1
  export default function installEdgeLib(): Promise<void>;
3
- //#endregion
4
2
  //# sourceMappingURL=install-edge-lib.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"install-edge-lib.d.ts","names":[],"sources":["../../src/lib/install-edge-lib.ts"],"mappings":";wBAE8B,kBAAkB"}
1
+ {"version":3,"file":"install-edge-lib.d.ts","sourceRoot":"","sources":["../../src/lib/install-edge-lib.ts"],"names":[],"mappings":"AAEA,wBAA8B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAa5D"}