assistant-ui 0.0.117 → 0.0.119

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 (130) hide show
  1. package/LICENSE +1 -1
  2. package/dist/codemods/utils/createTransformer.d.ts +10 -12
  3. package/dist/codemods/utils/createTransformer.d.ts.map +1 -1
  4. package/dist/codemods/utils/resolveBinding.d.ts +3 -0
  5. package/dist/codemods/utils/resolveBinding.d.ts.map +1 -0
  6. package/dist/codemods/utils/resolveBinding.js +78 -0
  7. package/dist/codemods/utils/resolveBinding.js.map +1 -0
  8. package/dist/codemods/v0-11/content-part-to-message-part.d.ts +1 -3
  9. package/dist/codemods/v0-11/content-part-to-message-part.d.ts.map +1 -1
  10. package/dist/codemods/v0-12/assistant-api-to-aui.d.ts +1 -3
  11. package/dist/codemods/v0-12/assistant-api-to-aui.d.ts.map +1 -1
  12. package/dist/codemods/v0-12/assistant-api-to-aui.js +51 -99
  13. package/dist/codemods/v0-12/assistant-api-to-aui.js.map +1 -1
  14. package/dist/codemods/v0-12/event-names-to-camelcase.d.ts +1 -3
  15. package/dist/codemods/v0-12/event-names-to-camelcase.d.ts.map +1 -1
  16. package/dist/codemods/v0-12/primitive-if-to-aui-if.d.ts +1 -3
  17. package/dist/codemods/v0-12/primitive-if-to-aui-if.d.ts.map +1 -1
  18. package/dist/codemods/v0-12/primitive-if-to-aui-if.js +6 -6
  19. package/dist/codemods/v0-12/primitive-if-to-aui-if.js.map +1 -1
  20. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.d.ts +1 -3
  21. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.d.ts.map +1 -1
  22. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.js +33 -5
  23. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.js.map +1 -1
  24. package/dist/codemods/v0-8/ui-package-split.d.ts +1 -3
  25. package/dist/codemods/v0-8/ui-package-split.d.ts.map +1 -1
  26. package/dist/codemods/v0-9/edge-package-split.d.ts +1 -3
  27. package/dist/codemods/v0-9/edge-package-split.d.ts.map +1 -1
  28. package/dist/commands/add.d.ts +10 -12
  29. package/dist/commands/add.d.ts.map +1 -1
  30. package/dist/commands/add.js +3 -3
  31. package/dist/commands/agent.d.ts +0 -2
  32. package/dist/commands/agent.d.ts.map +1 -1
  33. package/dist/commands/agent.js +16 -13
  34. package/dist/commands/agent.js.map +1 -1
  35. package/dist/commands/create.d.ts +33 -28
  36. package/dist/commands/create.d.ts.map +1 -1
  37. package/dist/commands/create.js +19 -15
  38. package/dist/commands/create.js.map +1 -1
  39. package/dist/commands/doctor.d.ts +8 -10
  40. package/dist/commands/doctor.d.ts.map +1 -1
  41. package/dist/commands/info.d.ts +2 -4
  42. package/dist/commands/info.d.ts.map +1 -1
  43. package/dist/commands/info.js +3 -3
  44. package/dist/commands/init.d.ts +5 -6
  45. package/dist/commands/init.d.ts.map +1 -1
  46. package/dist/commands/init.js +2 -2
  47. package/dist/commands/mcp.d.ts +0 -2
  48. package/dist/commands/mcp.d.ts.map +1 -1
  49. package/dist/commands/mcp.js +2 -2
  50. package/dist/commands/update.d.ts +0 -2
  51. package/dist/commands/update.d.ts.map +1 -1
  52. package/dist/commands/update.js +1 -1
  53. package/dist/commands/upgrade.d.ts +4 -6
  54. package/dist/commands/upgrade.d.ts.map +1 -1
  55. package/dist/index.d.ts +3 -1
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/lib/agent-skill.d.ts +8 -6
  58. package/dist/lib/agent-skill.d.ts.map +1 -1
  59. package/dist/lib/agent-skill.js +78 -2
  60. package/dist/lib/agent-skill.js.map +1 -1
  61. package/dist/lib/create-project.d.ts +22 -20
  62. package/dist/lib/create-project.d.ts.map +1 -1
  63. package/dist/lib/create-project.js +91 -5
  64. package/dist/lib/create-project.js.map +1 -1
  65. package/dist/lib/handle-cli-error.d.ts +0 -2
  66. package/dist/lib/handle-cli-error.d.ts.map +1 -1
  67. package/dist/lib/install-ai-sdk-lib.d.ts +0 -2
  68. package/dist/lib/install-ai-sdk-lib.d.ts.map +1 -1
  69. package/dist/lib/install-edge-lib.d.ts +0 -2
  70. package/dist/lib/install-edge-lib.d.ts.map +1 -1
  71. package/dist/lib/run-spawn.d.ts +11 -12
  72. package/dist/lib/run-spawn.d.ts.map +1 -1
  73. package/dist/lib/run-spawn.js +25 -10
  74. package/dist/lib/run-spawn.js.map +1 -1
  75. package/dist/lib/transform-options.d.ts +4 -6
  76. package/dist/lib/transform-options.d.ts.map +1 -1
  77. package/dist/lib/transform.d.ts +11 -13
  78. package/dist/lib/transform.d.ts.map +1 -1
  79. package/dist/lib/transform.js +19 -35
  80. package/dist/lib/transform.js.map +1 -1
  81. package/dist/lib/upgrade.d.ts +2 -4
  82. package/dist/lib/upgrade.d.ts.map +1 -1
  83. package/dist/lib/upgrade.js +6 -11
  84. package/dist/lib/upgrade.js.map +1 -1
  85. package/dist/lib/utils/config.d.ts +14 -16
  86. package/dist/lib/utils/config.d.ts.map +1 -1
  87. package/dist/lib/utils/file-scanner.d.ts +8 -10
  88. package/dist/lib/utils/file-scanner.d.ts.map +1 -1
  89. package/dist/lib/utils/logger.d.ts +6 -8
  90. package/dist/lib/utils/logger.d.ts.map +1 -1
  91. package/dist/lib/utils/package-installer.d.ts +5 -7
  92. package/dist/lib/utils/package-installer.d.ts.map +1 -1
  93. package/dist/lib/utils/package-json.d.ts +0 -2
  94. package/dist/lib/utils/package-json.d.ts.map +1 -1
  95. package/dist/lib/utils/package-manager.d.ts +2 -4
  96. package/dist/lib/utils/package-manager.d.ts.map +1 -1
  97. package/dist/lib/utils/package-manager.js +13 -2
  98. package/dist/lib/utils/package-manager.js.map +1 -1
  99. package/dist/lib/utils/registry.d.ts +0 -2
  100. package/dist/lib/utils/registry.d.ts.map +1 -1
  101. package/dist/lib/utils/workspace.d.ts +0 -2
  102. package/dist/lib/utils/workspace.d.ts.map +1 -1
  103. package/dist/program.d.ts +0 -2
  104. package/dist/program.d.ts.map +1 -1
  105. package/dist/program.js +6 -6
  106. package/dist/run.d.ts +0 -2
  107. package/dist/run.d.ts.map +1 -1
  108. package/package.json +2 -3
  109. package/src/codemods/utils/resolveBinding.test.ts +107 -0
  110. package/src/codemods/utils/resolveBinding.ts +130 -0
  111. package/src/codemods/v0-12/__tests__/assistant-api-to-aui.test.ts +256 -0
  112. package/src/codemods/v0-12/__tests__/primitive-if-to-aui-if.test.ts +31 -0
  113. package/src/codemods/v0-12/assistant-api-to-aui.ts +125 -225
  114. package/src/codemods/v0-12/primitive-if-to-aui-if.ts +8 -5
  115. package/src/codemods/v0-15/__tests__/aui-accessor-calls-to-properties.test.ts +101 -0
  116. package/src/codemods/v0-15/aui-accessor-calls-to-properties.ts +60 -5
  117. package/src/commands/agent.ts +15 -22
  118. package/src/commands/create.ts +24 -15
  119. package/src/lib/agent-skill.ts +103 -1
  120. package/src/lib/create-project.ts +99 -4
  121. package/src/lib/run-spawn.test.ts +47 -0
  122. package/src/lib/run-spawn.ts +29 -17
  123. package/src/lib/transform-files.test.ts +71 -0
  124. package/src/lib/transform.test.ts +69 -1
  125. package/src/lib/transform.ts +23 -38
  126. package/src/lib/upgrade.ts +9 -13
  127. package/src/lib/utils/package-manager.ts +24 -1
  128. package/plugin/.claude-plugin/plugin.json +0 -8
  129. package/plugin/skills/assistant-ui/SKILL.md +0 -199
  130. package/plugin/skills/assistant-ui/shipables.json +0 -22
