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
- return Buffer.from(projectId.slice("discovered-".length), "base64url").toString("utf-8");
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
- roots.push(resolveProjectPlansDir(projectPath, config));
57230
- roots.push(resolveGlobalPlansDir(config));
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 homedir28 } from "node:os";
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(homedir28(), ".claude"))
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(homedir28(), ".claude");
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(homedir28(), projectPath.slice(1));
57920
+ projectPath = join53(homedir29(), projectPath.slice(1));
57610
57921
  } else if (projectPath.startsWith("~\\")) {
57611
- projectPath = join53(homedir28(), projectPath.slice(1));
57922
+ projectPath = join53(homedir29(), projectPath.slice(1));
57612
57923
  }
57613
57924
  projectPath = resolve18(projectPath);
57614
- const homeDir = homedir28();
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(homedir28(), ".claude");
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(homedir28(), ".claude", "settings.json");
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(homedir28(), ".claude", "settings.json");
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 homedir29 } from "node:os";
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 = homedir29();
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 = homedir29();
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 = homedir29();
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(homedir29(), ".claude", "projects");
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(homedir29(), ".claude", "projects");
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 homedir30 } from "node:os";
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(homedir30(), "~") : null,
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 homedir31 } from "node:os";
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(homedir31(), ".claude", ".skills-catalog.json");
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 homedir33, platform as platform5 } from "node:os";
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 = homedir33();
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 homedir34 } from "node:os";
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 = homedir34();
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 homedir35 } from "node:os";
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(homedir35(), ".gemini/skills")
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.16",
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 homedir36, totalmem } from "node:os";
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: homedir36(),
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 homedir40 } from "node:os";
69086
+ import { homedir as homedir41 } from "node:os";
68774
69087
  import { join as join89 } from "node:path";
68775
69088
  function getGlobalMcpConfigPath() {
68776
- return join89(homedir40(), ".claude", ".mcp.json");
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(homedir40(), ".gemini", "settings.json");
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 homedir45 } from "node:os";
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(homedir45(), ".claudekit", "cache");
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 homedir46 } from "node:os";
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(/^~/, homedir46()), "media", String(contentId));
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 homedir47 } from "node:os";
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(homedir47(), ".claudekit", "logs");
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 homedir48 } from "node:os";
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(/^~/, homedir48());
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(/^~/, homedir48());
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(/^~/, homedir48());
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 homedir49 } from "node:os";
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(homedir49(), ".claudekit", "logs");
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(homedir49(), ".claudekit", "locks");
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 homedir50 } from "node:os";
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(/^~/, homedir50());
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(homedir50(), ".claudekit", "locks");
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 homedir37 } from "node:os";
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 = homedir37();
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 homedir38, tmpdir } from "node:os";
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(homedir38(), ".claude").replace(/\\/g, "/");
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 homedir39, platform as platform7 } from "node:os";
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(homedir39());
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 homedir41 } from "node:os";
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(homedir41(), ".claude").replace(/\\/g, "/");
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 homedir42, platform as platform15 } from "node:os";
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(homedir42(), ".claude"));
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 homedir43 } from "node:os";
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(homedir43(), ".claude") : join135(process.cwd(), ".claude");
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(homedir43(), ".claude");
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(homedir43(), ".claude") : join135(process.cwd(), ".claude");
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 (Kanban view)...");
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/${encodeURIComponent(basename24(dirname36(planFile)))}?dir=${encodeURIComponent(dirname36(dirname36(planFile)))}`;
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 homedir44 } from "node:os";
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(homedir44(), ".claude", "skills");
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}`);