claudekit-cli 3.18.0 → 3.20.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 +306 -158
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -22342,6 +22342,153 @@ function getInstalledKits(metadata) {
22342
22342
  return [];
22343
22343
  }
22344
22344
 
22345
+ // node_modules/yocto-queue/index.js
22346
+ class Node {
22347
+ value;
22348
+ next;
22349
+ constructor(value) {
22350
+ this.value = value;
22351
+ }
22352
+ }
22353
+
22354
+ class Queue {
22355
+ #head;
22356
+ #tail;
22357
+ #size;
22358
+ constructor() {
22359
+ this.clear();
22360
+ }
22361
+ enqueue(value) {
22362
+ const node = new Node(value);
22363
+ if (this.#head) {
22364
+ this.#tail.next = node;
22365
+ this.#tail = node;
22366
+ } else {
22367
+ this.#head = node;
22368
+ this.#tail = node;
22369
+ }
22370
+ this.#size++;
22371
+ }
22372
+ dequeue() {
22373
+ const current = this.#head;
22374
+ if (!current) {
22375
+ return;
22376
+ }
22377
+ this.#head = this.#head.next;
22378
+ this.#size--;
22379
+ if (!this.#head) {
22380
+ this.#tail = undefined;
22381
+ }
22382
+ return current.value;
22383
+ }
22384
+ peek() {
22385
+ if (!this.#head) {
22386
+ return;
22387
+ }
22388
+ return this.#head.value;
22389
+ }
22390
+ clear() {
22391
+ this.#head = undefined;
22392
+ this.#tail = undefined;
22393
+ this.#size = 0;
22394
+ }
22395
+ get size() {
22396
+ return this.#size;
22397
+ }
22398
+ *[Symbol.iterator]() {
22399
+ let current = this.#head;
22400
+ while (current) {
22401
+ yield current.value;
22402
+ current = current.next;
22403
+ }
22404
+ }
22405
+ *drain() {
22406
+ while (this.#head) {
22407
+ yield this.dequeue();
22408
+ }
22409
+ }
22410
+ }
22411
+
22412
+ // node_modules/p-limit/index.js
22413
+ function pLimit(concurrency) {
22414
+ validateConcurrency(concurrency);
22415
+ const queue = new Queue;
22416
+ let activeCount = 0;
22417
+ const resumeNext = () => {
22418
+ if (activeCount < concurrency && queue.size > 0) {
22419
+ activeCount++;
22420
+ queue.dequeue()();
22421
+ }
22422
+ };
22423
+ const next = () => {
22424
+ activeCount--;
22425
+ resumeNext();
22426
+ };
22427
+ const run = async (function_, resolve2, arguments_) => {
22428
+ const result = (async () => function_(...arguments_))();
22429
+ resolve2(result);
22430
+ try {
22431
+ await result;
22432
+ } catch {}
22433
+ next();
22434
+ };
22435
+ const enqueue = (function_, resolve2, arguments_) => {
22436
+ new Promise((internalResolve) => {
22437
+ queue.enqueue(internalResolve);
22438
+ }).then(run.bind(undefined, function_, resolve2, arguments_));
22439
+ if (activeCount < concurrency) {
22440
+ resumeNext();
22441
+ }
22442
+ };
22443
+ const generator = (function_, ...arguments_) => new Promise((resolve2) => {
22444
+ enqueue(function_, resolve2, arguments_);
22445
+ });
22446
+ Object.defineProperties(generator, {
22447
+ activeCount: {
22448
+ get: () => activeCount
22449
+ },
22450
+ pendingCount: {
22451
+ get: () => queue.size
22452
+ },
22453
+ clearQueue: {
22454
+ value() {
22455
+ queue.clear();
22456
+ }
22457
+ },
22458
+ concurrency: {
22459
+ get: () => concurrency,
22460
+ set(newConcurrency) {
22461
+ validateConcurrency(newConcurrency);
22462
+ concurrency = newConcurrency;
22463
+ queueMicrotask(() => {
22464
+ while (activeCount < concurrency && queue.size > 0) {
22465
+ resumeNext();
22466
+ }
22467
+ });
22468
+ }
22469
+ },
22470
+ map: {
22471
+ async value(iterable, function_) {
22472
+ const promises2 = Array.from(iterable, (value, index) => this(function_, value, index));
22473
+ return Promise.all(promises2);
22474
+ }
22475
+ }
22476
+ });
22477
+ return generator;
22478
+ }
22479
+ function validateConcurrency(concurrency) {
22480
+ if (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {
22481
+ throw new TypeError("Expected `concurrency` to be a number from 1 and up");
22482
+ }
22483
+ }
22484
+
22485
+ // src/shared/concurrent-file-ops.ts
22486
+ var DEFAULT_CONCURRENCY = 50;
22487
+ async function mapWithLimit(items, fn, concurrency = DEFAULT_CONCURRENCY) {
22488
+ const limit = pLimit(concurrency);
22489
+ return Promise.all(items.map((item) => limit(() => fn(item))));
22490
+ }
22491
+
22345
22492
  // src/services/file-operations/ownership-checker.ts
22346
22493
  class OwnershipChecker {
22347
22494
  static async calculateChecksum(filePath) {
@@ -22392,7 +22539,7 @@ class OwnershipChecker {
22392
22539
  };
22393
22540
  }
22394
22541
  static async checkBatch(filePaths, metadata, claudeDir) {
22395
- const results = await Promise.all(filePaths.map((path2) => OwnershipChecker.checkOwnership(path2, metadata, claudeDir)));
22542
+ const results = await mapWithLimit(filePaths, (path2) => OwnershipChecker.checkOwnership(path2, metadata, claudeDir));
22396
22543
  return new Map(results.map((r2) => [r2.path, r2]));
22397
22544
  }
22398
22545
  }
@@ -23905,6 +24052,7 @@ init_logger();
23905
24052
 
23906
24053
  // src/domains/ui/prompts/kit-prompts.ts
23907
24054
  init_types2();
24055
+ var MIN_KITS_FOR_MULTISELECT = 2;
23908
24056
  async function selectKit(defaultKit, accessibleKits) {
23909
24057
  const kits = accessibleKits ?? Object.keys(AVAILABLE_KITS);
23910
24058
  const kit = await ie({
@@ -23921,6 +24069,24 @@ async function selectKit(defaultKit, accessibleKits) {
23921
24069
  }
23922
24070
  return kit;
23923
24071
  }
24072
+ async function selectKits(accessibleKits) {
24073
+ if (accessibleKits.length < MIN_KITS_FOR_MULTISELECT) {
24074
+ throw new Error(`selectKits requires at least ${MIN_KITS_FOR_MULTISELECT} accessible kits`);
24075
+ }
24076
+ const selected = await ae({
24077
+ message: "Select ClaudeKit(s) to install:",
24078
+ options: accessibleKits.map((key) => ({
24079
+ value: key,
24080
+ label: AVAILABLE_KITS[key].name,
24081
+ hint: AVAILABLE_KITS[key].description
24082
+ })),
24083
+ required: true
24084
+ });
24085
+ if (lD(selected)) {
24086
+ throw new Error("Kit selection cancelled");
24087
+ }
24088
+ return selected;
24089
+ }
23924
24090
  async function getDirectory(defaultDir = ".") {
23925
24091
  const dir = await te({
23926
24092
  message: "Enter target directory:",
@@ -24447,6 +24613,9 @@ class PromptsManager {
24447
24613
  async selectKit(defaultKit, accessibleKits) {
24448
24614
  return selectKit(defaultKit, accessibleKits);
24449
24615
  }
24616
+ async selectKits(accessibleKits) {
24617
+ return selectKits(accessibleKits);
24618
+ }
24450
24619
  async selectVersion(versions, defaultVersion) {
24451
24620
  return selectVersion(versions, defaultVersion);
24452
24621
  }
@@ -24550,6 +24719,7 @@ class PromptsManager {
24550
24719
 
24551
24720
  // src/commands/init/init-command.ts
24552
24721
  init_logger();
24722
+ init_types2();
24553
24723
 
24554
24724
  // src/commands/init/phases/conflict-handler.ts
24555
24725
  init_logger();
@@ -31338,7 +31508,7 @@ class Yallist {
31338
31508
  function insertAfter(self2, node, value) {
31339
31509
  const prev = node;
31340
31510
  const next = node ? node.next : self2.head;
31341
- const inserted = new Node(value, prev, next, self2);
31511
+ const inserted = new Node2(value, prev, next, self2);
31342
31512
  if (inserted.next === undefined) {
31343
31513
  self2.tail = inserted;
31344
31514
  }
@@ -31349,21 +31519,21 @@ function insertAfter(self2, node, value) {
31349
31519
  return inserted;
31350
31520
  }
31351
31521
  function push(self2, item) {
31352
- self2.tail = new Node(item, self2.tail, undefined, self2);
31522
+ self2.tail = new Node2(item, self2.tail, undefined, self2);
31353
31523
  if (!self2.head) {
31354
31524
  self2.head = self2.tail;
31355
31525
  }
31356
31526
  self2.length++;
31357
31527
  }
31358
31528
  function unshift(self2, item) {
31359
- self2.head = new Node(item, undefined, self2.head, self2);
31529
+ self2.head = new Node2(item, undefined, self2.head, self2);
31360
31530
  if (!self2.tail) {
31361
31531
  self2.tail = self2.head;
31362
31532
  }
31363
31533
  self2.length++;
31364
31534
  }
31365
31535
 
31366
- class Node {
31536
+ class Node2 {
31367
31537
  list;
31368
31538
  next;
31369
31539
  prev;
@@ -36547,146 +36717,6 @@ class ReleaseManifestLoader {
36547
36717
  init_environment();
36548
36718
  init_logger();
36549
36719
 
36550
- // node_modules/yocto-queue/index.js
36551
- class Node2 {
36552
- value;
36553
- next;
36554
- constructor(value) {
36555
- this.value = value;
36556
- }
36557
- }
36558
-
36559
- class Queue {
36560
- #head;
36561
- #tail;
36562
- #size;
36563
- constructor() {
36564
- this.clear();
36565
- }
36566
- enqueue(value) {
36567
- const node = new Node2(value);
36568
- if (this.#head) {
36569
- this.#tail.next = node;
36570
- this.#tail = node;
36571
- } else {
36572
- this.#head = node;
36573
- this.#tail = node;
36574
- }
36575
- this.#size++;
36576
- }
36577
- dequeue() {
36578
- const current = this.#head;
36579
- if (!current) {
36580
- return;
36581
- }
36582
- this.#head = this.#head.next;
36583
- this.#size--;
36584
- if (!this.#head) {
36585
- this.#tail = undefined;
36586
- }
36587
- return current.value;
36588
- }
36589
- peek() {
36590
- if (!this.#head) {
36591
- return;
36592
- }
36593
- return this.#head.value;
36594
- }
36595
- clear() {
36596
- this.#head = undefined;
36597
- this.#tail = undefined;
36598
- this.#size = 0;
36599
- }
36600
- get size() {
36601
- return this.#size;
36602
- }
36603
- *[Symbol.iterator]() {
36604
- let current = this.#head;
36605
- while (current) {
36606
- yield current.value;
36607
- current = current.next;
36608
- }
36609
- }
36610
- *drain() {
36611
- while (this.#head) {
36612
- yield this.dequeue();
36613
- }
36614
- }
36615
- }
36616
-
36617
- // node_modules/p-limit/index.js
36618
- function pLimit(concurrency) {
36619
- validateConcurrency(concurrency);
36620
- const queue = new Queue;
36621
- let activeCount = 0;
36622
- const resumeNext = () => {
36623
- if (activeCount < concurrency && queue.size > 0) {
36624
- activeCount++;
36625
- queue.dequeue()();
36626
- }
36627
- };
36628
- const next = () => {
36629
- activeCount--;
36630
- resumeNext();
36631
- };
36632
- const run = async (function_, resolve6, arguments_) => {
36633
- const result = (async () => function_(...arguments_))();
36634
- resolve6(result);
36635
- try {
36636
- await result;
36637
- } catch {}
36638
- next();
36639
- };
36640
- const enqueue = (function_, resolve6, arguments_) => {
36641
- new Promise((internalResolve) => {
36642
- queue.enqueue(internalResolve);
36643
- }).then(run.bind(undefined, function_, resolve6, arguments_));
36644
- if (activeCount < concurrency) {
36645
- resumeNext();
36646
- }
36647
- };
36648
- const generator = (function_, ...arguments_) => new Promise((resolve6) => {
36649
- enqueue(function_, resolve6, arguments_);
36650
- });
36651
- Object.defineProperties(generator, {
36652
- activeCount: {
36653
- get: () => activeCount
36654
- },
36655
- pendingCount: {
36656
- get: () => queue.size
36657
- },
36658
- clearQueue: {
36659
- value() {
36660
- queue.clear();
36661
- }
36662
- },
36663
- concurrency: {
36664
- get: () => concurrency,
36665
- set(newConcurrency) {
36666
- validateConcurrency(newConcurrency);
36667
- concurrency = newConcurrency;
36668
- queueMicrotask(() => {
36669
- while (activeCount < concurrency && queue.size > 0) {
36670
- resumeNext();
36671
- }
36672
- });
36673
- }
36674
- },
36675
- map: {
36676
- async value(iterable, function_) {
36677
- const promises3 = Array.from(iterable, (value, index) => this(function_, value, index));
36678
- return Promise.all(promises3);
36679
- }
36680
- }
36681
- });
36682
- return generator;
36683
- }
36684
- function validateConcurrency(concurrency) {
36685
- if (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {
36686
- throw new TypeError("Expected `concurrency` to be a number from 1 and up");
36687
- }
36688
- }
36689
-
36690
36720
  // src/services/file-operations/manifest/manifest-updater.ts
36691
36721
  import { join as join41 } from "node:path";
36692
36722
  init_logger();
@@ -37030,10 +37060,10 @@ class LegacyMigration {
37030
37060
  }
37031
37061
  }
37032
37062
  if (filesInManifest.length > 0) {
37033
- const checksumResults = await Promise.all(filesInManifest.map(async ({ file, relativePath, manifestChecksum }) => {
37063
+ const checksumResults = await mapWithLimit(filesInManifest, async ({ file, relativePath, manifestChecksum }) => {
37034
37064
  const actualChecksum = await OwnershipChecker.calculateChecksum(file);
37035
37065
  return { relativePath, actualChecksum, manifestChecksum };
37036
- }));
37066
+ });
37037
37067
  for (const { relativePath, actualChecksum, manifestChecksum } of checksumResults) {
37038
37068
  if (actualChecksum === manifestChecksum) {
37039
37069
  preview.ckPristine.push(relativePath);
@@ -37085,11 +37115,11 @@ User-created files (sample):`);
37085
37115
  ...preview.userCreated.map((p) => ({ relativePath: p, ownership: "user" }))
37086
37116
  ];
37087
37117
  if (filesToChecksum.length > 0) {
37088
- const checksumResults = await Promise.all(filesToChecksum.map(async ({ relativePath, ownership }) => {
37118
+ const checksumResults = await mapWithLimit(filesToChecksum, async ({ relativePath, ownership }) => {
37089
37119
  const fullPath = join43(claudeDir, relativePath);
37090
37120
  const checksum = await OwnershipChecker.calculateChecksum(fullPath);
37091
37121
  return { relativePath, checksum, ownership };
37092
- }));
37122
+ });
37093
37123
  for (const { relativePath, checksum, ownership } of checksumResults) {
37094
37124
  trackedFiles.push({
37095
37125
  path: relativePath,
@@ -39616,11 +39646,51 @@ async function handleSelection(ctx) {
39616
39646
  return { ...ctx, cancelled: true };
39617
39647
  }
39618
39648
  }
39619
- let kitType = ctx.options.kit || config.defaults?.kit;
39620
- if (kitType && accessibleKits && !accessibleKits.includes(kitType)) {
39621
- logger.error(`No access to ${AVAILABLE_KITS[kitType].name}`);
39622
- logger.info("Purchase at https://claudekit.cc");
39623
- return { ...ctx, cancelled: true };
39649
+ let kitType;
39650
+ let pendingKits;
39651
+ const kitOption = ctx.options.kit || config.defaults?.kit;
39652
+ if (kitOption) {
39653
+ const allKitTypes = Object.keys(AVAILABLE_KITS);
39654
+ if (kitOption === "all") {
39655
+ const kitsToInstall = accessibleKits ?? allKitTypes;
39656
+ if (kitsToInstall.length === 0) {
39657
+ logger.error("No kits accessible for installation");
39658
+ return { ...ctx, cancelled: true };
39659
+ }
39660
+ kitType = kitsToInstall[0];
39661
+ if (kitsToInstall.length > 1) {
39662
+ pendingKits = kitsToInstall.slice(1);
39663
+ }
39664
+ logger.info(`Installing all accessible kits: ${kitsToInstall.map((k2) => AVAILABLE_KITS[k2].name).join(", ")}`);
39665
+ } else if (kitOption.includes(",")) {
39666
+ const requestedKits = kitOption.split(",").map((k2) => k2.trim());
39667
+ const invalidKits = requestedKits.filter((k2) => !allKitTypes.includes(k2));
39668
+ if (invalidKits.length > 0) {
39669
+ logger.error(`Invalid kit(s): ${invalidKits.join(", ")}`);
39670
+ logger.info(`Valid kits: ${allKitTypes.join(", ")}`);
39671
+ return { ...ctx, cancelled: true };
39672
+ }
39673
+ if (accessibleKits) {
39674
+ const noAccessKits = requestedKits.filter((k2) => !accessibleKits.includes(k2));
39675
+ if (noAccessKits.length > 0) {
39676
+ logger.error(`No access to: ${noAccessKits.map((k2) => AVAILABLE_KITS[k2].name).join(", ")}`);
39677
+ logger.info("Purchase at https://claudekit.cc");
39678
+ return { ...ctx, cancelled: true };
39679
+ }
39680
+ }
39681
+ kitType = requestedKits[0];
39682
+ if (requestedKits.length > 1) {
39683
+ pendingKits = requestedKits.slice(1);
39684
+ }
39685
+ logger.info(`Installing kits: ${requestedKits.map((k2) => AVAILABLE_KITS[k2].name).join(", ")}`);
39686
+ } else {
39687
+ kitType = kitOption;
39688
+ if (accessibleKits && !accessibleKits.includes(kitType)) {
39689
+ logger.error(`No access to ${AVAILABLE_KITS[kitType].name}`);
39690
+ logger.info("Purchase at https://claudekit.cc");
39691
+ return { ...ctx, cancelled: true };
39692
+ }
39693
+ }
39624
39694
  }
39625
39695
  if (!kitType) {
39626
39696
  if (ctx.isNonInteractive) {
@@ -39632,6 +39702,16 @@ async function handleSelection(ctx) {
39632
39702
  } else if (accessibleKits?.length === 1) {
39633
39703
  kitType = accessibleKits[0];
39634
39704
  logger.info(`Using ${AVAILABLE_KITS[kitType].name} (only accessible kit)`);
39705
+ } else if (accessibleKits && accessibleKits.length > 1) {
39706
+ const selectedKits = await ctx.prompts.selectKits(accessibleKits);
39707
+ if (selectedKits.length === 0) {
39708
+ throw new Error("At least one kit must be selected");
39709
+ }
39710
+ kitType = selectedKits[0];
39711
+ if (selectedKits.length > 1) {
39712
+ pendingKits = selectedKits.slice(1);
39713
+ logger.success(`Selected ${selectedKits.length} kits: ${selectedKits.map((k2) => AVAILABLE_KITS[k2].name).join(", ")}`);
39714
+ }
39635
39715
  } else {
39636
39716
  kitType = await ctx.prompts.selectKit(undefined, accessibleKits);
39637
39717
  }
@@ -39781,7 +39861,9 @@ async function handleSelection(ctx) {
39781
39861
  kitType,
39782
39862
  resolvedDir,
39783
39863
  release,
39784
- selectedVersion
39864
+ selectedVersion,
39865
+ pendingKits,
39866
+ accessibleKits
39785
39867
  };
39786
39868
  }
39787
39869
  // src/commands/init/phases/sync-handler.ts
@@ -40605,6 +40687,50 @@ async function handleTransforms(ctx) {
40605
40687
  };
40606
40688
  }
40607
40689
  // src/commands/init/init-command.ts
40690
+ async function installAdditionalKit(baseCtx, kitType) {
40691
+ const kit = AVAILABLE_KITS[kitType];
40692
+ const github = new GitHubClient;
40693
+ logger.info(`
40694
+ Installing additional kit: ${kit.name}`);
40695
+ let release;
40696
+ if (baseCtx.selectedVersion && !baseCtx.selectedVersion.includes("latest")) {
40697
+ try {
40698
+ release = await github.getReleaseByTag(kit, baseCtx.selectedVersion);
40699
+ logger.success(`Found matching version: ${release.tag_name}`);
40700
+ } catch {
40701
+ logger.warning(`Version ${baseCtx.selectedVersion} not available for ${kit.name}, using latest`);
40702
+ release = await github.getLatestRelease(kit, baseCtx.options.beta);
40703
+ logger.success(`Found: ${release.tag_name}`);
40704
+ }
40705
+ } else {
40706
+ release = await github.getLatestRelease(kit, baseCtx.options.beta);
40707
+ logger.success(`Found: ${release.tag_name}`);
40708
+ }
40709
+ let ctx = {
40710
+ ...baseCtx,
40711
+ kit,
40712
+ kitType,
40713
+ release,
40714
+ selectedVersion: release.tag_name,
40715
+ tempDir: undefined,
40716
+ archivePath: undefined,
40717
+ extractDir: undefined
40718
+ };
40719
+ ctx = await handleDownload(ctx);
40720
+ if (ctx.cancelled)
40721
+ return ctx;
40722
+ ctx = await handleTransforms(ctx);
40723
+ if (ctx.cancelled)
40724
+ return ctx;
40725
+ ctx = await handleMigration(ctx);
40726
+ if (ctx.cancelled)
40727
+ return ctx;
40728
+ ctx = await handleMerge(ctx);
40729
+ if (ctx.cancelled)
40730
+ return ctx;
40731
+ ctx = await handlePostInstall(ctx);
40732
+ return ctx;
40733
+ }
40608
40734
  function createInitContext(rawOptions, prompts) {
40609
40735
  const placeholderOptions = {
40610
40736
  dir: ".",
@@ -40685,6 +40811,28 @@ async function initCommand(options) {
40685
40811
  if (ctx.cancelled)
40686
40812
  return;
40687
40813
  }
40814
+ if (!isSyncMode && ctx.pendingKits && ctx.pendingKits.length > 0 && ctx.kitType) {
40815
+ const installedKits = [ctx.kitType];
40816
+ const kitsToInstall = [...ctx.pendingKits];
40817
+ for (const pendingKit of kitsToInstall) {
40818
+ try {
40819
+ ctx = await installAdditionalKit(ctx, pendingKit);
40820
+ if (ctx.cancelled) {
40821
+ logger.warning(`Installation of ${AVAILABLE_KITS[pendingKit].name} was cancelled`);
40822
+ break;
40823
+ }
40824
+ installedKits.push(pendingKit);
40825
+ } catch (error) {
40826
+ logger.error(`Failed to install ${AVAILABLE_KITS[pendingKit].name}: ${error instanceof Error ? error.message : "Unknown error"}`);
40827
+ if (installedKits.length > 1) {
40828
+ logger.info(`Successfully installed: ${installedKits.map((k2) => AVAILABLE_KITS[k2].name).join(", ")}`);
40829
+ }
40830
+ throw error;
40831
+ }
40832
+ }
40833
+ logger.success(`
40834
+ Installed ${installedKits.length} kits: ${installedKits.map((k2) => AVAILABLE_KITS[k2].name).join(", ")}`);
40835
+ }
40688
40836
  prompts.outro(`Project initialized successfully at ${ctx.resolvedDir}`);
40689
40837
  const protectedNote = ctx.customClaudeFiles.length > 0 ? `Your project has been initialized with the latest version.
40690
40838
  Protected files (.env, .claude custom files, etc.) were not modified.` : `Your project has been initialized with the latest version.
@@ -41766,7 +41914,7 @@ var import_picocolors24 = __toESM(require_picocolors(), 1);
41766
41914
  // package.json
41767
41915
  var package_default = {
41768
41916
  name: "claudekit-cli",
41769
- version: "3.18.0",
41917
+ version: "3.20.0",
41770
41918
  description: "CLI tool for bootstrapping and updating ClaudeKit projects",
41771
41919
  type: "module",
41772
41920
  repository: {
@@ -42136,13 +42284,13 @@ ${import_picocolors25.default.bold(import_picocolors25.default.cyan(result.kitCo
42136
42284
  // src/cli/command-registry.ts
42137
42285
  init_logger();
42138
42286
  function registerCommands(cli) {
42139
- cli.command("new", "Bootstrap a new ClaudeKit project (with interactive version selection)").option("--dir <dir>", "Target directory (default: .)").option("--kit <kit>", "Kit to use (engineer, marketing)").option("-r, --release <version>", "Skip version selection, use specific version (e.g., latest, v1.0.0)").option("--force", "Overwrite existing files without confirmation").option("--exclude <pattern>", "Exclude files matching glob pattern (can be used multiple times)").option("--opencode", "Install OpenCode CLI package (non-interactive mode)").option("--gemini", "Install Google Gemini CLI package (non-interactive mode)").option("--install-skills", "Install skills dependencies (non-interactive mode)").option("--with-sudo", "Include system packages requiring sudo (Linux: ffmpeg, imagemagick)").option("--prefix", "Add /ck: prefix to all slash commands by moving them to commands/ck/ subdirectory").option("--beta", "Show beta versions in selection prompt").option("--refresh", "Bypass release cache to fetch latest versions from GitHub").option("--docs-dir <name>", "Custom docs folder name (default: docs)").option("--plans-dir <name>", "Custom plans folder name (default: plans)").option("-y, --yes", "Non-interactive mode with sensible defaults (skip all prompts)").option("--use-git", "Use git clone instead of GitHub API (uses SSH/HTTPS credentials)").action(async (options) => {
42287
+ cli.command("new", "Bootstrap a new ClaudeKit project (with interactive version selection)").option("--dir <dir>", "Target directory (default: .)").option("--kit <kit>", "Kit to use: engineer, marketing, all, or comma-separated").option("-r, --release <version>", "Skip version selection, use specific version (e.g., latest, v1.0.0)").option("--force", "Overwrite existing files without confirmation").option("--exclude <pattern>", "Exclude files matching glob pattern (can be used multiple times)").option("--opencode", "Install OpenCode CLI package (non-interactive mode)").option("--gemini", "Install Google Gemini CLI package (non-interactive mode)").option("--install-skills", "Install skills dependencies (non-interactive mode)").option("--with-sudo", "Include system packages requiring sudo (Linux: ffmpeg, imagemagick)").option("--prefix", "Add /ck: prefix to all slash commands by moving them to commands/ck/ subdirectory").option("--beta", "Show beta versions in selection prompt").option("--refresh", "Bypass release cache to fetch latest versions from GitHub").option("--docs-dir <name>", "Custom docs folder name (default: docs)").option("--plans-dir <name>", "Custom plans folder name (default: plans)").option("-y, --yes", "Non-interactive mode with sensible defaults (skip all prompts)").option("--use-git", "Use git clone instead of GitHub API (uses SSH/HTTPS credentials)").action(async (options) => {
42140
42288
  if (options.exclude && !Array.isArray(options.exclude)) {
42141
42289
  options.exclude = [options.exclude];
42142
42290
  }
42143
42291
  await newCommand(options);
42144
42292
  });
42145
- cli.command("init", "Initialize or update ClaudeKit project (with interactive version selection)").option("--dir <dir>", "Target directory (default: .)").option("--kit <kit>", "Kit to use (engineer, marketing)").option("-r, --release <version>", "Skip version selection, use specific version (e.g., latest, v1.0.0)").option("--exclude <pattern>", "Exclude files matching glob pattern (can be used multiple times)").option("--only <pattern>", "Include only files matching glob pattern (can be used multiple times)").option("-g, --global", "Use platform-specific user configuration directory").option("--fresh", "Completely remove .claude directory before downloading (requires confirmation)").option("--install-skills", "Install skills dependencies (non-interactive mode)").option("--with-sudo", "Include system packages requiring sudo (Linux: ffmpeg, imagemagick)").option("--prefix", "Add /ck: prefix to all slash commands by moving them to commands/ck/ subdirectory").option("--beta", "Show beta versions in selection prompt").option("--refresh", "Bypass release cache to fetch latest versions from GitHub").option("--dry-run", "Preview changes without applying them (requires --prefix)").option("--force-overwrite", "Override ownership protections and delete user-modified files (requires --prefix)").option("--force-overwrite-settings", "Fully replace settings.json instead of selective merge (destroys user customizations)").option("--skip-setup", "Skip interactive configuration wizard").option("--docs-dir <name>", "Custom docs folder name (default: docs)").option("--plans-dir <name>", "Custom plans folder name (default: plans)").option("-y, --yes", "Non-interactive mode with sensible defaults (skip all prompts)").option("--sync", "Sync config files from upstream with interactive hunk-by-hunk merge").option("--use-git", "Use git clone instead of GitHub API (uses SSH/HTTPS credentials)").action(async (options) => {
42293
+ cli.command("init", "Initialize or update ClaudeKit project (with interactive version selection)").option("--dir <dir>", "Target directory (default: .)").option("--kit <kit>", "Kit to use: engineer, marketing, all, or comma-separated").option("-r, --release <version>", "Skip version selection, use specific version (e.g., latest, v1.0.0)").option("--exclude <pattern>", "Exclude files matching glob pattern (can be used multiple times)").option("--only <pattern>", "Include only files matching glob pattern (can be used multiple times)").option("-g, --global", "Use platform-specific user configuration directory").option("--fresh", "Completely remove .claude directory before downloading (requires confirmation)").option("--install-skills", "Install skills dependencies (non-interactive mode)").option("--with-sudo", "Include system packages requiring sudo (Linux: ffmpeg, imagemagick)").option("--prefix", "Add /ck: prefix to all slash commands by moving them to commands/ck/ subdirectory").option("--beta", "Show beta versions in selection prompt").option("--refresh", "Bypass release cache to fetch latest versions from GitHub").option("--dry-run", "Preview changes without applying them (requires --prefix)").option("--force-overwrite", "Override ownership protections and delete user-modified files (requires --prefix)").option("--force-overwrite-settings", "Fully replace settings.json instead of selective merge (destroys user customizations)").option("--skip-setup", "Skip interactive configuration wizard").option("--docs-dir <name>", "Custom docs folder name (default: docs)").option("--plans-dir <name>", "Custom plans folder name (default: plans)").option("-y, --yes", "Non-interactive mode with sensible defaults (skip all prompts)").option("--sync", "Sync config files from upstream with interactive hunk-by-hunk merge").option("--use-git", "Use git clone instead of GitHub API (uses SSH/HTTPS credentials)").action(async (options) => {
42146
42294
  if (options.exclude && !Array.isArray(options.exclude)) {
42147
42295
  options.exclude = [options.exclude];
42148
42296
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudekit-cli",
3
- "version": "3.18.0",
3
+ "version": "3.20.0",
4
4
  "description": "CLI tool for bootstrapping and updating ClaudeKit projects",
5
5
  "type": "module",
6
6
  "repository": {