claudekit-cli 3.41.4-dev.16 → 3.41.4-dev.17
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
CHANGED
|
@@ -56717,7 +56717,7 @@ function trackPhaseUnchecked(planDir, phaseId, source) {
|
|
|
56717
56717
|
}
|
|
56718
56718
|
|
|
56719
56719
|
// src/domains/plan-parser/plan-types.ts
|
|
56720
|
-
var PhaseStatusSchema, PlanBoardStatusSchema, PlanScopeSchema, PlanPhaseSchema, ParseOptionsSchema, ValidationIssueSchema, ValidationResultSchema2, PhaseInputSchema, PlanSourceSchema, CreatePlanOptionsSchema, PlanSummarySchema, TimelinePhaseSchema, TimelineDataSchema, HeatmapCellSchema, HeatmapDataSchema, PlansRegistryEntrySchema, PlansRegistryStatsSchema, PlansRegistrySchema;
|
|
56720
|
+
var PhaseStatusSchema, PlanBoardStatusSchema, PlanScopeSchema, PlanPhaseSchema, ParseOptionsSchema, ValidationIssueSchema, ValidationResultSchema2, PhaseInputSchema, PlanSourceSchema, CreatePlanOptionsSchema, PlanSummarySchema, ProjectPlanListItemSchema, ProjectPlansEntrySchema, MultiProjectPlansResponseSchema, TimelinePhaseSchema, TimelineDataSchema, HeatmapCellSchema, HeatmapDataSchema, PlansRegistryEntrySchema, PlansRegistryStatsSchema, PlansRegistrySchema;
|
|
56721
56721
|
var init_plan_types = __esm(() => {
|
|
56722
56722
|
init_zod();
|
|
56723
56723
|
PhaseStatusSchema = exports_external.enum(["completed", "in-progress", "pending"]);
|
|
@@ -56791,6 +56791,24 @@ var init_plan_types = __esm(() => {
|
|
|
56791
56791
|
progressPct: exports_external.number().int().min(0).max(100),
|
|
56792
56792
|
phases: exports_external.array(PlanPhaseSchema)
|
|
56793
56793
|
});
|
|
56794
|
+
ProjectPlanListItemSchema = exports_external.object({
|
|
56795
|
+
file: exports_external.string(),
|
|
56796
|
+
name: exports_external.string(),
|
|
56797
|
+
slug: exports_external.string(),
|
|
56798
|
+
summary: PlanSummarySchema
|
|
56799
|
+
});
|
|
56800
|
+
ProjectPlansEntrySchema = exports_external.object({
|
|
56801
|
+
id: exports_external.string(),
|
|
56802
|
+
name: exports_external.string(),
|
|
56803
|
+
path: exports_external.string(),
|
|
56804
|
+
plansDir: exports_external.string(),
|
|
56805
|
+
error: exports_external.string().optional(),
|
|
56806
|
+
plans: exports_external.array(ProjectPlanListItemSchema)
|
|
56807
|
+
});
|
|
56808
|
+
MultiProjectPlansResponseSchema = exports_external.object({
|
|
56809
|
+
projects: exports_external.array(ProjectPlansEntrySchema),
|
|
56810
|
+
totalPlans: exports_external.number().int().min(0)
|
|
56811
|
+
});
|
|
56794
56812
|
TimelinePhaseSchema = exports_external.object({
|
|
56795
56813
|
phaseId: exports_external.string(),
|
|
56796
56814
|
name: exports_external.string(),
|
|
@@ -57140,8 +57158,154 @@ var init_action_signal = __esm(() => {
|
|
|
57140
57158
|
cleanupTimers = new Map;
|
|
57141
57159
|
});
|
|
57142
57160
|
|
|
57161
|
+
// node_modules/yocto-queue/index.js
|
|
57162
|
+
class Node {
|
|
57163
|
+
value;
|
|
57164
|
+
next;
|
|
57165
|
+
constructor(value) {
|
|
57166
|
+
this.value = value;
|
|
57167
|
+
}
|
|
57168
|
+
}
|
|
57169
|
+
var Queue;
|
|
57170
|
+
var init_yocto_queue = __esm(() => {
|
|
57171
|
+
Queue = class Queue {
|
|
57172
|
+
#head;
|
|
57173
|
+
#tail;
|
|
57174
|
+
#size;
|
|
57175
|
+
constructor() {
|
|
57176
|
+
this.clear();
|
|
57177
|
+
}
|
|
57178
|
+
enqueue(value) {
|
|
57179
|
+
const node = new Node(value);
|
|
57180
|
+
if (this.#head) {
|
|
57181
|
+
this.#tail.next = node;
|
|
57182
|
+
this.#tail = node;
|
|
57183
|
+
} else {
|
|
57184
|
+
this.#head = node;
|
|
57185
|
+
this.#tail = node;
|
|
57186
|
+
}
|
|
57187
|
+
this.#size++;
|
|
57188
|
+
}
|
|
57189
|
+
dequeue() {
|
|
57190
|
+
const current = this.#head;
|
|
57191
|
+
if (!current) {
|
|
57192
|
+
return;
|
|
57193
|
+
}
|
|
57194
|
+
this.#head = this.#head.next;
|
|
57195
|
+
this.#size--;
|
|
57196
|
+
if (!this.#head) {
|
|
57197
|
+
this.#tail = undefined;
|
|
57198
|
+
}
|
|
57199
|
+
return current.value;
|
|
57200
|
+
}
|
|
57201
|
+
peek() {
|
|
57202
|
+
if (!this.#head) {
|
|
57203
|
+
return;
|
|
57204
|
+
}
|
|
57205
|
+
return this.#head.value;
|
|
57206
|
+
}
|
|
57207
|
+
clear() {
|
|
57208
|
+
this.#head = undefined;
|
|
57209
|
+
this.#tail = undefined;
|
|
57210
|
+
this.#size = 0;
|
|
57211
|
+
}
|
|
57212
|
+
get size() {
|
|
57213
|
+
return this.#size;
|
|
57214
|
+
}
|
|
57215
|
+
*[Symbol.iterator]() {
|
|
57216
|
+
let current = this.#head;
|
|
57217
|
+
while (current) {
|
|
57218
|
+
yield current.value;
|
|
57219
|
+
current = current.next;
|
|
57220
|
+
}
|
|
57221
|
+
}
|
|
57222
|
+
*drain() {
|
|
57223
|
+
while (this.#head) {
|
|
57224
|
+
yield this.dequeue();
|
|
57225
|
+
}
|
|
57226
|
+
}
|
|
57227
|
+
};
|
|
57228
|
+
});
|
|
57229
|
+
|
|
57230
|
+
// node_modules/p-limit/index.js
|
|
57231
|
+
function pLimit(concurrency) {
|
|
57232
|
+
validateConcurrency(concurrency);
|
|
57233
|
+
const queue = new Queue;
|
|
57234
|
+
let activeCount = 0;
|
|
57235
|
+
const resumeNext = () => {
|
|
57236
|
+
if (activeCount < concurrency && queue.size > 0) {
|
|
57237
|
+
activeCount++;
|
|
57238
|
+
queue.dequeue()();
|
|
57239
|
+
}
|
|
57240
|
+
};
|
|
57241
|
+
const next = () => {
|
|
57242
|
+
activeCount--;
|
|
57243
|
+
resumeNext();
|
|
57244
|
+
};
|
|
57245
|
+
const run = async (function_, resolve17, arguments_) => {
|
|
57246
|
+
const result = (async () => function_(...arguments_))();
|
|
57247
|
+
resolve17(result);
|
|
57248
|
+
try {
|
|
57249
|
+
await result;
|
|
57250
|
+
} catch {}
|
|
57251
|
+
next();
|
|
57252
|
+
};
|
|
57253
|
+
const enqueue = (function_, resolve17, arguments_) => {
|
|
57254
|
+
new Promise((internalResolve) => {
|
|
57255
|
+
queue.enqueue(internalResolve);
|
|
57256
|
+
}).then(run.bind(undefined, function_, resolve17, arguments_));
|
|
57257
|
+
if (activeCount < concurrency) {
|
|
57258
|
+
resumeNext();
|
|
57259
|
+
}
|
|
57260
|
+
};
|
|
57261
|
+
const generator = (function_, ...arguments_) => new Promise((resolve17) => {
|
|
57262
|
+
enqueue(function_, resolve17, arguments_);
|
|
57263
|
+
});
|
|
57264
|
+
Object.defineProperties(generator, {
|
|
57265
|
+
activeCount: {
|
|
57266
|
+
get: () => activeCount
|
|
57267
|
+
},
|
|
57268
|
+
pendingCount: {
|
|
57269
|
+
get: () => queue.size
|
|
57270
|
+
},
|
|
57271
|
+
clearQueue: {
|
|
57272
|
+
value() {
|
|
57273
|
+
queue.clear();
|
|
57274
|
+
}
|
|
57275
|
+
},
|
|
57276
|
+
concurrency: {
|
|
57277
|
+
get: () => concurrency,
|
|
57278
|
+
set(newConcurrency) {
|
|
57279
|
+
validateConcurrency(newConcurrency);
|
|
57280
|
+
concurrency = newConcurrency;
|
|
57281
|
+
queueMicrotask(() => {
|
|
57282
|
+
while (activeCount < concurrency && queue.size > 0) {
|
|
57283
|
+
resumeNext();
|
|
57284
|
+
}
|
|
57285
|
+
});
|
|
57286
|
+
}
|
|
57287
|
+
},
|
|
57288
|
+
map: {
|
|
57289
|
+
async value(iterable, function_) {
|
|
57290
|
+
const promises = Array.from(iterable, (value, index) => this(function_, value, index));
|
|
57291
|
+
return Promise.all(promises);
|
|
57292
|
+
}
|
|
57293
|
+
}
|
|
57294
|
+
});
|
|
57295
|
+
return generator;
|
|
57296
|
+
}
|
|
57297
|
+
function validateConcurrency(concurrency) {
|
|
57298
|
+
if (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {
|
|
57299
|
+
throw new TypeError("Expected `concurrency` to be a number from 1 and up");
|
|
57300
|
+
}
|
|
57301
|
+
}
|
|
57302
|
+
var init_p_limit = __esm(() => {
|
|
57303
|
+
init_yocto_queue();
|
|
57304
|
+
});
|
|
57305
|
+
|
|
57143
57306
|
// src/domains/web-server/routes/plan-routes.ts
|
|
57144
57307
|
import { existsSync as existsSync33, readFileSync as readFileSync11, realpathSync } from "node:fs";
|
|
57308
|
+
import { homedir as homedir28 } from "node:os";
|
|
57145
57309
|
import { basename as basename16, dirname as dirname18, join as join52, relative as relative11, resolve as resolve17, sep as sep6 } from "node:path";
|
|
57146
57310
|
function sanitizeError(err) {
|
|
57147
57311
|
if (err instanceof Error) {
|
|
@@ -57211,7 +57375,19 @@ async function getProjectPathForRequest(projectId) {
|
|
|
57211
57375
|
return null;
|
|
57212
57376
|
if (projectId.startsWith("discovered-")) {
|
|
57213
57377
|
try {
|
|
57214
|
-
|
|
57378
|
+
const decodedPath = Buffer.from(projectId.slice("discovered-".length), "base64url").toString("utf-8");
|
|
57379
|
+
if (!decodedPath)
|
|
57380
|
+
return null;
|
|
57381
|
+
const now = Date.now();
|
|
57382
|
+
const discoveredPaths = cachedDiscoveredProjectKeys && cachedDiscoveredProjectKeys.expiresAt > now ? cachedDiscoveredProjectKeys.value : new Set(scanClaudeProjects().map((project) => toProjectPathKey(project.path)));
|
|
57383
|
+
if (!cachedDiscoveredProjectKeys || cachedDiscoveredProjectKeys.expiresAt <= now) {
|
|
57384
|
+
cachedDiscoveredProjectKeys = {
|
|
57385
|
+
value: discoveredPaths,
|
|
57386
|
+
expiresAt: now + GLOBAL_PLAN_ROOT_CACHE_TTL_MS
|
|
57387
|
+
};
|
|
57388
|
+
}
|
|
57389
|
+
const projectPath = toProjectPathKey(decodedPath);
|
|
57390
|
+
return discoveredPaths.has(projectPath) ? projectPath : null;
|
|
57215
57391
|
} catch {
|
|
57216
57392
|
return null;
|
|
57217
57393
|
}
|
|
@@ -57226,8 +57402,9 @@ async function getAllowedRoots(projectId) {
|
|
|
57226
57402
|
return roots;
|
|
57227
57403
|
try {
|
|
57228
57404
|
const { config } = await CkConfigManager.loadFull(projectPath);
|
|
57229
|
-
|
|
57230
|
-
roots.push(
|
|
57405
|
+
const projectPlansDir = projectId?.startsWith("discovered-") ? resolveSafeDiscoveredProjectPlansDir(projectPath, config) : resolveProjectPlansDir(projectPath, config);
|
|
57406
|
+
roots.push(projectPlansDir);
|
|
57407
|
+
roots.push(getGlobalPlanRoot());
|
|
57231
57408
|
} catch {}
|
|
57232
57409
|
return Array.from(new Set(roots.map((root) => resolve17(root))));
|
|
57233
57410
|
}
|
|
@@ -57263,6 +57440,70 @@ function getPlanDirPath(value, res, projectId) {
|
|
|
57263
57440
|
function getPlanFilePath(value, res, projectId) {
|
|
57264
57441
|
return getSafePath(value, "file", res, projectId);
|
|
57265
57442
|
}
|
|
57443
|
+
function toProjectPathKey(projectPath) {
|
|
57444
|
+
const resolvedPath = resolve17(projectPath);
|
|
57445
|
+
if (!existsSync33(resolvedPath)) {
|
|
57446
|
+
return resolvedPath;
|
|
57447
|
+
}
|
|
57448
|
+
try {
|
|
57449
|
+
return realpathSync(resolvedPath);
|
|
57450
|
+
} catch {
|
|
57451
|
+
return resolvedPath;
|
|
57452
|
+
}
|
|
57453
|
+
}
|
|
57454
|
+
function createDiscoveredProjectId(projectPath) {
|
|
57455
|
+
return `discovered-${Buffer.from(projectPath).toString("base64url")}`;
|
|
57456
|
+
}
|
|
57457
|
+
function toProjectPlanListItem(summary, plansDir) {
|
|
57458
|
+
return {
|
|
57459
|
+
file: relative11(plansDir, summary.planFile),
|
|
57460
|
+
name: basename16(dirname18(summary.planFile)),
|
|
57461
|
+
slug: basename16(dirname18(summary.planFile)),
|
|
57462
|
+
summary: {
|
|
57463
|
+
...summary,
|
|
57464
|
+
planDir: relative11(plansDir, summary.planDir),
|
|
57465
|
+
planFile: relative11(plansDir, summary.planFile)
|
|
57466
|
+
}
|
|
57467
|
+
};
|
|
57468
|
+
}
|
|
57469
|
+
async function buildProjectPlansEntry(target) {
|
|
57470
|
+
const projectPath = toProjectPathKey(target.path);
|
|
57471
|
+
const { config } = await CkConfigManager.loadFull(projectPath);
|
|
57472
|
+
const plansDir = target.id.startsWith("discovered-") ? resolveSafeDiscoveredProjectPlansDir(projectPath, config) : resolveProjectPlansDir(projectPath, config);
|
|
57473
|
+
const plans = buildPlanSummaries(scanPlanDir(plansDir)).map((summary) => toProjectPlanListItem(summary, plansDir));
|
|
57474
|
+
return {
|
|
57475
|
+
id: target.id,
|
|
57476
|
+
name: target.name,
|
|
57477
|
+
path: projectPath,
|
|
57478
|
+
plansDir,
|
|
57479
|
+
plans
|
|
57480
|
+
};
|
|
57481
|
+
}
|
|
57482
|
+
function withTimeout(promiseFactory, timeoutMs, label) {
|
|
57483
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
57484
|
+
const timer = setTimeout(() => {
|
|
57485
|
+
rejectPromise(new Error(`${label} scan timed out`));
|
|
57486
|
+
}, timeoutMs);
|
|
57487
|
+
promiseFactory().then((value) => {
|
|
57488
|
+
clearTimeout(timer);
|
|
57489
|
+
resolvePromise(value);
|
|
57490
|
+
}, (error) => {
|
|
57491
|
+
clearTimeout(timer);
|
|
57492
|
+
rejectPromise(error);
|
|
57493
|
+
});
|
|
57494
|
+
});
|
|
57495
|
+
}
|
|
57496
|
+
function isCurrentProjectFallbackCandidate(currentPath, globalProjectKey) {
|
|
57497
|
+
if (toProjectPathKey(currentPath) === globalProjectKey)
|
|
57498
|
+
return false;
|
|
57499
|
+
if (toProjectPathKey(currentPath) === toProjectPathKey(homedir28()))
|
|
57500
|
+
return false;
|
|
57501
|
+
return existsSync33(join52(currentPath, ".git")) || existsSync33(CkConfigManager.getProjectConfigPath(currentPath)) || existsSync33(join52(currentPath, "plans"));
|
|
57502
|
+
}
|
|
57503
|
+
function resolveSafeDiscoveredProjectPlansDir(projectPath, config) {
|
|
57504
|
+
const configuredPlansDir = resolveProjectPlansDir(projectPath, config);
|
|
57505
|
+
return isWithinBase(configuredPlansDir, projectPath) ? configuredPlansDir : resolveProjectPlansDir(projectPath);
|
|
57506
|
+
}
|
|
57266
57507
|
function registerPlanRoutes(app) {
|
|
57267
57508
|
app.get("/api/plan/parse", async (req, res) => {
|
|
57268
57509
|
const projectId = String(req.query.projectId ?? "") || undefined;
|
|
@@ -57318,6 +57559,74 @@ function registerPlanRoutes(app) {
|
|
|
57318
57559
|
res.status(500).json({ error: sanitizeError(err) });
|
|
57319
57560
|
}
|
|
57320
57561
|
});
|
|
57562
|
+
app.get("/api/plan/list-all", async (_req, res) => {
|
|
57563
|
+
try {
|
|
57564
|
+
const globalProjectKey = toProjectPathKey(join52(homedir28(), ".claude"));
|
|
57565
|
+
const seenProjectKeys = new Set;
|
|
57566
|
+
const scanTargets = [];
|
|
57567
|
+
for (const project of await ProjectsRegistryManager.listProjects()) {
|
|
57568
|
+
if (!existsSync33(resolve17(project.path)))
|
|
57569
|
+
continue;
|
|
57570
|
+
const projectKey = toProjectPathKey(project.path);
|
|
57571
|
+
if (projectKey === globalProjectKey || seenProjectKeys.has(projectKey))
|
|
57572
|
+
continue;
|
|
57573
|
+
seenProjectKeys.add(projectKey);
|
|
57574
|
+
scanTargets.push({
|
|
57575
|
+
id: project.id,
|
|
57576
|
+
name: project.alias,
|
|
57577
|
+
path: project.path
|
|
57578
|
+
});
|
|
57579
|
+
}
|
|
57580
|
+
for (const project of scanClaudeProjects()) {
|
|
57581
|
+
const projectKey = toProjectPathKey(project.path);
|
|
57582
|
+
if (projectKey === globalProjectKey || seenProjectKeys.has(projectKey))
|
|
57583
|
+
continue;
|
|
57584
|
+
seenProjectKeys.add(projectKey);
|
|
57585
|
+
scanTargets.push({
|
|
57586
|
+
id: createDiscoveredProjectId(project.path),
|
|
57587
|
+
name: basename16(project.path),
|
|
57588
|
+
path: project.path
|
|
57589
|
+
});
|
|
57590
|
+
}
|
|
57591
|
+
const currentPath = resolve17(process.cwd());
|
|
57592
|
+
const currentProjectKey = toProjectPathKey(currentPath);
|
|
57593
|
+
if (isCurrentProjectFallbackCandidate(currentPath, globalProjectKey) && !seenProjectKeys.has(currentProjectKey)) {
|
|
57594
|
+
scanTargets.push({
|
|
57595
|
+
id: "current",
|
|
57596
|
+
name: basename16(currentPath),
|
|
57597
|
+
path: currentPath
|
|
57598
|
+
});
|
|
57599
|
+
}
|
|
57600
|
+
if (scanTargets.length === 0) {
|
|
57601
|
+
res.json({ projects: [], totalPlans: 0 });
|
|
57602
|
+
return;
|
|
57603
|
+
}
|
|
57604
|
+
const limit = pLimit(PROJECT_SCAN_CONCURRENCY);
|
|
57605
|
+
const results = await Promise.allSettled(scanTargets.map((target) => limit(() => withTimeout(() => buildProjectPlansEntry(target), PROJECT_SCAN_TIMEOUT_MS, target.name))));
|
|
57606
|
+
const projects = results.flatMap((result, index) => {
|
|
57607
|
+
if (result.status === "fulfilled") {
|
|
57608
|
+
return [result.value];
|
|
57609
|
+
}
|
|
57610
|
+
return [
|
|
57611
|
+
{
|
|
57612
|
+
id: scanTargets[index]?.id ?? `unknown-${index}`,
|
|
57613
|
+
name: scanTargets[index]?.name ?? `Project ${index + 1}`,
|
|
57614
|
+
path: scanTargets[index]?.path ?? "",
|
|
57615
|
+
plansDir: resolveProjectPlansDir(scanTargets[index]?.path ?? process.cwd()),
|
|
57616
|
+
plans: [],
|
|
57617
|
+
error: sanitizeError(result.reason)
|
|
57618
|
+
}
|
|
57619
|
+
];
|
|
57620
|
+
});
|
|
57621
|
+
const response = {
|
|
57622
|
+
projects,
|
|
57623
|
+
totalPlans: projects.reduce((total, project) => total + project.plans.length, 0)
|
|
57624
|
+
};
|
|
57625
|
+
res.json(response);
|
|
57626
|
+
} catch (err) {
|
|
57627
|
+
res.status(500).json({ error: sanitizeError(err) });
|
|
57628
|
+
}
|
|
57629
|
+
});
|
|
57321
57630
|
app.get("/api/plan/summary", async (req, res) => {
|
|
57322
57631
|
const projectId = String(req.query.projectId ?? "") || undefined;
|
|
57323
57632
|
const file = await getPlanFilePath(String(req.query.file ?? ""), res, projectId);
|
|
@@ -57422,14 +57731,16 @@ function registerPlanRoutes(app) {
|
|
|
57422
57731
|
res.json(signal);
|
|
57423
57732
|
});
|
|
57424
57733
|
}
|
|
57425
|
-
var import_gray_matter10, PaginationQuerySchema, ActionRequestSchema, GLOBAL_PLAN_ROOT_CACHE_TTL_MS = 5000, cachedGlobalPlanRoot = null;
|
|
57734
|
+
var import_gray_matter10, PaginationQuerySchema, ActionRequestSchema, GLOBAL_PLAN_ROOT_CACHE_TTL_MS = 5000, PROJECT_SCAN_CONCURRENCY = 5, PROJECT_SCAN_TIMEOUT_MS = 1e4, cachedGlobalPlanRoot = null, cachedDiscoveredProjectKeys = null;
|
|
57426
57735
|
var init_plan_routes = __esm(() => {
|
|
57736
|
+
init_claudekit_data2();
|
|
57427
57737
|
init_claudekit_data2();
|
|
57428
57738
|
init_config();
|
|
57429
57739
|
init_action_executor();
|
|
57430
57740
|
init_action_signal();
|
|
57431
57741
|
init_plan_parser();
|
|
57432
57742
|
init_types3();
|
|
57743
|
+
init_p_limit();
|
|
57433
57744
|
init_zod();
|
|
57434
57745
|
import_gray_matter10 = __toESM(require_gray_matter(), 1);
|
|
57435
57746
|
PaginationQuerySchema = exports_external.object({
|
|
@@ -57497,7 +57808,7 @@ var init_project_plan_data = __esm(() => {
|
|
|
57497
57808
|
// src/domains/web-server/routes/project-routes.ts
|
|
57498
57809
|
import { existsSync as existsSync34 } from "node:fs";
|
|
57499
57810
|
import { readFile as readFile25 } from "node:fs/promises";
|
|
57500
|
-
import { homedir as
|
|
57811
|
+
import { homedir as homedir29 } from "node:os";
|
|
57501
57812
|
import { basename as basename17, join as join53, resolve as resolve18 } from "node:path";
|
|
57502
57813
|
function registerProjectRoutes(app) {
|
|
57503
57814
|
app.get("/api/projects", async (req, res) => {
|
|
@@ -57518,7 +57829,7 @@ function registerProjectRoutes(app) {
|
|
|
57518
57829
|
for (const discovered of discoveredProjects) {
|
|
57519
57830
|
if (registeredPaths.has(discovered.path))
|
|
57520
57831
|
continue;
|
|
57521
|
-
if (discovered.path === join53(
|
|
57832
|
+
if (discovered.path === join53(homedir29(), ".claude"))
|
|
57522
57833
|
continue;
|
|
57523
57834
|
const projectInfo = await detectAndBuildProjectInfo(discovered.path, `discovered-${discovered.path}`, cachedSettings, cachedSkills, false);
|
|
57524
57835
|
if (projectInfo) {
|
|
@@ -57534,7 +57845,7 @@ function registerProjectRoutes(app) {
|
|
|
57534
57845
|
if (cwdProject) {
|
|
57535
57846
|
projects.push(cwdProject);
|
|
57536
57847
|
}
|
|
57537
|
-
const globalDir = join53(
|
|
57848
|
+
const globalDir = join53(homedir29(), ".claude");
|
|
57538
57849
|
const globalProject = await detectAndBuildProjectInfo(globalDir, "global", undefined, undefined, false);
|
|
57539
57850
|
if (globalProject) {
|
|
57540
57851
|
projects.push(globalProject);
|
|
@@ -57606,12 +57917,12 @@ function registerProjectRoutes(app) {
|
|
|
57606
57917
|
const body = validation.data;
|
|
57607
57918
|
let projectPath = body.path;
|
|
57608
57919
|
if (projectPath.startsWith("~/") || projectPath === "~") {
|
|
57609
|
-
projectPath = join53(
|
|
57920
|
+
projectPath = join53(homedir29(), projectPath.slice(1));
|
|
57610
57921
|
} else if (projectPath.startsWith("~\\")) {
|
|
57611
|
-
projectPath = join53(
|
|
57922
|
+
projectPath = join53(homedir29(), projectPath.slice(1));
|
|
57612
57923
|
}
|
|
57613
57924
|
projectPath = resolve18(projectPath);
|
|
57614
|
-
const homeDir =
|
|
57925
|
+
const homeDir = homedir29();
|
|
57615
57926
|
if (projectPath.includes("..") || !projectPath.startsWith(homeDir)) {
|
|
57616
57927
|
res.status(400).json({ error: "Invalid path after expansion" });
|
|
57617
57928
|
return;
|
|
@@ -57668,7 +57979,7 @@ function registerProjectRoutes(app) {
|
|
|
57668
57979
|
if (id === "current") {
|
|
57669
57980
|
projectPath = process.cwd();
|
|
57670
57981
|
} else if (id === "global") {
|
|
57671
|
-
projectPath = join53(
|
|
57982
|
+
projectPath = join53(homedir29(), ".claude");
|
|
57672
57983
|
} else {
|
|
57673
57984
|
res.status(404).json({ error: "Project not found" });
|
|
57674
57985
|
return;
|
|
@@ -57748,7 +58059,7 @@ async function buildProjectInfoFromRegistry(registered, cachedSettings, cachedSk
|
|
|
57748
58059
|
const hasLocalConfig = hasClaudeDir && CkConfigManager.projectConfigExists(registered.path, false);
|
|
57749
58060
|
const settings = cachedSettings !== undefined ? cachedSettings : await readSettings();
|
|
57750
58061
|
const skills = cachedSkills !== undefined ? cachedSkills : await scanSkills();
|
|
57751
|
-
const settingsPath = join53(
|
|
58062
|
+
const settingsPath = join53(homedir29(), ".claude", "settings.json");
|
|
57752
58063
|
const health = existsSync34(settingsPath) ? "healthy" : "warning";
|
|
57753
58064
|
const model = getCurrentModel() || settings?.model || "claude-sonnet-4";
|
|
57754
58065
|
const planData = includePlanData ? await buildProjectPlanData(registered.path, "project") : null;
|
|
@@ -57790,7 +58101,7 @@ async function detectAndBuildProjectInfo(path5, id, cachedSettings, cachedSkills
|
|
|
57790
58101
|
const hasLocalConfig = CkConfigManager.projectConfigExists(path5, id === "global");
|
|
57791
58102
|
const settings = cachedSettings !== undefined ? cachedSettings : await readSettings();
|
|
57792
58103
|
const skills = cachedSkills !== undefined ? cachedSkills : await scanSkills();
|
|
57793
|
-
const settingsPath = join53(
|
|
58104
|
+
const settingsPath = join53(homedir29(), ".claude", "settings.json");
|
|
57794
58105
|
const health = existsSync34(settingsPath) ? "healthy" : "warning";
|
|
57795
58106
|
const model = getCurrentModel() || settings?.model || "claude-sonnet-4";
|
|
57796
58107
|
const scope = id === "global" ? "global" : "project";
|
|
@@ -57838,7 +58149,7 @@ var init_project_routes = __esm(() => {
|
|
|
57838
58149
|
// src/domains/web-server/routes/session-routes.ts
|
|
57839
58150
|
import { existsSync as existsSync35 } from "node:fs";
|
|
57840
58151
|
import { readFile as readFile26, readdir as readdir14, stat as stat9 } from "node:fs/promises";
|
|
57841
|
-
import { homedir as
|
|
58152
|
+
import { homedir as homedir30 } from "node:os";
|
|
57842
58153
|
import { basename as basename18, join as join54 } from "node:path";
|
|
57843
58154
|
function toDateStr(d3) {
|
|
57844
58155
|
const y3 = d3.getFullYear();
|
|
@@ -57847,7 +58158,7 @@ function toDateStr(d3) {
|
|
|
57847
58158
|
return `${y3}-${m2}-${day}`;
|
|
57848
58159
|
}
|
|
57849
58160
|
async function scanActivityMetrics(periodDays) {
|
|
57850
|
-
const home7 =
|
|
58161
|
+
const home7 = homedir30();
|
|
57851
58162
|
const projectsDir2 = join54(home7, ".claude", "projects");
|
|
57852
58163
|
const cutoff = new Date;
|
|
57853
58164
|
cutoff.setDate(cutoff.getDate() - periodDays);
|
|
@@ -57918,7 +58229,7 @@ async function scanActivityMetrics(periodDays) {
|
|
|
57918
58229
|
return { totalSessions, projects: projectActivities, dailyCounts };
|
|
57919
58230
|
}
|
|
57920
58231
|
async function resolveSessionDir(projectId) {
|
|
57921
|
-
const home7 =
|
|
58232
|
+
const home7 = homedir30();
|
|
57922
58233
|
if (projectId.startsWith("discovered-")) {
|
|
57923
58234
|
try {
|
|
57924
58235
|
const encodedPathB64 = projectId.slice("discovered-".length);
|
|
@@ -58092,7 +58403,7 @@ async function parseSessionDetail(filePath, limit, offset) {
|
|
|
58092
58403
|
}
|
|
58093
58404
|
function registerSessionRoutes(app) {
|
|
58094
58405
|
app.get("/api/sessions", async (_req, res) => {
|
|
58095
|
-
const home7 =
|
|
58406
|
+
const home7 = homedir30();
|
|
58096
58407
|
const projectsDir2 = join54(home7, ".claude", "projects");
|
|
58097
58408
|
if (!existsSync35(projectsDir2)) {
|
|
58098
58409
|
res.json({ projects: [] });
|
|
@@ -58161,7 +58472,7 @@ function registerSessionRoutes(app) {
|
|
|
58161
58472
|
res.status(404).json({ error: "Project not found" });
|
|
58162
58473
|
return;
|
|
58163
58474
|
}
|
|
58164
|
-
const allowedBase = join54(
|
|
58475
|
+
const allowedBase = join54(homedir30(), ".claude", "projects");
|
|
58165
58476
|
if (!projectDir.startsWith(allowedBase)) {
|
|
58166
58477
|
res.status(403).json({ error: "Access denied" });
|
|
58167
58478
|
return;
|
|
@@ -58191,7 +58502,7 @@ function registerSessionRoutes(app) {
|
|
|
58191
58502
|
res.status(404).json({ error: "Project not found" });
|
|
58192
58503
|
return;
|
|
58193
58504
|
}
|
|
58194
|
-
const allowedBase = join54(
|
|
58505
|
+
const allowedBase = join54(homedir30(), ".claude", "projects");
|
|
58195
58506
|
if (!projectDir.startsWith(allowedBase)) {
|
|
58196
58507
|
res.status(403).json({ error: "Access denied" });
|
|
58197
58508
|
return;
|
|
@@ -58225,7 +58536,7 @@ var init_session_routes = __esm(() => {
|
|
|
58225
58536
|
});
|
|
58226
58537
|
|
|
58227
58538
|
// src/domains/web-server/routes/settings-routes.ts
|
|
58228
|
-
import { homedir as
|
|
58539
|
+
import { homedir as homedir31 } from "node:os";
|
|
58229
58540
|
function registerSettingsRoutes(app) {
|
|
58230
58541
|
app.get("/api/settings", async (_req, res) => {
|
|
58231
58542
|
try {
|
|
@@ -58281,7 +58592,7 @@ function registerSettingsRoutes(app) {
|
|
|
58281
58592
|
res.json({
|
|
58282
58593
|
success: true,
|
|
58283
58594
|
path: "~/.claude/settings.json",
|
|
58284
|
-
backupPath: saveResult.backupPath ? saveResult.backupPath.replace(
|
|
58595
|
+
backupPath: saveResult.backupPath ? saveResult.backupPath.replace(homedir31(), "~") : null,
|
|
58285
58596
|
absolutePath: getSettingsPath()
|
|
58286
58597
|
});
|
|
58287
58598
|
} catch (error) {
|
|
@@ -58315,7 +58626,7 @@ var init_settings_routes = __esm(() => {
|
|
|
58315
58626
|
|
|
58316
58627
|
// src/domains/skills/skill-catalog-generator.ts
|
|
58317
58628
|
import { mkdir as mkdir11, readFile as readFile27, readdir as readdir15, rename as rename7, stat as stat10, writeFile as writeFile11 } from "node:fs/promises";
|
|
58318
|
-
import { homedir as
|
|
58629
|
+
import { homedir as homedir32 } from "node:os";
|
|
58319
58630
|
import { dirname as dirname19, join as join55, relative as relative12 } from "node:path";
|
|
58320
58631
|
async function hasScripts(skillPath) {
|
|
58321
58632
|
try {
|
|
@@ -58458,7 +58769,7 @@ var CATALOG_PATH, CATALOG_VERSION = "1.0.0", SKIP_DIRS4, skillCatalogGenerator;
|
|
|
58458
58769
|
var init_skill_catalog_generator = __esm(() => {
|
|
58459
58770
|
init_skills_discovery();
|
|
58460
58771
|
init_logger();
|
|
58461
|
-
CATALOG_PATH = join55(
|
|
58772
|
+
CATALOG_PATH = join55(homedir32(), ".claude", ".skills-catalog.json");
|
|
58462
58773
|
SKIP_DIRS4 = [".venv", "__pycache__", "node_modules", ".git"];
|
|
58463
58774
|
skillCatalogGenerator = new SkillCatalogGenerator;
|
|
58464
58775
|
});
|
|
@@ -58748,7 +59059,7 @@ var init_skill_browser_routes = __esm(() => {
|
|
|
58748
59059
|
|
|
58749
59060
|
// src/commands/skills/agents.ts
|
|
58750
59061
|
import { existsSync as existsSync36, readdirSync as readdirSync5, statSync as statSync7 } from "node:fs";
|
|
58751
|
-
import { homedir as
|
|
59062
|
+
import { homedir as homedir34, platform as platform5 } from "node:os";
|
|
58752
59063
|
import { join as join57 } from "node:path";
|
|
58753
59064
|
function hasInstallSignal2(path6) {
|
|
58754
59065
|
if (!path6 || !existsSync36(path6)) {
|
|
@@ -58805,7 +59116,7 @@ function isSkillInstalled(skillName, agent, options2) {
|
|
|
58805
59116
|
}
|
|
58806
59117
|
var home7, OPENCODE_BINARY_NAME2, agents;
|
|
58807
59118
|
var init_agents = __esm(() => {
|
|
58808
|
-
home7 =
|
|
59119
|
+
home7 = homedir34();
|
|
58809
59120
|
OPENCODE_BINARY_NAME2 = platform5() === "win32" ? "opencode.exe" : "opencode";
|
|
58810
59121
|
agents = {
|
|
58811
59122
|
"claude-code": {
|
|
@@ -58912,7 +59223,7 @@ var init_agents = __esm(() => {
|
|
|
58912
59223
|
// src/commands/skills/skills-registry.ts
|
|
58913
59224
|
import { existsSync as existsSync37 } from "node:fs";
|
|
58914
59225
|
import { mkdir as mkdir12, readFile as readFile29, writeFile as writeFile12 } from "node:fs/promises";
|
|
58915
|
-
import { homedir as
|
|
59226
|
+
import { homedir as homedir35 } from "node:os";
|
|
58916
59227
|
import { dirname as dirname20, join as join58, sep as sep8 } from "node:path";
|
|
58917
59228
|
function getCliVersion3() {
|
|
58918
59229
|
try {
|
|
@@ -59024,7 +59335,7 @@ async function syncRegistry() {
|
|
|
59024
59335
|
var home8, REGISTRY_PATH3, SkillInstallationSchema, SkillRegistrySchema, REGISTRY_PATH_MIGRATIONS;
|
|
59025
59336
|
var init_skills_registry = __esm(() => {
|
|
59026
59337
|
init_zod();
|
|
59027
|
-
home8 =
|
|
59338
|
+
home8 = homedir35();
|
|
59028
59339
|
REGISTRY_PATH3 = join58(home8, ".claudekit", "skill-registry.json");
|
|
59029
59340
|
SkillInstallationSchema = exports_external.object({
|
|
59030
59341
|
skill: exports_external.string(),
|
|
@@ -59056,7 +59367,7 @@ var init_skills_registry = __esm(() => {
|
|
|
59056
59367
|
// src/commands/skills/skills-installer.ts
|
|
59057
59368
|
import { existsSync as existsSync38 } from "node:fs";
|
|
59058
59369
|
import { cp as cp2, mkdir as mkdir13, rm as rm7, stat as stat11 } from "node:fs/promises";
|
|
59059
|
-
import { homedir as
|
|
59370
|
+
import { homedir as homedir36 } from "node:os";
|
|
59060
59371
|
import { dirname as dirname21, join as join59, resolve as resolve20 } from "node:path";
|
|
59061
59372
|
function isSamePath2(path1, path22) {
|
|
59062
59373
|
try {
|
|
@@ -59187,7 +59498,7 @@ var init_skills_installer = __esm(() => {
|
|
|
59187
59498
|
LEGACY_SKILL_PATHS = {
|
|
59188
59499
|
"gemini-cli": {
|
|
59189
59500
|
project: ".gemini/skills",
|
|
59190
|
-
global: join59(
|
|
59501
|
+
global: join59(homedir36(), ".gemini/skills")
|
|
59191
59502
|
}
|
|
59192
59503
|
};
|
|
59193
59504
|
});
|
|
@@ -60136,7 +60447,7 @@ var package_default;
|
|
|
60136
60447
|
var init_package = __esm(() => {
|
|
60137
60448
|
package_default = {
|
|
60138
60449
|
name: "claudekit-cli",
|
|
60139
|
-
version: "3.41.4-dev.
|
|
60450
|
+
version: "3.41.4-dev.17",
|
|
60140
60451
|
description: "CLI tool for bootstrapping and updating ClaudeKit projects",
|
|
60141
60452
|
type: "module",
|
|
60142
60453
|
repository: {
|
|
@@ -60163,6 +60474,8 @@ var init_package = __esm(() => {
|
|
|
60163
60474
|
"dashboard:dev": "cd src/ui && bun install --silent && cd ../.. && bun run src/index.ts config ui --dev",
|
|
60164
60475
|
"dashboard:tauri": "cd src/ui && bun install --silent && cd ../.. && bun run src/index.ts config ui --dev --no-open --port 3456",
|
|
60165
60476
|
"ui:build": "cd src/ui && bun install --silent && bun run build",
|
|
60477
|
+
"ui:test": "cd src/ui && bun install --silent && bun run test",
|
|
60478
|
+
"ui:test:plans": "cd src/ui && bun install --silent && bunx vitest run src/hooks/__tests__/use-plans-dashboard.vitest.ts src/pages/__tests__/PlansPage.vitest.tsx src/pages/__tests__/PlanDetailPage.vitest.tsx",
|
|
60166
60479
|
"ui:dev": "cd src/ui && bun run dev",
|
|
60167
60480
|
build: `bun build src/index.ts --outdir dist --target node --external @octokit/rest --external better-sqlite3 && node -e "const fs=require('fs'),f='dist/index.js',c=fs.readFileSync(f,'utf-8');fs.writeFileSync(f,c.replace(/^#!.*\\n\\/\\/ @bun\\n/,''))"`,
|
|
60168
60481
|
"verify:package": "node scripts/prepublish-check.js",
|
|
@@ -60178,7 +60491,7 @@ var init_package = __esm(() => {
|
|
|
60178
60491
|
"dev:quick": "./scripts/dev-quick-start.sh",
|
|
60179
60492
|
"dev:all": "./scripts/dev-quick-start.sh all",
|
|
60180
60493
|
metrics: "bun run scripts/workflow-metrics.ts",
|
|
60181
|
-
validate: "bun run typecheck && bun run lint && bun test && bun run build",
|
|
60494
|
+
validate: "bun run typecheck && bun run lint && bun test && bun run ui:test && bun run build",
|
|
60182
60495
|
"install:hooks": "./.githooks/install.sh",
|
|
60183
60496
|
prepare: `node -e "try{require('child_process').execSync('git rev-parse --git-dir',{stdio:'ignore'});require('child_process').execSync('bash .githooks/install.sh',{stdio:'inherit'})}catch(e){console.warn('[i] Hook install skipped:',e.message)}"`
|
|
60184
60497
|
},
|
|
@@ -62714,7 +63027,7 @@ import { spawn as spawn3 } from "node:child_process";
|
|
|
62714
63027
|
import { execFile as execFile7 } from "node:child_process";
|
|
62715
63028
|
import { existsSync as existsSync42 } from "node:fs";
|
|
62716
63029
|
import { readFile as readFile36 } from "node:fs/promises";
|
|
62717
|
-
import { cpus, homedir as
|
|
63030
|
+
import { cpus, homedir as homedir37, totalmem } from "node:os";
|
|
62718
63031
|
import { join as join67 } from "node:path";
|
|
62719
63032
|
function runCommand(cmd, args, fallback2) {
|
|
62720
63033
|
return new Promise((resolve22) => {
|
|
@@ -62880,7 +63193,7 @@ function registerSystemRoutes(app) {
|
|
|
62880
63193
|
gitVersion,
|
|
62881
63194
|
ghVersion,
|
|
62882
63195
|
shell: process.env.SHELL ?? process.env.ComSpec ?? "unknown",
|
|
62883
|
-
homeDir:
|
|
63196
|
+
homeDir: homedir37(),
|
|
62884
63197
|
cpuCores: cpus().length,
|
|
62885
63198
|
totalMemoryGb: (totalmem() / 1024 ** 3).toFixed(1)
|
|
62886
63199
|
};
|
|
@@ -68770,10 +69083,10 @@ var init_config_manager2 = __esm(() => {
|
|
|
68770
69083
|
|
|
68771
69084
|
// src/services/package-installer/gemini-mcp/validation.ts
|
|
68772
69085
|
import { existsSync as existsSync56, lstatSync, readlinkSync } from "node:fs";
|
|
68773
|
-
import { homedir as
|
|
69086
|
+
import { homedir as homedir41 } from "node:os";
|
|
68774
69087
|
import { join as join89 } from "node:path";
|
|
68775
69088
|
function getGlobalMcpConfigPath() {
|
|
68776
|
-
return join89(
|
|
69089
|
+
return join89(homedir41(), ".claude", ".mcp.json");
|
|
68777
69090
|
}
|
|
68778
69091
|
function getLocalMcpConfigPath(projectDir) {
|
|
68779
69092
|
return join89(projectDir, ".mcp.json");
|
|
@@ -68794,7 +69107,7 @@ function findMcpConfigPath(projectDir) {
|
|
|
68794
69107
|
}
|
|
68795
69108
|
function getGeminiSettingsPath(projectDir, isGlobal) {
|
|
68796
69109
|
if (isGlobal) {
|
|
68797
|
-
return join89(
|
|
69110
|
+
return join89(homedir41(), ".gemini", "settings.json");
|
|
68798
69111
|
}
|
|
68799
69112
|
return join89(projectDir, ".gemini", "settings.json");
|
|
68800
69113
|
}
|
|
@@ -71422,7 +71735,7 @@ var init_content_validator = __esm(() => {
|
|
|
71422
71735
|
import { createHash as createHash7 } from "node:crypto";
|
|
71423
71736
|
import { existsSync as existsSync72, mkdirSync as mkdirSync5, readFileSync as readFileSync18, readdirSync as readdirSync10, statSync as statSync13 } from "node:fs";
|
|
71424
71737
|
import { rename as rename11, writeFile as writeFile35 } from "node:fs/promises";
|
|
71425
|
-
import { homedir as
|
|
71738
|
+
import { homedir as homedir46 } from "node:os";
|
|
71426
71739
|
import { basename as basename27, join as join151 } from "node:path";
|
|
71427
71740
|
function getCachedContext(repoPath) {
|
|
71428
71741
|
const cachePath = getCacheFilePath(repoPath);
|
|
@@ -71497,7 +71810,7 @@ function getCacheFilePath(repoPath) {
|
|
|
71497
71810
|
}
|
|
71498
71811
|
var CACHE_DIR, CACHE_TTL_MS4;
|
|
71499
71812
|
var init_context_cache_manager = __esm(() => {
|
|
71500
|
-
CACHE_DIR = join151(
|
|
71813
|
+
CACHE_DIR = join151(homedir46(), ".claudekit", "cache");
|
|
71501
71814
|
CACHE_TTL_MS4 = 24 * 60 * 60 * 1000;
|
|
71502
71815
|
});
|
|
71503
71816
|
|
|
@@ -71951,10 +72264,10 @@ IMPORTANT: Generate the image and output the path as JSON: {"imagePath": "/path/
|
|
|
71951
72264
|
// src/commands/content/phases/photo-generator.ts
|
|
71952
72265
|
import { execSync as execSync8 } from "node:child_process";
|
|
71953
72266
|
import { existsSync as existsSync74, mkdirSync as mkdirSync6, readdirSync as readdirSync12 } from "node:fs";
|
|
71954
|
-
import { homedir as
|
|
72267
|
+
import { homedir as homedir47 } from "node:os";
|
|
71955
72268
|
import { join as join153 } from "node:path";
|
|
71956
72269
|
async function generatePhoto(_content, context, config, platform16, contentId, contentLogger) {
|
|
71957
|
-
const mediaDir = join153(config.contentDir.replace(/^~/,
|
|
72270
|
+
const mediaDir = join153(config.contentDir.replace(/^~/, homedir47()), "media", String(contentId));
|
|
71958
72271
|
if (!existsSync74(mediaDir)) {
|
|
71959
72272
|
mkdirSync6(mediaDir, { recursive: true });
|
|
71960
72273
|
}
|
|
@@ -72068,7 +72381,7 @@ var init_content_creator = __esm(() => {
|
|
|
72068
72381
|
|
|
72069
72382
|
// src/commands/content/phases/content-logger.ts
|
|
72070
72383
|
import { createWriteStream as createWriteStream4, existsSync as existsSync75, mkdirSync as mkdirSync7, statSync as statSync14 } from "node:fs";
|
|
72071
|
-
import { homedir as
|
|
72384
|
+
import { homedir as homedir48 } from "node:os";
|
|
72072
72385
|
import { join as join154 } from "node:path";
|
|
72073
72386
|
|
|
72074
72387
|
class ContentLogger {
|
|
@@ -72077,7 +72390,7 @@ class ContentLogger {
|
|
|
72077
72390
|
logDir;
|
|
72078
72391
|
maxBytes;
|
|
72079
72392
|
constructor(maxBytes = 0) {
|
|
72080
|
-
this.logDir = join154(
|
|
72393
|
+
this.logDir = join154(homedir48(), ".claudekit", "logs");
|
|
72081
72394
|
this.maxBytes = maxBytes;
|
|
72082
72395
|
}
|
|
72083
72396
|
init() {
|
|
@@ -73688,11 +74001,11 @@ var init_setup_wizard = __esm(() => {
|
|
|
73688
74001
|
|
|
73689
74002
|
// src/commands/content/content-review-commands.ts
|
|
73690
74003
|
import { existsSync as existsSync79 } from "node:fs";
|
|
73691
|
-
import { homedir as
|
|
74004
|
+
import { homedir as homedir49 } from "node:os";
|
|
73692
74005
|
async function queueContent() {
|
|
73693
74006
|
const cwd2 = process.cwd();
|
|
73694
74007
|
const config = await loadContentConfig(cwd2);
|
|
73695
|
-
const dbPath = config.dbPath.replace(/^~/,
|
|
74008
|
+
const dbPath = config.dbPath.replace(/^~/, homedir49());
|
|
73696
74009
|
if (!existsSync79(dbPath)) {
|
|
73697
74010
|
logger.info("No content database found. Run 'ck content setup' first.");
|
|
73698
74011
|
return;
|
|
@@ -73719,7 +74032,7 @@ async function queueContent() {
|
|
|
73719
74032
|
async function approveContentCmd(id) {
|
|
73720
74033
|
const cwd2 = process.cwd();
|
|
73721
74034
|
const config = await loadContentConfig(cwd2);
|
|
73722
|
-
const dbPath = config.dbPath.replace(/^~/,
|
|
74035
|
+
const dbPath = config.dbPath.replace(/^~/, homedir49());
|
|
73723
74036
|
const db = initDatabase(dbPath);
|
|
73724
74037
|
try {
|
|
73725
74038
|
approveContent(db, Number.parseInt(id, 10));
|
|
@@ -73731,7 +74044,7 @@ async function approveContentCmd(id) {
|
|
|
73731
74044
|
async function rejectContentCmd(id, reason) {
|
|
73732
74045
|
const cwd2 = process.cwd();
|
|
73733
74046
|
const config = await loadContentConfig(cwd2);
|
|
73734
|
-
const dbPath = config.dbPath.replace(/^~/,
|
|
74047
|
+
const dbPath = config.dbPath.replace(/^~/, homedir49());
|
|
73735
74048
|
const db = initDatabase(dbPath);
|
|
73736
74049
|
try {
|
|
73737
74050
|
rejectContent(db, Number.parseInt(id, 10), reason);
|
|
@@ -73762,7 +74075,7 @@ __export(exports_content_subcommands, {
|
|
|
73762
74075
|
approveContentCmd: () => approveContentCmd
|
|
73763
74076
|
});
|
|
73764
74077
|
import { existsSync as existsSync80, readFileSync as readFileSync21, unlinkSync as unlinkSync5 } from "node:fs";
|
|
73765
|
-
import { homedir as
|
|
74078
|
+
import { homedir as homedir50 } from "node:os";
|
|
73766
74079
|
import { join as join159 } from "node:path";
|
|
73767
74080
|
function isDaemonRunning() {
|
|
73768
74081
|
const lockFile = join159(LOCK_DIR, `${LOCK_NAME2}.lock`);
|
|
@@ -73836,7 +74149,7 @@ async function statusContent() {
|
|
|
73836
74149
|
} catch {}
|
|
73837
74150
|
}
|
|
73838
74151
|
async function logsContent(options2) {
|
|
73839
|
-
const logDir = join159(
|
|
74152
|
+
const logDir = join159(homedir50(), ".claudekit", "logs");
|
|
73840
74153
|
const dateStr = new Date().toISOString().slice(0, 10).replace(/-/g, "");
|
|
73841
74154
|
const logPath = join159(logDir, `content-${dateStr}.log`);
|
|
73842
74155
|
if (!existsSync80(logPath)) {
|
|
@@ -73870,12 +74183,12 @@ var init_content_subcommands = __esm(() => {
|
|
|
73870
74183
|
init_setup_wizard();
|
|
73871
74184
|
init_state_manager();
|
|
73872
74185
|
init_content_review_commands();
|
|
73873
|
-
LOCK_DIR = join159(
|
|
74186
|
+
LOCK_DIR = join159(homedir50(), ".claudekit", "locks");
|
|
73874
74187
|
});
|
|
73875
74188
|
|
|
73876
74189
|
// src/commands/content/content-command.ts
|
|
73877
74190
|
import { existsSync as existsSync81, mkdirSync as mkdirSync9, unlinkSync as unlinkSync6, writeFileSync as writeFileSync7 } from "node:fs";
|
|
73878
|
-
import { homedir as
|
|
74191
|
+
import { homedir as homedir51 } from "node:os";
|
|
73879
74192
|
import { join as join160 } from "node:path";
|
|
73880
74193
|
async function contentCommand(options2) {
|
|
73881
74194
|
const cwd2 = process.cwd();
|
|
@@ -73908,7 +74221,7 @@ async function contentCommand(options2) {
|
|
|
73908
74221
|
if (!existsSync81(LOCK_DIR2))
|
|
73909
74222
|
mkdirSync9(LOCK_DIR2, { recursive: true });
|
|
73910
74223
|
writeFileSync7(LOCK_FILE, String(process.pid), "utf-8");
|
|
73911
|
-
const dbPath = config.dbPath.replace(/^~/,
|
|
74224
|
+
const dbPath = config.dbPath.replace(/^~/, homedir51());
|
|
73912
74225
|
const db = initDatabase(dbPath);
|
|
73913
74226
|
contentLogger.info(`Database initialised at ${dbPath}`);
|
|
73914
74227
|
const adapters = initializeAdapters(config);
|
|
@@ -74054,7 +74367,7 @@ var init_content_command = __esm(() => {
|
|
|
74054
74367
|
init_publisher();
|
|
74055
74368
|
init_review_manager();
|
|
74056
74369
|
init_state_manager();
|
|
74057
|
-
LOCK_DIR2 = join160(
|
|
74370
|
+
LOCK_DIR2 = join160(homedir51(), ".claudekit", "locks");
|
|
74058
74371
|
LOCK_FILE = join160(LOCK_DIR2, "ck-content.lock");
|
|
74059
74372
|
});
|
|
74060
74373
|
|
|
@@ -81343,7 +81656,7 @@ init_logger();
|
|
|
81343
81656
|
init_path_resolver();
|
|
81344
81657
|
import { existsSync as existsSync50 } from "node:fs";
|
|
81345
81658
|
import { readFile as readFile38 } from "node:fs/promises";
|
|
81346
|
-
import { homedir as
|
|
81659
|
+
import { homedir as homedir38 } from "node:os";
|
|
81347
81660
|
import { dirname as dirname23, join as join75, normalize as normalize6, resolve as resolve23 } from "node:path";
|
|
81348
81661
|
async function checkPathRefsValid(projectDir) {
|
|
81349
81662
|
const globalClaudeMd = join75(PathResolver.getGlobalKitDir(), "CLAUDE.md");
|
|
@@ -81376,7 +81689,7 @@ async function checkPathRefsValid(projectDir) {
|
|
|
81376
81689
|
};
|
|
81377
81690
|
}
|
|
81378
81691
|
const baseDir = dirname23(claudeMdPath);
|
|
81379
|
-
const home9 =
|
|
81692
|
+
const home9 = homedir38();
|
|
81380
81693
|
const broken = [];
|
|
81381
81694
|
for (const ref of refs) {
|
|
81382
81695
|
let refPath;
|
|
@@ -81960,7 +82273,7 @@ init_path_resolver();
|
|
|
81960
82273
|
import { spawnSync as spawnSync3 } from "node:child_process";
|
|
81961
82274
|
import { existsSync as existsSync52, readFileSync as readFileSync15, statSync as statSync9, writeFileSync as writeFileSync5 } from "node:fs";
|
|
81962
82275
|
import { readdir as readdir20 } from "node:fs/promises";
|
|
81963
|
-
import { homedir as
|
|
82276
|
+
import { homedir as homedir39, tmpdir } from "node:os";
|
|
81964
82277
|
import { join as join79, resolve as resolve24 } from "node:path";
|
|
81965
82278
|
var HOOK_CHECK_TIMEOUT_MS = 5000;
|
|
81966
82279
|
var PYTHON_CHECK_TIMEOUT_MS = 3000;
|
|
@@ -81979,7 +82292,7 @@ function isPathWithin(filePath, parentDir) {
|
|
|
81979
82292
|
}
|
|
81980
82293
|
function getCanonicalGlobalCommandRoot() {
|
|
81981
82294
|
const configuredGlobalDir = PathResolver.getGlobalKitDir().replace(/\\/g, "/").replace(/\/+$/, "");
|
|
81982
|
-
const defaultGlobalDir = join79(
|
|
82295
|
+
const defaultGlobalDir = join79(homedir39(), ".claude").replace(/\\/g, "/");
|
|
81983
82296
|
return configuredGlobalDir === defaultGlobalDir ? "$HOME" : configuredGlobalDir;
|
|
81984
82297
|
}
|
|
81985
82298
|
function getClaudeSettingsFiles(projectDir) {
|
|
@@ -83339,7 +83652,7 @@ import { platform as platform8 } from "node:os";
|
|
|
83339
83652
|
init_environment();
|
|
83340
83653
|
init_path_resolver();
|
|
83341
83654
|
import { constants as constants3, access as access4, mkdir as mkdir17, readFile as readFile40, unlink as unlink9, writeFile as writeFile18 } from "node:fs/promises";
|
|
83342
|
-
import { arch as arch2, homedir as
|
|
83655
|
+
import { arch as arch2, homedir as homedir40, platform as platform7 } from "node:os";
|
|
83343
83656
|
import { join as join81, normalize as normalize7 } from "node:path";
|
|
83344
83657
|
function shouldSkipExpensiveOperations4() {
|
|
83345
83658
|
return shouldSkipExpensiveOperations();
|
|
@@ -83362,7 +83675,7 @@ async function checkPlatformDetect() {
|
|
|
83362
83675
|
};
|
|
83363
83676
|
}
|
|
83364
83677
|
async function checkHomeDirResolution() {
|
|
83365
|
-
const nodeHome = normalize7(
|
|
83678
|
+
const nodeHome = normalize7(homedir40());
|
|
83366
83679
|
const rawEnvHome = getHomeDirectoryFromEnv(platform7());
|
|
83367
83680
|
const envHome = rawEnvHome ? normalize7(rawEnvHome) : "";
|
|
83368
83681
|
const match = nodeHome === envHome && envHome !== "";
|
|
@@ -84337,147 +84650,8 @@ import { createReadStream as createReadStream2 } from "node:fs";
|
|
|
84337
84650
|
import { stat as stat12 } from "node:fs/promises";
|
|
84338
84651
|
import { relative as relative13 } from "node:path";
|
|
84339
84652
|
|
|
84340
|
-
// node_modules/yocto-queue/index.js
|
|
84341
|
-
class Node {
|
|
84342
|
-
value;
|
|
84343
|
-
next;
|
|
84344
|
-
constructor(value) {
|
|
84345
|
-
this.value = value;
|
|
84346
|
-
}
|
|
84347
|
-
}
|
|
84348
|
-
|
|
84349
|
-
class Queue {
|
|
84350
|
-
#head;
|
|
84351
|
-
#tail;
|
|
84352
|
-
#size;
|
|
84353
|
-
constructor() {
|
|
84354
|
-
this.clear();
|
|
84355
|
-
}
|
|
84356
|
-
enqueue(value) {
|
|
84357
|
-
const node = new Node(value);
|
|
84358
|
-
if (this.#head) {
|
|
84359
|
-
this.#tail.next = node;
|
|
84360
|
-
this.#tail = node;
|
|
84361
|
-
} else {
|
|
84362
|
-
this.#head = node;
|
|
84363
|
-
this.#tail = node;
|
|
84364
|
-
}
|
|
84365
|
-
this.#size++;
|
|
84366
|
-
}
|
|
84367
|
-
dequeue() {
|
|
84368
|
-
const current = this.#head;
|
|
84369
|
-
if (!current) {
|
|
84370
|
-
return;
|
|
84371
|
-
}
|
|
84372
|
-
this.#head = this.#head.next;
|
|
84373
|
-
this.#size--;
|
|
84374
|
-
if (!this.#head) {
|
|
84375
|
-
this.#tail = undefined;
|
|
84376
|
-
}
|
|
84377
|
-
return current.value;
|
|
84378
|
-
}
|
|
84379
|
-
peek() {
|
|
84380
|
-
if (!this.#head) {
|
|
84381
|
-
return;
|
|
84382
|
-
}
|
|
84383
|
-
return this.#head.value;
|
|
84384
|
-
}
|
|
84385
|
-
clear() {
|
|
84386
|
-
this.#head = undefined;
|
|
84387
|
-
this.#tail = undefined;
|
|
84388
|
-
this.#size = 0;
|
|
84389
|
-
}
|
|
84390
|
-
get size() {
|
|
84391
|
-
return this.#size;
|
|
84392
|
-
}
|
|
84393
|
-
*[Symbol.iterator]() {
|
|
84394
|
-
let current = this.#head;
|
|
84395
|
-
while (current) {
|
|
84396
|
-
yield current.value;
|
|
84397
|
-
current = current.next;
|
|
84398
|
-
}
|
|
84399
|
-
}
|
|
84400
|
-
*drain() {
|
|
84401
|
-
while (this.#head) {
|
|
84402
|
-
yield this.dequeue();
|
|
84403
|
-
}
|
|
84404
|
-
}
|
|
84405
|
-
}
|
|
84406
|
-
|
|
84407
|
-
// node_modules/p-limit/index.js
|
|
84408
|
-
function pLimit(concurrency) {
|
|
84409
|
-
validateConcurrency(concurrency);
|
|
84410
|
-
const queue = new Queue;
|
|
84411
|
-
let activeCount = 0;
|
|
84412
|
-
const resumeNext = () => {
|
|
84413
|
-
if (activeCount < concurrency && queue.size > 0) {
|
|
84414
|
-
activeCount++;
|
|
84415
|
-
queue.dequeue()();
|
|
84416
|
-
}
|
|
84417
|
-
};
|
|
84418
|
-
const next = () => {
|
|
84419
|
-
activeCount--;
|
|
84420
|
-
resumeNext();
|
|
84421
|
-
};
|
|
84422
|
-
const run = async (function_, resolve25, arguments_) => {
|
|
84423
|
-
const result = (async () => function_(...arguments_))();
|
|
84424
|
-
resolve25(result);
|
|
84425
|
-
try {
|
|
84426
|
-
await result;
|
|
84427
|
-
} catch {}
|
|
84428
|
-
next();
|
|
84429
|
-
};
|
|
84430
|
-
const enqueue = (function_, resolve25, arguments_) => {
|
|
84431
|
-
new Promise((internalResolve) => {
|
|
84432
|
-
queue.enqueue(internalResolve);
|
|
84433
|
-
}).then(run.bind(undefined, function_, resolve25, arguments_));
|
|
84434
|
-
if (activeCount < concurrency) {
|
|
84435
|
-
resumeNext();
|
|
84436
|
-
}
|
|
84437
|
-
};
|
|
84438
|
-
const generator = (function_, ...arguments_) => new Promise((resolve25) => {
|
|
84439
|
-
enqueue(function_, resolve25, arguments_);
|
|
84440
|
-
});
|
|
84441
|
-
Object.defineProperties(generator, {
|
|
84442
|
-
activeCount: {
|
|
84443
|
-
get: () => activeCount
|
|
84444
|
-
},
|
|
84445
|
-
pendingCount: {
|
|
84446
|
-
get: () => queue.size
|
|
84447
|
-
},
|
|
84448
|
-
clearQueue: {
|
|
84449
|
-
value() {
|
|
84450
|
-
queue.clear();
|
|
84451
|
-
}
|
|
84452
|
-
},
|
|
84453
|
-
concurrency: {
|
|
84454
|
-
get: () => concurrency,
|
|
84455
|
-
set(newConcurrency) {
|
|
84456
|
-
validateConcurrency(newConcurrency);
|
|
84457
|
-
concurrency = newConcurrency;
|
|
84458
|
-
queueMicrotask(() => {
|
|
84459
|
-
while (activeCount < concurrency && queue.size > 0) {
|
|
84460
|
-
resumeNext();
|
|
84461
|
-
}
|
|
84462
|
-
});
|
|
84463
|
-
}
|
|
84464
|
-
},
|
|
84465
|
-
map: {
|
|
84466
|
-
async value(iterable, function_) {
|
|
84467
|
-
const promises2 = Array.from(iterable, (value, index) => this(function_, value, index));
|
|
84468
|
-
return Promise.all(promises2);
|
|
84469
|
-
}
|
|
84470
|
-
}
|
|
84471
|
-
});
|
|
84472
|
-
return generator;
|
|
84473
|
-
}
|
|
84474
|
-
function validateConcurrency(concurrency) {
|
|
84475
|
-
if (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {
|
|
84476
|
-
throw new TypeError("Expected `concurrency` to be a number from 1 and up");
|
|
84477
|
-
}
|
|
84478
|
-
}
|
|
84479
|
-
|
|
84480
84653
|
// src/shared/concurrent-file-ops.ts
|
|
84654
|
+
init_p_limit();
|
|
84481
84655
|
var DEFAULT_CONCURRENCY = 50;
|
|
84482
84656
|
async function mapWithLimit(items, fn, concurrency = DEFAULT_CONCURRENCY) {
|
|
84483
84657
|
const limit = pLimit(concurrency);
|
|
@@ -97202,7 +97376,7 @@ class FileScanner {
|
|
|
97202
97376
|
|
|
97203
97377
|
// src/domains/installation/merger/settings-processor.ts
|
|
97204
97378
|
import { execSync as execSync5 } from "node:child_process";
|
|
97205
|
-
import { homedir as
|
|
97379
|
+
import { homedir as homedir42 } from "node:os";
|
|
97206
97380
|
import { dirname as dirname31, join as join105 } from "node:path";
|
|
97207
97381
|
|
|
97208
97382
|
// src/domains/config/installed-settings-tracker.ts
|
|
@@ -97688,7 +97862,7 @@ class SettingsProcessor {
|
|
|
97688
97862
|
return false;
|
|
97689
97863
|
}
|
|
97690
97864
|
const configuredGlobalDir = PathResolver.getGlobalKitDir().replace(/\\/g, "/").replace(/\/+$/, "");
|
|
97691
|
-
const defaultGlobalDir = join105(
|
|
97865
|
+
const defaultGlobalDir = join105(homedir42(), ".claude").replace(/\\/g, "/");
|
|
97692
97866
|
return configuredGlobalDir !== defaultGlobalDir;
|
|
97693
97867
|
}
|
|
97694
97868
|
getClaudeCommandRoot() {
|
|
@@ -98107,6 +98281,7 @@ class ReleaseManifestLoader {
|
|
|
98107
98281
|
init_environment();
|
|
98108
98282
|
init_logger();
|
|
98109
98283
|
init_safe_spinner();
|
|
98284
|
+
init_p_limit();
|
|
98110
98285
|
|
|
98111
98286
|
// src/services/file-operations/manifest/manifest-updater.ts
|
|
98112
98287
|
init_metadata_migration();
|
|
@@ -102340,7 +102515,7 @@ async function transformFolderPaths(extractDir, folders, options2 = {}) {
|
|
|
102340
102515
|
// src/services/transformers/global-path-transformer.ts
|
|
102341
102516
|
init_logger();
|
|
102342
102517
|
import { readFile as readFile57, readdir as readdir41, writeFile as writeFile32 } from "node:fs/promises";
|
|
102343
|
-
import { homedir as
|
|
102518
|
+
import { homedir as homedir43, platform as platform15 } from "node:os";
|
|
102344
102519
|
import { extname as extname6, join as join133 } from "node:path";
|
|
102345
102520
|
var IS_WINDOWS3 = platform15() === "win32";
|
|
102346
102521
|
var HOME_PREFIX = IS_WINDOWS3 ? "%USERPROFILE%" : "$HOME";
|
|
@@ -102351,7 +102526,7 @@ function normalizeInstallPath(path16) {
|
|
|
102351
102526
|
return path16.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
102352
102527
|
}
|
|
102353
102528
|
function getDefaultGlobalClaudeDir() {
|
|
102354
|
-
return normalizeInstallPath(join133(
|
|
102529
|
+
return normalizeInstallPath(join133(homedir43(), ".claude"));
|
|
102355
102530
|
}
|
|
102356
102531
|
function getCustomGlobalClaudeDir(targetClaudeDir) {
|
|
102357
102532
|
if (!targetClaudeDir)
|
|
@@ -102762,7 +102937,7 @@ init_dist2();
|
|
|
102762
102937
|
var import_picocolors28 = __toESM(require_picocolors(), 1);
|
|
102763
102938
|
import { existsSync as existsSync61 } from "node:fs";
|
|
102764
102939
|
import { readFile as readFile58, rm as rm15, unlink as unlink12 } from "node:fs/promises";
|
|
102765
|
-
import { homedir as
|
|
102940
|
+
import { homedir as homedir44 } from "node:os";
|
|
102766
102941
|
import { basename as basename23, join as join135, resolve as resolve34 } from "node:path";
|
|
102767
102942
|
init_logger();
|
|
102768
102943
|
init_agents_discovery();
|
|
@@ -103201,7 +103376,7 @@ async function processMetadataDeletions(skillSourcePath, installGlobally) {
|
|
|
103201
103376
|
}
|
|
103202
103377
|
if (!sourceMetadata.deletions || sourceMetadata.deletions.length === 0)
|
|
103203
103378
|
return;
|
|
103204
|
-
const claudeDir3 = installGlobally ? join135(
|
|
103379
|
+
const claudeDir3 = installGlobally ? join135(homedir44(), ".claude") : join135(process.cwd(), ".claude");
|
|
103205
103380
|
if (!existsSync61(claudeDir3))
|
|
103206
103381
|
return;
|
|
103207
103382
|
try {
|
|
@@ -103357,7 +103532,7 @@ async function migrateCommand(options2) {
|
|
|
103357
103532
|
let installGlobally = options2.global ?? false;
|
|
103358
103533
|
if (options2.global === undefined && !options2.yes) {
|
|
103359
103534
|
const projectTarget = join135(process.cwd(), ".claude");
|
|
103360
|
-
const globalTarget = join135(
|
|
103535
|
+
const globalTarget = join135(homedir44(), ".claude");
|
|
103361
103536
|
const scopeChoice = await ie({
|
|
103362
103537
|
message: "Installation scope",
|
|
103363
103538
|
options: [
|
|
@@ -103409,7 +103584,7 @@ async function migrateCommand(options2) {
|
|
|
103409
103584
|
}
|
|
103410
103585
|
const providerNames = selectedProviders.map((prov) => import_picocolors28.default.cyan(providers[prov].displayName)).join(", ");
|
|
103411
103586
|
f2.message(` Providers: ${providerNames}`);
|
|
103412
|
-
const targetDir = installGlobally ? join135(
|
|
103587
|
+
const targetDir = installGlobally ? join135(homedir44(), ".claude") : join135(process.cwd(), ".claude");
|
|
103413
103588
|
f2.message(` Scope: ${installGlobally ? "Global" : "Project"} ${import_picocolors28.default.dim(`-> ${targetDir}`)}`);
|
|
103414
103589
|
const cmdProviders = getProvidersSupporting("commands");
|
|
103415
103590
|
const unsupportedCmd = selectedProviders.filter((pv) => !cmdProviders.includes(pv));
|
|
@@ -104498,7 +104673,7 @@ async function handleKanban(target, options2) {
|
|
|
104498
104673
|
process.exitCode = 1;
|
|
104499
104674
|
return;
|
|
104500
104675
|
}
|
|
104501
|
-
logger.info("Starting ClaudeKit Dashboard (
|
|
104676
|
+
logger.info("Starting ClaudeKit Dashboard (Plans kanban view)...");
|
|
104502
104677
|
const { port, dev = false } = options2;
|
|
104503
104678
|
const noOpen = options2.open === false;
|
|
104504
104679
|
let server;
|
|
@@ -104510,7 +104685,7 @@ async function handleKanban(target, options2) {
|
|
|
104510
104685
|
process.exitCode = 1;
|
|
104511
104686
|
return;
|
|
104512
104687
|
}
|
|
104513
|
-
const route = `/plans
|
|
104688
|
+
const route = `/plans?dir=${encodeURIComponent(dirname36(dirname36(planFile)))}&view=kanban`;
|
|
104514
104689
|
const url = `http://localhost:${server.port}${route}`;
|
|
104515
104690
|
console.log();
|
|
104516
104691
|
console.log(import_picocolors30.default.bold(" ClaudeKit Dashboard — Plans"));
|
|
@@ -108067,7 +108242,7 @@ async function scanForRepos(parentDir) {
|
|
|
108067
108242
|
init_logger();
|
|
108068
108243
|
import { spawnSync as spawnSync8 } from "node:child_process";
|
|
108069
108244
|
import { existsSync as existsSync69 } from "node:fs";
|
|
108070
|
-
import { homedir as
|
|
108245
|
+
import { homedir as homedir45 } from "node:os";
|
|
108071
108246
|
import { join as join148 } from "node:path";
|
|
108072
108247
|
async function validateSetup(cwd2) {
|
|
108073
108248
|
const workDir = cwd2 ?? process.cwd();
|
|
@@ -108099,7 +108274,7 @@ Run this command from a directory with a GitHub remote.`);
|
|
|
108099
108274
|
} catch {
|
|
108100
108275
|
throw new Error(`Failed to parse repository info: ${ghRepo.stdout}`);
|
|
108101
108276
|
}
|
|
108102
|
-
const skillsPath = join148(
|
|
108277
|
+
const skillsPath = join148(homedir45(), ".claude", "skills");
|
|
108103
108278
|
const skillsAvailable = existsSync69(skillsPath);
|
|
108104
108279
|
if (!skillsAvailable) {
|
|
108105
108280
|
logger.warning(`ClaudeKit Engineer skills not found at ${skillsPath}`);
|