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.
- package/dist/index.js +306 -158
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
39620
|
-
|
|
39621
|
-
|
|
39622
|
-
|
|
39623
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
}
|