@@ -1,24 +1,22 @@
1
1
  import { Command } from "commander";
2
- //#region src/commands/doctor.d.ts
3
2
  export interface DiscoveredPackage {
4
- name: string;
5
- version: string;
6
- installPath: string;
3
+ name: string;
4
+ version: string;
5
+ installPath: string;
7
6
  }
8
7
  export declare function discoverInstalledPackages(cwd: string): DiscoveredPackage[];
9
8
  export interface DuplicateGroup {
10
- name: string;
11
- installations: DiscoveredPackage[];
9
+ name: string;
10
+ installations: DiscoveredPackage[];
12
11
  }
13
12
  export declare function findDuplicates(packages: DiscoveredPackage[]): DuplicateGroup[];
14
13
  export declare function uniquePackageNames(packages: DiscoveredPackage[]): string[];
15
14
  export declare function compareSemver(a: string, b: string): number;
16
15
  export interface OutdatedPackage {
17
- name: string;
18
- current: string;
19
- latest: string;
16
+ name: string;
17
+ current: string;
18
+ latest: string;
20
19
  }
21
20
  export declare function findOutdated(packages: DiscoveredPackage[], latest: Map<string, string | null>): OutdatedPackage[];
22
21
  export declare const doctor: Command;
23
- //#endregion
24
22
  //# sourceMappingURL=doctor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","names":[],"sources":["../../src/commands/doctor.ts"],"mappings":";;iBAmBiB;EACf;EACA;EACA;;wBAiKc,0BAA0B,cAAc;iBAiBvC;EACf;EACA,eAAe;;wBAGD,eACd,UAAU,sBACT;wBAmBa,mBAAmB,UAAU;wBAmC7B,cAAc,WAAW;iBAOxB;EACf;EACA;EACA;;wBAGc,aACd,UAAU,qBACV,QAAQ,6BACP;qBAsFU,QAAM"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAgKD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAe1E;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,iBAAiB,EAAE,CAAC;CACpC;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,cAAc,EAAE,CAiBlB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAE1E;AAiCD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GACjC,eAAe,EAAE,CAmBnB;AAmED,eAAO,MAAM,MAAM,SA6Df,CAAC"}
