claudekit-cli 3.41.4-dev.43 → 3.41.4-dev.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/cli-manifest.json +2128 -0
  2. package/dist/index.js +1744 -783
  3. package/package.json +8 -3
package/dist/index.js CHANGED
@@ -6907,6 +6907,9 @@ var init_checksum_utils = __esm(() => {
6907
6907
  function setTaxonomyOverrides(overrides) {
6908
6908
  userOverrides = overrides;
6909
6909
  }
6910
+ function getOpenCodeDefaultModelOverride() {
6911
+ return userOverrides?.opencode?.default?.model;
6912
+ }
6910
6913
  function resolveModel(sourceModel, targetProvider) {
6911
6914
  if (sourceModel === undefined || sourceModel === null) {
6912
6915
  return { resolved: null };
@@ -6941,7 +6944,7 @@ function resolveModel(sourceModel, targetProvider) {
6941
6944
  }
6942
6945
  return { resolved: providerMap[tier] };
6943
6946
  }
6944
- var SOURCE_TIER_MAP, DEFAULT_PROVIDER_MODEL_MAP, userOverrides;
6947
+ var OPENCODE_DEFAULT_MODEL = "anthropic/claude-sonnet-4-6", SOURCE_TIER_MAP, DEFAULT_PROVIDER_MODEL_MAP, userOverrides;
6945
6948
  var init_model_taxonomy = __esm(() => {
6946
6949
  SOURCE_TIER_MAP = {
6947
6950
  opus: "heavy",
@@ -60755,7 +60758,7 @@ var package_default;
60755
60758
  var init_package = __esm(() => {
60756
60759
  package_default = {
60757
60760
  name: "claudekit-cli",
60758
- version: "3.41.4-dev.43",
60761
+ version: "3.41.4-dev.45",
60759
60762
  description: "CLI tool for bootstrapping and updating ClaudeKit projects",
60760
60763
  type: "module",
60761
60764
  repository: {
@@ -60772,7 +60775,8 @@ var init_package = __esm(() => {
60772
60775
  files: [
60773
60776
  "bin/ck.js",
60774
60777
  "dist/index.js",
60775
- "dist/ui/"
60778
+ "dist/ui/",
60779
+ "cli-manifest.json"
60776
60780
  ],
60777
60781
  scripts: {
60778
60782
  tauri: "tauri",
@@ -60807,7 +60811,11 @@ var init_package = __esm(() => {
60807
60811
  metrics: "bun run scripts/workflow-metrics.ts",
60808
60812
  validate: "bun run typecheck && bun run lint && bun run desktop:check-sync && bun run desktop:validate-config && bun run desktop:validate-icons && bun test && bun run ui:test && bun run build",
60809
60813
  "install:hooks": "./.githooks/install.sh",
60810
- 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)}"`
60814
+ 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)}"`,
60815
+ "help:check-parity": "bun run scripts/check-help-parity.ts",
60816
+ "manifest:generate": "bun run scripts/generate-cli-manifest.ts",
60817
+ "docs:generate": "bun run scripts/generate-cli-reference.ts",
60818
+ prepublishOnly: "bun run help:check-parity && bun run manifest:generate && bun run docs:generate"
60811
60819
  },
60812
60820
  keywords: [
60813
60821
  "cli",
@@ -71880,10 +71888,10 @@ __export(exports_worktree_manager, {
71880
71888
  cleanupAllWorktrees: () => cleanupAllWorktrees
71881
71889
  });
71882
71890
  import { existsSync as existsSync67 } from "node:fs";
71883
- import { readFile as readFile61, writeFile as writeFile33 } from "node:fs/promises";
71884
- import { join as join148 } from "node:path";
71891
+ import { readFile as readFile62, writeFile as writeFile34 } from "node:fs/promises";
71892
+ import { join as join149 } from "node:path";
71885
71893
  async function createWorktree(projectDir, issueNumber, baseBranch) {
71886
- const worktreePath = join148(projectDir, WORKTREE_DIR, `issue-${issueNumber}`);
71894
+ const worktreePath = join149(projectDir, WORKTREE_DIR, `issue-${issueNumber}`);
71887
71895
  const branchName = `ck-watch/issue-${issueNumber}`;
71888
71896
  await spawnAndCollect("git", ["fetch", "origin", baseBranch], projectDir).catch(() => {
71889
71897
  logger.warning(`[worktree] Could not fetch origin/${baseBranch}, using local`);
@@ -71901,7 +71909,7 @@ async function createWorktree(projectDir, issueNumber, baseBranch) {
71901
71909
  return worktreePath;
71902
71910
  }
71903
71911
  async function removeWorktree(projectDir, issueNumber) {
71904
- const worktreePath = join148(projectDir, WORKTREE_DIR, `issue-${issueNumber}`);
71912
+ const worktreePath = join149(projectDir, WORKTREE_DIR, `issue-${issueNumber}`);
71905
71913
  const branchName = `ck-watch/issue-${issueNumber}`;
71906
71914
  try {
71907
71915
  await spawnAndCollect("git", ["worktree", "remove", worktreePath, "--force"], projectDir);
@@ -71915,7 +71923,7 @@ async function listActiveWorktrees(projectDir) {
71915
71923
  try {
71916
71924
  const output2 = await spawnAndCollect("git", ["worktree", "list", "--porcelain"], projectDir);
71917
71925
  const issueNumbers = [];
71918
- const worktreePrefix = join148(projectDir, WORKTREE_DIR, "issue-").replace(/\\/g, "/");
71926
+ const worktreePrefix = join149(projectDir, WORKTREE_DIR, "issue-").replace(/\\/g, "/");
71919
71927
  for (const line of output2.split(`
71920
71928
  `)) {
71921
71929
  if (line.startsWith("worktree ")) {
@@ -71943,16 +71951,16 @@ async function cleanupAllWorktrees(projectDir) {
71943
71951
  await spawnAndCollect("git", ["worktree", "prune"], projectDir).catch(() => {});
71944
71952
  }
71945
71953
  async function ensureGitignore(projectDir) {
71946
- const gitignorePath = join148(projectDir, ".gitignore");
71954
+ const gitignorePath = join149(projectDir, ".gitignore");
71947
71955
  try {
71948
- const content = existsSync67(gitignorePath) ? await readFile61(gitignorePath, "utf-8") : "";
71956
+ const content = existsSync67(gitignorePath) ? await readFile62(gitignorePath, "utf-8") : "";
71949
71957
  if (!content.includes(".worktrees")) {
71950
71958
  const newContent = content.endsWith(`
71951
71959
  `) ? `${content}.worktrees/
71952
71960
  ` : `${content}
71953
71961
  .worktrees/
71954
71962
  `;
71955
- await writeFile33(gitignorePath, newContent, "utf-8");
71963
+ await writeFile34(gitignorePath, newContent, "utf-8");
71956
71964
  logger.info("[worktree] Added .worktrees/ to .gitignore");
71957
71965
  }
71958
71966
  } catch (err) {
@@ -72048,9 +72056,9 @@ var init_content_validator = __esm(() => {
72048
72056
  // src/commands/content/phases/context-cache-manager.ts
72049
72057
  import { createHash as createHash8 } from "node:crypto";
72050
72058
  import { existsSync as existsSync73, mkdirSync as mkdirSync5, readFileSync as readFileSync18, readdirSync as readdirSync10, statSync as statSync13 } from "node:fs";
72051
- import { rename as rename12, writeFile as writeFile35 } from "node:fs/promises";
72052
- import { homedir as homedir48 } from "node:os";
72053
- import { basename as basename30, join as join155 } from "node:path";
72059
+ import { rename as rename12, writeFile as writeFile36 } from "node:fs/promises";
72060
+ import { homedir as homedir49 } from "node:os";
72061
+ import { basename as basename30, join as join156 } from "node:path";
72054
72062
  function getCachedContext(repoPath) {
72055
72063
  const cachePath = getCacheFilePath(repoPath);
72056
72064
  if (!existsSync73(cachePath))
@@ -72075,7 +72083,7 @@ async function saveCachedContext(repoPath, cache5) {
72075
72083
  }
72076
72084
  const cachePath = getCacheFilePath(repoPath);
72077
72085
  const tmpPath = `${cachePath}.tmp`;
72078
- await writeFile35(tmpPath, JSON.stringify(cache5, null, 2), "utf-8");
72086
+ await writeFile36(tmpPath, JSON.stringify(cache5, null, 2), "utf-8");
72079
72087
  await rename12(tmpPath, cachePath);
72080
72088
  }
72081
72089
  function computeSourceHash(repoPath) {
@@ -72093,25 +72101,25 @@ function computeSourceHash(repoPath) {
72093
72101
  }
72094
72102
  function getDocSourcePaths(repoPath) {
72095
72103
  const paths = [];
72096
- const docsDir = join155(repoPath, "docs");
72104
+ const docsDir = join156(repoPath, "docs");
72097
72105
  if (existsSync73(docsDir)) {
72098
72106
  try {
72099
72107
  const files = readdirSync10(docsDir);
72100
72108
  for (const f3 of files) {
72101
72109
  if (f3.endsWith(".md"))
72102
- paths.push(join155(docsDir, f3));
72110
+ paths.push(join156(docsDir, f3));
72103
72111
  }
72104
72112
  } catch {}
72105
72113
  }
72106
- const readme = join155(repoPath, "README.md");
72114
+ const readme = join156(repoPath, "README.md");
72107
72115
  if (existsSync73(readme))
72108
72116
  paths.push(readme);
72109
- const stylesDir = join155(repoPath, "assets", "writing-styles");
72117
+ const stylesDir = join156(repoPath, "assets", "writing-styles");
72110
72118
  if (existsSync73(stylesDir)) {
72111
72119
  try {
72112
72120
  const files = readdirSync10(stylesDir);
72113
72121
  for (const f3 of files) {
72114
- paths.push(join155(stylesDir, f3));
72122
+ paths.push(join156(stylesDir, f3));
72115
72123
  }
72116
72124
  } catch {}
72117
72125
  }
@@ -72120,11 +72128,11 @@ function getDocSourcePaths(repoPath) {
72120
72128
  function getCacheFilePath(repoPath) {
72121
72129
  const repoName = basename30(repoPath).replace(/[^a-zA-Z0-9_-]/g, "_");
72122
72130
  const pathHash = createHash8("sha256").update(repoPath).digest("hex").slice(0, 8);
72123
- return join155(CACHE_DIR, `${repoName}-${pathHash}-context-cache.json`);
72131
+ return join156(CACHE_DIR, `${repoName}-${pathHash}-context-cache.json`);
72124
72132
  }
72125
72133
  var CACHE_DIR, CACHE_TTL_MS4;
72126
72134
  var init_context_cache_manager = __esm(() => {
72127
- CACHE_DIR = join155(homedir48(), ".claudekit", "cache");
72135
+ CACHE_DIR = join156(homedir49(), ".claudekit", "cache");
72128
72136
  CACHE_TTL_MS4 = 24 * 60 * 60 * 1000;
72129
72137
  });
72130
72138
 
@@ -72305,7 +72313,7 @@ function extractContentFromResponse(response) {
72305
72313
  // src/commands/content/phases/docs-summarizer.ts
72306
72314
  import { execSync as execSync7 } from "node:child_process";
72307
72315
  import { existsSync as existsSync74, readFileSync as readFileSync19, readdirSync as readdirSync11 } from "node:fs";
72308
- import { join as join156 } from "node:path";
72316
+ import { join as join157 } from "node:path";
72309
72317
  async function summarizeProjectDocs(repoPath, contentLogger) {
72310
72318
  const rawContent = collectRawDocs(repoPath);
72311
72319
  if (rawContent.total.length < 200) {
@@ -72359,12 +72367,12 @@ function collectRawDocs(repoPath) {
72359
72367
  return capped;
72360
72368
  };
72361
72369
  const docsContent = [];
72362
- const docsDir = join156(repoPath, "docs");
72370
+ const docsDir = join157(repoPath, "docs");
72363
72371
  if (existsSync74(docsDir)) {
72364
72372
  try {
72365
72373
  const files = readdirSync11(docsDir).filter((f3) => f3.endsWith(".md")).sort();
72366
72374
  for (const f3 of files) {
72367
- const content = readCapped(join156(docsDir, f3), 5000);
72375
+ const content = readCapped(join157(docsDir, f3), 5000);
72368
72376
  if (content) {
72369
72377
  docsContent.push(`### ${f3}
72370
72378
  ${content}`);
@@ -72378,21 +72386,21 @@ ${content}`);
72378
72386
  let brand = "";
72379
72387
  const brandCandidates = ["docs/brand-guidelines.md", "docs/design-guidelines.md"];
72380
72388
  for (const p of brandCandidates) {
72381
- brand = readCapped(join156(repoPath, p), 3000);
72389
+ brand = readCapped(join157(repoPath, p), 3000);
72382
72390
  if (brand)
72383
72391
  break;
72384
72392
  }
72385
72393
  let styles3 = "";
72386
- const stylesDir = join156(repoPath, "assets", "writing-styles");
72394
+ const stylesDir = join157(repoPath, "assets", "writing-styles");
72387
72395
  if (existsSync74(stylesDir)) {
72388
72396
  try {
72389
72397
  const files = readdirSync11(stylesDir).slice(0, 3);
72390
- styles3 = files.map((f3) => readCapped(join156(stylesDir, f3), 1000)).filter(Boolean).join(`
72398
+ styles3 = files.map((f3) => readCapped(join157(stylesDir, f3), 1000)).filter(Boolean).join(`
72391
72399
 
72392
72400
  `);
72393
72401
  } catch {}
72394
72402
  }
72395
- const readme = readCapped(join156(repoPath, "README.md"), 3000);
72403
+ const readme = readCapped(join157(repoPath, "README.md"), 3000);
72396
72404
  const total = [docs, brand, styles3, readme].join(`
72397
72405
  `);
72398
72406
  return { docs, brand, styles: styles3, readme, total };
@@ -72578,10 +72586,10 @@ IMPORTANT: Generate the image and output the path as JSON: {"imagePath": "/path/
72578
72586
  // src/commands/content/phases/photo-generator.ts
72579
72587
  import { execSync as execSync8 } from "node:child_process";
72580
72588
  import { existsSync as existsSync75, mkdirSync as mkdirSync6, readdirSync as readdirSync12 } from "node:fs";
72581
- import { homedir as homedir49 } from "node:os";
72582
- import { join as join157 } from "node:path";
72589
+ import { homedir as homedir50 } from "node:os";
72590
+ import { join as join158 } from "node:path";
72583
72591
  async function generatePhoto(_content, context, config, platform17, contentId, contentLogger) {
72584
- const mediaDir = join157(config.contentDir.replace(/^~/, homedir49()), "media", String(contentId));
72592
+ const mediaDir = join158(config.contentDir.replace(/^~/, homedir50()), "media", String(contentId));
72585
72593
  if (!existsSync75(mediaDir)) {
72586
72594
  mkdirSync6(mediaDir, { recursive: true });
72587
72595
  }
@@ -72606,7 +72614,7 @@ async function generatePhoto(_content, context, config, platform17, contentId, c
72606
72614
  const imageFile = files.find((f3) => /\.(png|jpg|jpeg|webp)$/i.test(f3));
72607
72615
  if (imageFile) {
72608
72616
  const ext2 = imageFile.split(".").pop() ?? "png";
72609
- return { path: join157(mediaDir, imageFile), ...dimensions, format: ext2 };
72617
+ return { path: join158(mediaDir, imageFile), ...dimensions, format: ext2 };
72610
72618
  }
72611
72619
  contentLogger.warn(`Photo generation produced no image for content ${contentId}`);
72612
72620
  return null;
@@ -72695,8 +72703,8 @@ var init_content_creator = __esm(() => {
72695
72703
 
72696
72704
  // src/commands/content/phases/content-logger.ts
72697
72705
  import { createWriteStream as createWriteStream4, existsSync as existsSync76, mkdirSync as mkdirSync7, statSync as statSync14 } from "node:fs";
72698
- import { homedir as homedir50 } from "node:os";
72699
- import { join as join158 } from "node:path";
72706
+ import { homedir as homedir51 } from "node:os";
72707
+ import { join as join159 } from "node:path";
72700
72708
 
72701
72709
  class ContentLogger {
72702
72710
  stream = null;
@@ -72704,7 +72712,7 @@ class ContentLogger {
72704
72712
  logDir;
72705
72713
  maxBytes;
72706
72714
  constructor(maxBytes = 0) {
72707
- this.logDir = join158(homedir50(), ".claudekit", "logs");
72715
+ this.logDir = join159(homedir51(), ".claudekit", "logs");
72708
72716
  this.maxBytes = maxBytes;
72709
72717
  }
72710
72718
  init() {
@@ -72736,7 +72744,7 @@ class ContentLogger {
72736
72744
  }
72737
72745
  }
72738
72746
  getLogPath() {
72739
- return join158(this.logDir, `content-${this.getDateStr()}.log`);
72747
+ return join159(this.logDir, `content-${this.getDateStr()}.log`);
72740
72748
  }
72741
72749
  write(level, message) {
72742
72750
  this.rotateIfNeeded();
@@ -72753,18 +72761,18 @@ class ContentLogger {
72753
72761
  if (dateStr !== this.currentDate) {
72754
72762
  this.close();
72755
72763
  this.currentDate = dateStr;
72756
- const logPath = join158(this.logDir, `content-${dateStr}.log`);
72764
+ const logPath = join159(this.logDir, `content-${dateStr}.log`);
72757
72765
  this.stream = createWriteStream4(logPath, { flags: "a", mode: 384 });
72758
72766
  return;
72759
72767
  }
72760
72768
  if (this.maxBytes > 0 && this.stream) {
72761
- const logPath = join158(this.logDir, `content-${this.currentDate}.log`);
72769
+ const logPath = join159(this.logDir, `content-${this.currentDate}.log`);
72762
72770
  try {
72763
72771
  const stat25 = statSync14(logPath);
72764
72772
  if (stat25.size >= this.maxBytes) {
72765
72773
  this.close();
72766
72774
  const suffix = Date.now();
72767
- const rotatedPath = join158(this.logDir, `content-${this.currentDate}-${suffix}.log`);
72775
+ const rotatedPath = join159(this.logDir, `content-${this.currentDate}-${suffix}.log`);
72768
72776
  import("node:fs/promises").then(({ rename: rename13 }) => rename13(logPath, rotatedPath).catch(() => {}));
72769
72777
  this.stream = createWriteStream4(logPath, { flags: "w", mode: 384 });
72770
72778
  }
@@ -72802,7 +72810,7 @@ var init_sqlite_client = () => {};
72802
72810
 
72803
72811
  // src/commands/content/phases/db-manager.ts
72804
72812
  import { existsSync as existsSync77, mkdirSync as mkdirSync8 } from "node:fs";
72805
- import { dirname as dirname45 } from "node:path";
72813
+ import { dirname as dirname46 } from "node:path";
72806
72814
  function initDatabase(dbPath) {
72807
72815
  ensureParentDir(dbPath);
72808
72816
  const db = openDatabase(dbPath);
@@ -72823,7 +72831,7 @@ function runRetentionCleanup(db, retentionDays = 90) {
72823
72831
  db.prepare("DELETE FROM git_events WHERE processed = 1 AND created_at < ?").run(cutoff);
72824
72832
  }
72825
72833
  function ensureParentDir(dbPath) {
72826
- const dir = dirname45(dbPath);
72834
+ const dir = dirname46(dbPath);
72827
72835
  if (dir && !existsSync77(dir)) {
72828
72836
  mkdirSync8(dir, { recursive: true });
72829
72837
  }
@@ -72990,7 +72998,7 @@ function isNoiseCommit(title, author) {
72990
72998
  // src/commands/content/phases/change-detector.ts
72991
72999
  import { execSync as execSync10, spawnSync as spawnSync9 } from "node:child_process";
72992
73000
  import { existsSync as existsSync78, readFileSync as readFileSync20, readdirSync as readdirSync13, statSync as statSync15 } from "node:fs";
72993
- import { join as join159 } from "node:path";
73001
+ import { join as join160 } from "node:path";
72994
73002
  function detectCommits(repo, since) {
72995
73003
  try {
72996
73004
  const fetchUrl = sshToHttps(repo.remoteUrl);
@@ -73099,7 +73107,7 @@ function detectTags(repo, since) {
73099
73107
  }
73100
73108
  }
73101
73109
  function detectCompletedPlans(repo, since) {
73102
- const plansDir = join159(repo.path, "plans");
73110
+ const plansDir = join160(repo.path, "plans");
73103
73111
  if (!existsSync78(plansDir))
73104
73112
  return [];
73105
73113
  const sinceMs = new Date(since).getTime();
@@ -73109,7 +73117,7 @@ function detectCompletedPlans(repo, since) {
73109
73117
  for (const entry of entries) {
73110
73118
  if (!entry.isDirectory())
73111
73119
  continue;
73112
- const planFile = join159(plansDir, entry.name, "plan.md");
73120
+ const planFile = join160(plansDir, entry.name, "plan.md");
73113
73121
  if (!existsSync78(planFile))
73114
73122
  continue;
73115
73123
  try {
@@ -73187,7 +73195,7 @@ function classifyCommit(event) {
73187
73195
  // src/commands/content/phases/repo-discoverer.ts
73188
73196
  import { execSync as execSync11 } from "node:child_process";
73189
73197
  import { readdirSync as readdirSync14 } from "node:fs";
73190
- import { join as join160 } from "node:path";
73198
+ import { join as join161 } from "node:path";
73191
73199
  function discoverRepos2(cwd2) {
73192
73200
  const repos = [];
73193
73201
  if (isGitRepoRoot(cwd2)) {
@@ -73200,7 +73208,7 @@ function discoverRepos2(cwd2) {
73200
73208
  for (const entry of entries) {
73201
73209
  if (!entry.isDirectory() || entry.name.startsWith("."))
73202
73210
  continue;
73203
- const dirPath = join160(cwd2, entry.name);
73211
+ const dirPath = join161(cwd2, entry.name);
73204
73212
  if (isGitRepoRoot(dirPath)) {
73205
73213
  const info = getRepoInfo(dirPath);
73206
73214
  if (info)
@@ -73867,12 +73875,12 @@ var init_types6 = __esm(() => {
73867
73875
  });
73868
73876
 
73869
73877
  // src/commands/content/phases/state-manager.ts
73870
- import { readFile as readFile63, rename as rename13, writeFile as writeFile36 } from "node:fs/promises";
73871
- import { join as join161 } from "node:path";
73878
+ import { readFile as readFile64, rename as rename13, writeFile as writeFile37 } from "node:fs/promises";
73879
+ import { join as join162 } from "node:path";
73872
73880
  async function loadContentConfig(projectDir) {
73873
- const configPath = join161(projectDir, CK_CONFIG_FILE2);
73881
+ const configPath = join162(projectDir, CK_CONFIG_FILE2);
73874
73882
  try {
73875
- const raw2 = await readFile63(configPath, "utf-8");
73883
+ const raw2 = await readFile64(configPath, "utf-8");
73876
73884
  const json = JSON.parse(raw2);
73877
73885
  return ContentConfigSchema.parse(json.content ?? {});
73878
73886
  } catch {
@@ -73880,15 +73888,15 @@ async function loadContentConfig(projectDir) {
73880
73888
  }
73881
73889
  }
73882
73890
  async function saveContentConfig(projectDir, config) {
73883
- const configPath = join161(projectDir, CK_CONFIG_FILE2);
73891
+ const configPath = join162(projectDir, CK_CONFIG_FILE2);
73884
73892
  const json = await readJsonSafe(configPath);
73885
73893
  json.content = { ...json.content, ...config };
73886
73894
  await atomicWrite(configPath, json);
73887
73895
  }
73888
73896
  async function loadContentState(projectDir) {
73889
- const configPath = join161(projectDir, CK_CONFIG_FILE2);
73897
+ const configPath = join162(projectDir, CK_CONFIG_FILE2);
73890
73898
  try {
73891
- const raw2 = await readFile63(configPath, "utf-8");
73899
+ const raw2 = await readFile64(configPath, "utf-8");
73892
73900
  const json = JSON.parse(raw2);
73893
73901
  const contentBlock = json.content ?? {};
73894
73902
  return ContentStateSchema.parse(contentBlock.state ?? {});
@@ -73897,7 +73905,7 @@ async function loadContentState(projectDir) {
73897
73905
  }
73898
73906
  }
73899
73907
  async function saveContentState(projectDir, state) {
73900
- const configPath = join161(projectDir, CK_CONFIG_FILE2);
73908
+ const configPath = join162(projectDir, CK_CONFIG_FILE2);
73901
73909
  const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
73902
73910
  for (const key of Object.keys(state.dailyPostCounts)) {
73903
73911
  const dateStr = key.slice(-10);
@@ -73915,7 +73923,7 @@ async function saveContentState(projectDir, state) {
73915
73923
  }
73916
73924
  async function readJsonSafe(filePath) {
73917
73925
  try {
73918
- const raw2 = await readFile63(filePath, "utf-8");
73926
+ const raw2 = await readFile64(filePath, "utf-8");
73919
73927
  return JSON.parse(raw2);
73920
73928
  } catch {
73921
73929
  return {};
@@ -73923,7 +73931,7 @@ async function readJsonSafe(filePath) {
73923
73931
  }
73924
73932
  async function atomicWrite(filePath, data) {
73925
73933
  const tmpPath = `${filePath}.tmp`;
73926
- await writeFile36(tmpPath, JSON.stringify(data, null, 2), "utf-8");
73934
+ await writeFile37(tmpPath, JSON.stringify(data, null, 2), "utf-8");
73927
73935
  await rename13(tmpPath, filePath);
73928
73936
  }
73929
73937
  var CK_CONFIG_FILE2 = ".ck.json";
@@ -74179,7 +74187,7 @@ var init_platform_setup_x = __esm(() => {
74179
74187
 
74180
74188
  // src/commands/content/phases/setup-wizard.ts
74181
74189
  import { existsSync as existsSync79 } from "node:fs";
74182
- import { join as join162 } from "node:path";
74190
+ import { join as join163 } from "node:path";
74183
74191
  async function runSetupWizard2(cwd2, contentLogger) {
74184
74192
  console.log();
74185
74193
  oe(import_picocolors43.default.bgCyan(import_picocolors43.default.white(" CK Content — Multi-Channel Content Engine ")));
@@ -74247,8 +74255,8 @@ async function showRepoSummary(cwd2) {
74247
74255
  function detectBrandAssets(cwd2, contentLogger) {
74248
74256
  const repos = discoverRepos2(cwd2);
74249
74257
  for (const repo of repos) {
74250
- const hasGuidelines = existsSync79(join162(repo.path, "docs", "brand-guidelines.md"));
74251
- const hasStyles = existsSync79(join162(repo.path, "assets", "writing-styles"));
74258
+ const hasGuidelines = existsSync79(join163(repo.path, "docs", "brand-guidelines.md"));
74259
+ const hasStyles = existsSync79(join163(repo.path, "assets", "writing-styles"));
74252
74260
  if (!hasGuidelines) {
74253
74261
  f2.warning(`${repo.name}: No docs/brand-guidelines.md — content will use generic tone.`);
74254
74262
  contentLogger.warn(`${repo.name}: missing docs/brand-guidelines.md`);
@@ -74315,11 +74323,11 @@ var init_setup_wizard = __esm(() => {
74315
74323
 
74316
74324
  // src/commands/content/content-review-commands.ts
74317
74325
  import { existsSync as existsSync80 } from "node:fs";
74318
- import { homedir as homedir51 } from "node:os";
74326
+ import { homedir as homedir52 } from "node:os";
74319
74327
  async function queueContent() {
74320
74328
  const cwd2 = process.cwd();
74321
74329
  const config = await loadContentConfig(cwd2);
74322
- const dbPath = config.dbPath.replace(/^~/, homedir51());
74330
+ const dbPath = config.dbPath.replace(/^~/, homedir52());
74323
74331
  if (!existsSync80(dbPath)) {
74324
74332
  logger.info("No content database found. Run 'ck content setup' first.");
74325
74333
  return;
@@ -74346,7 +74354,7 @@ async function queueContent() {
74346
74354
  async function approveContentCmd(id) {
74347
74355
  const cwd2 = process.cwd();
74348
74356
  const config = await loadContentConfig(cwd2);
74349
- const dbPath = config.dbPath.replace(/^~/, homedir51());
74357
+ const dbPath = config.dbPath.replace(/^~/, homedir52());
74350
74358
  const db = initDatabase(dbPath);
74351
74359
  try {
74352
74360
  approveContent(db, Number.parseInt(id, 10));
@@ -74358,7 +74366,7 @@ async function approveContentCmd(id) {
74358
74366
  async function rejectContentCmd(id, reason) {
74359
74367
  const cwd2 = process.cwd();
74360
74368
  const config = await loadContentConfig(cwd2);
74361
- const dbPath = config.dbPath.replace(/^~/, homedir51());
74369
+ const dbPath = config.dbPath.replace(/^~/, homedir52());
74362
74370
  const db = initDatabase(dbPath);
74363
74371
  try {
74364
74372
  rejectContent(db, Number.parseInt(id, 10), reason);
@@ -74389,10 +74397,10 @@ __export(exports_content_subcommands, {
74389
74397
  approveContentCmd: () => approveContentCmd
74390
74398
  });
74391
74399
  import { existsSync as existsSync81, readFileSync as readFileSync21, unlinkSync as unlinkSync6 } from "node:fs";
74392
- import { homedir as homedir52 } from "node:os";
74393
- import { join as join163 } from "node:path";
74400
+ import { homedir as homedir53 } from "node:os";
74401
+ import { join as join164 } from "node:path";
74394
74402
  function isDaemonRunning() {
74395
- const lockFile = join163(LOCK_DIR, `${LOCK_NAME2}.lock`);
74403
+ const lockFile = join164(LOCK_DIR, `${LOCK_NAME2}.lock`);
74396
74404
  if (!existsSync81(lockFile))
74397
74405
  return { running: false, pid: null };
74398
74406
  try {
@@ -74424,7 +74432,7 @@ async function startContent(options2) {
74424
74432
  await contentCommand(options2);
74425
74433
  }
74426
74434
  async function stopContent() {
74427
- const lockFile = join163(LOCK_DIR, `${LOCK_NAME2}.lock`);
74435
+ const lockFile = join164(LOCK_DIR, `${LOCK_NAME2}.lock`);
74428
74436
  if (!existsSync81(lockFile)) {
74429
74437
  logger.info("Content daemon is not running.");
74430
74438
  return;
@@ -74463,9 +74471,9 @@ async function statusContent() {
74463
74471
  } catch {}
74464
74472
  }
74465
74473
  async function logsContent(options2) {
74466
- const logDir = join163(homedir52(), ".claudekit", "logs");
74474
+ const logDir = join164(homedir53(), ".claudekit", "logs");
74467
74475
  const dateStr = new Date().toISOString().slice(0, 10).replace(/-/g, "");
74468
- const logPath = join163(logDir, `content-${dateStr}.log`);
74476
+ const logPath = join164(logDir, `content-${dateStr}.log`);
74469
74477
  if (!existsSync81(logPath)) {
74470
74478
  logger.info("No content logs found for today.");
74471
74479
  return;
@@ -74497,13 +74505,13 @@ var init_content_subcommands = __esm(() => {
74497
74505
  init_setup_wizard();
74498
74506
  init_state_manager();
74499
74507
  init_content_review_commands();
74500
- LOCK_DIR = join163(homedir52(), ".claudekit", "locks");
74508
+ LOCK_DIR = join164(homedir53(), ".claudekit", "locks");
74501
74509
  });
74502
74510
 
74503
74511
  // src/commands/content/content-command.ts
74504
74512
  import { existsSync as existsSync82, mkdirSync as mkdirSync9, unlinkSync as unlinkSync7, writeFileSync as writeFileSync7 } from "node:fs";
74505
- import { homedir as homedir53 } from "node:os";
74506
- import { join as join164 } from "node:path";
74513
+ import { homedir as homedir54 } from "node:os";
74514
+ import { join as join165 } from "node:path";
74507
74515
  async function contentCommand(options2) {
74508
74516
  const cwd2 = process.cwd();
74509
74517
  const contentLogger = new ContentLogger;
@@ -74535,7 +74543,7 @@ async function contentCommand(options2) {
74535
74543
  if (!existsSync82(LOCK_DIR2))
74536
74544
  mkdirSync9(LOCK_DIR2, { recursive: true });
74537
74545
  writeFileSync7(LOCK_FILE, String(process.pid), "utf-8");
74538
- const dbPath = config.dbPath.replace(/^~/, homedir53());
74546
+ const dbPath = config.dbPath.replace(/^~/, homedir54());
74539
74547
  const db = initDatabase(dbPath);
74540
74548
  contentLogger.info(`Database initialised at ${dbPath}`);
74541
74549
  const adapters = initializeAdapters(config);
@@ -74681,8 +74689,8 @@ var init_content_command = __esm(() => {
74681
74689
  init_publisher();
74682
74690
  init_review_manager();
74683
74691
  init_state_manager();
74684
- LOCK_DIR2 = join164(homedir53(), ".claudekit", "locks");
74685
- LOCK_FILE = join164(LOCK_DIR2, "ck-content.lock");
74692
+ LOCK_DIR2 = join165(homedir54(), ".claudekit", "locks");
74693
+ LOCK_FILE = join165(LOCK_DIR2, "ck-content.lock");
74686
74694
  });
74687
74695
 
74688
74696
  // src/commands/content/index.ts
@@ -74703,59 +74711,21 @@ var init_content = __esm(() => {
74703
74711
  init_content_subcommands();
74704
74712
  });
74705
74713
 
74706
- // src/domains/help/commands/common-options.ts
74707
- var filterOptionsGroup, folderOptionsGroup;
74708
- var init_common_options = __esm(() => {
74709
- filterOptionsGroup = {
74710
- title: "Filter Options",
74711
- options: [
74712
- {
74713
- flags: "--exclude <pattern>",
74714
- description: "Exclude files matching glob pattern (can be used multiple times)"
74715
- },
74716
- {
74717
- flags: "--beta",
74718
- description: "Show beta versions in selection prompt"
74719
- },
74720
- {
74721
- flags: "--refresh",
74722
- description: "Bypass release cache to fetch latest versions from GitHub"
74723
- }
74724
- ]
74725
- };
74726
- folderOptionsGroup = {
74727
- title: "Folder Options",
74728
- options: [
74729
- {
74730
- flags: "--docs-dir <name>",
74731
- description: "Custom docs folder name to avoid conflicts with existing folders",
74732
- defaultValue: "docs"
74733
- },
74734
- {
74735
- flags: "--plans-dir <name>",
74736
- description: "Custom plans folder name to avoid conflicts with existing folders",
74737
- defaultValue: "plans"
74738
- }
74739
- ]
74740
- };
74741
- });
74742
-
74743
- // src/domains/help/commands/new-command-help.ts
74744
- var newCommandHelp;
74745
- var init_new_command_help = __esm(() => {
74746
- init_common_options();
74747
- newCommandHelp = {
74748
- name: "new",
74749
- description: "Bootstrap a new ClaudeKit project (with interactive version selection)",
74750
- usage: "ck new [options]",
74714
+ // src/domains/help/commands/agents-command-help.ts
74715
+ var agentsCommandHelp;
74716
+ var init_agents_command_help = __esm(() => {
74717
+ agentsCommandHelp = {
74718
+ name: "agents",
74719
+ description: "Install, uninstall, and manage Claude Code agents across providers",
74720
+ usage: "ck agents [options]",
74751
74721
  examples: [
74752
74722
  {
74753
- command: "ck new --kit engineer --dir ./my-project",
74754
- description: "Create engineer kit project in specific directory"
74723
+ command: "ck agents --name maintainer --agent codex",
74724
+ description: "Install one agent to Codex"
74755
74725
  },
74756
74726
  {
74757
- command: "ck new -y --use-git --release v2.1.0",
74758
- description: "Non-interactive with git clone (no GitHub API needed)"
74727
+ command: "ck agents --list --installed",
74728
+ description: "Show installed agents and locations"
74759
74729
  }
74760
74730
  ],
74761
74731
  optionGroups: [
@@ -74763,122 +74733,458 @@ var init_new_command_help = __esm(() => {
74763
74733
  title: "Mode Options",
74764
74734
  options: [
74765
74735
  {
74766
- flags: "-y, --yes",
74767
- description: "Non-interactive mode (skip all prompts)"
74768
- },
74769
- {
74770
- flags: "--use-git",
74771
- description: "Use git clone instead of GitHub API (uses SSH/HTTPS credentials)"
74772
- }
74773
- ]
74774
- },
74775
- {
74776
- title: "Project Options",
74777
- options: [
74778
- {
74779
- flags: "--dir <directory>",
74780
- description: "Target directory for the new project",
74781
- defaultValue: "."
74736
+ flags: "-l, --list",
74737
+ description: "List available agents from source"
74782
74738
  },
74783
74739
  {
74784
- flags: "--kit <kit>",
74785
- description: "Kit to use (engineer, marketing)"
74740
+ flags: "--installed",
74741
+ description: "When used with --list, show installed agents instead"
74786
74742
  },
74787
74743
  {
74788
- flags: "-r, --release <version>",
74789
- description: "Skip version selection, use specific version (e.g., latest, v1.0.0)"
74744
+ flags: "-u, --uninstall",
74745
+ description: "Uninstall agent(s) from providers"
74790
74746
  },
74791
74747
  {
74792
- flags: "--force",
74793
- description: "Overwrite existing files without confirmation"
74748
+ flags: "--sync",
74749
+ description: "Sync registry with filesystem (clean orphaned entries)"
74794
74750
  }
74795
74751
  ]
74796
74752
  },
74797
- filterOptionsGroup,
74798
74753
  {
74799
74754
  title: "Installation Options",
74800
74755
  options: [
74801
74756
  {
74802
- flags: "--opencode",
74803
- description: "Install OpenCode CLI package (non-interactive mode)"
74757
+ flags: "-n, --name <agent>",
74758
+ description: "Agent name to install or uninstall"
74804
74759
  },
74805
74760
  {
74806
- flags: "--gemini",
74807
- description: "Install Google Gemini CLI package (non-interactive mode)"
74761
+ flags: "-a, --agent <provider>",
74762
+ description: "Target provider(s), can be specified multiple times"
74808
74763
  },
74809
74764
  {
74810
- flags: "--install-skills",
74811
- description: "Install skills dependencies (non-interactive mode)"
74765
+ flags: "-g, --global",
74766
+ description: "Install globally instead of project-level"
74812
74767
  },
74813
74768
  {
74814
- flags: "--with-sudo",
74815
- description: "Include system packages requiring sudo (Linux: ffmpeg, imagemagick)"
74769
+ flags: "--all",
74770
+ description: "Install to all supported providers"
74816
74771
  },
74817
74772
  {
74818
- flags: "--prefix",
74819
- description: "Add /ck: prefix to all slash commands"
74773
+ flags: "-y, --yes",
74774
+ description: "Skip confirmation prompts"
74820
74775
  }
74821
74776
  ]
74822
74777
  },
74823
- folderOptionsGroup
74778
+ {
74779
+ title: "Uninstall Options",
74780
+ options: [
74781
+ {
74782
+ flags: "--force",
74783
+ description: "Force uninstall even if not tracked in registry"
74784
+ }
74785
+ ]
74786
+ }
74824
74787
  ]
74825
74788
  };
74826
74789
  });
74827
74790
 
74828
- // src/domains/help/commands/backups-command-help.ts
74829
- var backupsCommandHelp;
74830
- var init_backups_command_help = __esm(() => {
74831
- backupsCommandHelp = {
74832
- name: "backups",
74833
- description: "List, restore, and prune ClaudeKit recovery backups",
74834
- usage: "ck backups <list|restore|prune> [options]",
74791
+ // src/domains/help/commands/api-command-help.ts
74792
+ var apiCommandHelp;
74793
+ var init_api_command_help = __esm(() => {
74794
+ apiCommandHelp = {
74795
+ name: "api",
74796
+ description: "Interact with ClaudeKit API and proxy services",
74797
+ usage: "ck api [action] [service] [path] [options]",
74835
74798
  examples: [
74836
74799
  {
74837
- command: "ck backups list --limit 5",
74838
- description: "Show the newest five recovery backups"
74800
+ command: "ck api status",
74801
+ description: "Validate your API key and check rate limit status"
74839
74802
  },
74840
74803
  {
74841
- command: "ck backups restore 2026-04-06T21-53-01-706-byrf --yes",
74842
- description: "Restore a specific recovery backup without prompting"
74804
+ command: "ck api vidcap summary https://youtu.be/abc123",
74805
+ description: "Generate an AI summary of a YouTube video"
74843
74806
  }
74844
74807
  ],
74845
74808
  optionGroups: [
74846
74809
  {
74847
- title: "Subcommands",
74848
- options: [
74810
+ title: "Output Options",
74811
+ options: [{ flags: "--json", description: "Output raw JSON instead of formatted display" }]
74812
+ }
74813
+ ],
74814
+ subcommands: [
74815
+ {
74816
+ name: "status",
74817
+ description: "Validate API key and check rate limit",
74818
+ usage: "ck api status [--json]",
74819
+ examples: [],
74820
+ optionGroups: [
74849
74821
  {
74850
- flags: "list [--limit <n>] [--json]",
74851
- description: "List recovery backups under ~/.claudekit/backups/"
74852
- },
74822
+ title: "Output Options",
74823
+ options: [
74824
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
74825
+ ]
74826
+ }
74827
+ ]
74828
+ },
74829
+ {
74830
+ name: "services",
74831
+ description: "List available proxy services",
74832
+ usage: "ck api services [--json]",
74833
+ examples: [],
74834
+ optionGroups: [
74853
74835
  {
74854
- flags: "restore <id> [--yes] [--json]",
74855
- description: "Restore a specific recovery backup to its original source root"
74836
+ title: "Output Options",
74837
+ options: [
74838
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
74839
+ ]
74840
+ }
74841
+ ]
74842
+ },
74843
+ {
74844
+ name: "setup",
74845
+ description: "Configure and store your ClaudeKit API key",
74846
+ usage: "ck api setup [--key <key>] [--force] [--json]",
74847
+ examples: [],
74848
+ optionGroups: [
74849
+ {
74850
+ title: "Setup Options",
74851
+ options: [
74852
+ { flags: "--key <key>", description: "API key to store" },
74853
+ { flags: "--force", description: "Force re-setup even if key already exists" }
74854
+ ]
74856
74855
  },
74857
74856
  {
74858
- flags: "prune [id] [--keep <n> | --all] [--yes] [--json]",
74859
- description: "Delete one, many, or old recovery backups"
74857
+ title: "Output Options",
74858
+ options: [
74859
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
74860
+ ]
74860
74861
  }
74861
74862
  ]
74862
74863
  },
74863
74864
  {
74864
- title: "Shared Options",
74865
- options: [
74866
- { flags: "--limit <n>", description: "Show only the newest N backups" },
74867
- { flags: "--keep <n>", description: "Keep the newest N backups when pruning" },
74868
- { flags: "--all", description: "Delete all recovery backups" },
74869
- { flags: "-y, --yes", description: "Skip confirmation prompts" },
74870
- { flags: "--json", description: "Output machine-readable JSON" }
74865
+ name: "proxy",
74866
+ description: "Generic HTTP proxy to any ClaudeKit-backed service",
74867
+ usage: "ck api proxy <service> <path> [options]",
74868
+ examples: [],
74869
+ optionGroups: [
74870
+ {
74871
+ title: "Proxy Options",
74872
+ options: [
74873
+ {
74874
+ flags: "--method <method>",
74875
+ description: "HTTP method for the request",
74876
+ defaultValue: "GET"
74877
+ },
74878
+ { flags: "--body <json>", description: "Request body as JSON string" },
74879
+ { flags: "--query <json>", description: "Query params as JSON string" }
74880
+ ]
74881
+ },
74882
+ {
74883
+ title: "Output Options",
74884
+ options: [
74885
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
74886
+ ]
74887
+ }
74871
74888
  ]
74872
- }
74873
- ],
74874
- sections: [
74889
+ },
74875
74890
  {
74876
- title: "Backup Scope",
74877
- content: "These backups contain only the ClaudeKit-managed files targeted by destructive operations, not the full ~/.claude/ directory."
74891
+ name: "vidcap",
74892
+ description: "Video metadata and AI processing via YouTube",
74893
+ usage: "ck api vidcap <action> <url|query>",
74894
+ examples: [],
74895
+ optionGroups: [
74896
+ {
74897
+ title: "Vidcap Options",
74898
+ options: [
74899
+ {
74900
+ flags: "--locale <locale>",
74901
+ description: "Locale for summary/caption output",
74902
+ defaultValue: "en"
74903
+ },
74904
+ { flags: "--max-results <n>", description: "Max results for search action" },
74905
+ {
74906
+ flags: "--second <s>",
74907
+ description: "Timestamp in seconds for screenshot action"
74908
+ },
74909
+ {
74910
+ flags: "--order <order>",
74911
+ description: "Sort order for comments (time/relevance)"
74912
+ }
74913
+ ]
74914
+ },
74915
+ {
74916
+ title: "Output Options",
74917
+ options: [
74918
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
74919
+ ]
74920
+ }
74921
+ ],
74922
+ subcommands: [
74923
+ {
74924
+ name: "info",
74925
+ description: "Fetch video metadata (title, duration, channel)",
74926
+ usage: "ck api vidcap info <url>",
74927
+ examples: [],
74928
+ optionGroups: [
74929
+ {
74930
+ title: "Output Options",
74931
+ options: [{ flags: "--json", description: "Output raw JSON" }]
74932
+ }
74933
+ ]
74934
+ },
74935
+ {
74936
+ name: "search",
74937
+ description: "Search YouTube for videos matching a query",
74938
+ usage: "ck api vidcap search <query>",
74939
+ examples: [],
74940
+ optionGroups: [
74941
+ {
74942
+ title: "Search Options",
74943
+ options: [{ flags: "--max-results <n>", description: "Maximum number of results" }]
74944
+ }
74945
+ ]
74946
+ },
74947
+ {
74948
+ name: "summary",
74949
+ description: "Generate an AI summary of a video",
74950
+ usage: "ck api vidcap summary <url>",
74951
+ examples: [],
74952
+ optionGroups: [
74953
+ {
74954
+ title: "Summary Options",
74955
+ options: [
74956
+ {
74957
+ flags: "--locale <locale>",
74958
+ description: "Locale for summary text",
74959
+ defaultValue: "en"
74960
+ }
74961
+ ]
74962
+ }
74963
+ ]
74964
+ },
74965
+ {
74966
+ name: "caption",
74967
+ description: "Extract captions/transcript from a video",
74968
+ usage: "ck api vidcap caption <url>",
74969
+ examples: [],
74970
+ optionGroups: [
74971
+ {
74972
+ title: "Caption Options",
74973
+ options: [
74974
+ {
74975
+ flags: "--locale <locale>",
74976
+ description: "Locale for caption text",
74977
+ defaultValue: "en"
74978
+ }
74979
+ ]
74980
+ }
74981
+ ]
74982
+ },
74983
+ {
74984
+ name: "screenshot",
74985
+ description: "Capture a frame from a video at a specific timestamp",
74986
+ usage: "ck api vidcap screenshot <url>",
74987
+ examples: [],
74988
+ optionGroups: [
74989
+ {
74990
+ title: "Screenshot Options",
74991
+ options: [{ flags: "--second <s>", description: "Timestamp in seconds" }]
74992
+ }
74993
+ ]
74994
+ },
74995
+ {
74996
+ name: "comments",
74997
+ description: "Fetch comments for a video",
74998
+ usage: "ck api vidcap comments <url>",
74999
+ examples: [],
75000
+ optionGroups: [
75001
+ {
75002
+ title: "Comment Options",
75003
+ options: [
75004
+ {
75005
+ flags: "--order <order>",
75006
+ description: "Sort order: time or relevance"
75007
+ },
75008
+ { flags: "--max-results <n>", description: "Maximum number of comments" }
75009
+ ]
75010
+ }
75011
+ ]
75012
+ },
75013
+ {
75014
+ name: "media",
75015
+ description: "Download media or extract media URLs from a video",
75016
+ usage: "ck api vidcap media <url>",
75017
+ examples: [],
75018
+ optionGroups: [
75019
+ {
75020
+ title: "Output Options",
75021
+ options: [{ flags: "--json", description: "Output raw JSON" }]
75022
+ }
75023
+ ]
75024
+ }
75025
+ ]
74878
75026
  },
74879
75027
  {
74880
- title: "Automatic Retention",
74881
- content: "ClaudeKit keeps the newest recovery backups automatically and prunes older ones after successful destructive operations."
75028
+ name: "reviewweb",
75029
+ description: "Web scraping and SEO analysis via the ClaudeKit proxy",
75030
+ usage: "ck api reviewweb <action> <url|domain|keyword>",
75031
+ examples: [],
75032
+ optionGroups: [
75033
+ {
75034
+ title: "Review Options",
75035
+ options: [
75036
+ {
75037
+ flags: "--format <fmt>",
75038
+ description: "Summary format: bullet or paragraph"
75039
+ },
75040
+ { flags: "--max-length <n>", description: "Maximum summary length in characters" },
75041
+ {
75042
+ flags: "--instructions <text>",
75043
+ description: "Extraction instructions (extract action)"
75044
+ },
75045
+ { flags: "--template <json>", description: "JSON template for structured extraction" },
75046
+ {
75047
+ flags: "--type <type>",
75048
+ description: "Link type filter: web/image/file/all"
75049
+ },
75050
+ { flags: "--country <code>", description: "Country code for SEO commands" }
75051
+ ]
75052
+ },
75053
+ {
75054
+ title: "Output Options",
75055
+ options: [
75056
+ { flags: "--json", description: "Output raw JSON instead of formatted display" }
75057
+ ]
75058
+ }
75059
+ ],
75060
+ subcommands: [
75061
+ {
75062
+ name: "scrape",
75063
+ description: "Scrape raw HTML content from a URL",
75064
+ usage: "ck api reviewweb scrape <url>",
75065
+ examples: [],
75066
+ optionGroups: [
75067
+ {
75068
+ title: "Output Options",
75069
+ options: [{ flags: "--json", description: "Output raw JSON" }]
75070
+ }
75071
+ ]
75072
+ },
75073
+ {
75074
+ name: "summarize",
75075
+ description: "AI-generated summary of a web page",
75076
+ usage: "ck api reviewweb summarize <url>",
75077
+ examples: [],
75078
+ optionGroups: [
75079
+ {
75080
+ title: "Summary Options",
75081
+ options: [
75082
+ { flags: "--format <fmt>", description: "Output format: bullet or paragraph" },
75083
+ { flags: "--max-length <n>", description: "Maximum length in characters" }
75084
+ ]
75085
+ }
75086
+ ]
75087
+ },
75088
+ {
75089
+ name: "markdown",
75090
+ description: "Convert a web page to clean Markdown",
75091
+ usage: "ck api reviewweb markdown <url>",
75092
+ examples: [],
75093
+ optionGroups: [
75094
+ {
75095
+ title: "Output Options",
75096
+ options: [{ flags: "--json", description: "Output raw JSON" }]
75097
+ }
75098
+ ]
75099
+ },
75100
+ {
75101
+ name: "extract",
75102
+ description: "Extract structured data from a web page",
75103
+ usage: "ck api reviewweb extract <url>",
75104
+ examples: [],
75105
+ optionGroups: [
75106
+ {
75107
+ title: "Extraction Options",
75108
+ options: [
75109
+ { flags: "--instructions <text>", description: "Extraction instructions" },
75110
+ { flags: "--template <json>", description: "JSON template for output shape" }
75111
+ ]
75112
+ }
75113
+ ]
75114
+ },
75115
+ {
75116
+ name: "links",
75117
+ description: "Extract all links from a web page",
75118
+ usage: "ck api reviewweb links <url>",
75119
+ examples: [],
75120
+ optionGroups: [
75121
+ {
75122
+ title: "Filter Options",
75123
+ options: [
75124
+ {
75125
+ flags: "--type <type>",
75126
+ description: "Link type: web/image/file/all",
75127
+ defaultValue: "all"
75128
+ }
75129
+ ]
75130
+ }
75131
+ ]
75132
+ },
75133
+ {
75134
+ name: "screenshot",
75135
+ description: "Capture a screenshot of a web page",
75136
+ usage: "ck api reviewweb screenshot <url>",
75137
+ examples: [],
75138
+ optionGroups: [
75139
+ {
75140
+ title: "Output Options",
75141
+ options: [{ flags: "--json", description: "Output raw JSON" }]
75142
+ }
75143
+ ]
75144
+ },
75145
+ {
75146
+ name: "seo-traffic",
75147
+ description: "Fetch estimated organic traffic data for a domain",
75148
+ usage: "ck api reviewweb seo-traffic <domain>",
75149
+ examples: [],
75150
+ optionGroups: [
75151
+ {
75152
+ title: "SEO Options",
75153
+ options: [
75154
+ { flags: "--country <code>", description: "Country code for traffic data" }
75155
+ ]
75156
+ }
75157
+ ]
75158
+ },
75159
+ {
75160
+ name: "seo-keywords",
75161
+ description: "Fetch top SEO keywords for a domain or keyword",
75162
+ usage: "ck api reviewweb seo-keywords <domain|keyword>",
75163
+ examples: [],
75164
+ optionGroups: [
75165
+ {
75166
+ title: "SEO Options",
75167
+ options: [
75168
+ { flags: "--country <code>", description: "Country code for keyword data" }
75169
+ ]
75170
+ }
75171
+ ]
75172
+ },
75173
+ {
75174
+ name: "seo-backlinks",
75175
+ description: "Fetch backlink profile for a domain",
75176
+ usage: "ck api reviewweb seo-backlinks <domain>",
75177
+ examples: [],
75178
+ optionGroups: [
75179
+ {
75180
+ title: "SEO Options",
75181
+ options: [
75182
+ { flags: "--country <code>", description: "Country code for backlink data" }
75183
+ ]
75184
+ }
75185
+ ]
75186
+ }
75187
+ ]
74882
75188
  }
74883
75189
  ]
74884
75190
  };
@@ -74920,6 +75226,14 @@ var init_app_command_help = __esm(() => {
74920
75226
  {
74921
75227
  flags: "--uninstall",
74922
75228
  description: "Remove the installed desktop app and exit"
75229
+ },
75230
+ {
75231
+ flags: "--dev",
75232
+ description: "Force dev channel for this invocation"
75233
+ },
75234
+ {
75235
+ flags: "--stable",
75236
+ description: "Force stable channel for this invocation"
74923
75237
  }
74924
75238
  ]
74925
75239
  }
@@ -74933,127 +75247,439 @@ var init_app_command_help = __esm(() => {
74933
75247
  };
74934
75248
  });
74935
75249
 
74936
- // src/domains/help/commands/init-command-help.ts
74937
- var initCommandHelp;
74938
- var init_init_command_help = __esm(() => {
74939
- init_common_options();
74940
- initCommandHelp = {
74941
- name: "init",
74942
- description: "Initialize or update ClaudeKit project (with interactive version selection)",
74943
- usage: "ck init [options]",
75250
+ // src/domains/help/commands/backups-command-help.ts
75251
+ var backupsCommandHelp;
75252
+ var init_backups_command_help = __esm(() => {
75253
+ backupsCommandHelp = {
75254
+ name: "backups",
75255
+ description: "List, restore, and prune ClaudeKit recovery backups",
75256
+ usage: "ck backups <list|restore|prune> [options]",
74944
75257
  examples: [
74945
75258
  {
74946
- command: "ck init --kit engineer",
74947
- description: "Update local project with latest engineer kit"
75259
+ command: "ck backups list --limit 5",
75260
+ description: "Show the newest five recovery backups"
74948
75261
  },
74949
75262
  {
74950
- command: "ck init --use-git --release v2.1.0 -y",
74951
- description: "Non-interactive with git clone (no GitHub API needed)"
75263
+ command: "ck backups restore 2026-04-06T21-53-01-706-byrf --yes",
75264
+ description: "Restore a specific recovery backup without prompting"
74952
75265
  }
74953
75266
  ],
74954
75267
  optionGroups: [
74955
75268
  {
74956
- title: "Mode Options",
75269
+ title: "Subcommands",
74957
75270
  options: [
74958
75271
  {
74959
- flags: "-y, --yes",
74960
- description: "Non-interactive mode with sensible defaults (kit: engineer, dir: ., version: latest)"
75272
+ flags: "list [--limit <n>] [--json]",
75273
+ description: "List recovery backups under ~/.claudekit/backups/"
74961
75274
  },
74962
75275
  {
74963
- flags: "--use-git",
74964
- description: "Use git clone instead of GitHub API (uses SSH/HTTPS credentials)"
75276
+ flags: "restore <id> [--yes] [--json]",
75277
+ description: "Restore a specific recovery backup to its original source root"
74965
75278
  },
74966
75279
  {
74967
- flags: "--sync",
74968
- description: "Sync config files from upstream with interactive hunk-by-hunk merge"
75280
+ flags: "prune [id] [--keep <n> | --all] [--yes] [--json]",
75281
+ description: "Delete one, many, or old recovery backups"
74969
75282
  }
74970
75283
  ]
74971
75284
  },
74972
75285
  {
74973
- title: "Project Options",
75286
+ title: "Shared Options",
75287
+ options: [
75288
+ { flags: "--limit <n>", description: "Show only the newest N backups" },
75289
+ { flags: "--keep <n>", description: "Keep the newest N backups when pruning" },
75290
+ { flags: "--all", description: "Delete all recovery backups" },
75291
+ { flags: "-y, --yes", description: "Skip confirmation prompts" },
75292
+ { flags: "--json", description: "Output machine-readable JSON" }
75293
+ ]
75294
+ }
75295
+ ],
75296
+ subcommands: [
75297
+ {
75298
+ name: "list",
75299
+ description: "List recovery backups under ~/.claudekit/backups/",
75300
+ usage: "ck backups list [--limit <n>] [--json]",
75301
+ examples: [],
75302
+ optionGroups: []
75303
+ },
75304
+ {
75305
+ name: "restore",
75306
+ description: "Restore a specific recovery backup to its original source root",
75307
+ usage: "ck backups restore <id> [--yes] [--json]",
75308
+ examples: [],
75309
+ optionGroups: []
75310
+ },
75311
+ {
75312
+ name: "prune",
75313
+ description: "Delete one, many, or old recovery backups",
75314
+ usage: "ck backups prune [id] [--keep <n> | --all] [--yes] [--json]",
75315
+ examples: [],
75316
+ optionGroups: []
75317
+ }
75318
+ ],
75319
+ sections: [
75320
+ {
75321
+ title: "Backup Scope",
75322
+ content: "These backups contain only the ClaudeKit-managed files targeted by destructive operations, not the full ~/.claude/ directory."
75323
+ },
75324
+ {
75325
+ title: "Automatic Retention",
75326
+ content: "ClaudeKit keeps the newest recovery backups automatically and prunes older ones after successful destructive operations."
75327
+ }
75328
+ ]
75329
+ };
75330
+ });
75331
+
75332
+ // src/domains/help/commands/commands-command-help.ts
75333
+ var commandsCommandHelp;
75334
+ var init_commands_command_help = __esm(() => {
75335
+ commandsCommandHelp = {
75336
+ name: "commands",
75337
+ description: "Install, uninstall, and manage Claude commands across providers",
75338
+ usage: "ck commands [options]",
75339
+ examples: [
75340
+ {
75341
+ command: "ck commands --name plan --agent codex",
75342
+ description: "Install one slash command to Codex"
75343
+ },
75344
+ {
75345
+ command: "ck commands --list",
75346
+ description: "List available commands from source"
75347
+ }
75348
+ ],
75349
+ optionGroups: [
75350
+ {
75351
+ title: "Mode Options",
74974
75352
  options: [
74975
75353
  {
74976
- flags: "--dir <directory>",
74977
- description: "Target directory to initialize/update",
74978
- defaultValue: "."
75354
+ flags: "-l, --list",
75355
+ description: "List available commands from source"
74979
75356
  },
74980
75357
  {
74981
- flags: "--kit <kit>",
74982
- description: "Kit to use (engineer, marketing)"
75358
+ flags: "--installed",
75359
+ description: "When used with --list, show installed commands instead"
74983
75360
  },
74984
75361
  {
74985
- flags: "-r, --release <version>",
74986
- description: "Skip version selection, use specific version"
75362
+ flags: "-u, --uninstall",
75363
+ description: "Uninstall command(s) from providers"
75364
+ },
75365
+ {
75366
+ flags: "--sync",
75367
+ description: "Sync registry with filesystem (clean orphaned entries)"
75368
+ }
75369
+ ]
75370
+ },
75371
+ {
75372
+ title: "Installation Options",
75373
+ options: [
75374
+ {
75375
+ flags: "-n, --name <command>",
75376
+ description: "Command name to install or uninstall"
75377
+ },
75378
+ {
75379
+ flags: "-a, --agent <provider>",
75380
+ description: "Target provider(s), can be specified multiple times"
74987
75381
  },
74988
75382
  {
74989
75383
  flags: "-g, --global",
74990
- description: "Use platform-specific user configuration directory"
75384
+ description: "Install globally instead of project-level"
74991
75385
  },
74992
75386
  {
74993
- flags: "--fresh",
74994
- description: "Full reset: remove CK files, replace settings.json and CLAUDE.md, reinstall from scratch"
75387
+ flags: "--all",
75388
+ description: "Install to all supported providers"
74995
75389
  },
75390
+ {
75391
+ flags: "-y, --yes",
75392
+ description: "Skip confirmation prompts"
75393
+ }
75394
+ ]
75395
+ },
75396
+ {
75397
+ title: "Uninstall Options",
75398
+ options: [
74996
75399
  {
74997
75400
  flags: "--force",
74998
- description: "Force reinstall even if already at latest version (use with --yes; re-onboards missing files without full reset)"
75401
+ description: "Force uninstall even if not tracked in registry"
74999
75402
  }
75000
75403
  ]
75404
+ }
75405
+ ]
75406
+ };
75407
+ });
75408
+
75409
+ // src/domains/help/commands/config-command-help.ts
75410
+ var configCommandHelp;
75411
+ var init_config_command_help = __esm(() => {
75412
+ configCommandHelp = {
75413
+ name: "config",
75414
+ description: "Manage ClaudeKit configuration and launch the config dashboard",
75415
+ usage: "ck config [action] [key] [value] [options]",
75416
+ examples: [
75417
+ {
75418
+ command: "ck config",
75419
+ description: "Launch the web dashboard (same as 'ck config ui')"
75001
75420
  },
75002
75421
  {
75003
- title: "Filter Options",
75422
+ command: "ck config --host 0.0.0.0 --no-open",
75423
+ description: "Expose the dashboard to your network intentionally"
75424
+ },
75425
+ {
75426
+ command: "ck config set defaults.kit engineer",
75427
+ description: "Set a config value from the CLI"
75428
+ }
75429
+ ],
75430
+ optionGroups: [
75431
+ {
75432
+ title: "Actions",
75004
75433
  options: [
75005
75434
  {
75006
- flags: "--exclude <pattern>",
75007
- description: "Exclude files matching glob pattern (can be used multiple times)"
75435
+ flags: "ui",
75436
+ description: "Launch config dashboard (default action when omitted)"
75008
75437
  },
75009
75438
  {
75010
- flags: "--only <pattern>",
75011
- description: "Include only files matching glob pattern (can be used multiple times)"
75439
+ flags: "get <key>",
75440
+ description: "Read a config value"
75012
75441
  },
75013
75442
  {
75014
- flags: "--beta",
75015
- description: "Show beta versions in selection prompt"
75443
+ flags: "set <key> <value>",
75444
+ description: "Write a config value"
75016
75445
  },
75017
75446
  {
75018
- flags: "--refresh",
75019
- description: "Bypass release cache to fetch latest versions from GitHub"
75447
+ flags: "show",
75448
+ description: "Print merged config"
75020
75449
  }
75021
75450
  ]
75022
75451
  },
75023
75452
  {
75024
- title: "Installation Options",
75453
+ title: "Scope Options",
75025
75454
  options: [
75026
75455
  {
75027
- flags: "--install-skills",
75028
- description: "Install skills dependencies (non-interactive mode)"
75456
+ flags: "-g, --global",
75457
+ description: "Use global config (~/.claudekit/config.json)"
75029
75458
  },
75030
75459
  {
75031
- flags: "--with-sudo",
75032
- description: "Include system packages requiring sudo (Linux: ffmpeg, imagemagick)"
75460
+ flags: "-l, --local",
75461
+ description: "Use local config (.claude/.ck.json)"
75462
+ }
75463
+ ]
75464
+ },
75465
+ {
75466
+ title: "Dashboard Options",
75467
+ options: [
75468
+ {
75469
+ flags: "--port <port>",
75470
+ description: "Port for dashboard server"
75033
75471
  },
75034
75472
  {
75035
- flags: "--prefix",
75036
- description: "Add /ck: prefix to all slash commands"
75473
+ flags: "--host <host>",
75474
+ description: "Bind dashboard host (default: 127.0.0.1)"
75037
75475
  },
75038
75476
  {
75039
- flags: "--skip-setup",
75040
- description: "Skip interactive configuration wizard"
75477
+ flags: "--no-open",
75478
+ description: "Do not auto-open browser when launching dashboard"
75041
75479
  },
75480
+ {
75481
+ flags: "--dev",
75482
+ description: "Run dashboard in development mode with HMR"
75483
+ }
75484
+ ]
75485
+ },
75486
+ {
75487
+ title: "Output Options",
75488
+ options: [
75489
+ {
75490
+ flags: "--json",
75491
+ description: "Output machine-readable JSON for CLI actions"
75492
+ }
75493
+ ]
75494
+ }
75495
+ ],
75496
+ subcommands: [
75497
+ {
75498
+ name: "ui",
75499
+ description: "Launch config dashboard (default action when omitted)",
75500
+ usage: "ck config ui [--port <port>] [--host <host>] [--no-open] [--dev]",
75501
+ examples: [],
75502
+ optionGroups: []
75503
+ },
75504
+ {
75505
+ name: "get",
75506
+ description: "Read a config value",
75507
+ usage: "ck config get <key> [-g | -l] [--json]",
75508
+ examples: [],
75509
+ optionGroups: []
75510
+ },
75511
+ {
75512
+ name: "set",
75513
+ description: "Write a config value",
75514
+ usage: "ck config set <key> <value> [-g | -l]",
75515
+ examples: [],
75516
+ optionGroups: []
75517
+ },
75518
+ {
75519
+ name: "show",
75520
+ description: "Print merged config",
75521
+ usage: "ck config show [-g | -l] [--json]",
75522
+ examples: [],
75523
+ optionGroups: []
75524
+ }
75525
+ ],
75526
+ sections: [
75527
+ {
75528
+ title: "Notes",
75529
+ content: "Run 'ck config --help' to see both CLI actions and dashboard flags. Running bare 'ck config' opens the dashboard directly. Use '--host' to expose the dashboard intentionally beyond localhost."
75530
+ }
75531
+ ]
75532
+ };
75533
+ });
75534
+
75535
+ // src/domains/help/commands/content-command-help.ts
75536
+ var contentCommandHelp;
75537
+ var init_content_command_help = __esm(() => {
75538
+ contentCommandHelp = {
75539
+ name: "content",
75540
+ description: "Multi-channel content automation engine",
75541
+ usage: "ck content [action] [id] [options]",
75542
+ examples: [
75543
+ {
75544
+ command: "ck content start",
75545
+ description: "Start the content daemon (default action)"
75546
+ },
75547
+ {
75548
+ command: "ck content setup",
75549
+ description: "Interactive configuration wizard"
75550
+ },
75551
+ {
75552
+ command: "ck content queue",
75553
+ description: "List pending content items for review"
75554
+ }
75555
+ ],
75556
+ optionGroups: [
75557
+ {
75558
+ title: "Actions",
75559
+ options: [
75560
+ {
75561
+ flags: "start",
75562
+ description: "Start the content daemon (default when no action specified)"
75563
+ },
75564
+ {
75565
+ flags: "stop",
75566
+ description: "Stop the running content daemon"
75567
+ },
75568
+ {
75569
+ flags: "status",
75570
+ description: "Show daemon status and recent activity"
75571
+ },
75572
+ {
75573
+ flags: "logs",
75574
+ description: "View content daemon logs"
75575
+ },
75576
+ {
75577
+ flags: "setup",
75578
+ description: "Interactive configuration wizard"
75579
+ },
75580
+ {
75581
+ flags: "queue",
75582
+ description: "List pending content items"
75583
+ },
75584
+ {
75585
+ flags: "approve <id>",
75586
+ description: "Approve a content item for publishing"
75587
+ },
75588
+ {
75589
+ flags: "reject <id>",
75590
+ description: "Reject a content item"
75591
+ }
75592
+ ]
75593
+ },
75594
+ {
75595
+ title: "Options",
75596
+ options: [
75042
75597
  {
75043
75598
  flags: "--dry-run",
75044
- description: "Preview changes without applying them (requires --prefix)"
75599
+ description: "Generate content without publishing"
75045
75600
  },
75046
75601
  {
75047
- flags: "--force-overwrite",
75048
- description: "Override ownership protections and delete user-modified files"
75602
+ flags: "--verbose",
75603
+ description: "Enable verbose logging"
75049
75604
  },
75050
75605
  {
75051
- flags: "--force-overwrite-settings",
75052
- description: "Fully replace settings.json instead of selective merge"
75606
+ flags: "--force",
75607
+ description: "Kill existing process and start fresh"
75608
+ },
75609
+ {
75610
+ flags: "--tail",
75611
+ description: "Follow log output in real-time (for logs action)"
75612
+ },
75613
+ {
75614
+ flags: "--reason <reason>",
75615
+ description: "Rejection reason (for reject action)"
75053
75616
  }
75054
75617
  ]
75618
+ }
75619
+ ],
75620
+ subcommands: [
75621
+ {
75622
+ name: "start",
75623
+ description: "Start the content daemon (default when no action specified)",
75624
+ usage: "ck content start",
75625
+ examples: [],
75626
+ optionGroups: []
75055
75627
  },
75056
- folderOptionsGroup
75628
+ {
75629
+ name: "stop",
75630
+ description: "Stop the running content daemon",
75631
+ usage: "ck content stop",
75632
+ examples: [],
75633
+ optionGroups: []
75634
+ },
75635
+ {
75636
+ name: "status",
75637
+ description: "Show daemon status and recent activity",
75638
+ usage: "ck content status",
75639
+ examples: [],
75640
+ optionGroups: []
75641
+ },
75642
+ {
75643
+ name: "logs",
75644
+ description: "View content daemon logs",
75645
+ usage: "ck content logs [--tail]",
75646
+ examples: [],
75647
+ optionGroups: []
75648
+ },
75649
+ {
75650
+ name: "setup",
75651
+ description: "Interactive configuration wizard",
75652
+ usage: "ck content setup",
75653
+ examples: [],
75654
+ optionGroups: []
75655
+ },
75656
+ {
75657
+ name: "queue",
75658
+ description: "List pending content items",
75659
+ usage: "ck content queue",
75660
+ examples: [],
75661
+ optionGroups: []
75662
+ },
75663
+ {
75664
+ name: "approve",
75665
+ description: "Approve a content item for publishing",
75666
+ usage: "ck content approve <id>",
75667
+ examples: [],
75668
+ optionGroups: []
75669
+ },
75670
+ {
75671
+ name: "reject",
75672
+ description: "Reject a content item",
75673
+ usage: "ck content reject <id> [--reason <reason>]",
75674
+ examples: [],
75675
+ optionGroups: []
75676
+ }
75677
+ ],
75678
+ sections: [
75679
+ {
75680
+ title: "Notes",
75681
+ content: "Requires content config in .ck.json. Run 'ck content setup' for guided configuration. Review mode can be 'auto' or 'manual' (default: manual)."
75682
+ }
75057
75683
  ]
75058
75684
  };
75059
75685
  });
@@ -75109,330 +75735,380 @@ var init_doctor_command_help = __esm(() => {
75109
75735
  };
75110
75736
  });
75111
75737
 
75112
- // src/domains/help/commands/uninstall-command-help.ts
75113
- var uninstallCommandHelp;
75114
- var init_uninstall_command_help = __esm(() => {
75115
- uninstallCommandHelp = {
75116
- name: "uninstall",
75117
- description: "Remove ClaudeKit installations (ownership-aware)",
75118
- usage: "ck uninstall [options]",
75738
+ // src/domains/help/commands/common-options.ts
75739
+ var filterOptionsGroup, folderOptionsGroup;
75740
+ var init_common_options = __esm(() => {
75741
+ filterOptionsGroup = {
75742
+ title: "Filter Options",
75743
+ options: [
75744
+ {
75745
+ flags: "--exclude <pattern>",
75746
+ description: "Exclude files matching glob pattern (can be used multiple times)"
75747
+ },
75748
+ {
75749
+ flags: "--beta",
75750
+ description: "Show beta versions in selection prompt"
75751
+ },
75752
+ {
75753
+ flags: "--refresh",
75754
+ description: "Bypass release cache to fetch latest versions from GitHub"
75755
+ }
75756
+ ]
75757
+ };
75758
+ folderOptionsGroup = {
75759
+ title: "Folder Options",
75760
+ options: [
75761
+ {
75762
+ flags: "--docs-dir <name>",
75763
+ description: "Custom docs folder name to avoid conflicts with existing folders",
75764
+ defaultValue: "docs"
75765
+ },
75766
+ {
75767
+ flags: "--plans-dir <name>",
75768
+ description: "Custom plans folder name to avoid conflicts with existing folders",
75769
+ defaultValue: "plans"
75770
+ }
75771
+ ]
75772
+ };
75773
+ });
75774
+
75775
+ // src/domains/help/commands/init-command-help.ts
75776
+ var initCommandHelp;
75777
+ var init_init_command_help = __esm(() => {
75778
+ init_common_options();
75779
+ initCommandHelp = {
75780
+ name: "init",
75781
+ description: "Initialize or update ClaudeKit project (with interactive version selection)",
75782
+ usage: "ck init [options]",
75119
75783
  examples: [
75120
75784
  {
75121
- command: "ck uninstall --local --yes",
75122
- description: "Remove local installation without confirmation"
75785
+ command: "ck init --kit engineer",
75786
+ description: "Update local project with latest engineer kit"
75123
75787
  },
75124
75788
  {
75125
- command: "ck uninstall --dry-run",
75126
- description: "Preview what would be removed without deleting"
75789
+ command: "ck init --use-git --release v2.1.0 -y",
75790
+ description: "Non-interactive with git clone (no GitHub API needed)"
75127
75791
  }
75128
75792
  ],
75129
75793
  optionGroups: [
75130
75794
  {
75131
- title: "Scope Options",
75795
+ title: "Mode Options",
75132
75796
  options: [
75133
75797
  {
75134
- flags: "-l, --local",
75135
- description: "Uninstall only local installation (current project)"
75798
+ flags: "-y, --yes",
75799
+ description: "Non-interactive mode with sensible defaults (kit: engineer, dir: ., version: latest)"
75800
+ },
75801
+ {
75802
+ flags: "--use-git",
75803
+ description: "Use git clone instead of GitHub API (uses SSH/HTTPS credentials)"
75804
+ },
75805
+ {
75806
+ flags: "--sync",
75807
+ description: "Sync config files from upstream with interactive hunk-by-hunk merge"
75808
+ },
75809
+ {
75810
+ flags: "--archive <path>",
75811
+ description: "Use local archive file instead of downloading (zip/tar.gz)"
75812
+ },
75813
+ {
75814
+ flags: "--kit-path <path>",
75815
+ description: "Use local kit directory instead of downloading"
75816
+ }
75817
+ ]
75818
+ },
75819
+ {
75820
+ title: "Project Options",
75821
+ options: [
75822
+ {
75823
+ flags: "--dir <directory>",
75824
+ description: "Target directory to initialize/update",
75825
+ defaultValue: "."
75826
+ },
75827
+ {
75828
+ flags: "--kit <kit>",
75829
+ description: "Kit to use (engineer, marketing)"
75830
+ },
75831
+ {
75832
+ flags: "-r, --release <version>",
75833
+ description: "Skip version selection, use specific version"
75136
75834
  },
75137
75835
  {
75138
75836
  flags: "-g, --global",
75139
- description: "Uninstall only global installation (~/.claude/)"
75837
+ description: "Use platform-specific user configuration directory"
75140
75838
  },
75141
75839
  {
75142
- flags: "-A, --all",
75143
- description: "Uninstall from both local and global locations"
75840
+ flags: "--fresh",
75841
+ description: "Full reset: remove CK files, replace settings.json and CLAUDE.md, reinstall from scratch"
75144
75842
  },
75145
75843
  {
75146
- flags: "-k, --kit <type>",
75147
- description: "Uninstall specific kit only (engineer, marketing)"
75844
+ flags: "--force",
75845
+ description: "Force reinstall even if already at latest version (use with --yes; re-onboards missing files without full reset)"
75148
75846
  }
75149
75847
  ]
75150
75848
  },
75151
75849
  {
75152
- title: "Safety Options",
75850
+ title: "Filter Options",
75851
+ options: [
75852
+ {
75853
+ flags: "--exclude <pattern>",
75854
+ description: "Exclude files matching glob pattern (can be used multiple times)"
75855
+ },
75856
+ {
75857
+ flags: "--only <pattern>",
75858
+ description: "Include only files matching glob pattern (can be used multiple times)"
75859
+ },
75860
+ {
75861
+ flags: "--beta",
75862
+ description: "Show beta versions in selection prompt"
75863
+ },
75864
+ {
75865
+ flags: "--refresh",
75866
+ description: "Bypass release cache to fetch latest versions from GitHub"
75867
+ }
75868
+ ]
75869
+ },
75870
+ {
75871
+ title: "Installation Options",
75153
75872
  options: [
75873
+ {
75874
+ flags: "--install-skills",
75875
+ description: "Install skills dependencies (non-interactive mode)"
75876
+ },
75877
+ {
75878
+ flags: "--with-sudo",
75879
+ description: "Include system packages requiring sudo (Linux: ffmpeg, imagemagick)"
75880
+ },
75881
+ {
75882
+ flags: "--prefix",
75883
+ description: "Add /ck: prefix to all slash commands"
75884
+ },
75885
+ {
75886
+ flags: "--skip-setup",
75887
+ description: "Skip interactive configuration wizard"
75888
+ },
75154
75889
  {
75155
75890
  flags: "--dry-run",
75156
- description: "Preview what would be removed without deleting"
75891
+ description: "Preview changes without applying them (requires --prefix)"
75157
75892
  },
75158
75893
  {
75159
75894
  flags: "--force-overwrite",
75160
- description: "Delete even user-modified files (requires confirmation)"
75895
+ description: "Override ownership protections and delete user-modified files"
75161
75896
  },
75162
75897
  {
75163
- flags: "-y, --yes",
75164
- description: "Skip confirmation prompt"
75898
+ flags: "--force-overwrite-settings",
75899
+ description: "Fully replace settings.json instead of selective merge"
75165
75900
  }
75166
75901
  ]
75167
- }
75168
- ],
75169
- sections: [
75170
- {
75171
- title: "Ownership-Aware Uninstall",
75172
- content: "Uninstall preserves user customizations by default. Only CK-installed files that haven't been modified are removed. User-created files and modified files are preserved unless --force-overwrite is used."
75173
- }
75902
+ },
75903
+ folderOptionsGroup
75174
75904
  ]
75175
75905
  };
75176
75906
  });
75177
75907
 
75178
- // src/domains/help/commands/update-command-help.ts
75179
- var updateCommandHelp;
75180
- var init_update_command_help = __esm(() => {
75181
- updateCommandHelp = {
75182
- name: "update",
75183
- description: "Update ClaudeKit CLI tool only (not kit content)",
75184
- usage: "ck update [options]",
75908
+ // src/domains/help/commands/migrate-command-help.ts
75909
+ var migrateCommandHelp;
75910
+ var init_migrate_command_help = __esm(() => {
75911
+ migrateCommandHelp = {
75912
+ name: "migrate",
75913
+ description: "Migrate Claude Code agents, commands, skills, config, rules, and hooks to other providers",
75914
+ usage: "ck migrate [options]",
75185
75915
  examples: [
75186
75916
  {
75187
- command: "ck update --check",
75188
- description: "Check for CLI updates without installing"
75917
+ command: "ck migrate --agent codex --dry-run",
75918
+ description: "Preview the destination-aware migration plan before writing files"
75189
75919
  },
75190
75920
  {
75191
- command: "ck update --beta --yes",
75192
- description: "Update to latest beta version without confirmation"
75921
+ command: "ck migrate --agent codex -g",
75922
+ description: "Write to Codex global paths such as ~/.codex/ and ~/.agents/skills"
75923
+ },
75924
+ {
75925
+ command: "CK_FORCE_ASCII=1 ck migrate --agent codex",
75926
+ description: "Force ASCII borders on legacy Windows terminals (cmd.exe, older PowerShell)"
75193
75927
  }
75194
75928
  ],
75195
75929
  optionGroups: [
75196
75930
  {
75197
- title: "Update Options",
75931
+ title: "Target Options",
75198
75932
  options: [
75199
75933
  {
75200
- flags: "-r, --release <version>",
75201
- description: "Update to a specific version"
75934
+ flags: "-a, --agent <provider>",
75935
+ description: "Target provider(s), can be specified multiple times"
75202
75936
  },
75203
75937
  {
75204
- flags: "--check",
75205
- description: "Check for updates without installing"
75938
+ flags: "--all",
75939
+ description: "Migrate to all supported providers"
75940
+ },
75941
+ {
75942
+ flags: "-g, --global",
75943
+ description: "Install globally instead of the default project-level scope"
75206
75944
  },
75207
75945
  {
75208
75946
  flags: "-y, --yes",
75209
- description: "Skip all confirmation prompts (CLI and kit content update)"
75947
+ description: "Skip confirmation prompts after the pre-flight summary"
75210
75948
  },
75211
75949
  {
75212
- flags: "--beta",
75213
- description: "Update to the latest beta version"
75950
+ flags: "-f, --force",
75951
+ description: "Force reinstall deleted or edited managed items"
75214
75952
  },
75215
75953
  {
75216
- flags: "--registry <url>",
75217
- description: "Custom npm registry URL"
75954
+ flags: "--dry-run",
75955
+ description: "Preview plan, destinations, and next steps without writing files"
75218
75956
  }
75219
75957
  ]
75220
75958
  },
75221
75959
  {
75222
- title: "Deprecated Options",
75960
+ title: "Content Selection",
75223
75961
  options: [
75224
75962
  {
75225
- flags: "--kit <kit>",
75226
- description: "This option is no longer supported with 'ck update'",
75227
- deprecated: {
75228
- message: "Use 'ck init --kit <kit>' to update kit installations",
75229
- alternative: "ck init --kit <kit>"
75230
- }
75963
+ flags: "--config",
75964
+ description: "Migrate CLAUDE.md config only"
75231
75965
  },
75232
75966
  {
75233
- flags: "-g, --global",
75234
- description: "This option is no longer supported with 'ck update'",
75235
- deprecated: {
75236
- message: "Use 'ck init --global' to update global kit",
75237
- alternative: "ck init --global"
75238
- }
75967
+ flags: "--rules",
75968
+ description: "Migrate .claude/rules only"
75969
+ },
75970
+ {
75971
+ flags: "--hooks",
75972
+ description: "Migrate .claude/hooks only"
75973
+ },
75974
+ {
75975
+ flags: "--skip-config",
75976
+ description: "Skip config migration"
75977
+ },
75978
+ {
75979
+ flags: "--skip-rules",
75980
+ description: "Skip rules migration"
75981
+ },
75982
+ {
75983
+ flags: "--skip-hooks",
75984
+ description: "Skip hooks migration"
75985
+ },
75986
+ {
75987
+ flags: "--source <path>",
75988
+ description: "Custom CLAUDE.md source path"
75239
75989
  }
75240
75990
  ]
75241
75991
  }
75242
- ],
75243
- sections: [
75244
- {
75245
- title: "Note",
75246
- content: "'ck update' updates the CLI tool only and defaults to the latest stable release. Use '--beta' to opt into prerelease CLI builds. To update kit content (skills, commands, rules), use 'ck init' for local or 'ck init -g' for global. Use --yes to skip all prompts (both CLI and kit content update) for non-interactive/CI usage."
75247
- }
75248
75992
  ]
75249
75993
  };
75250
75994
  });
75251
75995
 
75252
- // src/domains/help/commands/versions-command-help.ts
75253
- var versionsCommandHelp;
75254
- var init_versions_command_help = __esm(() => {
75255
- versionsCommandHelp = {
75256
- name: "versions",
75257
- description: "List available versions of ClaudeKit repositories",
75258
- usage: "ck versions [options]",
75996
+ // src/domains/help/commands/new-command-help.ts
75997
+ var newCommandHelp;
75998
+ var init_new_command_help = __esm(() => {
75999
+ init_common_options();
76000
+ newCommandHelp = {
76001
+ name: "new",
76002
+ description: "Bootstrap a new ClaudeKit project (with interactive version selection)",
76003
+ usage: "ck new [options]",
75259
76004
  examples: [
75260
76005
  {
75261
- command: "ck versions --kit engineer --limit 10",
75262
- description: "Show latest 10 versions of engineer kit"
76006
+ command: "ck new --kit engineer --dir ./my-project",
76007
+ description: "Create engineer kit project in specific directory"
75263
76008
  },
75264
76009
  {
75265
- command: "ck versions --all",
75266
- description: "Show all releases including prereleases"
76010
+ command: "ck new -y --use-git --release v2.1.0",
76011
+ description: "Non-interactive with git clone (no GitHub API needed)"
75267
76012
  }
75268
76013
  ],
75269
76014
  optionGroups: [
75270
76015
  {
75271
- title: "Filter Options",
76016
+ title: "Mode Options",
75272
76017
  options: [
75273
76018
  {
75274
- flags: "--kit <kit>",
75275
- description: "Filter by specific kit (engineer, marketing)"
76019
+ flags: "-y, --yes",
76020
+ description: "Non-interactive mode (skip all prompts)"
75276
76021
  },
75277
76022
  {
75278
- flags: "--limit <number>",
75279
- description: "Number of releases to show",
75280
- defaultValue: "30"
76023
+ flags: "--use-git",
76024
+ description: "Use git clone instead of GitHub API (uses SSH/HTTPS credentials)"
75281
76025
  },
75282
76026
  {
75283
- flags: "--all",
75284
- description: "Show all releases including prereleases"
76027
+ flags: "--archive <path>",
76028
+ description: "Use local archive file instead of downloading (zip/tar.gz)"
76029
+ },
76030
+ {
76031
+ flags: "--kit-path <path>",
76032
+ description: "Use local kit directory instead of downloading"
75285
76033
  }
75286
76034
  ]
75287
- }
75288
- ]
75289
- };
75290
- });
75291
-
75292
- // src/domains/help/commands/skills-command-help.ts
75293
- var skillsCommandHelp;
75294
- var init_skills_command_help = __esm(() => {
75295
- skillsCommandHelp = {
75296
- name: "skills",
75297
- description: "Install, uninstall, and manage ClaudeKit skills across coding agents",
75298
- usage: "ck skills [options]",
75299
- examples: [
75300
- {
75301
- command: "ck skills --name frontend-design --agent claude-code -g",
75302
- description: "Install skill to Claude Code globally"
75303
76035
  },
75304
76036
  {
75305
- command: "ck skills --list --installed",
75306
- description: "Show all installed skills with their locations"
75307
- }
75308
- ],
75309
- optionGroups: [
75310
- {
75311
- title: "Mode Options",
76037
+ title: "Project Options",
75312
76038
  options: [
75313
76039
  {
75314
- flags: "-l, --list",
75315
- description: "List available skills from ClaudeKit source"
76040
+ flags: "--dir <directory>",
76041
+ description: "Target directory for the new project",
76042
+ defaultValue: "."
75316
76043
  },
75317
76044
  {
75318
- flags: "--installed",
75319
- description: "When used with --list, show installed skills instead"
76045
+ flags: "--kit <kit>",
76046
+ description: "Kit to use (engineer, marketing)"
75320
76047
  },
75321
76048
  {
75322
- flags: "-u, --uninstall",
75323
- description: "Uninstall skill(s) from agent(s)"
76049
+ flags: "-r, --release <version>",
76050
+ description: "Skip version selection, use specific version (e.g., latest, v1.0.0)"
75324
76051
  },
75325
76052
  {
75326
- flags: "--sync",
75327
- description: "Sync registry with filesystem (clean orphaned entries)"
76053
+ flags: "--force",
76054
+ description: "Overwrite existing files without confirmation"
75328
76055
  }
75329
76056
  ]
75330
76057
  },
76058
+ filterOptionsGroup,
75331
76059
  {
75332
76060
  title: "Installation Options",
75333
76061
  options: [
75334
76062
  {
75335
- flags: "-n, --name <skill>",
75336
- description: "Skill name to install or uninstall"
76063
+ flags: "--opencode",
76064
+ description: "Install OpenCode CLI package (non-interactive mode)"
75337
76065
  },
75338
76066
  {
75339
- flags: "-a, --agent <agent>",
75340
- description: "Target agent(s) - can be specified multiple times. Valid: claude-code, cursor, codex, opencode, goose, gemini-cli, antigravity, github-copilot, amp, kilo, roo, windsurf, cline, openhands"
76067
+ flags: "--gemini",
76068
+ description: "Install Google Gemini CLI package (non-interactive mode)"
75341
76069
  },
75342
76070
  {
75343
- flags: "-g, --global",
75344
- description: "Install to user's home directory (available across projects)"
76071
+ flags: "--install-skills",
76072
+ description: "Install skills dependencies (non-interactive mode)"
75345
76073
  },
75346
76074
  {
75347
- flags: "--all",
75348
- description: "Install to all supported agents"
76075
+ flags: "--with-sudo",
76076
+ description: "Include system packages requiring sudo (Linux: ffmpeg, imagemagick)"
75349
76077
  },
75350
76078
  {
75351
- flags: "-y, --yes",
75352
- description: "Non-interactive mode (skip confirmations)"
75353
- }
75354
- ]
75355
- },
75356
- {
75357
- title: "Uninstall Options",
75358
- options: [
75359
- {
75360
- flags: "-f, --force",
75361
- description: "Force uninstall even if skill not in registry (requires --agent)"
76079
+ flags: "--prefix",
76080
+ description: "Add /ck: prefix to all slash commands"
75362
76081
  }
75363
76082
  ]
75364
- }
75365
- ],
75366
- sections: [
75367
- {
75368
- title: "Supported Agents",
75369
- content: ` claude-code Claude Code CLI
75370
- cursor Cursor IDE
75371
- codex Codex CLI
75372
- opencode OpenCode
75373
- goose Goose AI
75374
- gemini-cli Gemini CLI
75375
- antigravity Antigravity Agent
75376
- github-copilot GitHub Copilot
75377
- amp Amp
75378
- kilo Kilo Code
75379
- roo Roo Code
75380
- windsurf Windsurf IDE
75381
- cline Cline
75382
- openhands OpenHands`
75383
76083
  },
75384
- {
75385
- title: "Notes",
75386
- content: ` • Skills are installed from ~/.claude/skills (ClaudeKit Engineer source)
75387
- • OpenCode reuses Claude-compatible skill roots (.claude/skills, ~/.claude/skills), so installs may be a no-op
75388
- • Registry stored at ~/.claudekit/skill-registry.json
75389
- • Target paths vary by agent; some agents intentionally share a common skills directory`
75390
- }
76084
+ folderOptionsGroup
75391
76085
  ]
75392
76086
  };
75393
76087
  });
75394
76088
 
75395
- // src/domains/help/commands/config-command-help.ts
75396
- var configCommandHelp;
75397
- var init_config_command_help = __esm(() => {
75398
- configCommandHelp = {
75399
- name: "config",
75400
- description: "Manage ClaudeKit configuration and launch the config dashboard",
75401
- usage: "ck config [action] [key] [value] [options]",
76089
+ // src/domains/help/commands/plan-command-help.ts
76090
+ var planCommandHelp;
76091
+ var init_plan_command_help = __esm(() => {
76092
+ planCommandHelp = {
76093
+ name: "plan",
76094
+ description: "Plan management: parse, validate, status, kanban, create, check, uncheck, add-phase",
76095
+ usage: "ck plan [action] [target] [options]",
75402
76096
  examples: [
75403
76097
  {
75404
- command: "ck config",
75405
- description: "Launch the web dashboard (same as 'ck config ui')"
75406
- },
75407
- {
75408
- command: "ck config --host 0.0.0.0 --no-open",
75409
- description: "Expose the dashboard to your network intentionally"
76098
+ command: "ck plan status",
76099
+ description: "Show progress summary for all plans in the current project"
75410
76100
  },
75411
76101
  {
75412
- command: "ck config set defaults.kit engineer",
75413
- description: "Set a config value from the CLI"
76102
+ command: "ck plan create --title 'Auth feature' --phases setup,api,ui",
76103
+ description: "Scaffold a new plan directory with three phases"
75414
76104
  }
75415
76105
  ],
75416
76106
  optionGroups: [
75417
76107
  {
75418
- title: "Actions",
76108
+ title: "Output Options",
75419
76109
  options: [
75420
- {
75421
- flags: "ui",
75422
- description: "Launch config dashboard (default action when omitted)"
75423
- },
75424
- {
75425
- flags: "get <key>",
75426
- description: "Read a config value"
75427
- },
75428
- {
75429
- flags: "set <key> <value>",
75430
- description: "Write a config value"
75431
- },
75432
- {
75433
- flags: "show",
75434
- description: "Print merged config"
75435
- }
76110
+ { flags: "--json", description: "Output in JSON format" },
76111
+ { flags: "--strict", description: "Strict validation mode (validate action)" }
75436
76112
  ]
75437
76113
  },
75438
76114
  {
@@ -75440,49 +76116,147 @@ var init_config_command_help = __esm(() => {
75440
76116
  options: [
75441
76117
  {
75442
76118
  flags: "-g, --global",
75443
- description: "Use global config (~/.claudekit/config.json)"
75444
- },
76119
+ description: "Use global plans scope (~/.claude/plans or configured global root)"
76120
+ }
76121
+ ]
76122
+ }
76123
+ ],
76124
+ subcommands: [
76125
+ {
76126
+ name: "parse",
76127
+ description: "Parse a plan.md and output an ASCII table or JSON of all phases",
76128
+ usage: "ck plan parse [target] [--json]",
76129
+ examples: [],
76130
+ optionGroups: [
75445
76131
  {
75446
- flags: "-l, --local",
75447
- description: "Use local config (.claude/.ck.json)"
76132
+ title: "Output Options",
76133
+ options: [{ flags: "--json", description: "Output machine-readable JSON" }]
75448
76134
  }
75449
76135
  ]
75450
76136
  },
75451
76137
  {
75452
- title: "Dashboard Options",
75453
- options: [
76138
+ name: "validate",
76139
+ description: "Validate plan.md syntax and structure",
76140
+ usage: "ck plan validate [target] [--strict] [--json]",
76141
+ examples: [],
76142
+ optionGroups: [
75454
76143
  {
75455
- flags: "--port <port>",
75456
- description: "Port for dashboard server"
75457
- },
76144
+ title: "Validation Options",
76145
+ options: [
76146
+ { flags: "--strict", description: "Fail on warnings in addition to errors" },
76147
+ { flags: "--json", description: "Output results as JSON" }
76148
+ ]
76149
+ }
76150
+ ]
76151
+ },
76152
+ {
76153
+ name: "status",
76154
+ description: "Show progress for plans in scope",
76155
+ usage: "ck plan status [--json] [-g]",
76156
+ examples: [],
76157
+ optionGroups: [
75458
76158
  {
75459
- flags: "--host <host>",
75460
- description: "Bind dashboard host (default: 127.0.0.1)"
76159
+ title: "Output Options",
76160
+ options: [{ flags: "--json", description: "Output in JSON format" }]
75461
76161
  },
75462
76162
  {
75463
- flags: "--no-open",
75464
- description: "Do not auto-open browser when launching dashboard"
76163
+ title: "Scope Options",
76164
+ options: [{ flags: "-g, --global", description: "Show status for global plans scope" }]
76165
+ }
76166
+ ]
76167
+ },
76168
+ {
76169
+ name: "kanban",
76170
+ description: "Launch interactive Kanban dashboard in the browser",
76171
+ usage: "ck plan kanban [--port <port>] [--no-open] [--dev]",
76172
+ examples: [],
76173
+ optionGroups: [
76174
+ {
76175
+ title: "Dashboard Options",
76176
+ options: [
76177
+ { flags: "--port <port>", description: "Port to serve the Kanban dashboard on" },
76178
+ { flags: "--no-open", description: "Do not auto-open the browser" },
76179
+ { flags: "--dev", description: "Start dashboard in development mode" }
76180
+ ]
76181
+ }
76182
+ ]
76183
+ },
76184
+ {
76185
+ name: "create",
76186
+ description: "Scaffold a new plan directory with phase files",
76187
+ usage: "ck plan create [--title <title>] [--phases <phases>] [options]",
76188
+ examples: [],
76189
+ optionGroups: [
76190
+ {
76191
+ title: "Create Options",
76192
+ options: [
76193
+ { flags: "--title <title>", description: "Plan title" },
76194
+ {
76195
+ flags: "--phases <phases>",
76196
+ description: "Comma-separated list of phase names"
76197
+ },
76198
+ { flags: "--dir <dir>", description: "Plan output directory" },
76199
+ {
76200
+ flags: "--priority <priority>",
76201
+ description: "Priority level: P1, P2, or P3"
76202
+ },
76203
+ { flags: "--issue <issue>", description: "GitHub issue number to link" },
76204
+ {
76205
+ flags: "--source <source>",
76206
+ description: "Creation source: skill | cli | dashboard"
76207
+ },
76208
+ {
76209
+ flags: "--session-id <id>",
76210
+ description: "Claude session ID for tracking"
76211
+ }
76212
+ ]
75465
76213
  },
75466
76214
  {
75467
- flags: "--dev",
75468
- description: "Run dashboard in development mode with HMR"
76215
+ title: "Scope Options",
76216
+ options: [{ flags: "-g, --global", description: "Create plan in global plans scope" }]
75469
76217
  }
75470
76218
  ]
75471
76219
  },
75472
76220
  {
75473
- title: "Output Options",
75474
- options: [
76221
+ name: "check",
76222
+ description: "Mark a phase as completed (or in-progress with --start)",
76223
+ usage: "ck plan check <id> [--start]",
76224
+ examples: [],
76225
+ optionGroups: [
75475
76226
  {
75476
- flags: "--json",
75477
- description: "Output machine-readable JSON for CLI actions"
76227
+ title: "Check Options",
76228
+ options: [
76229
+ {
76230
+ flags: "--start",
76231
+ description: "Mark phase as in-progress instead of completed"
76232
+ }
76233
+ ]
75478
76234
  }
75479
76235
  ]
75480
- }
75481
- ],
75482
- sections: [
76236
+ },
75483
76237
  {
75484
- title: "Notes",
75485
- content: "Run 'ck config --help' to see both CLI actions and dashboard flags. Running bare 'ck config' opens the dashboard directly. Use '--host' to expose the dashboard intentionally beyond localhost."
76238
+ name: "uncheck",
76239
+ description: "Reset a phase back to pending status",
76240
+ usage: "ck plan uncheck <id>",
76241
+ examples: [],
76242
+ optionGroups: []
76243
+ },
76244
+ {
76245
+ name: "add-phase",
76246
+ description: "Append a new phase to an existing plan",
76247
+ usage: "ck plan add-phase [target] [--after <id>]",
76248
+ examples: [],
76249
+ optionGroups: [
76250
+ {
76251
+ title: "Phase Options",
76252
+ options: [
76253
+ {
76254
+ flags: "--after <after>",
76255
+ description: "Insert the new phase after this phase ID"
76256
+ }
76257
+ ]
76258
+ }
76259
+ ]
75486
76260
  }
75487
76261
  ]
75488
76262
  };
@@ -75543,6 +76317,10 @@ var init_projects_command_help = __esm(() => {
75543
76317
  flags: "--alias <alias>",
75544
76318
  description: "Custom alias for project (add)"
75545
76319
  },
76320
+ {
76321
+ flags: "--pinned",
76322
+ description: "Pin this project (add)"
76323
+ },
75546
76324
  {
75547
76325
  flags: "--tags <tags>",
75548
76326
  description: "Comma-separated tags (add)"
@@ -75553,6 +76331,31 @@ var init_projects_command_help = __esm(() => {
75553
76331
  }
75554
76332
  ]
75555
76333
  }
76334
+ ],
76335
+ subcommands: [
76336
+ {
76337
+ name: "list",
76338
+ description: "List projects in registry",
76339
+ usage: "ck projects list [--json] [--pinned]",
76340
+ examples: [],
76341
+ optionGroups: [],
76342
+ aliases: ["ls"]
76343
+ },
76344
+ {
76345
+ name: "add",
76346
+ description: "Add project path to registry",
76347
+ usage: "ck projects add <path> [--alias <alias>] [--pinned] [--tags <tags>]",
76348
+ examples: [],
76349
+ optionGroups: []
76350
+ },
76351
+ {
76352
+ name: "remove",
76353
+ description: "Remove project by alias or ID",
76354
+ usage: "ck projects remove [alias] [--id <id>]",
76355
+ examples: [],
76356
+ optionGroups: [],
76357
+ aliases: ["rm"]
76358
+ }
75556
76359
  ]
75557
76360
  };
75558
76361
  });
@@ -75601,21 +76404,21 @@ var init_setup_command_help = __esm(() => {
75601
76404
  };
75602
76405
  });
75603
76406
 
75604
- // src/domains/help/commands/agents-command-help.ts
75605
- var agentsCommandHelp;
75606
- var init_agents_command_help = __esm(() => {
75607
- agentsCommandHelp = {
75608
- name: "agents",
75609
- description: "Install, uninstall, and manage Claude Code agents across providers",
75610
- usage: "ck agents [options]",
76407
+ // src/domains/help/commands/skills-command-help.ts
76408
+ var skillsCommandHelp;
76409
+ var init_skills_command_help = __esm(() => {
76410
+ skillsCommandHelp = {
76411
+ name: "skills",
76412
+ description: "Install, uninstall, and manage ClaudeKit skills across coding agents",
76413
+ usage: "ck skills [options]",
75611
76414
  examples: [
75612
76415
  {
75613
- command: "ck agents --name maintainer --agent codex",
75614
- description: "Install one agent to Codex"
76416
+ command: "ck skills --name frontend-design --agent claude-code -g",
76417
+ description: "Install skill to Claude Code globally"
75615
76418
  },
75616
76419
  {
75617
- command: "ck agents --list --installed",
75618
- description: "Show installed agents and locations"
76420
+ command: "ck skills --list --installed",
76421
+ description: "Show all installed skills with their locations"
75619
76422
  }
75620
76423
  ],
75621
76424
  optionGroups: [
@@ -75624,15 +76427,15 @@ var init_agents_command_help = __esm(() => {
75624
76427
  options: [
75625
76428
  {
75626
76429
  flags: "-l, --list",
75627
- description: "List available agents from source"
76430
+ description: "List available skills from ClaudeKit source"
75628
76431
  },
75629
76432
  {
75630
76433
  flags: "--installed",
75631
- description: "When used with --list, show installed agents instead"
76434
+ description: "When used with --list, show installed skills instead"
75632
76435
  },
75633
76436
  {
75634
76437
  flags: "-u, --uninstall",
75635
- description: "Uninstall agent(s) from providers"
76438
+ description: "Uninstall skill(s) from agent(s)"
75636
76439
  },
75637
76440
  {
75638
76441
  flags: "--sync",
@@ -75644,101 +76447,53 @@ var init_agents_command_help = __esm(() => {
75644
76447
  title: "Installation Options",
75645
76448
  options: [
75646
76449
  {
75647
- flags: "-n, --name <agent>",
75648
- description: "Agent name to install or uninstall"
76450
+ flags: "-n, --name <skill>",
76451
+ description: "Skill name to install or uninstall"
75649
76452
  },
75650
76453
  {
75651
- flags: "-a, --agent <provider>",
75652
- description: "Target provider(s), can be specified multiple times"
76454
+ flags: "-a, --agent <agent>",
76455
+ description: "Target agent(s) - can be specified multiple times. Valid: claude-code, cursor, codex, opencode, goose, gemini-cli, antigravity, github-copilot, amp, kilo, roo, windsurf, cline, openhands"
75653
76456
  },
75654
76457
  {
75655
76458
  flags: "-g, --global",
75656
- description: "Install globally instead of project-level"
76459
+ description: "Install to user's home directory (available across projects)"
75657
76460
  },
75658
76461
  {
75659
76462
  flags: "--all",
75660
- description: "Install to all supported providers"
76463
+ description: "Install to all supported agents"
75661
76464
  },
75662
76465
  {
75663
76466
  flags: "-y, --yes",
75664
- description: "Skip confirmation prompts"
75665
- }
75666
- ]
75667
- },
75668
- {
75669
- title: "Uninstall Options",
75670
- options: [
75671
- {
75672
- flags: "--force",
75673
- description: "Force uninstall even if not tracked in registry"
76467
+ description: "Non-interactive mode (skip confirmations)"
75674
76468
  }
75675
76469
  ]
75676
- }
75677
- ]
75678
- };
75679
- });
75680
-
75681
- // src/domains/help/commands/commands-command-help.ts
75682
- var commandsCommandHelp;
75683
- var init_commands_command_help = __esm(() => {
75684
- commandsCommandHelp = {
75685
- name: "commands",
75686
- description: "Install, uninstall, and manage Claude commands across providers",
75687
- usage: "ck commands [options]",
75688
- examples: [
75689
- {
75690
- command: "ck commands --name plan --agent codex",
75691
- description: "Install one slash command to Codex"
75692
76470
  },
75693
76471
  {
75694
- command: "ck commands --list",
75695
- description: "List available commands from source"
75696
- }
75697
- ],
75698
- optionGroups: [
75699
- {
75700
- title: "Mode Options",
76472
+ title: "Catalog Options",
75701
76473
  options: [
75702
76474
  {
75703
- flags: "-l, --list",
75704
- description: "List available commands from source"
76475
+ flags: "--catalog",
76476
+ description: "Show skill catalog stats and metadata"
75705
76477
  },
75706
76478
  {
75707
- flags: "--installed",
75708
- description: "When used with --list, show installed commands instead"
76479
+ flags: "--regenerate",
76480
+ description: "Force regenerate catalog (use with --catalog)"
75709
76481
  },
75710
76482
  {
75711
- flags: "-u, --uninstall",
75712
- description: "Uninstall command(s) from providers"
76483
+ flags: "--search <query>",
76484
+ description: "BM25 full-text search over skill catalog"
75713
76485
  },
75714
76486
  {
75715
- flags: "--sync",
75716
- description: "Sync registry with filesystem (clean orphaned entries)"
75717
- }
75718
- ]
75719
- },
75720
- {
75721
- title: "Installation Options",
75722
- options: [
75723
- {
75724
- flags: "-n, --name <command>",
75725
- description: "Command name to install or uninstall"
75726
- },
75727
- {
75728
- flags: "-a, --agent <provider>",
75729
- description: "Target provider(s), can be specified multiple times"
75730
- },
75731
- {
75732
- flags: "-g, --global",
75733
- description: "Install globally instead of project-level"
76487
+ flags: "--json",
76488
+ description: "Output search results as JSON (use with --search)"
75734
76489
  },
75735
76490
  {
75736
- flags: "--all",
75737
- description: "Install to all supported providers"
76491
+ flags: "--limit <n>",
76492
+ description: "Max search results, default 10 (use with --search)"
75738
76493
  },
75739
76494
  {
75740
- flags: "-y, --yes",
75741
- description: "Skip confirmation prompts"
76495
+ flags: "--validate",
76496
+ description: "Validate SKILL.md frontmatter fields"
75742
76497
  }
75743
76498
  ]
75744
76499
  },
@@ -75746,190 +76501,222 @@ var init_commands_command_help = __esm(() => {
75746
76501
  title: "Uninstall Options",
75747
76502
  options: [
75748
76503
  {
75749
- flags: "--force",
75750
- description: "Force uninstall even if not tracked in registry"
76504
+ flags: "-f, --force",
76505
+ description: "Force uninstall even if skill not in registry (requires --agent)"
75751
76506
  }
75752
76507
  ]
75753
76508
  }
76509
+ ],
76510
+ sections: [
76511
+ {
76512
+ title: "Supported Agents",
76513
+ content: ` claude-code Claude Code CLI
76514
+ cursor Cursor IDE
76515
+ codex Codex CLI
76516
+ opencode OpenCode
76517
+ goose Goose AI
76518
+ gemini-cli Gemini CLI
76519
+ antigravity Antigravity Agent
76520
+ github-copilot GitHub Copilot
76521
+ amp Amp
76522
+ kilo Kilo Code
76523
+ roo Roo Code
76524
+ windsurf Windsurf IDE
76525
+ cline Cline
76526
+ openhands OpenHands`
76527
+ },
76528
+ {
76529
+ title: "Notes",
76530
+ content: ` • Skills are installed from ~/.claude/skills (ClaudeKit Engineer source)
76531
+ • OpenCode reuses Claude-compatible skill roots (.claude/skills, ~/.claude/skills), so installs may be a no-op
76532
+ • Registry stored at ~/.claudekit/skill-registry.json
76533
+ • Target paths vary by agent; some agents intentionally share a common skills directory`
76534
+ }
75754
76535
  ]
75755
76536
  };
75756
76537
  });
75757
76538
 
75758
- // src/domains/help/commands/content-command-help.ts
75759
- var contentCommandHelp;
75760
- var init_content_command_help = __esm(() => {
75761
- contentCommandHelp = {
75762
- name: "content",
75763
- description: "Multi-channel content automation engine",
75764
- usage: "ck content [action] [id] [options]",
76539
+ // src/domains/help/commands/uninstall-command-help.ts
76540
+ var uninstallCommandHelp;
76541
+ var init_uninstall_command_help = __esm(() => {
76542
+ uninstallCommandHelp = {
76543
+ name: "uninstall",
76544
+ description: "Remove ClaudeKit installations (ownership-aware)",
76545
+ usage: "ck uninstall [options]",
75765
76546
  examples: [
75766
76547
  {
75767
- command: "ck content start",
75768
- description: "Start the content daemon (default action)"
75769
- },
75770
- {
75771
- command: "ck content setup",
75772
- description: "Interactive configuration wizard"
76548
+ command: "ck uninstall --local --yes",
76549
+ description: "Remove local installation without confirmation"
75773
76550
  },
75774
76551
  {
75775
- command: "ck content queue",
75776
- description: "List pending content items for review"
76552
+ command: "ck uninstall --dry-run",
76553
+ description: "Preview what would be removed without deleting"
75777
76554
  }
75778
76555
  ],
75779
76556
  optionGroups: [
75780
76557
  {
75781
- title: "Actions",
76558
+ title: "Scope Options",
75782
76559
  options: [
75783
76560
  {
75784
- flags: "start",
75785
- description: "Start the content daemon (default when no action specified)"
75786
- },
75787
- {
75788
- flags: "stop",
75789
- description: "Stop the running content daemon"
75790
- },
75791
- {
75792
- flags: "status",
75793
- description: "Show daemon status and recent activity"
75794
- },
75795
- {
75796
- flags: "logs",
75797
- description: "View content daemon logs"
75798
- },
75799
- {
75800
- flags: "setup",
75801
- description: "Interactive configuration wizard"
76561
+ flags: "-l, --local",
76562
+ description: "Uninstall only local installation (current project)"
75802
76563
  },
75803
76564
  {
75804
- flags: "queue",
75805
- description: "List pending content items"
76565
+ flags: "-g, --global",
76566
+ description: "Uninstall only global installation (~/.claude/)"
75806
76567
  },
75807
76568
  {
75808
- flags: "approve <id>",
75809
- description: "Approve a content item for publishing"
76569
+ flags: "-A, --all",
76570
+ description: "Uninstall from both local and global locations"
75810
76571
  },
75811
76572
  {
75812
- flags: "reject <id>",
75813
- description: "Reject a content item"
76573
+ flags: "-k, --kit <type>",
76574
+ description: "Uninstall specific kit only (engineer, marketing)"
75814
76575
  }
75815
76576
  ]
75816
76577
  },
75817
76578
  {
75818
- title: "Options",
76579
+ title: "Safety Options",
75819
76580
  options: [
75820
76581
  {
75821
76582
  flags: "--dry-run",
75822
- description: "Generate content without publishing"
75823
- },
75824
- {
75825
- flags: "--verbose",
75826
- description: "Enable verbose logging"
75827
- },
75828
- {
75829
- flags: "--force",
75830
- description: "Kill existing process and start fresh"
76583
+ description: "Preview what would be removed without deleting"
75831
76584
  },
75832
76585
  {
75833
- flags: "--tail",
75834
- description: "Follow log output in real-time (for logs action)"
76586
+ flags: "--force-overwrite",
76587
+ description: "Delete even user-modified files (requires confirmation)"
75835
76588
  },
75836
76589
  {
75837
- flags: "--reason <reason>",
75838
- description: "Rejection reason (for reject action)"
76590
+ flags: "-y, --yes",
76591
+ description: "Skip confirmation prompt"
75839
76592
  }
75840
76593
  ]
75841
76594
  }
75842
76595
  ],
75843
76596
  sections: [
75844
76597
  {
75845
- title: "Notes",
75846
- content: "Requires content config in .ck.json. Run 'ck content setup' for guided configuration. Review mode can be 'auto' or 'manual' (default: manual)."
76598
+ title: "Ownership-Aware Uninstall",
76599
+ content: "Uninstall preserves user customizations by default. Only CK-installed files that haven't been modified are removed. User-created files and modified files are preserved unless --force-overwrite is used."
75847
76600
  }
75848
76601
  ]
75849
76602
  };
75850
76603
  });
75851
76604
 
75852
- // src/domains/help/commands/migrate-command-help.ts
75853
- var migrateCommandHelp;
75854
- var init_migrate_command_help = __esm(() => {
75855
- migrateCommandHelp = {
75856
- name: "migrate",
75857
- description: "Migrate Claude Code agents, commands, skills, config, rules, and hooks to other providers",
75858
- usage: "ck migrate [options]",
76605
+ // src/domains/help/commands/update-command-help.ts
76606
+ var updateCommandHelp;
76607
+ var init_update_command_help = __esm(() => {
76608
+ updateCommandHelp = {
76609
+ name: "update",
76610
+ description: "Update ClaudeKit CLI tool only (not kit content)",
76611
+ usage: "ck update [options]",
75859
76612
  examples: [
75860
76613
  {
75861
- command: "ck migrate --agent codex --dry-run",
75862
- description: "Preview the destination-aware migration plan before writing files"
75863
- },
75864
- {
75865
- command: "ck migrate --agent codex -g",
75866
- description: "Write to Codex global paths such as ~/.codex/ and ~/.agents/skills"
76614
+ command: "ck update --check",
76615
+ description: "Check for CLI updates without installing"
75867
76616
  },
75868
76617
  {
75869
- command: "CK_FORCE_ASCII=1 ck migrate --agent codex",
75870
- description: "Force ASCII borders on legacy Windows terminals (cmd.exe, older PowerShell)"
76618
+ command: "ck update --dev --yes",
76619
+ description: "Update to latest dev version without confirmation"
75871
76620
  }
75872
76621
  ],
75873
76622
  optionGroups: [
75874
76623
  {
75875
- title: "Target Options",
76624
+ title: "Update Options",
75876
76625
  options: [
75877
76626
  {
75878
- flags: "-a, --agent <provider>",
75879
- description: "Target provider(s), can be specified multiple times"
75880
- },
75881
- {
75882
- flags: "--all",
75883
- description: "Migrate to all supported providers"
76627
+ flags: "-r, --release <version>",
76628
+ description: "Update to a specific version"
75884
76629
  },
75885
76630
  {
75886
- flags: "-g, --global",
75887
- description: "Install globally instead of the default project-level scope"
76631
+ flags: "--check",
76632
+ description: "Check for updates without installing"
75888
76633
  },
75889
76634
  {
75890
76635
  flags: "-y, --yes",
75891
- description: "Skip confirmation prompts after the pre-flight summary"
76636
+ description: "Skip all confirmation prompts (CLI and kit content update)"
75892
76637
  },
75893
76638
  {
75894
- flags: "-f, --force",
75895
- description: "Force reinstall deleted or edited managed items"
76639
+ flags: "-d, --dev",
76640
+ description: "Update to the latest dev version"
75896
76641
  },
75897
76642
  {
75898
- flags: "--dry-run",
75899
- description: "Preview plan, destinations, and next steps without writing files"
76643
+ flags: "--registry <url>",
76644
+ description: "Custom npm registry URL"
75900
76645
  }
75901
76646
  ]
75902
76647
  },
75903
76648
  {
75904
- title: "Content Selection",
76649
+ title: "Deprecated Options",
75905
76650
  options: [
75906
76651
  {
75907
- flags: "--config",
75908
- description: "Migrate CLAUDE.md config only"
75909
- },
75910
- {
75911
- flags: "--rules",
75912
- description: "Migrate .claude/rules only"
76652
+ flags: "--beta",
76653
+ description: "(deprecated) Alias for --dev; use -d, --dev instead",
76654
+ deprecated: {
76655
+ message: "Use '-d, --dev' to update to the latest dev version",
76656
+ alternative: "-d, --dev"
76657
+ }
75913
76658
  },
75914
76659
  {
75915
- flags: "--hooks",
75916
- description: "Migrate .claude/hooks only"
76660
+ flags: "--kit <kit>",
76661
+ description: "This option is no longer supported with 'ck update'",
76662
+ deprecated: {
76663
+ message: "Use 'ck init --kit <kit>' to update kit installations",
76664
+ alternative: "ck init --kit <kit>"
76665
+ }
75917
76666
  },
75918
76667
  {
75919
- flags: "--skip-config",
75920
- description: "Skip config migration"
75921
- },
76668
+ flags: "-g, --global",
76669
+ description: "This option is no longer supported with 'ck update'",
76670
+ deprecated: {
76671
+ message: "Use 'ck init --global' to update global kit",
76672
+ alternative: "ck init --global"
76673
+ }
76674
+ }
76675
+ ]
76676
+ }
76677
+ ],
76678
+ sections: [
76679
+ {
76680
+ title: "Note",
76681
+ content: "'ck update' updates the CLI tool only and defaults to the latest stable release. Use '--beta' to opt into prerelease CLI builds. To update kit content (skills, commands, rules), use 'ck init' for local or 'ck init -g' for global. Use --yes to skip all prompts (both CLI and kit content update) for non-interactive/CI usage."
76682
+ }
76683
+ ]
76684
+ };
76685
+ });
76686
+
76687
+ // src/domains/help/commands/versions-command-help.ts
76688
+ var versionsCommandHelp;
76689
+ var init_versions_command_help = __esm(() => {
76690
+ versionsCommandHelp = {
76691
+ name: "versions",
76692
+ description: "List available versions of ClaudeKit repositories",
76693
+ usage: "ck versions [options]",
76694
+ examples: [
76695
+ {
76696
+ command: "ck versions --kit engineer --limit 10",
76697
+ description: "Show latest 10 versions of engineer kit"
76698
+ },
76699
+ {
76700
+ command: "ck versions --all",
76701
+ description: "Show all releases including prereleases"
76702
+ }
76703
+ ],
76704
+ optionGroups: [
76705
+ {
76706
+ title: "Filter Options",
76707
+ options: [
75922
76708
  {
75923
- flags: "--skip-rules",
75924
- description: "Skip rules migration"
76709
+ flags: "--kit <kit>",
76710
+ description: "Filter by specific kit (engineer, marketing)"
75925
76711
  },
75926
76712
  {
75927
- flags: "--skip-hooks",
75928
- description: "Skip hooks migration"
76713
+ flags: "--limit <number>",
76714
+ description: "Number of releases to show",
76715
+ defaultValue: "30"
75929
76716
  },
75930
76717
  {
75931
- flags: "--source <path>",
75932
- description: "Custom CLAUDE.md source path"
76718
+ flags: "--all",
76719
+ description: "Show all releases including prereleases"
75933
76720
  }
75934
76721
  ]
75935
76722
  }
@@ -75970,6 +76757,10 @@ var init_watch_command_help = __esm(() => {
75970
76757
  {
75971
76758
  flags: "--force",
75972
76759
  description: "Kill existing watch process and start fresh"
76760
+ },
76761
+ {
76762
+ flags: "--verbose",
76763
+ description: "Enable verbose logging"
75973
76764
  }
75974
76765
  ]
75975
76766
  }
@@ -75979,22 +76770,24 @@ var init_watch_command_help = __esm(() => {
75979
76770
 
75980
76771
  // src/domains/help/commands/index.ts
75981
76772
  var init_commands2 = __esm(() => {
75982
- init_new_command_help();
75983
- init_backups_command_help();
76773
+ init_agents_command_help();
76774
+ init_api_command_help();
75984
76775
  init_app_command_help();
75985
- init_init_command_help();
76776
+ init_backups_command_help();
76777
+ init_commands_command_help();
76778
+ init_config_command_help();
76779
+ init_content_command_help();
75986
76780
  init_doctor_command_help();
76781
+ init_init_command_help();
76782
+ init_migrate_command_help();
76783
+ init_new_command_help();
76784
+ init_plan_command_help();
76785
+ init_projects_command_help();
76786
+ init_setup_command_help();
76787
+ init_skills_command_help();
75987
76788
  init_uninstall_command_help();
75988
76789
  init_update_command_help();
75989
76790
  init_versions_command_help();
75990
- init_skills_command_help();
75991
- init_config_command_help();
75992
- init_projects_command_help();
75993
- init_setup_command_help();
75994
- init_agents_command_help();
75995
- init_commands_command_help();
75996
- init_content_command_help();
75997
- init_migrate_command_help();
75998
76791
  init_watch_command_help();
75999
76792
  init_common_options();
76000
76793
  });
@@ -76008,22 +76801,24 @@ var init_help_commands = __esm(() => {
76008
76801
  init_commands2();
76009
76802
  init_commands2();
76010
76803
  HELP_REGISTRY = {
76011
- new: newCommandHelp,
76804
+ agents: agentsCommandHelp,
76805
+ api: apiCommandHelp,
76012
76806
  app: appCommandHelp,
76013
76807
  backups: backupsCommandHelp,
76014
- init: initCommandHelp,
76808
+ commands: commandsCommandHelp,
76015
76809
  config: configCommandHelp,
76016
76810
  content: contentCommandHelp,
76811
+ doctor: doctorCommandHelp,
76812
+ init: initCommandHelp,
76813
+ migrate: migrateCommandHelp,
76814
+ new: newCommandHelp,
76815
+ plan: planCommandHelp,
76017
76816
  projects: projectsCommandHelp,
76018
76817
  setup: setupCommandHelp,
76818
+ skills: skillsCommandHelp,
76819
+ uninstall: uninstallCommandHelp,
76019
76820
  update: updateCommandHelp,
76020
76821
  versions: versionsCommandHelp,
76021
- doctor: doctorCommandHelp,
76022
- uninstall: uninstallCommandHelp,
76023
- skills: skillsCommandHelp,
76024
- agents: agentsCommandHelp,
76025
- commands: commandsCommandHelp,
76026
- migrate: migrateCommandHelp,
76027
76822
  watch: watchCommandHelp
76028
76823
  };
76029
76824
  });
@@ -76221,10 +77016,23 @@ function renderCommandHeader(help, theme) {
76221
77016
  }
76222
77017
  return parts.join(" ");
76223
77018
  }
76224
- function renderUsage(help, theme) {
77019
+ function renderUsage(help, theme, _parentName) {
76225
77020
  return [theme.heading("Usage:"), ` ${theme.example(help.usage)}`, ""].join(`
76226
77021
  `);
76227
77022
  }
77023
+ function renderSubcommandList(subcommands, theme) {
77024
+ if (subcommands.length === 0)
77025
+ return "";
77026
+ const maxNameWidth = Math.max(...subcommands.map((s) => s.name.length));
77027
+ const lines = [theme.heading("Subcommands:")];
77028
+ for (const sub of subcommands) {
77029
+ const namePart = ` ${padEnd(theme.command(sub.name), maxNameWidth + 4)}`;
77030
+ lines.push(`${namePart}${theme.description(sub.description)}`);
77031
+ }
77032
+ lines.push("");
77033
+ return lines.join(`
77034
+ `);
77035
+ }
76228
77036
  function renderExamples(help, options2) {
76229
77037
  if (!options2.showExamples || help.examples.length === 0)
76230
77038
  return "";
@@ -76299,13 +77107,15 @@ function renderDeprecationWarning(help, theme) {
76299
77107
  function renderHelp(help, context = { globalHelp: false, options: DEFAULT_HELP_OPTIONS }) {
76300
77108
  const options2 = { ...DEFAULT_HELP_OPTIONS, ...context.options };
76301
77109
  const theme = options2.theme;
77110
+ const { parentName } = context;
76302
77111
  const sections = [
76303
77112
  renderBanner(options2),
76304
77113
  renderDeprecationWarning(help, theme),
76305
77114
  renderCommandHeader(help, theme),
76306
77115
  "",
76307
- renderUsage(help, theme),
77116
+ renderUsage(help, theme, parentName),
76308
77117
  renderExamples(help, options2),
77118
+ help.subcommands?.length ? renderSubcommandList(help.subcommands, theme) : "",
76309
77119
  renderOptionGroups(help, theme),
76310
77120
  renderSections(help, theme)
76311
77121
  ];
@@ -76370,7 +77180,8 @@ var init_help_renderer = __esm(() => {
76370
77180
  var exports_help_interceptor = {};
76371
77181
  __export(exports_help_interceptor, {
76372
77182
  isHelpRequested: () => isHelpRequested,
76373
- handleHelp: () => handleHelp
77183
+ handleHelp: () => handleHelp,
77184
+ getCommandChainFromArgv: () => getCommandChainFromArgv
76374
77185
  });
76375
77186
  function getHelpOptions() {
76376
77187
  const isTTY2 = process.stdout.isTTY ?? false;
@@ -76386,30 +77197,45 @@ function getHelpOptions() {
76386
77197
  noColor
76387
77198
  };
76388
77199
  }
76389
- function getCommandFromArgv() {
77200
+ function getCommandChainFromArgv() {
76390
77201
  const argv = process.argv.slice(2);
76391
- for (const arg of argv) {
76392
- if (arg.startsWith("-")) {
76393
- continue;
76394
- }
76395
- if (hasCommand(arg)) {
76396
- return arg;
76397
- }
76398
- return null;
77202
+ const tokens = argv.filter((arg) => !arg.startsWith("-"));
77203
+ const [first, second] = tokens;
77204
+ if (!first || !hasCommand(first)) {
77205
+ return [];
76399
77206
  }
76400
- return null;
77207
+ const chain = [first];
77208
+ if (second) {
77209
+ chain.push(second);
77210
+ }
77211
+ return chain;
76401
77212
  }
76402
77213
  async function handleHelp(_args) {
76403
77214
  try {
76404
77215
  const options2 = getHelpOptions();
76405
- const command = getCommandFromArgv();
77216
+ const chain = getCommandChainFromArgv();
76406
77217
  let output3;
76407
- if (command === null) {
77218
+ if (chain.length === 0) {
76408
77219
  output3 = renderGlobalHelp(HELP_REGISTRY, options2);
76409
77220
  } else {
76410
- const help = HELP_REGISTRY[command];
76411
- output3 = renderHelp(help, {
76412
- command,
77221
+ const [parentCmd, subCmd] = chain;
77222
+ const parentHelp = HELP_REGISTRY[parentCmd];
77223
+ if (subCmd && parentHelp.subcommands) {
77224
+ const subHelp = parentHelp.subcommands.find((s) => s.name === subCmd);
77225
+ if (subHelp) {
77226
+ output3 = renderHelp(subHelp, {
77227
+ command: subCmd,
77228
+ globalHelp: false,
77229
+ options: options2,
77230
+ parentName: parentCmd
77231
+ });
77232
+ await displayHelp(output3, options2);
77233
+ process.exitCode = 0;
77234
+ return;
77235
+ }
77236
+ }
77237
+ output3 = renderHelp(parentHelp, {
77238
+ command: parentCmd,
76413
77239
  globalHelp: false,
76414
77240
  options: options2
76415
77241
  });
@@ -104146,9 +104972,9 @@ async function initCommand(options2) {
104146
104972
  init_dist2();
104147
104973
  var import_picocolors30 = __toESM(require_picocolors(), 1);
104148
104974
  import { existsSync as existsSync62 } from "node:fs";
104149
- import { readFile as readFile59, rm as rm15, unlink as unlink12 } from "node:fs/promises";
104150
- import { homedir as homedir46 } from "node:os";
104151
- import { basename as basename26, join as join139, resolve as resolve36 } from "node:path";
104975
+ import { readFile as readFile60, rm as rm15, unlink as unlink12 } from "node:fs/promises";
104976
+ import { homedir as homedir47 } from "node:os";
104977
+ import { basename as basename26, join as join140, resolve as resolve36 } from "node:path";
104152
104978
  init_logger();
104153
104979
 
104154
104980
  // src/ui/ck-cli-design/tokens.ts
@@ -104616,9 +105442,128 @@ init_converters();
104616
105442
  init_hooks_settings_merger();
104617
105443
  init_model_taxonomy();
104618
105444
 
105445
+ // src/commands/portable/opencode-config-installer.ts
105446
+ init_logger();
105447
+ init_dist2();
105448
+ init_model_taxonomy();
105449
+ import { mkdir as mkdir33, readFile as readFile59, writeFile as writeFile33 } from "node:fs/promises";
105450
+ import { homedir as homedir46 } from "node:os";
105451
+ import { dirname as dirname38, join as join139 } from "node:path";
105452
+ function getOpenCodeConfigPath(options2) {
105453
+ if (options2.global) {
105454
+ return join139(options2.homeDir ?? homedir46(), ".config", "opencode", "opencode.json");
105455
+ }
105456
+ return join139(options2.cwd ?? process.cwd(), "opencode.json");
105457
+ }
105458
+ async function detectAuthenticatedProviders(homeDir) {
105459
+ const authPath = join139(homeDir ?? homedir46(), ".local", "share", "opencode", "auth.json");
105460
+ try {
105461
+ const raw2 = await readFile59(authPath, "utf-8");
105462
+ const parsed = JSON.parse(raw2);
105463
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
105464
+ return Object.keys(parsed);
105465
+ }
105466
+ } catch {}
105467
+ return [];
105468
+ }
105469
+ async function suggestOpenCodeDefaultModel(homeDir) {
105470
+ const override = getOpenCodeDefaultModelOverride();
105471
+ if (override) {
105472
+ return { model: override, reason: ".ck.json override" };
105473
+ }
105474
+ return { model: OPENCODE_DEFAULT_MODEL, reason: "fallback default" };
105475
+ }
105476
+ var clackPrompter = async ({ suggestion, reason, detectedProviders }) => {
105477
+ const providersHint = detectedProviders.length > 0 ? `Authenticated providers in opencode: ${detectedProviders.join(", ")}` : "No authenticated providers detected in opencode.";
105478
+ const response = await ie({
105479
+ message: `No default model in opencode.json. ${providersHint}`,
105480
+ options: [
105481
+ {
105482
+ value: "accept",
105483
+ label: `Write "${suggestion}"`,
105484
+ hint: reason
105485
+ },
105486
+ { value: "custom", label: "Enter a different model..." },
105487
+ { value: "skip", label: "Skip — I'll configure opencode.json myself" }
105488
+ ],
105489
+ initialValue: "accept"
105490
+ });
105491
+ if (lD(response) || response === "skip")
105492
+ return { action: "skip" };
105493
+ if (response === "accept")
105494
+ return { action: "accept" };
105495
+ const custom2 = await te({
105496
+ message: "Model (format: provider/model-id, e.g. openai/gpt-5)",
105497
+ placeholder: suggestion,
105498
+ validate: (value) => {
105499
+ if (!value || !value.includes("/"))
105500
+ return "Must be in 'provider/model-id' format";
105501
+ return;
105502
+ }
105503
+ });
105504
+ if (lD(custom2))
105505
+ return { action: "skip" };
105506
+ return { action: "custom", value: custom2 };
105507
+ };
105508
+ async function ensureOpenCodeModel(options2) {
105509
+ const configPath = getOpenCodeConfigPath(options2);
105510
+ let existing = null;
105511
+ try {
105512
+ const raw2 = await readFile59(configPath, "utf-8");
105513
+ const parsed = JSON.parse(raw2);
105514
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
105515
+ existing = parsed;
105516
+ } else {
105517
+ logger.warning(`ensureOpenCodeModel: ${configPath} is valid JSON but not an object; overwriting with default model`);
105518
+ }
105519
+ } catch (err) {
105520
+ const errno = err?.code;
105521
+ if (errno === "ENOENT") {} else if (err instanceof SyntaxError) {
105522
+ logger.warning(`ensureOpenCodeModel: ${configPath} is not valid JSON; overwriting with default model (existing contents will be lost)`);
105523
+ } else {
105524
+ logger.verbose(`ensureOpenCodeModel: failed to read ${configPath} (${errno ?? String(err)}); recreating`);
105525
+ }
105526
+ }
105527
+ if (existing && typeof existing.model === "string" && existing.model.trim().length > 0) {
105528
+ return { path: configPath, action: "existing", model: existing.model };
105529
+ }
105530
+ const suggestion = await suggestOpenCodeDefaultModel(options2.homeDir);
105531
+ let chosenModel = suggestion.model;
105532
+ if (options2.interactive) {
105533
+ const detectedProviders = await detectAuthenticatedProviders(options2.homeDir);
105534
+ const prompter = options2.prompter ?? clackPrompter;
105535
+ const response = await prompter({
105536
+ suggestion: suggestion.model,
105537
+ reason: suggestion.reason,
105538
+ detectedProviders
105539
+ });
105540
+ if (response.action === "skip") {
105541
+ return {
105542
+ path: configPath,
105543
+ action: "skipped",
105544
+ model: "",
105545
+ reason: "user declined"
105546
+ };
105547
+ }
105548
+ if (response.action === "custom") {
105549
+ chosenModel = response.value;
105550
+ }
105551
+ }
105552
+ const next = { ...existing ?? {}, model: chosenModel };
105553
+ await mkdir33(dirname38(configPath), { recursive: true });
105554
+ await writeFile33(configPath, `${JSON.stringify(next, null, 2)}
105555
+ `, "utf-8");
105556
+ return {
105557
+ path: configPath,
105558
+ action: existing ? "added" : "created",
105559
+ model: chosenModel,
105560
+ reason: suggestion.reason
105561
+ };
105562
+ }
105563
+
104619
105564
  // src/commands/portable/plan-display.ts
104620
105565
  var import_picocolors28 = __toESM(require_picocolors(), 1);
104621
- import { basename as basename25, dirname as dirname38, extname as extname7 } from "node:path";
105566
+ import { basename as basename25, dirname as dirname39, extname as extname7 } from "node:path";
104622
105567
  var DEFAULT_MAX_PLAN_GROUP_ITEMS = 20;
104623
105568
  var TYPE_ORDER = [
104624
105569
  "agent",
@@ -104844,21 +105789,21 @@ function collectPlannedWhereLines(plan) {
104844
105789
  return destinations.map((destination) => `${formatDisplayPath(destination)} -> ${formatCdHint(resolveCdTarget(destination))}`);
104845
105790
  }
104846
105791
  function resolveCdTarget(destination) {
104847
- return extname7(destination).length > 0 ? dirname38(destination) : destination;
105792
+ return extname7(destination).length > 0 ? dirname39(destination) : destination;
104848
105793
  }
104849
105794
  function normalizeWhereDestination(path16, portableType) {
104850
105795
  if (portableType === "agent" || portableType === "command" || portableType === "skill") {
104851
- return dirname38(path16);
105796
+ return dirname39(path16);
104852
105797
  }
104853
105798
  if (portableType === "hooks") {
104854
- return dirname38(path16);
105799
+ return dirname39(path16);
104855
105800
  }
104856
105801
  if (portableType === "rules") {
104857
105802
  const fileName = basename25(path16).toLowerCase();
104858
105803
  if (fileName === "agents.md" || fileName === "gemini.md" || fileName === ".goosehints" || fileName === "custom_modes.yaml" || fileName === "custom_modes.yml") {
104859
105804
  return path16;
104860
105805
  }
104861
- return dirname38(path16);
105806
+ return dirname39(path16);
104862
105807
  }
104863
105808
  return path16;
104864
105809
  }
@@ -105197,12 +106142,12 @@ async function executeDeleteAction(action, options2) {
105197
106142
  async function processMetadataDeletions(skillSourcePath, installGlobally) {
105198
106143
  if (!skillSourcePath)
105199
106144
  return;
105200
- const sourceMetadataPath = join139(resolve36(skillSourcePath, ".."), "metadata.json");
106145
+ const sourceMetadataPath = join140(resolve36(skillSourcePath, ".."), "metadata.json");
105201
106146
  if (!existsSync62(sourceMetadataPath))
105202
106147
  return;
105203
106148
  let sourceMetadata;
105204
106149
  try {
105205
- const content = await readFile59(sourceMetadataPath, "utf-8");
106150
+ const content = await readFile60(sourceMetadataPath, "utf-8");
105206
106151
  sourceMetadata = JSON.parse(content);
105207
106152
  } catch (error) {
105208
106153
  logger.debug(`[migrate] Failed to parse source metadata.json: ${error}`);
@@ -105210,7 +106155,7 @@ async function processMetadataDeletions(skillSourcePath, installGlobally) {
105210
106155
  }
105211
106156
  if (!sourceMetadata.deletions || sourceMetadata.deletions.length === 0)
105212
106157
  return;
105213
- const claudeDir3 = installGlobally ? join139(homedir46(), ".claude") : join139(process.cwd(), ".claude");
106158
+ const claudeDir3 = installGlobally ? join140(homedir47(), ".claude") : join140(process.cwd(), ".claude");
105214
106159
  if (!existsSync62(claudeDir3))
105215
106160
  return;
105216
106161
  try {
@@ -105327,8 +106272,8 @@ async function migrateCommand(options2) {
105327
106272
  let requestedGlobal = options2.global ?? false;
105328
106273
  let installGlobally = requestedGlobal;
105329
106274
  if (options2.global === undefined && !options2.yes) {
105330
- const projectTarget = join139(process.cwd(), ".claude");
105331
- const globalTarget = join139(homedir46(), ".claude");
106275
+ const projectTarget = join140(process.cwd(), ".claude");
106276
+ const globalTarget = join140(homedir47(), ".claude");
105332
106277
  const scopeChoice = await ie({
105333
106278
  message: "Installation scope",
105334
106279
  options: [
@@ -105457,7 +106402,7 @@ async function migrateCommand(options2) {
105457
106402
  for (const action of conflictActions) {
105458
106403
  if (!action.diff && action.targetPath && existsSync62(action.targetPath)) {
105459
106404
  try {
105460
- const targetContent = await readFile59(action.targetPath, "utf-8");
106405
+ const targetContent = await readFile60(action.targetPath, "utf-8");
105461
106406
  const sourceItem = agents2.find((a3) => a3.name === action.item) || commands.find((c2) => c2.name === action.item) || (configItem?.name === action.item ? configItem : null) || ruleItems.find((r2) => r2.name === action.item) || hookItems.find((h2) => h2.name === action.item);
105462
106407
  if (sourceItem) {
105463
106408
  const providerConfig = providers[action.provider];
@@ -105577,6 +106522,22 @@ async function migrateCommand(options2) {
105577
106522
  }
105578
106523
  progressSink.tick(progressLabelForType(task.type));
105579
106524
  }
106525
+ if (selectedProviders.includes("opencode")) {
106526
+ try {
106527
+ const result = await ensureOpenCodeModel({
106528
+ global: installGlobally,
106529
+ interactive: process.stdout.isTTY === true && !options2.yes
106530
+ });
106531
+ if (result.action === "created" || result.action === "added") {
106532
+ const reason = result.reason ? ` (${result.reason})` : "";
106533
+ f2.info(`Set default model "${result.model}" in ${result.path}${reason}`);
106534
+ } else if (result.action === "skipped") {
106535
+ f2.warn("Skipped writing default model to opencode.json. Migrated agents may fail with ProviderModelNotFoundError until you set one.");
106536
+ }
106537
+ } catch (err) {
106538
+ postProgressWarnings.push(`Could not update opencode.json model (${err instanceof Error ? err.message : String(err)}). Agents may fail with ProviderModelNotFoundError until a model is set.`);
106539
+ }
106540
+ }
105580
106541
  for (const [hooksProvider, files] of successfulHookFiles) {
105581
106542
  if (files.length === 0)
105582
106543
  continue;
@@ -105805,7 +106766,7 @@ function buildDryRunFallbackResults(skills, selectedProviders, installGlobally,
105805
106766
  results.push({
105806
106767
  itemName: skill.name,
105807
106768
  operation: "apply",
105808
- path: join139(basePath, skill.name),
106769
+ path: join140(basePath, skill.name),
105809
106770
  portableType: "skill",
105810
106771
  provider,
105811
106772
  providerDisplayName: providers[provider].displayName,
@@ -105965,7 +106926,7 @@ async function handleDirectorySetup(ctx) {
105965
106926
  // src/commands/new/phases/project-creation.ts
105966
106927
  init_config_manager();
105967
106928
  init_github_client();
105968
- import { join as join140 } from "node:path";
106929
+ import { join as join141 } from "node:path";
105969
106930
  init_logger();
105970
106931
  init_output_manager();
105971
106932
  init_types3();
@@ -106091,7 +107052,7 @@ async function projectCreation(kit, resolvedDir, validOptions, isNonInteractive2
106091
107052
  output.section("Installing");
106092
107053
  logger.verbose("Installation target", { directory: resolvedDir });
106093
107054
  const merger = new FileMerger;
106094
- const claudeDir3 = join140(resolvedDir, ".claude");
107055
+ const claudeDir3 = join141(resolvedDir, ".claude");
106095
107056
  merger.setMultiKitContext(claudeDir3, kit);
106096
107057
  if (validOptions.exclude && validOptions.exclude.length > 0) {
106097
107058
  merger.addIgnorePatterns(validOptions.exclude);
@@ -106138,7 +107099,7 @@ async function handleProjectCreation(ctx) {
106138
107099
  }
106139
107100
  // src/commands/new/phases/post-setup.ts
106140
107101
  init_projects_registry();
106141
- import { join as join141 } from "node:path";
107102
+ import { join as join142 } from "node:path";
106142
107103
  init_package_installer();
106143
107104
  init_logger();
106144
107105
  init_path_resolver();
@@ -106170,9 +107131,9 @@ async function postSetup(resolvedDir, validOptions, isNonInteractive2, prompts)
106170
107131
  withSudo: validOptions.withSudo
106171
107132
  });
106172
107133
  }
106173
- const claudeDir3 = join141(resolvedDir, ".claude");
107134
+ const claudeDir3 = join142(resolvedDir, ".claude");
106174
107135
  await promptSetupWizardIfNeeded({
106175
- envPath: join141(claudeDir3, ".env"),
107136
+ envPath: join142(claudeDir3, ".env"),
106176
107137
  claudeDir: claudeDir3,
106177
107138
  isGlobal: false,
106178
107139
  isNonInteractive: isNonInteractive2,
@@ -106242,7 +107203,7 @@ Please use only one download method.`);
106242
107203
  // src/commands/plan/plan-command.ts
106243
107204
  init_output_manager();
106244
107205
  import { existsSync as existsSync65, statSync as statSync11 } from "node:fs";
106245
- import { dirname as dirname42, isAbsolute as isAbsolute11, join as join144, parse as parse7, resolve as resolve41 } from "node:path";
107206
+ import { dirname as dirname43, isAbsolute as isAbsolute11, join as join145, parse as parse7, resolve as resolve41 } from "node:path";
106246
107207
 
106247
107208
  // src/commands/plan/plan-read-handlers.ts
106248
107209
  init_config();
@@ -106252,18 +107213,18 @@ init_logger();
106252
107213
  init_output_manager();
106253
107214
  var import_picocolors32 = __toESM(require_picocolors(), 1);
106254
107215
  import { existsSync as existsSync64, statSync as statSync10 } from "node:fs";
106255
- import { basename as basename27, dirname as dirname40, join as join143, relative as relative27, resolve as resolve39 } from "node:path";
107216
+ import { basename as basename27, dirname as dirname41, join as join144, relative as relative27, resolve as resolve39 } from "node:path";
106256
107217
 
106257
107218
  // src/commands/plan/plan-dependencies.ts
106258
107219
  init_config();
106259
107220
  init_plan_parser();
106260
107221
  init_plans_registry();
106261
107222
  import { existsSync as existsSync63 } from "node:fs";
106262
- import { dirname as dirname39, join as join142 } from "node:path";
107223
+ import { dirname as dirname40, join as join143 } from "node:path";
106263
107224
  async function resolvePlanDependencies(references, currentPlanFile, options2 = {}) {
106264
107225
  if (references.length === 0)
106265
107226
  return [];
106266
- const currentPlanDir = dirname39(currentPlanFile);
107227
+ const currentPlanDir = dirname40(currentPlanFile);
106267
107228
  const projectRoot = findProjectRoot(currentPlanDir);
106268
107229
  const config = options2.preloadedConfig ?? (await CkConfigManager.loadFull(projectRoot)).config;
106269
107230
  const defaultScope = inferPlanScopeForDir(currentPlanDir, config);
@@ -106279,7 +107240,7 @@ async function resolvePlanDependencies(references, currentPlanFile, options2 = {
106279
107240
  };
106280
107241
  }
106281
107242
  const scopeRoot = resolvePlanDirForScope(scope, projectRoot, config);
106282
- const planFile = join142(scopeRoot, planId, "plan.md");
107243
+ const planFile = join143(scopeRoot, planId, "plan.md");
106283
107244
  const isSelfReference = planFile === currentPlanFile;
106284
107245
  if (!existsSync63(planFile)) {
106285
107246
  return {
@@ -106350,7 +107311,7 @@ async function handleParse(target, options2) {
106350
107311
  console.log(JSON.stringify({ file: relative27(process.cwd(), planFile), frontmatter, phases }, null, 2));
106351
107312
  return;
106352
107313
  }
106353
- const title = typeof frontmatter.title === "string" ? frontmatter.title : basename27(dirname40(planFile));
107314
+ const title = typeof frontmatter.title === "string" ? frontmatter.title : basename27(dirname41(planFile));
106354
107315
  console.log();
106355
107316
  console.log(import_picocolors32.default.bold(` Plan: ${title}`));
106356
107317
  console.log(` File: ${planFile}`);
@@ -106421,7 +107382,7 @@ async function handleStatus(target, options2) {
106421
107382
  }
106422
107383
  const effectiveTarget = !resolvedTarget && globalBaseDir ? globalBaseDir : resolvedTarget;
106423
107384
  const t = effectiveTarget ? resolve39(effectiveTarget) : null;
106424
- const plansDir = t && existsSync64(t) && statSync10(t).isDirectory() && !existsSync64(join143(t, "plan.md")) ? t : null;
107385
+ const plansDir = t && existsSync64(t) && statSync10(t).isDirectory() && !existsSync64(join144(t, "plan.md")) ? t : null;
106425
107386
  if (plansDir) {
106426
107387
  const planFiles = scanPlanDir(plansDir);
106427
107388
  if (planFiles.length === 0) {
@@ -106461,7 +107422,7 @@ async function handleStatus(target, options2) {
106461
107422
  const blockedBy2 = await resolvePlanDependencies(s.blockedBy, pf, { preloadedConfig });
106462
107423
  const blocks2 = await resolvePlanDependencies(s.blocks, pf, { preloadedConfig });
106463
107424
  const bar = progressBar(s.completed, s.totalPhases);
106464
- const title2 = s.title ?? basename27(dirname40(pf));
107425
+ const title2 = s.title ?? basename27(dirname41(pf));
106465
107426
  console.log(` ${import_picocolors32.default.bold(title2)}`);
106466
107427
  console.log(` ${bar}`);
106467
107428
  if (s.inProgress > 0)
@@ -106480,7 +107441,7 @@ async function handleStatus(target, options2) {
106480
107441
  }
106481
107442
  console.log();
106482
107443
  } catch {
106483
- console.log(` [X] Failed to read: ${basename27(dirname40(pf))}`);
107444
+ console.log(` [X] Failed to read: ${basename27(dirname41(pf))}`);
106484
107445
  console.log();
106485
107446
  }
106486
107447
  }
@@ -106507,7 +107468,7 @@ async function handleStatus(target, options2) {
106507
107468
  console.log(JSON.stringify({ ...summary, dependencyStatus: { blockedBy, blocks } }, null, 2));
106508
107469
  return;
106509
107470
  }
106510
- const title = summary.title ?? basename27(dirname40(planFile));
107471
+ const title = summary.title ?? basename27(dirname41(planFile));
106511
107472
  console.log();
106512
107473
  console.log(import_picocolors32.default.bold(` ${title}`));
106513
107474
  if (summary.status)
@@ -106570,7 +107531,7 @@ async function handleKanban(target, options2) {
106570
107531
  process.exitCode = 1;
106571
107532
  return;
106572
107533
  }
106573
- const route = `/plans?dir=${encodeURIComponent(dirname40(dirname40(planFile)))}&view=kanban`;
107534
+ const route = `/plans?dir=${encodeURIComponent(dirname41(dirname41(planFile)))}&view=kanban`;
106574
107535
  const url = `http://localhost:${server.port}${route}`;
106575
107536
  console.log();
106576
107537
  console.log(import_picocolors32.default.bold(" ClaudeKit Dashboard — Plans"));
@@ -106605,7 +107566,7 @@ init_plan_parser();
106605
107566
  init_plans_registry();
106606
107567
  init_output_manager();
106607
107568
  var import_picocolors33 = __toESM(require_picocolors(), 1);
106608
- import { basename as basename28, dirname as dirname41, relative as relative28, resolve as resolve40 } from "node:path";
107569
+ import { basename as basename28, dirname as dirname42, relative as relative28, resolve as resolve40 } from "node:path";
106609
107570
  async function handleCreate(target, options2) {
106610
107571
  if (!options2.title) {
106611
107572
  output.error("[X] --title is required for create");
@@ -106705,7 +107666,7 @@ async function handleCheck(target, options2) {
106705
107666
  process.exitCode = 1;
106706
107667
  return;
106707
107668
  }
106708
- const planDir = dirname41(planFile);
107669
+ const planDir = dirname42(planFile);
106709
107670
  let planStatus = "pending";
106710
107671
  try {
106711
107672
  const projectRoot = findProjectRoot(planDir);
@@ -106754,7 +107715,7 @@ async function handleUncheck(target, options2) {
106754
107715
  process.exitCode = 1;
106755
107716
  return;
106756
107717
  }
106757
- const planDir = dirname41(planFile);
107718
+ const planDir = dirname42(planFile);
106758
107719
  try {
106759
107720
  const projectRoot = findProjectRoot(planDir);
106760
107721
  const summary = buildPlanSummary(planFile);
@@ -106793,7 +107754,7 @@ async function handleAddPhase(target, options2) {
106793
107754
  try {
106794
107755
  const result = addPhase(planFile, target, options2.after);
106795
107756
  try {
106796
- const planDir = dirname41(planFile);
107757
+ const planDir = dirname42(planFile);
106797
107758
  const projectRoot = findProjectRoot(planDir);
106798
107759
  updateRegistryAddPhase({
106799
107760
  planDir,
@@ -106836,7 +107797,7 @@ function resolvePlanFile(target, baseDir) {
106836
107797
  const stat23 = statSync11(t);
106837
107798
  if (stat23.isFile())
106838
107799
  return t;
106839
- const candidate = join144(t, "plan.md");
107800
+ const candidate = join145(t, "plan.md");
106840
107801
  if (existsSync65(candidate))
106841
107802
  return candidate;
106842
107803
  }
@@ -106844,10 +107805,10 @@ function resolvePlanFile(target, baseDir) {
106844
107805
  let dir = process.cwd();
106845
107806
  const root = parse7(dir).root;
106846
107807
  while (dir !== root) {
106847
- const candidate = join144(dir, "plan.md");
107808
+ const candidate = join145(dir, "plan.md");
106848
107809
  if (existsSync65(candidate))
106849
107810
  return candidate;
106850
- dir = dirname42(dir);
107811
+ dir = dirname43(dir);
106851
107812
  }
106852
107813
  }
106853
107814
  return null;
@@ -107366,8 +108327,8 @@ init_skills_registry();
107366
108327
  init_skills_uninstaller();
107367
108328
  var import_gray_matter11 = __toESM(require_gray_matter(), 1);
107368
108329
  var import_picocolors37 = __toESM(require_picocolors(), 1);
107369
- import { readFile as readFile60 } from "node:fs/promises";
107370
- import { join as join145 } from "node:path";
108330
+ import { readFile as readFile61 } from "node:fs/promises";
108331
+ import { join as join146 } from "node:path";
107371
108332
 
107372
108333
  // src/commands/skills/types.ts
107373
108334
  init_zod();
@@ -107489,9 +108450,9 @@ async function handleValidate2(sourcePath) {
107489
108450
  spinner.stop(`Checked ${skills.length} skill(s)`);
107490
108451
  let hasIssues = false;
107491
108452
  for (const skill of skills) {
107492
- const skillMdPath = join145(skill.path, "SKILL.md");
108453
+ const skillMdPath = join146(skill.path, "SKILL.md");
107493
108454
  try {
107494
- const content = await readFile60(skillMdPath, "utf-8");
108455
+ const content = await readFile61(skillMdPath, "utf-8");
107495
108456
  const { data } = import_gray_matter11.default(content, {
107496
108457
  engines: { javascript: { parse: () => ({}) } }
107497
108458
  });
@@ -108047,7 +109008,7 @@ async function detectInstallations() {
108047
109008
 
108048
109009
  // src/commands/uninstall/removal-handler.ts
108049
109010
  import { readdirSync as readdirSync9, rmSync as rmSync6 } from "node:fs";
108050
- import { basename as basename29, join as join147, resolve as resolve43, sep as sep11 } from "node:path";
109011
+ import { basename as basename29, join as join148, resolve as resolve43, sep as sep11 } from "node:path";
108051
109012
  init_logger();
108052
109013
  init_safe_prompts();
108053
109014
  init_safe_spinner();
@@ -108056,7 +109017,7 @@ var import_fs_extra44 = __toESM(require_lib3(), 1);
108056
109017
  // src/commands/uninstall/analysis-handler.ts
108057
109018
  init_metadata_migration();
108058
109019
  import { readdirSync as readdirSync8, rmSync as rmSync5 } from "node:fs";
108059
- import { dirname as dirname43, join as join146 } from "node:path";
109020
+ import { dirname as dirname44, join as join147 } from "node:path";
108060
109021
  init_logger();
108061
109022
  init_safe_prompts();
108062
109023
  var import_fs_extra43 = __toESM(require_lib3(), 1);
@@ -108078,7 +109039,7 @@ function classifyFileByOwnership(ownership, forceOverwrite, deleteReason) {
108078
109039
  }
108079
109040
  async function cleanupEmptyDirectories3(filePath, installationRoot) {
108080
109041
  let cleaned = 0;
108081
- let currentDir = dirname43(filePath);
109042
+ let currentDir = dirname44(filePath);
108082
109043
  while (currentDir !== installationRoot && currentDir.startsWith(installationRoot)) {
108083
109044
  try {
108084
109045
  const entries = readdirSync8(currentDir);
@@ -108086,7 +109047,7 @@ async function cleanupEmptyDirectories3(filePath, installationRoot) {
108086
109047
  rmSync5(currentDir, { recursive: true });
108087
109048
  cleaned++;
108088
109049
  logger.debug(`Removed empty directory: ${currentDir}`);
108089
- currentDir = dirname43(currentDir);
109050
+ currentDir = dirname44(currentDir);
108090
109051
  } else {
108091
109052
  break;
108092
109053
  }
@@ -108113,7 +109074,7 @@ async function analyzeInstallation(installation, forceOverwrite, kit) {
108113
109074
  const remainingFiles = metadata.kits?.[remainingKit]?.files || [];
108114
109075
  for (const file of remainingFiles) {
108115
109076
  const relativePath = normalizeTrackedPath(file.path);
108116
- if (await import_fs_extra43.pathExists(join146(installation.path, relativePath))) {
109077
+ if (await import_fs_extra43.pathExists(join147(installation.path, relativePath))) {
108117
109078
  result.retainedManifestPaths.push(relativePath);
108118
109079
  }
108119
109080
  }
@@ -108121,7 +109082,7 @@ async function analyzeInstallation(installation, forceOverwrite, kit) {
108121
109082
  const kitFiles = metadata.kits[kit].files || [];
108122
109083
  for (const trackedFile of kitFiles) {
108123
109084
  const relativePath = normalizeTrackedPath(trackedFile.path);
108124
- const filePath = join146(installation.path, relativePath);
109085
+ const filePath = join147(installation.path, relativePath);
108125
109086
  if (preservedPaths.has(relativePath)) {
108126
109087
  result.toPreserve.push({ path: relativePath, reason: "shared with other kit" });
108127
109088
  continue;
@@ -108154,7 +109115,7 @@ async function analyzeInstallation(installation, forceOverwrite, kit) {
108154
109115
  }
108155
109116
  for (const trackedFile of allTrackedFiles) {
108156
109117
  const relativePath = normalizeTrackedPath(trackedFile.path);
108157
- const filePath = join146(installation.path, relativePath);
109118
+ const filePath = join147(installation.path, relativePath);
108158
109119
  const ownershipResult = await OwnershipChecker.checkOwnership(filePath, metadata, installation.path);
108159
109120
  if (!ownershipResult.exists)
108160
109121
  continue;
@@ -108297,7 +109258,7 @@ async function removeInstallations(installations, options2) {
108297
109258
  let removedCount = 0;
108298
109259
  let cleanedDirs = 0;
108299
109260
  for (const item of analysis.toDelete) {
108300
- const filePath = join147(installation.path, item.path);
109261
+ const filePath = join148(installation.path, item.path);
108301
109262
  if (!await import_fs_extra44.pathExists(filePath))
108302
109263
  continue;
108303
109264
  if (!await isPathSafeToRemove(filePath, installation.path)) {
@@ -108631,7 +109592,7 @@ ${import_picocolors40.default.bold(import_picocolors40.default.cyan(result.kitCo
108631
109592
  init_logger();
108632
109593
  import { existsSync as existsSync72 } from "node:fs";
108633
109594
  import { rm as rm16 } from "node:fs/promises";
108634
- import { join as join154 } from "node:path";
109595
+ import { join as join155 } from "node:path";
108635
109596
  var import_picocolors41 = __toESM(require_picocolors(), 1);
108636
109597
 
108637
109598
  // src/commands/watch/phases/implementation-runner.ts
@@ -109149,8 +110110,8 @@ function spawnAndCollect3(command, args) {
109149
110110
  }
109150
110111
 
109151
110112
  // src/commands/watch/phases/issue-processor.ts
109152
- import { mkdir as mkdir33, writeFile as writeFile34 } from "node:fs/promises";
109153
- import { join as join150 } from "node:path";
110113
+ import { mkdir as mkdir34, writeFile as writeFile35 } from "node:fs/promises";
110114
+ import { join as join151 } from "node:path";
109154
110115
 
109155
110116
  // src/commands/watch/phases/approval-detector.ts
109156
110117
  init_logger();
@@ -109528,9 +110489,9 @@ async function checkAwaitingApproval(state, setup, options2, watchLog, projectDi
109528
110489
 
109529
110490
  // src/commands/watch/phases/plan-dir-finder.ts
109530
110491
  import { readdir as readdir44, stat as stat23 } from "node:fs/promises";
109531
- import { join as join149 } from "node:path";
110492
+ import { join as join150 } from "node:path";
109532
110493
  async function findRecentPlanDir(cwd2, issueNumber, watchLog) {
109533
- const plansRoot = join149(cwd2, "plans");
110494
+ const plansRoot = join150(cwd2, "plans");
109534
110495
  try {
109535
110496
  const entries = await readdir44(plansRoot);
109536
110497
  const tenMinAgo = Date.now() - 10 * 60 * 1000;
@@ -109539,14 +110500,14 @@ async function findRecentPlanDir(cwd2, issueNumber, watchLog) {
109539
110500
  for (const entry of entries) {
109540
110501
  if (entry === "watch" || entry === "reports" || entry === "visuals")
109541
110502
  continue;
109542
- const dirPath = join149(plansRoot, entry);
110503
+ const dirPath = join150(plansRoot, entry);
109543
110504
  const dirStat = await stat23(dirPath);
109544
110505
  if (!dirStat.isDirectory())
109545
110506
  continue;
109546
110507
  if (dirStat.mtimeMs < tenMinAgo)
109547
110508
  continue;
109548
110509
  try {
109549
- await stat23(join149(dirPath, "plan.md"));
110510
+ await stat23(join150(dirPath, "plan.md"));
109550
110511
  } catch {
109551
110512
  continue;
109552
110513
  }
@@ -109777,14 +110738,14 @@ async function handlePlanGeneration(issue, state, config, setup, options2, watch
109777
110738
  stats.plansCreated++;
109778
110739
  const detectedPlanDir = await findRecentPlanDir(projectDir, issue.number, watchLog);
109779
110740
  if (detectedPlanDir) {
109780
- state.activeIssues[numStr].planPath = join150(detectedPlanDir, "plan.md");
110741
+ state.activeIssues[numStr].planPath = join151(detectedPlanDir, "plan.md");
109781
110742
  watchLog.info(`Plan directory detected: ${detectedPlanDir}`);
109782
110743
  } else {
109783
110744
  try {
109784
- const planDir = join150(projectDir, "plans", "watch");
109785
- await mkdir33(planDir, { recursive: true });
109786
- const planFilePath = join150(planDir, `issue-${issue.number}-plan.md`);
109787
- await writeFile34(planFilePath, planResult.planText, "utf-8");
110745
+ const planDir = join151(projectDir, "plans", "watch");
110746
+ await mkdir34(planDir, { recursive: true });
110747
+ const planFilePath = join151(planDir, `issue-${issue.number}-plan.md`);
110748
+ await writeFile35(planFilePath, planResult.planText, "utf-8");
109788
110749
  state.activeIssues[numStr].planPath = planFilePath;
109789
110750
  watchLog.info(`Plan saved (fallback) to ${planFilePath}`);
109790
110751
  } catch (err) {
@@ -109929,15 +110890,15 @@ init_ck_config_manager();
109929
110890
  init_file_io();
109930
110891
  init_logger();
109931
110892
  import { existsSync as existsSync68 } from "node:fs";
109932
- import { mkdir as mkdir34, readFile as readFile62 } from "node:fs/promises";
109933
- import { dirname as dirname44 } from "node:path";
110893
+ import { mkdir as mkdir35, readFile as readFile63 } from "node:fs/promises";
110894
+ import { dirname as dirname45 } from "node:path";
109934
110895
  var PROCESSED_ISSUES_CAP = 500;
109935
110896
  async function readCkJson(projectDir) {
109936
110897
  const configPath = CkConfigManager.getProjectConfigPath(projectDir);
109937
110898
  try {
109938
110899
  if (!existsSync68(configPath))
109939
110900
  return {};
109940
- const content = await readFile62(configPath, "utf-8");
110901
+ const content = await readFile63(configPath, "utf-8");
109941
110902
  return JSON.parse(content);
109942
110903
  } catch (error) {
109943
110904
  logger.warning(`Failed to parse .ck.json: ${error instanceof Error ? error.message : "Unknown"}`);
@@ -109960,9 +110921,9 @@ async function loadWatchState(projectDir) {
109960
110921
  }
109961
110922
  async function saveWatchState(projectDir, state) {
109962
110923
  const configPath = CkConfigManager.getProjectConfigPath(projectDir);
109963
- const configDir = dirname44(configPath);
110924
+ const configDir = dirname45(configPath);
109964
110925
  if (!existsSync68(configDir)) {
109965
- await mkdir34(configDir, { recursive: true });
110926
+ await mkdir35(configDir, { recursive: true });
109966
110927
  }
109967
110928
  const raw2 = await readCkJson(projectDir);
109968
110929
  const watchRaw = raw2.watch ?? {};
@@ -110090,18 +111051,18 @@ init_logger();
110090
111051
  import { spawnSync as spawnSync7 } from "node:child_process";
110091
111052
  import { existsSync as existsSync69 } from "node:fs";
110092
111053
  import { readdir as readdir45, stat as stat24 } from "node:fs/promises";
110093
- import { join as join151 } from "node:path";
111054
+ import { join as join152 } from "node:path";
110094
111055
  async function scanForRepos(parentDir) {
110095
111056
  const repos = [];
110096
111057
  const entries = await readdir45(parentDir);
110097
111058
  for (const entry of entries) {
110098
111059
  if (entry.startsWith("."))
110099
111060
  continue;
110100
- const fullPath = join151(parentDir, entry);
111061
+ const fullPath = join152(parentDir, entry);
110101
111062
  const entryStat = await stat24(fullPath);
110102
111063
  if (!entryStat.isDirectory())
110103
111064
  continue;
110104
- const gitDir = join151(fullPath, ".git");
111065
+ const gitDir = join152(fullPath, ".git");
110105
111066
  if (!existsSync69(gitDir))
110106
111067
  continue;
110107
111068
  const result = spawnSync7("gh", ["repo", "view", "--json", "owner,name"], {
@@ -110127,8 +111088,8 @@ async function scanForRepos(parentDir) {
110127
111088
  init_logger();
110128
111089
  import { spawnSync as spawnSync8 } from "node:child_process";
110129
111090
  import { existsSync as existsSync70 } from "node:fs";
110130
- import { homedir as homedir47 } from "node:os";
110131
- import { join as join152 } from "node:path";
111091
+ import { homedir as homedir48 } from "node:os";
111092
+ import { join as join153 } from "node:path";
110132
111093
  async function validateSetup(cwd2) {
110133
111094
  const workDir = cwd2 ?? process.cwd();
110134
111095
  const ghVersion = spawnSync8("gh", ["--version"], { encoding: "utf-8", timeout: 1e4 });
@@ -110159,7 +111120,7 @@ Run this command from a directory with a GitHub remote.`);
110159
111120
  } catch {
110160
111121
  throw new Error(`Failed to parse repository info: ${ghRepo.stdout}`);
110161
111122
  }
110162
- const skillsPath = join152(homedir47(), ".claude", "skills");
111123
+ const skillsPath = join153(homedir48(), ".claude", "skills");
110163
111124
  const skillsAvailable = existsSync70(skillsPath);
110164
111125
  if (!skillsAvailable) {
110165
111126
  logger.warning(`ClaudeKit Engineer skills not found at ${skillsPath}`);
@@ -110177,8 +111138,8 @@ init_logger();
110177
111138
  init_path_resolver();
110178
111139
  import { createWriteStream as createWriteStream3, statSync as statSync12 } from "node:fs";
110179
111140
  import { existsSync as existsSync71 } from "node:fs";
110180
- import { mkdir as mkdir35, rename as rename11 } from "node:fs/promises";
110181
- import { join as join153 } from "node:path";
111141
+ import { mkdir as mkdir36, rename as rename11 } from "node:fs/promises";
111142
+ import { join as join154 } from "node:path";
110182
111143
 
110183
111144
  class WatchLogger {
110184
111145
  logStream = null;
@@ -110186,16 +111147,16 @@ class WatchLogger {
110186
111147
  logPath = null;
110187
111148
  maxBytes;
110188
111149
  constructor(logDir, maxBytes = 0) {
110189
- this.logDir = logDir ?? join153(PathResolver.getClaudeKitDir(), "logs");
111150
+ this.logDir = logDir ?? join154(PathResolver.getClaudeKitDir(), "logs");
110190
111151
  this.maxBytes = maxBytes;
110191
111152
  }
110192
111153
  async init() {
110193
111154
  try {
110194
111155
  if (!existsSync71(this.logDir)) {
110195
- await mkdir35(this.logDir, { recursive: true });
111156
+ await mkdir36(this.logDir, { recursive: true });
110196
111157
  }
110197
111158
  const dateStr = formatDate(new Date);
110198
- this.logPath = join153(this.logDir, `watch-${dateStr}.log`);
111159
+ this.logPath = join154(this.logDir, `watch-${dateStr}.log`);
110199
111160
  this.logStream = createWriteStream3(this.logPath, { flags: "a", mode: 384 });
110200
111161
  } catch (error) {
110201
111162
  logger.warning(`Cannot create watch log file: ${error instanceof Error ? error.message : "Unknown"}`);
@@ -110377,7 +111338,7 @@ async function watchCommand(options2) {
110377
111338
  }
110378
111339
  async function discoverRepos(options2, watchLog) {
110379
111340
  const cwd2 = process.cwd();
110380
- const isGitRepo = existsSync72(join154(cwd2, ".git"));
111341
+ const isGitRepo = existsSync72(join155(cwd2, ".git"));
110381
111342
  if (options2.force) {
110382
111343
  await forceRemoveLock(watchLog);
110383
111344
  }
@@ -110636,7 +111597,7 @@ function registerCommands(cli) {
110636
111597
  init_package();
110637
111598
  init_config_version_checker();
110638
111599
  import { existsSync as existsSync84, readFileSync as readFileSync22 } from "node:fs";
110639
- import { join as join166 } from "node:path";
111600
+ import { join as join167 } from "node:path";
110640
111601
 
110641
111602
  // src/domains/versioning/version-checker.ts
110642
111603
  init_version_utils();
@@ -110650,15 +111611,15 @@ init_types3();
110650
111611
  init_logger();
110651
111612
  init_path_resolver();
110652
111613
  import { existsSync as existsSync83 } from "node:fs";
110653
- import { mkdir as mkdir36, readFile as readFile64, writeFile as writeFile37 } from "node:fs/promises";
110654
- import { join as join165 } from "node:path";
111614
+ import { mkdir as mkdir37, readFile as readFile65, writeFile as writeFile38 } from "node:fs/promises";
111615
+ import { join as join166 } from "node:path";
110655
111616
 
110656
111617
  class VersionCacheManager {
110657
111618
  static CACHE_FILENAME = "version-check.json";
110658
111619
  static CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
110659
111620
  static getCacheFile() {
110660
111621
  const cacheDir = PathResolver.getCacheDir(false);
110661
- return join165(cacheDir, VersionCacheManager.CACHE_FILENAME);
111622
+ return join166(cacheDir, VersionCacheManager.CACHE_FILENAME);
110662
111623
  }
110663
111624
  static async load() {
110664
111625
  const cacheFile = VersionCacheManager.getCacheFile();
@@ -110667,7 +111628,7 @@ class VersionCacheManager {
110667
111628
  logger.debug("Version check cache not found");
110668
111629
  return null;
110669
111630
  }
110670
- const content = await readFile64(cacheFile, "utf-8");
111631
+ const content = await readFile65(cacheFile, "utf-8");
110671
111632
  const cache5 = JSON.parse(content);
110672
111633
  if (!cache5.lastCheck || !cache5.currentVersion || !cache5.latestVersion) {
110673
111634
  logger.debug("Invalid cache structure, ignoring");
@@ -110685,9 +111646,9 @@ class VersionCacheManager {
110685
111646
  const cacheDir = PathResolver.getCacheDir(false);
110686
111647
  try {
110687
111648
  if (!existsSync83(cacheDir)) {
110688
- await mkdir36(cacheDir, { recursive: true, mode: 448 });
111649
+ await mkdir37(cacheDir, { recursive: true, mode: 448 });
110689
111650
  }
110690
- await writeFile37(cacheFile, JSON.stringify(cache5, null, 2), "utf-8");
111651
+ await writeFile38(cacheFile, JSON.stringify(cache5, null, 2), "utf-8");
110691
111652
  logger.debug(`Version check cache saved to ${cacheFile}`);
110692
111653
  } catch (error) {
110693
111654
  logger.debug(`Failed to save version check cache: ${error}`);
@@ -110969,9 +111930,9 @@ async function displayVersion() {
110969
111930
  let localInstalledKits = [];
110970
111931
  let globalInstalledKits = [];
110971
111932
  const globalKitDir = PathResolver.getGlobalKitDir();
110972
- const globalMetadataPath = join166(globalKitDir, "metadata.json");
111933
+ const globalMetadataPath = join167(globalKitDir, "metadata.json");
110973
111934
  const prefix = PathResolver.getPathPrefix(false);
110974
- const localMetadataPath = prefix ? join166(process.cwd(), prefix, "metadata.json") : join166(process.cwd(), "metadata.json");
111935
+ const localMetadataPath = prefix ? join167(process.cwd(), prefix, "metadata.json") : join167(process.cwd(), "metadata.json");
110975
111936
  const isLocalSameAsGlobal = localMetadataPath === globalMetadataPath;
110976
111937
  if (!isLocalSameAsGlobal && existsSync84(localMetadataPath)) {
110977
111938
  try {