claudekit-cli 3.3.1 → 3.4.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 +96 -8
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -13078,7 +13078,7 @@ var cac = (name = "") => new CAC(name);
|
|
|
13078
13078
|
// package.json
|
|
13079
13079
|
var package_default = {
|
|
13080
13080
|
name: "claudekit-cli",
|
|
13081
|
-
version: "3.
|
|
13081
|
+
version: "3.4.0",
|
|
13082
13082
|
description: "CLI tool for bootstrapping and updating ClaudeKit projects",
|
|
13083
13083
|
type: "module",
|
|
13084
13084
|
repository: {
|
|
@@ -13219,11 +13219,14 @@ var HealingSummarySchema = exports_external.object({
|
|
|
13219
13219
|
fixes: exports_external.array(FixAttemptSchema)
|
|
13220
13220
|
});
|
|
13221
13221
|
// src/lib/health-checks/check-runner.ts
|
|
13222
|
+
init_logger();
|
|
13223
|
+
|
|
13222
13224
|
class CheckRunner {
|
|
13223
13225
|
checkers = [];
|
|
13224
13226
|
options;
|
|
13225
13227
|
constructor(options = {}) {
|
|
13226
13228
|
this.options = options;
|
|
13229
|
+
logger.verbose("CheckRunner initialized", { options });
|
|
13227
13230
|
}
|
|
13228
13231
|
registerChecker(checker) {
|
|
13229
13232
|
this.checkers.push(checker);
|
|
@@ -13234,8 +13237,13 @@ class CheckRunner {
|
|
|
13234
13237
|
}
|
|
13235
13238
|
}
|
|
13236
13239
|
async run() {
|
|
13240
|
+
logger.verbose("Starting health check run");
|
|
13237
13241
|
const filteredCheckers = this.filterCheckersByGroup();
|
|
13242
|
+
logger.verbose(`Running ${filteredCheckers.length} checker(s)`, {
|
|
13243
|
+
groups: filteredCheckers.map((c2) => c2.group)
|
|
13244
|
+
});
|
|
13238
13245
|
const allResults = await this.executeCheckersInParallel(filteredCheckers);
|
|
13246
|
+
logger.verbose("All checks completed, building summary");
|
|
13239
13247
|
return this.buildSummary(allResults);
|
|
13240
13248
|
}
|
|
13241
13249
|
filterCheckersByGroup() {
|
|
@@ -13246,7 +13254,14 @@ class CheckRunner {
|
|
|
13246
13254
|
return this.checkers.filter((checker) => allowedGroups.has(checker.group));
|
|
13247
13255
|
}
|
|
13248
13256
|
async executeCheckersInParallel(checkers) {
|
|
13249
|
-
const resultsArrays = await Promise.all(checkers.map((checker) =>
|
|
13257
|
+
const resultsArrays = await Promise.all(checkers.map(async (checker) => {
|
|
13258
|
+
logger.verbose(`Starting checker: ${checker.group}`);
|
|
13259
|
+
const results = await checker.run();
|
|
13260
|
+
logger.verbose(`Completed checker: ${checker.group}`, {
|
|
13261
|
+
checkCount: results.length
|
|
13262
|
+
});
|
|
13263
|
+
return results;
|
|
13264
|
+
}));
|
|
13250
13265
|
return resultsArrays.flat();
|
|
13251
13266
|
}
|
|
13252
13267
|
buildSummary(checks) {
|
|
@@ -13374,9 +13389,12 @@ async function commandExists(command) {
|
|
|
13374
13389
|
}
|
|
13375
13390
|
try {
|
|
13376
13391
|
const whichCmd = process.platform === "win32" ? "where" : "which";
|
|
13392
|
+
logger.verbose(`Checking if command exists: ${command}`);
|
|
13377
13393
|
await execAsync(`${whichCmd} ${command}`);
|
|
13394
|
+
logger.verbose(`Command found: ${command}`);
|
|
13378
13395
|
return true;
|
|
13379
13396
|
} catch {
|
|
13397
|
+
logger.verbose(`Command not found: ${command}`);
|
|
13380
13398
|
return false;
|
|
13381
13399
|
}
|
|
13382
13400
|
}
|
|
@@ -13388,10 +13406,14 @@ async function getCommandPath(command) {
|
|
|
13388
13406
|
}
|
|
13389
13407
|
try {
|
|
13390
13408
|
const whichCmd = process.platform === "win32" ? "where" : "which";
|
|
13409
|
+
logger.verbose(`Getting path for command: ${command}`);
|
|
13391
13410
|
const { stdout } = await execAsync(`${whichCmd} ${command}`);
|
|
13392
|
-
|
|
13411
|
+
const path = stdout.trim().split(`
|
|
13393
13412
|
`)[0] || null;
|
|
13413
|
+
logger.verbose(`Command path resolved: ${command} -> ${path}`);
|
|
13414
|
+
return path;
|
|
13394
13415
|
} catch {
|
|
13416
|
+
logger.verbose(`Failed to get path for command: ${command}`);
|
|
13395
13417
|
return null;
|
|
13396
13418
|
}
|
|
13397
13419
|
}
|
|
@@ -13409,11 +13431,15 @@ async function getCommandVersion(command, versionFlag, versionRegex) {
|
|
|
13409
13431
|
return mockVersions[command] || null;
|
|
13410
13432
|
}
|
|
13411
13433
|
try {
|
|
13434
|
+
logger.verbose(`Getting version for: ${command} ${versionFlag}`);
|
|
13412
13435
|
const { stdout, stderr } = await execAsync(`${command} ${versionFlag}`);
|
|
13413
13436
|
const output = stdout || stderr;
|
|
13414
13437
|
const match = output.match(versionRegex);
|
|
13415
|
-
|
|
13438
|
+
const version = match?.[1] || null;
|
|
13439
|
+
logger.verbose(`Version detected: ${command} -> ${version}`);
|
|
13440
|
+
return version;
|
|
13416
13441
|
} catch (error) {
|
|
13442
|
+
logger.verbose(`Failed to get version for ${command}: ${error}`);
|
|
13417
13443
|
logger.debug(`Failed to get version for ${command}: ${error}`);
|
|
13418
13444
|
return null;
|
|
13419
13445
|
}
|
|
@@ -13432,9 +13458,11 @@ function compareVersions(current, required) {
|
|
|
13432
13458
|
return true;
|
|
13433
13459
|
}
|
|
13434
13460
|
async function checkDependency(config) {
|
|
13461
|
+
logger.verbose(`Checking dependency: ${config.name}`);
|
|
13435
13462
|
for (const command of config.commands) {
|
|
13436
13463
|
const exists = await commandExists(command);
|
|
13437
13464
|
if (exists) {
|
|
13465
|
+
logger.verbose(`Found ${config.name} via command: ${command}`);
|
|
13438
13466
|
const path = await getCommandPath(command);
|
|
13439
13467
|
const version = await getCommandVersion(command, config.versionFlag, config.versionRegex);
|
|
13440
13468
|
let meetsRequirements = true;
|
|
@@ -13465,8 +13493,13 @@ async function checkDependency(config) {
|
|
|
13465
13493
|
};
|
|
13466
13494
|
}
|
|
13467
13495
|
async function checkAllDependencies() {
|
|
13496
|
+
logger.verbose("Checking all dependencies in parallel");
|
|
13468
13497
|
const checks = Object.values(DEPENDENCIES).map((config) => checkDependency(config));
|
|
13469
|
-
|
|
13498
|
+
const results = await Promise.all(checks);
|
|
13499
|
+
logger.verbose("All dependency checks complete", {
|
|
13500
|
+
count: results.length
|
|
13501
|
+
});
|
|
13502
|
+
return results;
|
|
13470
13503
|
}
|
|
13471
13504
|
|
|
13472
13505
|
// src/utils/dependency-installer.ts
|
|
@@ -13700,18 +13733,27 @@ async function installDependency(dependency, method) {
|
|
|
13700
13733
|
}
|
|
13701
13734
|
|
|
13702
13735
|
// src/lib/health-checks/system-checker.ts
|
|
13736
|
+
init_logger();
|
|
13703
13737
|
var execAsync3 = promisify3(exec3);
|
|
13704
13738
|
|
|
13705
13739
|
class SystemChecker {
|
|
13706
13740
|
group = "system";
|
|
13707
13741
|
async run() {
|
|
13742
|
+
logger.verbose("SystemChecker: Starting dependency checks");
|
|
13708
13743
|
const deps = await checkAllDependencies();
|
|
13744
|
+
logger.verbose("SystemChecker: Dependency scan complete", {
|
|
13745
|
+
count: deps.length
|
|
13746
|
+
});
|
|
13709
13747
|
const results = [];
|
|
13710
13748
|
for (const dep of deps) {
|
|
13749
|
+
logger.verbose(`SystemChecker: Processing ${dep.name}`);
|
|
13711
13750
|
results.push(await this.mapDependencyToCheck(dep));
|
|
13712
13751
|
}
|
|
13752
|
+
logger.verbose("SystemChecker: Checking git");
|
|
13713
13753
|
results.push(await this.checkGit());
|
|
13754
|
+
logger.verbose("SystemChecker: Checking GitHub CLI");
|
|
13714
13755
|
results.push(await this.checkGitHubCli());
|
|
13756
|
+
logger.verbose("SystemChecker: All system checks complete");
|
|
13715
13757
|
return results;
|
|
13716
13758
|
}
|
|
13717
13759
|
async mapDependencyToCheck(dep) {
|
|
@@ -14064,6 +14106,9 @@ async function getClaudeKitSetup(projectDir = process.cwd()) {
|
|
|
14064
14106
|
return setup;
|
|
14065
14107
|
}
|
|
14066
14108
|
|
|
14109
|
+
// src/lib/health-checks/claudekit-checker.ts
|
|
14110
|
+
init_logger();
|
|
14111
|
+
|
|
14067
14112
|
// src/lib/package-manager-detector.ts
|
|
14068
14113
|
init_logger();
|
|
14069
14114
|
import { exec as exec4 } from "node:child_process";
|
|
@@ -14079,20 +14124,27 @@ class PackageManagerDetector {
|
|
|
14079
14124
|
static CACHE_TTL = 30 * 24 * 60 * 60 * 1000;
|
|
14080
14125
|
static QUERY_TIMEOUT = 5000;
|
|
14081
14126
|
static async detect() {
|
|
14127
|
+
logger.verbose("PackageManagerDetector: Starting detection");
|
|
14082
14128
|
const envPm = PackageManagerDetector.detectFromEnv();
|
|
14083
14129
|
if (envPm !== "unknown") {
|
|
14130
|
+
logger.verbose(`PackageManagerDetector: Detected from env: ${envPm}`);
|
|
14084
14131
|
return envPm;
|
|
14085
14132
|
}
|
|
14133
|
+
logger.verbose("PackageManagerDetector: Checking cache");
|
|
14086
14134
|
const cachedPm = await PackageManagerDetector.readCachedPm();
|
|
14087
14135
|
if (cachedPm) {
|
|
14136
|
+
logger.verbose(`PackageManagerDetector: Using cached: ${cachedPm}`);
|
|
14088
14137
|
logger.debug(`Using cached package manager: ${cachedPm}`);
|
|
14089
14138
|
return cachedPm;
|
|
14090
14139
|
}
|
|
14140
|
+
logger.verbose("PackageManagerDetector: Querying package managers");
|
|
14091
14141
|
const owningPm = await PackageManagerDetector.findOwningPm();
|
|
14092
14142
|
if (owningPm) {
|
|
14143
|
+
logger.verbose(`PackageManagerDetector: Found owning PM: ${owningPm}`);
|
|
14093
14144
|
await PackageManagerDetector.saveCachedPm(owningPm);
|
|
14094
14145
|
return owningPm;
|
|
14095
14146
|
}
|
|
14147
|
+
logger.verbose("PackageManagerDetector: Defaulting to npm");
|
|
14096
14148
|
logger.warning("Could not detect package manager that installed claudekit-cli, defaulting to npm");
|
|
14097
14149
|
return "npm";
|
|
14098
14150
|
}
|
|
@@ -14209,19 +14261,26 @@ class PackageManagerDetector {
|
|
|
14209
14261
|
checkFn: (stdout) => stdout.includes("claudekit-cli")
|
|
14210
14262
|
}
|
|
14211
14263
|
];
|
|
14264
|
+
logger.verbose("PackageManagerDetector: Querying all PMs in parallel");
|
|
14212
14265
|
logger.debug("Querying package managers for claudekit-cli ownership...");
|
|
14213
14266
|
const results = await Promise.allSettled(queries.map(async ({ pm, cmd, checkFn }) => {
|
|
14214
14267
|
try {
|
|
14268
|
+
logger.verbose(`PackageManagerDetector: Querying ${pm}`);
|
|
14215
14269
|
const { stdout } = await execAsync4(cmd, {
|
|
14216
14270
|
timeout: PackageManagerDetector.QUERY_TIMEOUT
|
|
14217
14271
|
});
|
|
14218
14272
|
if (checkFn(stdout)) {
|
|
14273
|
+
logger.verbose(`PackageManagerDetector: Found via ${pm}`);
|
|
14219
14274
|
logger.debug(`Found claudekit-cli installed via ${pm}`);
|
|
14220
14275
|
return pm;
|
|
14221
14276
|
}
|
|
14222
|
-
|
|
14277
|
+
logger.verbose(`PackageManagerDetector: Not found via ${pm}`);
|
|
14278
|
+
} catch {
|
|
14279
|
+
logger.verbose(`PackageManagerDetector: ${pm} query failed or not available`);
|
|
14280
|
+
}
|
|
14223
14281
|
return null;
|
|
14224
14282
|
}));
|
|
14283
|
+
logger.verbose("PackageManagerDetector: All PM queries complete");
|
|
14225
14284
|
for (const result of results) {
|
|
14226
14285
|
if (result.status === "fulfilled" && result.value) {
|
|
14227
14286
|
return result.value;
|
|
@@ -14304,9 +14363,13 @@ class PackageManagerDetector {
|
|
|
14304
14363
|
return null;
|
|
14305
14364
|
const command = PackageManagerDetector.getVersionCommand(pm);
|
|
14306
14365
|
try {
|
|
14366
|
+
logger.verbose(`PackageManagerDetector: Getting version for ${pm}`);
|
|
14307
14367
|
const { stdout } = await execAsync4(command, { timeout: 3000 });
|
|
14308
|
-
|
|
14368
|
+
const version = stdout.trim();
|
|
14369
|
+
logger.verbose(`PackageManagerDetector: ${pm} version: ${version}`);
|
|
14370
|
+
return version;
|
|
14309
14371
|
} catch {
|
|
14372
|
+
logger.verbose(`PackageManagerDetector: Failed to get ${pm} version`);
|
|
14310
14373
|
return null;
|
|
14311
14374
|
}
|
|
14312
14375
|
}
|
|
@@ -14332,15 +14395,27 @@ class ClaudekitChecker {
|
|
|
14332
14395
|
this.projectDir = projectDir;
|
|
14333
14396
|
}
|
|
14334
14397
|
async run() {
|
|
14398
|
+
logger.verbose("ClaudekitChecker: Scanning ClaudeKit setup", {
|
|
14399
|
+
projectDir: this.projectDir
|
|
14400
|
+
});
|
|
14335
14401
|
const setup = await getClaudeKitSetup(this.projectDir);
|
|
14402
|
+
logger.verbose("ClaudekitChecker: Setup scan complete");
|
|
14336
14403
|
const results = [];
|
|
14404
|
+
logger.verbose("ClaudekitChecker: Checking CLI install method");
|
|
14337
14405
|
results.push(await this.checkCliInstallMethod());
|
|
14406
|
+
logger.verbose("ClaudekitChecker: Checking global install");
|
|
14338
14407
|
results.push(this.checkGlobalInstall(setup));
|
|
14408
|
+
logger.verbose("ClaudekitChecker: Checking project install");
|
|
14339
14409
|
results.push(this.checkProjectInstall(setup));
|
|
14410
|
+
logger.verbose("ClaudekitChecker: Checking CLAUDE.md files");
|
|
14340
14411
|
results.push(...this.checkClaudeMd(setup));
|
|
14412
|
+
logger.verbose("ClaudekitChecker: Checking active plan");
|
|
14341
14413
|
results.push(this.checkActivePlan());
|
|
14414
|
+
logger.verbose("ClaudekitChecker: Checking skills scripts");
|
|
14342
14415
|
results.push(...this.checkSkillsScripts(setup));
|
|
14416
|
+
logger.verbose("ClaudekitChecker: Checking component counts");
|
|
14343
14417
|
results.push(this.checkComponentCounts(setup));
|
|
14418
|
+
logger.verbose("ClaudekitChecker: All checks complete");
|
|
14344
14419
|
return results;
|
|
14345
14420
|
}
|
|
14346
14421
|
async checkCliInstallMethod() {
|
|
@@ -14555,6 +14630,7 @@ class ClaudekitChecker {
|
|
|
14555
14630
|
}
|
|
14556
14631
|
// src/lib/health-checks/auth-checker.ts
|
|
14557
14632
|
init_types2();
|
|
14633
|
+
init_logger();
|
|
14558
14634
|
import { execSync as execSync2 } from "node:child_process";
|
|
14559
14635
|
|
|
14560
14636
|
// src/lib/auth.ts
|
|
@@ -15276,21 +15352,28 @@ class AuthChecker {
|
|
|
15276
15352
|
this.kits = kits;
|
|
15277
15353
|
}
|
|
15278
15354
|
async run() {
|
|
15355
|
+
logger.verbose("AuthChecker: Starting authentication checks");
|
|
15279
15356
|
const results = [];
|
|
15357
|
+
logger.verbose("AuthChecker: Checking GitHub CLI auth status");
|
|
15280
15358
|
results.push(await this.checkGhAuth());
|
|
15359
|
+
logger.verbose("AuthChecker: Checking GitHub token");
|
|
15281
15360
|
results.push(await this.checkGhToken());
|
|
15282
15361
|
for (const kit of this.kits) {
|
|
15362
|
+
logger.verbose(`AuthChecker: Checking repo access for kit: ${kit}`);
|
|
15283
15363
|
results.push(await this.checkRepoAccess(kit));
|
|
15284
15364
|
}
|
|
15365
|
+
logger.verbose("AuthChecker: All auth checks complete");
|
|
15285
15366
|
return results;
|
|
15286
15367
|
}
|
|
15287
15368
|
async checkGhAuth() {
|
|
15288
15369
|
if (false) {}
|
|
15289
15370
|
try {
|
|
15371
|
+
logger.verbose("AuthChecker: Running 'gh auth status' command");
|
|
15290
15372
|
execSync2("gh auth status", {
|
|
15291
15373
|
stdio: ["pipe", "pipe", "pipe"],
|
|
15292
15374
|
timeout: 5000
|
|
15293
15375
|
});
|
|
15376
|
+
logger.verbose("AuthChecker: gh auth status succeeded");
|
|
15294
15377
|
return {
|
|
15295
15378
|
id: "gh-auth-status",
|
|
15296
15379
|
name: "GitHub CLI Auth",
|
|
@@ -15314,7 +15397,9 @@ class AuthChecker {
|
|
|
15314
15397
|
}
|
|
15315
15398
|
async checkGhToken() {
|
|
15316
15399
|
try {
|
|
15400
|
+
logger.verbose("AuthChecker: Getting GitHub token via AuthManager");
|
|
15317
15401
|
const { token } = await AuthManager.getToken();
|
|
15402
|
+
logger.verbose("AuthChecker: Token retrieved successfully");
|
|
15318
15403
|
const maskedToken = `${token.substring(0, 8)}...`;
|
|
15319
15404
|
return {
|
|
15320
15405
|
id: "gh-token",
|
|
@@ -15342,6 +15427,7 @@ class AuthChecker {
|
|
|
15342
15427
|
async checkRepoAccess(kit) {
|
|
15343
15428
|
const kitConfig = AVAILABLE_KITS[kit];
|
|
15344
15429
|
if (isCIEnvironment2) {
|
|
15430
|
+
logger.verbose(`AuthChecker: Skipping repo access check for ${kit} in CI`);
|
|
15345
15431
|
return {
|
|
15346
15432
|
id: `repo-access-${kit}`,
|
|
15347
15433
|
name: `Repository Access (${kit})`,
|
|
@@ -15352,8 +15438,10 @@ class AuthChecker {
|
|
|
15352
15438
|
};
|
|
15353
15439
|
}
|
|
15354
15440
|
try {
|
|
15441
|
+
logger.verbose(`AuthChecker: Checking access to ${kitConfig.owner}/${kitConfig.repo}`);
|
|
15355
15442
|
const client = new GitHubClient;
|
|
15356
15443
|
const hasAccess = await client.checkAccess(kitConfig);
|
|
15444
|
+
logger.verbose(`AuthChecker: Repo access check complete for ${kit}`, { hasAccess });
|
|
15357
15445
|
if (hasAccess) {
|
|
15358
15446
|
return {
|
|
15359
15447
|
id: `repo-access-${kit}`,
|
|
@@ -32171,7 +32259,7 @@ import { promisify as promisify6 } from "node:util";
|
|
|
32171
32259
|
// package.json
|
|
32172
32260
|
var package_default2 = {
|
|
32173
32261
|
name: "claudekit-cli",
|
|
32174
|
-
version: "3.
|
|
32262
|
+
version: "3.4.0",
|
|
32175
32263
|
description: "CLI tool for bootstrapping and updating ClaudeKit projects",
|
|
32176
32264
|
type: "module",
|
|
32177
32265
|
repository: {
|