@@ -1,8 +1,6 @@
1
- import { findWorkspaceRoot } from "../lib/utils/workspace.js";
2
1
  import { Command } from "commander";
3
- //#region src/commands/info.d.ts
2
+ import { findWorkspaceRoot } from "../lib/utils/workspace.js";
3
+ export { findWorkspaceRoot };
4
4
  export declare function satisfiesRange(version: string, range: string): boolean;
5
5
  export declare const info: Command;
6
- //#endregion
7
- export { findWorkspaceRoot };
8
6
  //# sourceMappingURL=info.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"info.d.ts","names":[],"sources":["../../src/commands/info.ts"],"mappings":";;;wBAiNgB,eAAe,iBAAiB;qBAyMnC,MAAI"}
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,OAAO,EAAE,iBAAiB,EAAmB,kCAA+B;AAE5E,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAsM7B,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAYtE;AA6LD,eAAO,MAAM,IAAI,SA6Cb,CAAC"}
@@ -1,13 +1,13 @@
1
- import { logPackageJsonParseError } from "../lib/utils/package-json.js";
2
1
  import { findWorkspaceRoot, resolveRealPath } from "../lib/utils/workspace.js";
3
- import * as os$1 from "node:os";
2
+ import { logPackageJsonParseError } from "../lib/utils/package-json.js";
4
3
  import { Command } from "commander";
