claudekit-cli 3.18.0 → 3.19.0

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 (2) hide show
  1. package/dist/index.js +104 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -23905,6 +23905,7 @@ init_logger();
23905
23905
 
23906
23906
  // src/domains/ui/prompts/kit-prompts.ts
23907
23907
  init_types2();
23908
+ var MIN_KITS_FOR_MULTISELECT = 2;
23908
23909
  async function selectKit(defaultKit, accessibleKits) {
23909
23910
  const kits = accessibleKits ?? Object.keys(AVAILABLE_KITS);
23910
23911
  const kit = await ie({
@@ -23921,6 +23922,24 @@ async function selectKit(defaultKit, accessibleKits) {
23921
23922
  }
23922
23923
  return kit;
23923
23924
  }
23925
+ async function selectKits(accessibleKits) {
23926
+ if (accessibleKits.length < MIN_KITS_FOR_MULTISELECT) {
23927
+ throw new Error(`selectKits requires at least ${MIN_KITS_FOR_MULTISELECT} accessible kits`);
23928
+ }
23929
+ const selected = await ae({
23930
+ message: "Select ClaudeKit(s) to install:",
23931
+ options: accessibleKits.map((key) => ({
23932
+ value: key,
23933
+ label: AVAILABLE_KITS[key].name,
23934
+ hint: AVAILABLE_KITS[key].description
23935
+ })),
23936
+ required: true
23937
+ });
23938
+ if (lD(selected)) {
23939
+ throw new Error("Kit selection cancelled");
23940
+ }
23941
+ return selected;
23942
+ }
23924
23943
  async function getDirectory(defaultDir = ".") {
23925
23944
  const dir = await te({
23926
23945
  message: "Enter target directory:",
@@ -24447,6 +24466,9 @@ class PromptsManager {
24447
24466
  async selectKit(defaultKit, accessibleKits) {
24448
24467
  return selectKit(defaultKit, accessibleKits);
24449
24468
  }
24469
+ async selectKits(accessibleKits) {
24470
+ return selectKits(accessibleKits);
24471
+ }
24450
24472
  async selectVersion(versions, defaultVersion) {
24451
24473
  return selectVersion(versions, defaultVersion);
24452
24474
  }
@@ -24550,6 +24572,7 @@ class PromptsManager {
24550
24572
 
24551
24573
  // src/commands/init/init-command.ts
24552
24574
  init_logger();
24575
+ init_types2();
24553
24576
 
24554
24577
  // src/commands/init/phases/conflict-handler.ts
24555
24578
  init_logger();
@@ -39622,6 +39645,7 @@ async function handleSelection(ctx) {
39622
39645
  logger.info("Purchase at https://claudekit.cc");
39623
39646
  return { ...ctx, cancelled: true };
39624
39647
  }
39648
+ let pendingKits;
39625
39649
  if (!kitType) {
39626
39650
  if (ctx.isNonInteractive) {
39627
39651
  if (!accessibleKits || accessibleKits.length === 0) {
@@ -39632,6 +39656,16 @@ async function handleSelection(ctx) {
39632
39656
  } else if (accessibleKits?.length === 1) {
39633
39657
  kitType = accessibleKits[0];
39634
39658
  logger.info(`Using ${AVAILABLE_KITS[kitType].name} (only accessible kit)`);
39659
+ } else if (accessibleKits && accessibleKits.length > 1) {
39660
+ const selectedKits = await ctx.prompts.selectKits(accessibleKits);
39661
+ if (selectedKits.length === 0) {
39662
+ throw new Error("At least one kit must be selected");
39663
+ }
39664
+ kitType = selectedKits[0];
39665
+ if (selectedKits.length > 1) {
39666
+ pendingKits = selectedKits.slice(1);
39667
+ logger.success(`Selected ${selectedKits.length} kits: ${selectedKits.map((k2) => AVAILABLE_KITS[k2].name).join(", ")}`);
39668
+ }
39635
39669
  } else {
39636
39670
  kitType = await ctx.prompts.selectKit(undefined, accessibleKits);
39637
39671
  }
@@ -39781,7 +39815,9 @@ async function handleSelection(ctx) {
39781
39815
  kitType,
39782
39816
  resolvedDir,
39783
39817
  release,
39784
- selectedVersion
39818
+ selectedVersion,
39819
+ pendingKits,
39820
+ accessibleKits
39785
39821
  };
39786
39822
  }
39787
39823
  // src/commands/init/phases/sync-handler.ts
@@ -40605,6 +40641,50 @@ async function handleTransforms(ctx) {
40605
40641
  };
40606
40642
  }
40607
40643
  // src/commands/init/init-command.ts
40644
+ async function installAdditionalKit(baseCtx, kitType) {
40645
+ const kit = AVAILABLE_KITS[kitType];
40646
+ const github = new GitHubClient;
40647
+ logger.info(`
40648
+ Installing additional kit: ${kit.name}`);
40649
+ let release;
40650
+ if (baseCtx.selectedVersion && !baseCtx.selectedVersion.includes("latest")) {
40651
+ try {
40652
+ release = await github.getReleaseByTag(kit, baseCtx.selectedVersion);
40653
+ logger.success(`Found matching version: ${release.tag_name}`);
40654
+ } catch {
40655
+ logger.warning(`Version ${baseCtx.selectedVersion} not available for ${kit.name}, using latest`);
40656
+ release = await github.getLatestRelease(kit, baseCtx.options.beta);
40657
+ logger.success(`Found: ${release.tag_name}`);
40658
+ }
40659
+ } else {
40660
+ release = await github.getLatestRelease(kit, baseCtx.options.beta);
40661
+ logger.success(`Found: ${release.tag_name}`);
40662
+ }
40663
+ let ctx = {
40664
+ ...baseCtx,
40665
+ kit,
40666
+ kitType,
40667
+ release,
40668
+ selectedVersion: release.tag_name,
40669
+ tempDir: undefined,
40670
+ archivePath: undefined,
40671
+ extractDir: undefined
40672
+ };
40673
+ ctx = await handleDownload(ctx);
40674
+ if (ctx.cancelled)
40675
+ return ctx;
40676
+ ctx = await handleTransforms(ctx);
40677
+ if (ctx.cancelled)
40678
+ return ctx;
40679
+ ctx = await handleMigration(ctx);
40680
+ if (ctx.cancelled)
40681
+ return ctx;
40682
+ ctx = await handleMerge(ctx);
40683
+ if (ctx.cancelled)
40684
+ return ctx;
40685
+ ctx = await handlePostInstall(ctx);
40686
+ return ctx;
40687
+ }
40608
40688
  function createInitContext(rawOptions, prompts) {
40609
40689
  const placeholderOptions = {
40610
40690
  dir: ".",
@@ -40685,6 +40765,28 @@ async function initCommand(options) {
40685
40765
  if (ctx.cancelled)
40686
40766
  return;
40687
40767
  }
40768
+ if (!isSyncMode && ctx.pendingKits && ctx.pendingKits.length > 0 && ctx.kitType) {
40769
+ const installedKits = [ctx.kitType];
40770
+ const kitsToInstall = [...ctx.pendingKits];
40771
+ for (const pendingKit of kitsToInstall) {
40772
+ try {
40773
+ ctx = await installAdditionalKit(ctx, pendingKit);
40774
+ if (ctx.cancelled) {
40775
+ logger.warning(`Installation of ${AVAILABLE_KITS[pendingKit].name} was cancelled`);
40776
+ break;
40777
+ }
40778
+ installedKits.push(pendingKit);
40779
+ } catch (error) {
40780
+ logger.error(`Failed to install ${AVAILABLE_KITS[pendingKit].name}: ${error instanceof Error ? error.message : "Unknown error"}`);
40781
+ if (installedKits.length > 1) {
40782
+ logger.info(`Successfully installed: ${installedKits.map((k2) => AVAILABLE_KITS[k2].name).join(", ")}`);
40783
+ }
40784
+ throw error;
40785
+ }
40786
+ }
40787
+ logger.success(`
40788
+ Installed ${installedKits.length} kits: ${installedKits.map((k2) => AVAILABLE_KITS[k2].name).join(", ")}`);
40789
+ }
40688
40790
  prompts.outro(`Project initialized successfully at ${ctx.resolvedDir}`);
40689
40791
  const protectedNote = ctx.customClaudeFiles.length > 0 ? `Your project has been initialized with the latest version.
40690
40792
  Protected files (.env, .claude custom files, etc.) were not modified.` : `Your project has been initialized with the latest version.
@@ -41766,7 +41868,7 @@ var import_picocolors24 = __toESM(require_picocolors(), 1);
41766
41868
  // package.json
41767
41869
  var package_default = {
41768
41870
  name: "claudekit-cli",
41769
- version: "3.18.0",
41871
+ version: "3.19.0",
41770
41872
  description: "CLI tool for bootstrapping and updating ClaudeKit projects",
41771
41873
  type: "module",
41772
41874
  repository: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudekit-cli",
3
- "version": "3.18.0",
3
+ "version": "3.19.0",
4
4
  "description": "CLI tool for bootstrapping and updating ClaudeKit projects",
5
5
  "type": "module",
6
6
  "repository": {