5
4
  import chalk from "chalk";
6
5
  import * as fs$1 from "node:fs";
7
6
  import * as path$1 from "node:path";
7
+ import * as os$1 from "node:os";
8
8
  import { detect } from "detect-package-manager";
9
- import { spawnSync } from "node:child_process";
10
9
  import { satisfies } from "semver";
10
+ import { spawnSync } from "node:child_process";
11
11
  //#region src/commands/info.ts
12
12
  const ASSISTANT_UI_PACKAGES = [
13
13
  "@assistant-ui/react",
@@ -1,14 +1,13 @@
1
1
  import { Command } from "commander";
2
- //#region src/commands/init.d.ts
3
2
  interface ExistingProjectInitPlan {
4
- initArgs: string[];
5
- addArgs: string[];
3
+ initArgs: string[];
4
+ addArgs: string[];
6
5
  }
7
6
  export declare function createExistingProjectInitPlan(params: {
8
- yes: boolean;
9
- overwrite: boolean;
7
+ yes: boolean;
8
+ overwrite: boolean;
10
9
  }): ExistingProjectInitPlan;
11
10
  export declare function isNonInteractiveShell(stdinIsTTY?: boolean): boolean;
12
11
  export declare const init: Command;
13
- //#endregion
12
+ export {};
14
13
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","names":[],"sources":["../../src/commands/init.ts"],"mappings":";;UAaU;EACR;EACA;;wBAGc,8BAA8B;EAC5C;EACA;IACE;wBAYY,sBACd;qBAKW,MAAI"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAa5C,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IACpD,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,uBAAuB,CAU1B;AAED,wBAAgB,qBAAqB,CACnC,UAAU,UAAsB,GAC/B,OAAO,CAET;AAED,eAAO,MAAM,IAAI,SAuGb,CAAC"}
@@ -1,7 +1,7 @@
1
- import { SpawnExitError, SpawnSignalError, runSpawn } from "../lib/run-spawn.js";
2
1
  import { logger } from "../lib/utils/logger.js";
3
- import { resolvePackageManagerForCwd } from "../lib/utils/package-manager.js";
4
2
  import { getComponentsJsonStyle, resolveQuickStartRegistryUrl } from "../lib/utils/registry.js";
3
+ import { SpawnExitError, SpawnSignalError, runSpawn } from "../lib/run-spawn.js";
4
+ import { resolvePackageManagerForCwd } from "../lib/utils/package-manager.js";
5
5
  import { dlxCommand, resolvePackageManager } from "../lib/create-project.js";
6
6
  import { create } from "./create.js";
7
7
  import { Command, Option } from "commander";
@@ -1,5 +1,3 @@
1
1
  import { Command } from "commander";
2
- //#region src/commands/mcp.d.ts
3
2
  export declare const mcp: Command;
4
- //#endregion
5
3
  //# sourceMappingURL=mcp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","names":[],"sources":["../../src/commands/mcp.ts"],"mappings":";;qBAgQa,KAAG"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgQpC,eAAO,MAAM,GAAG,SAmDZ,CAAC"}
@@ -1,9 +1,9 @@
1
- import { SpawnExitError, SpawnSignalError, runSpawn } from "../lib/run-spawn.js";
2
1
  import { logger } from "../lib/utils/logger.js";
3
- import os from "node:os";
2
+ import { SpawnExitError, SpawnSignalError, runSpawn } from "../lib/run-spawn.js";
4
3
  import { Command } from "commander";
5
4
  import fs from "node:fs";
6
5
  import path from "node:path";
6
+ import os from "node:os";
7
7
  import * as p from "@clack/prompts";
8
8
  //#region src/commands/mcp.ts
9
9
  const HOSTED_MCP_URL = "https://www.assistant-ui.com/mcp";
@@ -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 = "4007601e2e16762060f02d45ad82f453eed5409a";
4
+ export declare const SKILLS_PLUGIN_SOURCE = "gh:assistant-ui/skills/assistant-ui#4007601e2e16762060f02d45ad82f453eed5409a";
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 = "4007601e2e16762060f02d45ad82f453eed5409a";
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 = \"4007601e2e16762060f02d45ad82f453eed5409a\";\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