claudekit-cli 4.2.0 → 4.2.1-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli-manifest.json +2 -2
- package/dist/index.js +164 -175
- package/package.json +1 -1
package/cli-manifest.json
CHANGED
package/dist/index.js
CHANGED
|
@@ -62890,7 +62890,7 @@ var package_default;
|
|
|
62890
62890
|
var init_package = __esm(() => {
|
|
62891
62891
|
package_default = {
|
|
62892
62892
|
name: "claudekit-cli",
|
|
62893
|
-
version: "4.2.
|
|
62893
|
+
version: "4.2.1-dev.1",
|
|
62894
62894
|
description: "CLI tool for bootstrapping and updating ClaudeKit projects",
|
|
62895
62895
|
type: "module",
|
|
62896
62896
|
repository: {
|
|
@@ -74006,76 +74006,6 @@ var init_ownership_display = __esm(() => {
|
|
|
74006
74006
|
import_picocolors25 = __toESM(require_picocolors(), 1);
|
|
74007
74007
|
});
|
|
74008
74008
|
|
|
74009
|
-
// src/ui/node_modules/picocolors/picocolors.js
|
|
74010
|
-
var require_picocolors2 = __commonJS((exports, module) => {
|
|
74011
|
-
var p = process || {};
|
|
74012
|
-
var argv = p.argv || [];
|
|
74013
|
-
var env2 = p.env || {};
|
|
74014
|
-
var isColorSupported = !(!!env2.NO_COLOR || argv.includes("--no-color")) && (!!env2.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env2.TERM !== "dumb" || !!env2.CI);
|
|
74015
|
-
var formatter = (open6, close, replace3 = open6) => (input) => {
|
|
74016
|
-
let string = "" + input, index = string.indexOf(close, open6.length);
|
|
74017
|
-
return ~index ? open6 + replaceClose(string, close, replace3, index) + close : open6 + string + close;
|
|
74018
|
-
};
|
|
74019
|
-
var replaceClose = (string, close, replace3, index) => {
|
|
74020
|
-
let result = "", cursor = 0;
|
|
74021
|
-
do {
|
|
74022
|
-
result += string.substring(cursor, index) + replace3;
|
|
74023
|
-
cursor = index + close.length;
|
|
74024
|
-
index = string.indexOf(close, cursor);
|
|
74025
|
-
} while (~index);
|
|
74026
|
-
return result + string.substring(cursor);
|
|
74027
|
-
};
|
|
74028
|
-
var createColors = (enabled = isColorSupported) => {
|
|
74029
|
-
let f3 = enabled ? formatter : () => String;
|
|
74030
|
-
return {
|
|
74031
|
-
isColorSupported: enabled,
|
|
74032
|
-
reset: f3("\x1B[0m", "\x1B[0m"),
|
|
74033
|
-
bold: f3("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
|
|
74034
|
-
dim: f3("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
|
|
74035
|
-
italic: f3("\x1B[3m", "\x1B[23m"),
|
|
74036
|
-
underline: f3("\x1B[4m", "\x1B[24m"),
|
|
74037
|
-
inverse: f3("\x1B[7m", "\x1B[27m"),
|
|
74038
|
-
hidden: f3("\x1B[8m", "\x1B[28m"),
|
|
74039
|
-
strikethrough: f3("\x1B[9m", "\x1B[29m"),
|
|
74040
|
-
black: f3("\x1B[30m", "\x1B[39m"),
|
|
74041
|
-
red: f3("\x1B[31m", "\x1B[39m"),
|
|
74042
|
-
green: f3("\x1B[32m", "\x1B[39m"),
|
|
74043
|
-
yellow: f3("\x1B[33m", "\x1B[39m"),
|
|
74044
|
-
blue: f3("\x1B[34m", "\x1B[39m"),
|
|
74045
|
-
magenta: f3("\x1B[35m", "\x1B[39m"),
|
|
74046
|
-
cyan: f3("\x1B[36m", "\x1B[39m"),
|
|
74047
|
-
white: f3("\x1B[37m", "\x1B[39m"),
|
|
74048
|
-
gray: f3("\x1B[90m", "\x1B[39m"),
|
|
74049
|
-
bgBlack: f3("\x1B[40m", "\x1B[49m"),
|
|
74050
|
-
bgRed: f3("\x1B[41m", "\x1B[49m"),
|
|
74051
|
-
bgGreen: f3("\x1B[42m", "\x1B[49m"),
|
|
74052
|
-
bgYellow: f3("\x1B[43m", "\x1B[49m"),
|
|
74053
|
-
bgBlue: f3("\x1B[44m", "\x1B[49m"),
|
|
74054
|
-
bgMagenta: f3("\x1B[45m", "\x1B[49m"),
|
|
74055
|
-
bgCyan: f3("\x1B[46m", "\x1B[49m"),
|
|
74056
|
-
bgWhite: f3("\x1B[47m", "\x1B[49m"),
|
|
74057
|
-
blackBright: f3("\x1B[90m", "\x1B[39m"),
|
|
74058
|
-
redBright: f3("\x1B[91m", "\x1B[39m"),
|
|
74059
|
-
greenBright: f3("\x1B[92m", "\x1B[39m"),
|
|
74060
|
-
yellowBright: f3("\x1B[93m", "\x1B[39m"),
|
|
74061
|
-
blueBright: f3("\x1B[94m", "\x1B[39m"),
|
|
74062
|
-
magentaBright: f3("\x1B[95m", "\x1B[39m"),
|
|
74063
|
-
cyanBright: f3("\x1B[96m", "\x1B[39m"),
|
|
74064
|
-
whiteBright: f3("\x1B[97m", "\x1B[39m"),
|
|
74065
|
-
bgBlackBright: f3("\x1B[100m", "\x1B[49m"),
|
|
74066
|
-
bgRedBright: f3("\x1B[101m", "\x1B[49m"),
|
|
74067
|
-
bgGreenBright: f3("\x1B[102m", "\x1B[49m"),
|
|
74068
|
-
bgYellowBright: f3("\x1B[103m", "\x1B[49m"),
|
|
74069
|
-
bgBlueBright: f3("\x1B[104m", "\x1B[49m"),
|
|
74070
|
-
bgMagentaBright: f3("\x1B[105m", "\x1B[49m"),
|
|
74071
|
-
bgCyanBright: f3("\x1B[106m", "\x1B[49m"),
|
|
74072
|
-
bgWhiteBright: f3("\x1B[107m", "\x1B[49m")
|
|
74073
|
-
};
|
|
74074
|
-
};
|
|
74075
|
-
module.exports = createColors();
|
|
74076
|
-
module.exports.createColors = createColors;
|
|
74077
|
-
});
|
|
74078
|
-
|
|
74079
74009
|
// src/commands/watch/phases/implementation-git-helpers.ts
|
|
74080
74010
|
import { spawn as spawn5 } from "node:child_process";
|
|
74081
74011
|
async function getCurrentBranch2(cwd2) {
|
|
@@ -74184,9 +74114,9 @@ __export(exports_worktree_manager, {
|
|
|
74184
74114
|
});
|
|
74185
74115
|
import { existsSync as existsSync70 } from "node:fs";
|
|
74186
74116
|
import { readFile as readFile66, writeFile as writeFile37 } from "node:fs/promises";
|
|
74187
|
-
import { join as
|
|
74117
|
+
import { join as join152 } from "node:path";
|
|
74188
74118
|
async function createWorktree(projectDir, issueNumber, baseBranch) {
|
|
74189
|
-
const worktreePath =
|
|
74119
|
+
const worktreePath = join152(projectDir, WORKTREE_DIR, `issue-${issueNumber}`);
|
|
74190
74120
|
const branchName = `ck-watch/issue-${issueNumber}`;
|
|
74191
74121
|
await spawnAndCollect("git", ["fetch", "origin", baseBranch], projectDir).catch(() => {
|
|
74192
74122
|
logger.warning(`[worktree] Could not fetch origin/${baseBranch}, using local`);
|
|
@@ -74204,7 +74134,7 @@ async function createWorktree(projectDir, issueNumber, baseBranch) {
|
|
|
74204
74134
|
return worktreePath;
|
|
74205
74135
|
}
|
|
74206
74136
|
async function removeWorktree(projectDir, issueNumber) {
|
|
74207
|
-
const worktreePath =
|
|
74137
|
+
const worktreePath = join152(projectDir, WORKTREE_DIR, `issue-${issueNumber}`);
|
|
74208
74138
|
const branchName = `ck-watch/issue-${issueNumber}`;
|
|
74209
74139
|
try {
|
|
74210
74140
|
await spawnAndCollect("git", ["worktree", "remove", worktreePath, "--force"], projectDir);
|
|
@@ -74218,7 +74148,7 @@ async function listActiveWorktrees(projectDir) {
|
|
|
74218
74148
|
try {
|
|
74219
74149
|
const output2 = await spawnAndCollect("git", ["worktree", "list", "--porcelain"], projectDir);
|
|
74220
74150
|
const issueNumbers = [];
|
|
74221
|
-
const worktreePrefix =
|
|
74151
|
+
const worktreePrefix = join152(projectDir, WORKTREE_DIR, "issue-").replace(/\\/g, "/");
|
|
74222
74152
|
for (const line of output2.split(`
|
|
74223
74153
|
`)) {
|
|
74224
74154
|
if (line.startsWith("worktree ")) {
|
|
@@ -74246,7 +74176,7 @@ async function cleanupAllWorktrees(projectDir) {
|
|
|
74246
74176
|
await spawnAndCollect("git", ["worktree", "prune"], projectDir).catch(() => {});
|
|
74247
74177
|
}
|
|
74248
74178
|
async function ensureGitignore(projectDir) {
|
|
74249
|
-
const gitignorePath =
|
|
74179
|
+
const gitignorePath = join152(projectDir, ".gitignore");
|
|
74250
74180
|
try {
|
|
74251
74181
|
const content = existsSync70(gitignorePath) ? await readFile66(gitignorePath, "utf-8") : "";
|
|
74252
74182
|
if (!content.includes(".worktrees")) {
|
|
@@ -74353,7 +74283,7 @@ import { createHash as createHash9 } from "node:crypto";
|
|
|
74353
74283
|
import { existsSync as existsSync76, mkdirSync as mkdirSync5, readFileSync as readFileSync18, readdirSync as readdirSync11, statSync as statSync14 } from "node:fs";
|
|
74354
74284
|
import { rename as rename14, writeFile as writeFile39 } from "node:fs/promises";
|
|
74355
74285
|
import { homedir as homedir53 } from "node:os";
|
|
74356
|
-
import { basename as basename31, join as
|
|
74286
|
+
import { basename as basename31, join as join159 } from "node:path";
|
|
74357
74287
|
function getCachedContext(repoPath) {
|
|
74358
74288
|
const cachePath = getCacheFilePath(repoPath);
|
|
74359
74289
|
if (!existsSync76(cachePath))
|
|
@@ -74396,25 +74326,25 @@ function computeSourceHash(repoPath) {
|
|
|
74396
74326
|
}
|
|
74397
74327
|
function getDocSourcePaths(repoPath) {
|
|
74398
74328
|
const paths = [];
|
|
74399
|
-
const docsDir =
|
|
74329
|
+
const docsDir = join159(repoPath, "docs");
|
|
74400
74330
|
if (existsSync76(docsDir)) {
|
|
74401
74331
|
try {
|
|
74402
74332
|
const files = readdirSync11(docsDir);
|
|
74403
74333
|
for (const f3 of files) {
|
|
74404
74334
|
if (f3.endsWith(".md"))
|
|
74405
|
-
paths.push(
|
|
74335
|
+
paths.push(join159(docsDir, f3));
|
|
74406
74336
|
}
|
|
74407
74337
|
} catch {}
|
|
74408
74338
|
}
|
|
74409
|
-
const readme =
|
|
74339
|
+
const readme = join159(repoPath, "README.md");
|
|
74410
74340
|
if (existsSync76(readme))
|
|
74411
74341
|
paths.push(readme);
|
|
74412
|
-
const stylesDir =
|
|
74342
|
+
const stylesDir = join159(repoPath, "assets", "writing-styles");
|
|
74413
74343
|
if (existsSync76(stylesDir)) {
|
|
74414
74344
|
try {
|
|
74415
74345
|
const files = readdirSync11(stylesDir);
|
|
74416
74346
|
for (const f3 of files) {
|
|
74417
|
-
paths.push(
|
|
74347
|
+
paths.push(join159(stylesDir, f3));
|
|
74418
74348
|
}
|
|
74419
74349
|
} catch {}
|
|
74420
74350
|
}
|
|
@@ -74423,11 +74353,11 @@ function getDocSourcePaths(repoPath) {
|
|
|
74423
74353
|
function getCacheFilePath(repoPath) {
|
|
74424
74354
|
const repoName = basename31(repoPath).replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
74425
74355
|
const pathHash = createHash9("sha256").update(repoPath).digest("hex").slice(0, 8);
|
|
74426
|
-
return
|
|
74356
|
+
return join159(CACHE_DIR, `${repoName}-${pathHash}-context-cache.json`);
|
|
74427
74357
|
}
|
|
74428
74358
|
var CACHE_DIR, CACHE_TTL_MS5;
|
|
74429
74359
|
var init_context_cache_manager = __esm(() => {
|
|
74430
|
-
CACHE_DIR =
|
|
74360
|
+
CACHE_DIR = join159(homedir53(), ".claudekit", "cache");
|
|
74431
74361
|
CACHE_TTL_MS5 = 24 * 60 * 60 * 1000;
|
|
74432
74362
|
});
|
|
74433
74363
|
|
|
@@ -74608,7 +74538,7 @@ function extractContentFromResponse(response) {
|
|
|
74608
74538
|
// src/commands/content/phases/docs-summarizer.ts
|
|
74609
74539
|
import { execSync as execSync7 } from "node:child_process";
|
|
74610
74540
|
import { existsSync as existsSync77, readFileSync as readFileSync19, readdirSync as readdirSync12 } from "node:fs";
|
|
74611
|
-
import { join as
|
|
74541
|
+
import { join as join160 } from "node:path";
|
|
74612
74542
|
async function summarizeProjectDocs(repoPath, contentLogger) {
|
|
74613
74543
|
const rawContent = collectRawDocs(repoPath);
|
|
74614
74544
|
if (rawContent.total.length < 200) {
|
|
@@ -74662,12 +74592,12 @@ function collectRawDocs(repoPath) {
|
|
|
74662
74592
|
return capped;
|
|
74663
74593
|
};
|
|
74664
74594
|
const docsContent = [];
|
|
74665
|
-
const docsDir =
|
|
74595
|
+
const docsDir = join160(repoPath, "docs");
|
|
74666
74596
|
if (existsSync77(docsDir)) {
|
|
74667
74597
|
try {
|
|
74668
74598
|
const files = readdirSync12(docsDir).filter((f3) => f3.endsWith(".md")).sort();
|
|
74669
74599
|
for (const f3 of files) {
|
|
74670
|
-
const content = readCapped(
|
|
74600
|
+
const content = readCapped(join160(docsDir, f3), 5000);
|
|
74671
74601
|
if (content) {
|
|
74672
74602
|
docsContent.push(`### ${f3}
|
|
74673
74603
|
${content}`);
|
|
@@ -74681,21 +74611,21 @@ ${content}`);
|
|
|
74681
74611
|
let brand = "";
|
|
74682
74612
|
const brandCandidates = ["docs/brand-guidelines.md", "docs/design-guidelines.md"];
|
|
74683
74613
|
for (const p of brandCandidates) {
|
|
74684
|
-
brand = readCapped(
|
|
74614
|
+
brand = readCapped(join160(repoPath, p), 3000);
|
|
74685
74615
|
if (brand)
|
|
74686
74616
|
break;
|
|
74687
74617
|
}
|
|
74688
74618
|
let styles3 = "";
|
|
74689
|
-
const stylesDir =
|
|
74619
|
+
const stylesDir = join160(repoPath, "assets", "writing-styles");
|
|
74690
74620
|
if (existsSync77(stylesDir)) {
|
|
74691
74621
|
try {
|
|
74692
74622
|
const files = readdirSync12(stylesDir).slice(0, 3);
|
|
74693
|
-
styles3 = files.map((f3) => readCapped(
|
|
74623
|
+
styles3 = files.map((f3) => readCapped(join160(stylesDir, f3), 1000)).filter(Boolean).join(`
|
|
74694
74624
|
|
|
74695
74625
|
`);
|
|
74696
74626
|
} catch {}
|
|
74697
74627
|
}
|
|
74698
|
-
const readme = readCapped(
|
|
74628
|
+
const readme = readCapped(join160(repoPath, "README.md"), 3000);
|
|
74699
74629
|
const total = [docs, brand, styles3, readme].join(`
|
|
74700
74630
|
`);
|
|
74701
74631
|
return { docs, brand, styles: styles3, readme, total };
|
|
@@ -74882,9 +74812,9 @@ IMPORTANT: Generate the image and output the path as JSON: {"imagePath": "/path/
|
|
|
74882
74812
|
import { execSync as execSync8 } from "node:child_process";
|
|
74883
74813
|
import { existsSync as existsSync78, mkdirSync as mkdirSync6, readdirSync as readdirSync13 } from "node:fs";
|
|
74884
74814
|
import { homedir as homedir54 } from "node:os";
|
|
74885
|
-
import { join as
|
|
74815
|
+
import { join as join161 } from "node:path";
|
|
74886
74816
|
async function generatePhoto(_content, context, config, platform18, contentId, contentLogger) {
|
|
74887
|
-
const mediaDir =
|
|
74817
|
+
const mediaDir = join161(config.contentDir.replace(/^~/, homedir54()), "media", String(contentId));
|
|
74888
74818
|
if (!existsSync78(mediaDir)) {
|
|
74889
74819
|
mkdirSync6(mediaDir, { recursive: true });
|
|
74890
74820
|
}
|
|
@@ -74909,7 +74839,7 @@ async function generatePhoto(_content, context, config, platform18, contentId, c
|
|
|
74909
74839
|
const imageFile = files.find((f3) => /\.(png|jpg|jpeg|webp)$/i.test(f3));
|
|
74910
74840
|
if (imageFile) {
|
|
74911
74841
|
const ext2 = imageFile.split(".").pop() ?? "png";
|
|
74912
|
-
return { path:
|
|
74842
|
+
return { path: join161(mediaDir, imageFile), ...dimensions, format: ext2 };
|
|
74913
74843
|
}
|
|
74914
74844
|
contentLogger.warn(`Photo generation produced no image for content ${contentId}`);
|
|
74915
74845
|
return null;
|
|
@@ -74999,7 +74929,7 @@ var init_content_creator = __esm(() => {
|
|
|
74999
74929
|
// src/commands/content/phases/content-logger.ts
|
|
75000
74930
|
import { createWriteStream as createWriteStream4, existsSync as existsSync79, mkdirSync as mkdirSync7, statSync as statSync15 } from "node:fs";
|
|
75001
74931
|
import { homedir as homedir55 } from "node:os";
|
|
75002
|
-
import { join as
|
|
74932
|
+
import { join as join162 } from "node:path";
|
|
75003
74933
|
|
|
75004
74934
|
class ContentLogger {
|
|
75005
74935
|
stream = null;
|
|
@@ -75007,7 +74937,7 @@ class ContentLogger {
|
|
|
75007
74937
|
logDir;
|
|
75008
74938
|
maxBytes;
|
|
75009
74939
|
constructor(maxBytes = 0) {
|
|
75010
|
-
this.logDir =
|
|
74940
|
+
this.logDir = join162(homedir55(), ".claudekit", "logs");
|
|
75011
74941
|
this.maxBytes = maxBytes;
|
|
75012
74942
|
}
|
|
75013
74943
|
init() {
|
|
@@ -75039,7 +74969,7 @@ class ContentLogger {
|
|
|
75039
74969
|
}
|
|
75040
74970
|
}
|
|
75041
74971
|
getLogPath() {
|
|
75042
|
-
return
|
|
74972
|
+
return join162(this.logDir, `content-${this.getDateStr()}.log`);
|
|
75043
74973
|
}
|
|
75044
74974
|
write(level, message) {
|
|
75045
74975
|
this.rotateIfNeeded();
|
|
@@ -75056,18 +74986,18 @@ class ContentLogger {
|
|
|
75056
74986
|
if (dateStr !== this.currentDate) {
|
|
75057
74987
|
this.close();
|
|
75058
74988
|
this.currentDate = dateStr;
|
|
75059
|
-
const logPath =
|
|
74989
|
+
const logPath = join162(this.logDir, `content-${dateStr}.log`);
|
|
75060
74990
|
this.stream = createWriteStream4(logPath, { flags: "a", mode: 384 });
|
|
75061
74991
|
return;
|
|
75062
74992
|
}
|
|
75063
74993
|
if (this.maxBytes > 0 && this.stream) {
|
|
75064
|
-
const logPath =
|
|
74994
|
+
const logPath = join162(this.logDir, `content-${this.currentDate}.log`);
|
|
75065
74995
|
try {
|
|
75066
74996
|
const stat25 = statSync15(logPath);
|
|
75067
74997
|
if (stat25.size >= this.maxBytes) {
|
|
75068
74998
|
this.close();
|
|
75069
74999
|
const suffix = Date.now();
|
|
75070
|
-
const rotatedPath =
|
|
75000
|
+
const rotatedPath = join162(this.logDir, `content-${this.currentDate}-${suffix}.log`);
|
|
75071
75001
|
import("node:fs/promises").then(({ rename: rename15 }) => rename15(logPath, rotatedPath).catch(() => {}));
|
|
75072
75002
|
this.stream = createWriteStream4(logPath, { flags: "w", mode: 384 });
|
|
75073
75003
|
}
|
|
@@ -75293,7 +75223,7 @@ function isNoiseCommit(title, author) {
|
|
|
75293
75223
|
// src/commands/content/phases/change-detector.ts
|
|
75294
75224
|
import { execSync as execSync10, spawnSync as spawnSync9 } from "node:child_process";
|
|
75295
75225
|
import { existsSync as existsSync81, readFileSync as readFileSync20, readdirSync as readdirSync14, statSync as statSync16 } from "node:fs";
|
|
75296
|
-
import { join as
|
|
75226
|
+
import { join as join163 } from "node:path";
|
|
75297
75227
|
function detectCommits(repo, since) {
|
|
75298
75228
|
try {
|
|
75299
75229
|
const fetchUrl = sshToHttps(repo.remoteUrl);
|
|
@@ -75402,7 +75332,7 @@ function detectTags(repo, since) {
|
|
|
75402
75332
|
}
|
|
75403
75333
|
}
|
|
75404
75334
|
function detectCompletedPlans(repo, since) {
|
|
75405
|
-
const plansDir =
|
|
75335
|
+
const plansDir = join163(repo.path, "plans");
|
|
75406
75336
|
if (!existsSync81(plansDir))
|
|
75407
75337
|
return [];
|
|
75408
75338
|
const sinceMs = new Date(since).getTime();
|
|
@@ -75412,7 +75342,7 @@ function detectCompletedPlans(repo, since) {
|
|
|
75412
75342
|
for (const entry of entries) {
|
|
75413
75343
|
if (!entry.isDirectory())
|
|
75414
75344
|
continue;
|
|
75415
|
-
const planFile =
|
|
75345
|
+
const planFile = join163(plansDir, entry.name, "plan.md");
|
|
75416
75346
|
if (!existsSync81(planFile))
|
|
75417
75347
|
continue;
|
|
75418
75348
|
try {
|
|
@@ -75490,7 +75420,7 @@ function classifyCommit(event) {
|
|
|
75490
75420
|
// src/commands/content/phases/repo-discoverer.ts
|
|
75491
75421
|
import { execSync as execSync11 } from "node:child_process";
|
|
75492
75422
|
import { readdirSync as readdirSync15 } from "node:fs";
|
|
75493
|
-
import { join as
|
|
75423
|
+
import { join as join164 } from "node:path";
|
|
75494
75424
|
function discoverRepos2(cwd2) {
|
|
75495
75425
|
const repos = [];
|
|
75496
75426
|
if (isGitRepoRoot(cwd2)) {
|
|
@@ -75503,7 +75433,7 @@ function discoverRepos2(cwd2) {
|
|
|
75503
75433
|
for (const entry of entries) {
|
|
75504
75434
|
if (!entry.isDirectory() || entry.name.startsWith("."))
|
|
75505
75435
|
continue;
|
|
75506
|
-
const dirPath =
|
|
75436
|
+
const dirPath = join164(cwd2, entry.name);
|
|
75507
75437
|
if (isGitRepoRoot(dirPath)) {
|
|
75508
75438
|
const info = getRepoInfo(dirPath);
|
|
75509
75439
|
if (info)
|
|
@@ -76171,9 +76101,9 @@ var init_types6 = __esm(() => {
|
|
|
76171
76101
|
|
|
76172
76102
|
// src/commands/content/phases/state-manager.ts
|
|
76173
76103
|
import { readFile as readFile68, rename as rename15, writeFile as writeFile40 } from "node:fs/promises";
|
|
76174
|
-
import { join as
|
|
76104
|
+
import { join as join165 } from "node:path";
|
|
76175
76105
|
async function loadContentConfig(projectDir) {
|
|
76176
|
-
const configPath =
|
|
76106
|
+
const configPath = join165(projectDir, CK_CONFIG_FILE2);
|
|
76177
76107
|
try {
|
|
76178
76108
|
const raw2 = await readFile68(configPath, "utf-8");
|
|
76179
76109
|
const json = JSON.parse(raw2);
|
|
@@ -76183,13 +76113,13 @@ async function loadContentConfig(projectDir) {
|
|
|
76183
76113
|
}
|
|
76184
76114
|
}
|
|
76185
76115
|
async function saveContentConfig(projectDir, config) {
|
|
76186
|
-
const configPath =
|
|
76116
|
+
const configPath = join165(projectDir, CK_CONFIG_FILE2);
|
|
76187
76117
|
const json = await readJsonSafe(configPath);
|
|
76188
76118
|
json.content = { ...json.content, ...config };
|
|
76189
76119
|
await atomicWrite2(configPath, json);
|
|
76190
76120
|
}
|
|
76191
76121
|
async function loadContentState(projectDir) {
|
|
76192
|
-
const configPath =
|
|
76122
|
+
const configPath = join165(projectDir, CK_CONFIG_FILE2);
|
|
76193
76123
|
try {
|
|
76194
76124
|
const raw2 = await readFile68(configPath, "utf-8");
|
|
76195
76125
|
const json = JSON.parse(raw2);
|
|
@@ -76200,7 +76130,7 @@ async function loadContentState(projectDir) {
|
|
|
76200
76130
|
}
|
|
76201
76131
|
}
|
|
76202
76132
|
async function saveContentState(projectDir, state) {
|
|
76203
|
-
const configPath =
|
|
76133
|
+
const configPath = join165(projectDir, CK_CONFIG_FILE2);
|
|
76204
76134
|
const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
|
|
76205
76135
|
for (const key of Object.keys(state.dailyPostCounts)) {
|
|
76206
76136
|
const dateStr = key.slice(-10);
|
|
@@ -76482,7 +76412,7 @@ var init_platform_setup_x = __esm(() => {
|
|
|
76482
76412
|
|
|
76483
76413
|
// src/commands/content/phases/setup-wizard.ts
|
|
76484
76414
|
import { existsSync as existsSync82 } from "node:fs";
|
|
76485
|
-
import { join as
|
|
76415
|
+
import { join as join166 } from "node:path";
|
|
76486
76416
|
async function runSetupWizard2(cwd2, contentLogger) {
|
|
76487
76417
|
console.log();
|
|
76488
76418
|
oe(import_picocolors43.default.bgCyan(import_picocolors43.default.white(" CK Content — Multi-Channel Content Engine ")));
|
|
@@ -76550,8 +76480,8 @@ async function showRepoSummary(cwd2) {
|
|
|
76550
76480
|
function detectBrandAssets(cwd2, contentLogger) {
|
|
76551
76481
|
const repos = discoverRepos2(cwd2);
|
|
76552
76482
|
for (const repo of repos) {
|
|
76553
|
-
const hasGuidelines = existsSync82(
|
|
76554
|
-
const hasStyles = existsSync82(
|
|
76483
|
+
const hasGuidelines = existsSync82(join166(repo.path, "docs", "brand-guidelines.md"));
|
|
76484
|
+
const hasStyles = existsSync82(join166(repo.path, "assets", "writing-styles"));
|
|
76555
76485
|
if (!hasGuidelines) {
|
|
76556
76486
|
f2.warning(`${repo.name}: No docs/brand-guidelines.md — content will use generic tone.`);
|
|
76557
76487
|
contentLogger.warn(`${repo.name}: missing docs/brand-guidelines.md`);
|
|
@@ -76693,9 +76623,9 @@ __export(exports_content_subcommands, {
|
|
|
76693
76623
|
});
|
|
76694
76624
|
import { existsSync as existsSync84, readFileSync as readFileSync21, unlinkSync as unlinkSync6 } from "node:fs";
|
|
76695
76625
|
import { homedir as homedir57 } from "node:os";
|
|
76696
|
-
import { join as
|
|
76626
|
+
import { join as join167 } from "node:path";
|
|
76697
76627
|
function isDaemonRunning() {
|
|
76698
|
-
const lockFile =
|
|
76628
|
+
const lockFile = join167(LOCK_DIR, `${LOCK_NAME2}.lock`);
|
|
76699
76629
|
if (!existsSync84(lockFile))
|
|
76700
76630
|
return { running: false, pid: null };
|
|
76701
76631
|
try {
|
|
@@ -76727,7 +76657,7 @@ async function startContent(options2) {
|
|
|
76727
76657
|
await contentCommand(options2);
|
|
76728
76658
|
}
|
|
76729
76659
|
async function stopContent() {
|
|
76730
|
-
const lockFile =
|
|
76660
|
+
const lockFile = join167(LOCK_DIR, `${LOCK_NAME2}.lock`);
|
|
76731
76661
|
if (!existsSync84(lockFile)) {
|
|
76732
76662
|
logger.info("Content daemon is not running.");
|
|
76733
76663
|
return;
|
|
@@ -76766,9 +76696,9 @@ async function statusContent() {
|
|
|
76766
76696
|
} catch {}
|
|
76767
76697
|
}
|
|
76768
76698
|
async function logsContent(options2) {
|
|
76769
|
-
const logDir =
|
|
76699
|
+
const logDir = join167(homedir57(), ".claudekit", "logs");
|
|
76770
76700
|
const dateStr = new Date().toISOString().slice(0, 10).replace(/-/g, "");
|
|
76771
|
-
const logPath =
|
|
76701
|
+
const logPath = join167(logDir, `content-${dateStr}.log`);
|
|
76772
76702
|
if (!existsSync84(logPath)) {
|
|
76773
76703
|
logger.info("No content logs found for today.");
|
|
76774
76704
|
return;
|
|
@@ -76800,13 +76730,13 @@ var init_content_subcommands = __esm(() => {
|
|
|
76800
76730
|
init_setup_wizard();
|
|
76801
76731
|
init_state_manager();
|
|
76802
76732
|
init_content_review_commands();
|
|
76803
|
-
LOCK_DIR =
|
|
76733
|
+
LOCK_DIR = join167(homedir57(), ".claudekit", "locks");
|
|
76804
76734
|
});
|
|
76805
76735
|
|
|
76806
76736
|
// src/commands/content/content-command.ts
|
|
76807
76737
|
import { existsSync as existsSync85, mkdirSync as mkdirSync9, unlinkSync as unlinkSync7, writeFileSync as writeFileSync7 } from "node:fs";
|
|
76808
76738
|
import { homedir as homedir58 } from "node:os";
|
|
76809
|
-
import { join as
|
|
76739
|
+
import { join as join168 } from "node:path";
|
|
76810
76740
|
async function contentCommand(options2) {
|
|
76811
76741
|
const cwd2 = process.cwd();
|
|
76812
76742
|
const contentLogger = new ContentLogger;
|
|
@@ -76984,8 +76914,8 @@ var init_content_command = __esm(() => {
|
|
|
76984
76914
|
init_publisher();
|
|
76985
76915
|
init_review_manager();
|
|
76986
76916
|
init_state_manager();
|
|
76987
|
-
LOCK_DIR2 =
|
|
76988
|
-
LOCK_FILE =
|
|
76917
|
+
LOCK_DIR2 = join168(homedir58(), ".claudekit", "locks");
|
|
76918
|
+
LOCK_FILE = join168(LOCK_DIR2, "ck-content.lock");
|
|
76989
76919
|
});
|
|
76990
76920
|
|
|
76991
76921
|
// src/commands/content/index.ts
|
|
@@ -85283,7 +85213,7 @@ function buildDuplicateInventoryCheck(projectSkills, globalSkills) {
|
|
|
85283
85213
|
if (duplicates.length === 0) {
|
|
85284
85214
|
return pass("ck-skill-inventory", "Skill Inventory", "No duplicate project/global skills");
|
|
85285
85215
|
}
|
|
85286
|
-
return warn("ck-skill-inventory", "Skill Inventory", `${duplicates.length} duplicate project/global skill(s)`, duplicates, "Keep one installation scope per skill; inspect with: ck skills list --installed");
|
|
85216
|
+
return warn("ck-skill-inventory", "Skill Inventory", `${duplicates.length} duplicate project/global skill(s)`, duplicates, "Keep one installation scope per skill; inspect with: ck skills --list --installed");
|
|
85287
85217
|
}
|
|
85288
85218
|
function buildSkillOverridesCheck(settingsPath, read) {
|
|
85289
85219
|
if (!read.settings || !Object.prototype.hasOwnProperty.call(read.settings, "skillOverrides")) {
|
|
@@ -107512,7 +107442,7 @@ import { basename as basename27, join as join142, resolve as resolve46 } from "n
|
|
|
107512
107442
|
init_logger();
|
|
107513
107443
|
|
|
107514
107444
|
// src/ui/ck-cli-design/tokens.ts
|
|
107515
|
-
var import_picocolors27 = __toESM(
|
|
107445
|
+
var import_picocolors27 = __toESM(require_picocolors(), 1);
|
|
107516
107446
|
import { homedir as homedir47, platform as platform16 } from "node:os";
|
|
107517
107447
|
import { resolve as resolve45, win32 as win322 } from "node:path";
|
|
107518
107448
|
var PANEL_MIN_WIDTH = 60;
|
|
@@ -111460,14 +111390,48 @@ init_skill_catalog_generator();
|
|
|
111460
111390
|
init_skill_search_index();
|
|
111461
111391
|
init_logger();
|
|
111462
111392
|
init_agents();
|
|
111463
|
-
init_skills_discovery();
|
|
111464
|
-
init_skills_installer();
|
|
111465
|
-
init_skills_registry();
|
|
111466
|
-
init_skills_uninstaller();
|
|
111467
111393
|
var import_gray_matter12 = __toESM(require_gray_matter(), 1);
|
|
111468
111394
|
var import_picocolors37 = __toESM(require_picocolors(), 1);
|
|
111469
111395
|
import { readFile as readFile65 } from "node:fs/promises";
|
|
111396
|
+
import { join as join149 } from "node:path";
|
|
111397
|
+
|
|
111398
|
+
// src/commands/skills/installed-skills-inventory.ts
|
|
111470
111399
|
import { join as join148 } from "node:path";
|
|
111400
|
+
init_path_resolver();
|
|
111401
|
+
var SCOPE_SORT_ORDER = {
|
|
111402
|
+
project: 0,
|
|
111403
|
+
global: 1
|
|
111404
|
+
};
|
|
111405
|
+
async function getActiveClaudeSkillInstallations(options2 = {}) {
|
|
111406
|
+
const projectDir = options2.projectDir ?? process.cwd();
|
|
111407
|
+
const globalDir = options2.globalDir ?? PathResolver.getGlobalKitDir();
|
|
111408
|
+
const [projectSkills, globalSkills] = await Promise.all([
|
|
111409
|
+
scanSkills2(join148(projectDir, ".claude", "skills")),
|
|
111410
|
+
scanSkills2(join148(globalDir, "skills"))
|
|
111411
|
+
]);
|
|
111412
|
+
const projectIds = new Set(projectSkills.map((skill) => skill.id));
|
|
111413
|
+
const globalIds = new Set(globalSkills.map((skill) => skill.id));
|
|
111414
|
+
return [
|
|
111415
|
+
...projectSkills.map((skill) => ({
|
|
111416
|
+
skill: skill.id,
|
|
111417
|
+
scope: "project",
|
|
111418
|
+
path: skill.file,
|
|
111419
|
+
duplicateAcrossScopes: globalIds.has(skill.id)
|
|
111420
|
+
})),
|
|
111421
|
+
...globalSkills.map((skill) => ({
|
|
111422
|
+
skill: skill.id,
|
|
111423
|
+
scope: "global",
|
|
111424
|
+
path: skill.file,
|
|
111425
|
+
duplicateAcrossScopes: projectIds.has(skill.id)
|
|
111426
|
+
}))
|
|
111427
|
+
].sort((a3, b3) => a3.skill.localeCompare(b3.skill) || SCOPE_SORT_ORDER[a3.scope] - SCOPE_SORT_ORDER[b3.scope]);
|
|
111428
|
+
}
|
|
111429
|
+
|
|
111430
|
+
// src/commands/skills/skills-command.ts
|
|
111431
|
+
init_skills_discovery();
|
|
111432
|
+
init_skills_installer();
|
|
111433
|
+
init_skills_registry();
|
|
111434
|
+
init_skills_uninstaller();
|
|
111471
111435
|
|
|
111472
111436
|
// src/commands/skills/types.ts
|
|
111473
111437
|
init_zod();
|
|
@@ -111603,7 +111567,7 @@ async function handleValidate2(sourcePath) {
|
|
|
111603
111567
|
spinner.stop(`Checked ${skills.length} skill(s)`);
|
|
111604
111568
|
let hasIssues = false;
|
|
111605
111569
|
for (const skill of skills) {
|
|
111606
|
-
const skillMdPath =
|
|
111570
|
+
const skillMdPath = join149(skill.path, "SKILL.md");
|
|
111607
111571
|
try {
|
|
111608
111572
|
const content = await readFile65(skillMdPath, "utf-8");
|
|
111609
111573
|
const { data } = import_gray_matter12.default(content, {
|
|
@@ -111639,30 +111603,55 @@ async function detectInstalledAgents2() {
|
|
|
111639
111603
|
}
|
|
111640
111604
|
async function listSkills2(showInstalled) {
|
|
111641
111605
|
if (showInstalled) {
|
|
111642
|
-
const installations = await
|
|
111643
|
-
|
|
111644
|
-
|
|
111606
|
+
const [installations, activeClaudeSkills] = await Promise.all([
|
|
111607
|
+
getInstalledSkills(),
|
|
111608
|
+
getActiveClaudeSkillInstallations()
|
|
111609
|
+
]);
|
|
111610
|
+
if (installations.length === 0 && activeClaudeSkills.length === 0) {
|
|
111611
|
+
f2.warn("No installed skills found.");
|
|
111645
111612
|
return;
|
|
111646
111613
|
}
|
|
111647
111614
|
console.log();
|
|
111648
|
-
|
|
111649
|
-
|
|
111650
|
-
|
|
111651
|
-
|
|
111652
|
-
const
|
|
111653
|
-
|
|
111654
|
-
|
|
111615
|
+
if (activeClaudeSkills.length > 0) {
|
|
111616
|
+
f2.step(import_picocolors37.default.bold("Active Claude Code Skills"));
|
|
111617
|
+
console.log();
|
|
111618
|
+
const bySkill = new Map;
|
|
111619
|
+
for (const inst of activeClaudeSkills) {
|
|
111620
|
+
const list3 = bySkill.get(inst.skill) || [];
|
|
111621
|
+
list3.push(inst);
|
|
111622
|
+
bySkill.set(inst.skill, list3);
|
|
111623
|
+
}
|
|
111624
|
+
for (const [skill, installs] of bySkill) {
|
|
111625
|
+
const duplicate = installs.some((inst) => inst.duplicateAcrossScopes) ? ` ${import_picocolors37.default.yellow("(project/global duplicate)")}` : "";
|
|
111626
|
+
console.log(` ${import_picocolors37.default.cyan(skill)}${duplicate}`);
|
|
111627
|
+
for (const inst of installs) {
|
|
111628
|
+
console.log(` ${import_picocolors37.default.dim("→")} ${inst.scope}: ${import_picocolors37.default.dim(inst.path)}`);
|
|
111629
|
+
}
|
|
111630
|
+
}
|
|
111631
|
+
console.log();
|
|
111632
|
+
console.log(import_picocolors37.default.dim(` ${activeClaudeSkills.length} active Claude Code skill installation(s)`));
|
|
111633
|
+
console.log();
|
|
111655
111634
|
}
|
|
111656
|
-
|
|
111657
|
-
|
|
111658
|
-
|
|
111659
|
-
|
|
111660
|
-
|
|
111635
|
+
if (installations.length > 0) {
|
|
111636
|
+
f2.step(import_picocolors37.default.bold("Registry-managed Agent Skills"));
|
|
111637
|
+
console.log();
|
|
111638
|
+
const bySkill = new Map;
|
|
111639
|
+
for (const inst of installations) {
|
|
111640
|
+
const list3 = bySkill.get(inst.skill) || [];
|
|
111641
|
+
list3.push(inst);
|
|
111642
|
+
bySkill.set(inst.skill, list3);
|
|
111643
|
+
}
|
|
111644
|
+
for (const [skill, installs] of bySkill) {
|
|
111645
|
+
console.log(` ${import_picocolors37.default.cyan(skill)}`);
|
|
111646
|
+
for (const inst of installs) {
|
|
111647
|
+
const scope = inst.global ? "global" : "project";
|
|
111648
|
+
console.log(` ${import_picocolors37.default.dim("→")} ${inst.agent} (${scope}): ${import_picocolors37.default.dim(inst.path)}`);
|
|
111649
|
+
}
|
|
111661
111650
|
}
|
|
111651
|
+
console.log();
|
|
111652
|
+
console.log(import_picocolors37.default.dim(` ${installations.length} registry-managed installation(s) across ${bySkill.size} skill(s)`));
|
|
111662
111653
|
}
|
|
111663
111654
|
console.log();
|
|
111664
|
-
console.log(import_picocolors37.default.dim(` ${installations.length} installation(s) across ${bySkill.size} skill(s)`));
|
|
111665
|
-
console.log();
|
|
111666
111655
|
return;
|
|
111667
111656
|
}
|
|
111668
111657
|
const sourcePath = getSkillSourcePath();
|
|
@@ -112161,7 +112150,7 @@ async function detectInstallations() {
|
|
|
112161
112150
|
|
|
112162
112151
|
// src/commands/uninstall/removal-handler.ts
|
|
112163
112152
|
import { readdirSync as readdirSync10, rmSync as rmSync5 } from "node:fs";
|
|
112164
|
-
import { basename as basename30, join as
|
|
112153
|
+
import { basename as basename30, join as join151, resolve as resolve53, sep as sep13 } from "node:path";
|
|
112165
112154
|
init_logger();
|
|
112166
112155
|
init_safe_prompts();
|
|
112167
112156
|
init_safe_spinner();
|
|
@@ -112170,7 +112159,7 @@ var import_fs_extra41 = __toESM(require_lib(), 1);
|
|
|
112170
112159
|
// src/commands/uninstall/analysis-handler.ts
|
|
112171
112160
|
init_metadata_migration();
|
|
112172
112161
|
import { readdirSync as readdirSync9, rmSync as rmSync4 } from "node:fs";
|
|
112173
|
-
import { dirname as dirname45, join as
|
|
112162
|
+
import { dirname as dirname45, join as join150 } from "node:path";
|
|
112174
112163
|
init_logger();
|
|
112175
112164
|
init_safe_prompts();
|
|
112176
112165
|
var import_fs_extra40 = __toESM(require_lib(), 1);
|
|
@@ -112230,7 +112219,7 @@ async function analyzeInstallation(installation, forceOverwrite, kit) {
|
|
|
112230
112219
|
const remainingFiles = metadata.kits?.[remainingKit]?.files || [];
|
|
112231
112220
|
for (const file of remainingFiles) {
|
|
112232
112221
|
const relativePath = normalizeTrackedPath(file.path);
|
|
112233
|
-
if (await import_fs_extra40.pathExists(
|
|
112222
|
+
if (await import_fs_extra40.pathExists(join150(installation.path, relativePath))) {
|
|
112234
112223
|
result.retainedManifestPaths.push(relativePath);
|
|
112235
112224
|
}
|
|
112236
112225
|
}
|
|
@@ -112238,7 +112227,7 @@ async function analyzeInstallation(installation, forceOverwrite, kit) {
|
|
|
112238
112227
|
const kitFiles = metadata.kits[kit].files || [];
|
|
112239
112228
|
for (const trackedFile of kitFiles) {
|
|
112240
112229
|
const relativePath = normalizeTrackedPath(trackedFile.path);
|
|
112241
|
-
const filePath =
|
|
112230
|
+
const filePath = join150(installation.path, relativePath);
|
|
112242
112231
|
if (preservedPaths.has(relativePath)) {
|
|
112243
112232
|
result.toPreserve.push({ path: relativePath, reason: "shared with other kit" });
|
|
112244
112233
|
continue;
|
|
@@ -112271,7 +112260,7 @@ async function analyzeInstallation(installation, forceOverwrite, kit) {
|
|
|
112271
112260
|
}
|
|
112272
112261
|
for (const trackedFile of allTrackedFiles) {
|
|
112273
112262
|
const relativePath = normalizeTrackedPath(trackedFile.path);
|
|
112274
|
-
const filePath =
|
|
112263
|
+
const filePath = join150(installation.path, relativePath);
|
|
112275
112264
|
const ownershipResult = await OwnershipChecker.checkOwnership(filePath, metadata, installation.path);
|
|
112276
112265
|
if (!ownershipResult.exists)
|
|
112277
112266
|
continue;
|
|
@@ -112414,7 +112403,7 @@ async function removeInstallations(installations, options2) {
|
|
|
112414
112403
|
let removedCount = 0;
|
|
112415
112404
|
let cleanedDirs = 0;
|
|
112416
112405
|
for (const item of analysis.toDelete) {
|
|
112417
|
-
const filePath =
|
|
112406
|
+
const filePath = join151(installation.path, item.path);
|
|
112418
112407
|
if (!await import_fs_extra41.pathExists(filePath))
|
|
112419
112408
|
continue;
|
|
112420
112409
|
if (!await isPathSafeToRemove(filePath, installation.path)) {
|
|
@@ -112823,7 +112812,7 @@ ${import_picocolors40.default.bold(import_picocolors40.default.cyan(result.kitCo
|
|
|
112823
112812
|
init_logger();
|
|
112824
112813
|
import { existsSync as existsSync75 } from "node:fs";
|
|
112825
112814
|
import { rm as rm17 } from "node:fs/promises";
|
|
112826
|
-
import { join as
|
|
112815
|
+
import { join as join158 } from "node:path";
|
|
112827
112816
|
var import_picocolors41 = __toESM(require_picocolors(), 1);
|
|
112828
112817
|
|
|
112829
112818
|
// src/commands/watch/phases/implementation-runner.ts
|
|
@@ -113342,7 +113331,7 @@ function spawnAndCollect3(command, args) {
|
|
|
113342
113331
|
|
|
113343
113332
|
// src/commands/watch/phases/issue-processor.ts
|
|
113344
113333
|
import { mkdir as mkdir39, writeFile as writeFile38 } from "node:fs/promises";
|
|
113345
|
-
import { join as
|
|
113334
|
+
import { join as join154 } from "node:path";
|
|
113346
113335
|
|
|
113347
113336
|
// src/commands/watch/phases/approval-detector.ts
|
|
113348
113337
|
init_logger();
|
|
@@ -113720,9 +113709,9 @@ async function checkAwaitingApproval(state, setup, options2, watchLog, projectDi
|
|
|
113720
113709
|
|
|
113721
113710
|
// src/commands/watch/phases/plan-dir-finder.ts
|
|
113722
113711
|
import { readdir as readdir44, stat as stat23 } from "node:fs/promises";
|
|
113723
|
-
import { join as
|
|
113712
|
+
import { join as join153 } from "node:path";
|
|
113724
113713
|
async function findRecentPlanDir(cwd2, issueNumber, watchLog) {
|
|
113725
|
-
const plansRoot =
|
|
113714
|
+
const plansRoot = join153(cwd2, "plans");
|
|
113726
113715
|
try {
|
|
113727
113716
|
const entries = await readdir44(plansRoot);
|
|
113728
113717
|
const tenMinAgo = Date.now() - 10 * 60 * 1000;
|
|
@@ -113731,14 +113720,14 @@ async function findRecentPlanDir(cwd2, issueNumber, watchLog) {
|
|
|
113731
113720
|
for (const entry of entries) {
|
|
113732
113721
|
if (entry === "watch" || entry === "reports" || entry === "visuals")
|
|
113733
113722
|
continue;
|
|
113734
|
-
const dirPath =
|
|
113723
|
+
const dirPath = join153(plansRoot, entry);
|
|
113735
113724
|
const dirStat = await stat23(dirPath);
|
|
113736
113725
|
if (!dirStat.isDirectory())
|
|
113737
113726
|
continue;
|
|
113738
113727
|
if (dirStat.mtimeMs < tenMinAgo)
|
|
113739
113728
|
continue;
|
|
113740
113729
|
try {
|
|
113741
|
-
await stat23(
|
|
113730
|
+
await stat23(join153(dirPath, "plan.md"));
|
|
113742
113731
|
} catch {
|
|
113743
113732
|
continue;
|
|
113744
113733
|
}
|
|
@@ -113969,13 +113958,13 @@ async function handlePlanGeneration(issue, state, config, setup, options2, watch
|
|
|
113969
113958
|
stats.plansCreated++;
|
|
113970
113959
|
const detectedPlanDir = await findRecentPlanDir(projectDir, issue.number, watchLog);
|
|
113971
113960
|
if (detectedPlanDir) {
|
|
113972
|
-
state.activeIssues[numStr].planPath =
|
|
113961
|
+
state.activeIssues[numStr].planPath = join154(detectedPlanDir, "plan.md");
|
|
113973
113962
|
watchLog.info(`Plan directory detected: ${detectedPlanDir}`);
|
|
113974
113963
|
} else {
|
|
113975
113964
|
try {
|
|
113976
|
-
const planDir =
|
|
113965
|
+
const planDir = join154(projectDir, "plans", "watch");
|
|
113977
113966
|
await mkdir39(planDir, { recursive: true });
|
|
113978
|
-
const planFilePath =
|
|
113967
|
+
const planFilePath = join154(planDir, `issue-${issue.number}-plan.md`);
|
|
113979
113968
|
await writeFile38(planFilePath, planResult.planText, "utf-8");
|
|
113980
113969
|
state.activeIssues[numStr].planPath = planFilePath;
|
|
113981
113970
|
watchLog.info(`Plan saved (fallback) to ${planFilePath}`);
|
|
@@ -114282,18 +114271,18 @@ init_logger();
|
|
|
114282
114271
|
import { spawnSync as spawnSync7 } from "node:child_process";
|
|
114283
114272
|
import { existsSync as existsSync72 } from "node:fs";
|
|
114284
114273
|
import { readdir as readdir45, stat as stat24 } from "node:fs/promises";
|
|
114285
|
-
import { join as
|
|
114274
|
+
import { join as join155 } from "node:path";
|
|
114286
114275
|
async function scanForRepos(parentDir) {
|
|
114287
114276
|
const repos = [];
|
|
114288
114277
|
const entries = await readdir45(parentDir);
|
|
114289
114278
|
for (const entry of entries) {
|
|
114290
114279
|
if (entry.startsWith("."))
|
|
114291
114280
|
continue;
|
|
114292
|
-
const fullPath =
|
|
114281
|
+
const fullPath = join155(parentDir, entry);
|
|
114293
114282
|
const entryStat = await stat24(fullPath);
|
|
114294
114283
|
if (!entryStat.isDirectory())
|
|
114295
114284
|
continue;
|
|
114296
|
-
const gitDir =
|
|
114285
|
+
const gitDir = join155(fullPath, ".git");
|
|
114297
114286
|
if (!existsSync72(gitDir))
|
|
114298
114287
|
continue;
|
|
114299
114288
|
const result = spawnSync7("gh", ["repo", "view", "--json", "owner,name"], {
|
|
@@ -114320,7 +114309,7 @@ init_logger();
|
|
|
114320
114309
|
import { spawnSync as spawnSync8 } from "node:child_process";
|
|
114321
114310
|
import { existsSync as existsSync73 } from "node:fs";
|
|
114322
114311
|
import { homedir as homedir52 } from "node:os";
|
|
114323
|
-
import { join as
|
|
114312
|
+
import { join as join156 } from "node:path";
|
|
114324
114313
|
async function validateSetup(cwd2) {
|
|
114325
114314
|
const workDir = cwd2 ?? process.cwd();
|
|
114326
114315
|
const ghVersion = spawnSync8("gh", ["--version"], { encoding: "utf-8", timeout: 1e4 });
|
|
@@ -114351,7 +114340,7 @@ Run this command from a directory with a GitHub remote.`);
|
|
|
114351
114340
|
} catch {
|
|
114352
114341
|
throw new Error(`Failed to parse repository info: ${ghRepo.stdout}`);
|
|
114353
114342
|
}
|
|
114354
|
-
const skillsPath =
|
|
114343
|
+
const skillsPath = join156(homedir52(), ".claude", "skills");
|
|
114355
114344
|
const skillsAvailable = existsSync73(skillsPath);
|
|
114356
114345
|
if (!skillsAvailable) {
|
|
114357
114346
|
logger.warning(`ClaudeKit Engineer skills not found at ${skillsPath}`);
|
|
@@ -114370,7 +114359,7 @@ init_path_resolver();
|
|
|
114370
114359
|
import { createWriteStream as createWriteStream3, statSync as statSync13 } from "node:fs";
|
|
114371
114360
|
import { existsSync as existsSync74 } from "node:fs";
|
|
114372
114361
|
import { mkdir as mkdir41, rename as rename13 } from "node:fs/promises";
|
|
114373
|
-
import { join as
|
|
114362
|
+
import { join as join157 } from "node:path";
|
|
114374
114363
|
|
|
114375
114364
|
class WatchLogger {
|
|
114376
114365
|
logStream = null;
|
|
@@ -114378,7 +114367,7 @@ class WatchLogger {
|
|
|
114378
114367
|
logPath = null;
|
|
114379
114368
|
maxBytes;
|
|
114380
114369
|
constructor(logDir, maxBytes = 0) {
|
|
114381
|
-
this.logDir = logDir ??
|
|
114370
|
+
this.logDir = logDir ?? join157(PathResolver.getClaudeKitDir(), "logs");
|
|
114382
114371
|
this.maxBytes = maxBytes;
|
|
114383
114372
|
}
|
|
114384
114373
|
async init() {
|
|
@@ -114387,7 +114376,7 @@ class WatchLogger {
|
|
|
114387
114376
|
await mkdir41(this.logDir, { recursive: true });
|
|
114388
114377
|
}
|
|
114389
114378
|
const dateStr = formatDate(new Date);
|
|
114390
|
-
this.logPath =
|
|
114379
|
+
this.logPath = join157(this.logDir, `watch-${dateStr}.log`);
|
|
114391
114380
|
this.logStream = createWriteStream3(this.logPath, { flags: "a", mode: 384 });
|
|
114392
114381
|
} catch (error) {
|
|
114393
114382
|
logger.warning(`Cannot create watch log file: ${error instanceof Error ? error.message : "Unknown"}`);
|
|
@@ -114569,7 +114558,7 @@ async function watchCommand(options2) {
|
|
|
114569
114558
|
}
|
|
114570
114559
|
async function discoverRepos(options2, watchLog) {
|
|
114571
114560
|
const cwd2 = process.cwd();
|
|
114572
|
-
const isGitRepo = existsSync75(
|
|
114561
|
+
const isGitRepo = existsSync75(join158(cwd2, ".git"));
|
|
114573
114562
|
if (options2.force) {
|
|
114574
114563
|
await forceRemoveLock(watchLog);
|
|
114575
114564
|
}
|
|
@@ -114827,7 +114816,7 @@ function registerCommands(cli) {
|
|
|
114827
114816
|
init_package();
|
|
114828
114817
|
init_config_version_checker();
|
|
114829
114818
|
import { existsSync as existsSync87, readFileSync as readFileSync22 } from "node:fs";
|
|
114830
|
-
import { join as
|
|
114819
|
+
import { join as join170 } from "node:path";
|
|
114831
114820
|
|
|
114832
114821
|
// src/domains/versioning/version-checker.ts
|
|
114833
114822
|
init_version_utils();
|
|
@@ -114842,14 +114831,14 @@ init_logger();
|
|
|
114842
114831
|
init_path_resolver();
|
|
114843
114832
|
import { existsSync as existsSync86 } from "node:fs";
|
|
114844
114833
|
import { mkdir as mkdir42, readFile as readFile69, writeFile as writeFile41 } from "node:fs/promises";
|
|
114845
|
-
import { join as
|
|
114834
|
+
import { join as join169 } from "node:path";
|
|
114846
114835
|
|
|
114847
114836
|
class VersionCacheManager {
|
|
114848
114837
|
static CACHE_FILENAME = "version-check.json";
|
|
114849
114838
|
static CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
114850
114839
|
static getCacheFile() {
|
|
114851
114840
|
const cacheDir = PathResolver.getCacheDir(false);
|
|
114852
|
-
return
|
|
114841
|
+
return join169(cacheDir, VersionCacheManager.CACHE_FILENAME);
|
|
114853
114842
|
}
|
|
114854
114843
|
static async load() {
|
|
114855
114844
|
const cacheFile = VersionCacheManager.getCacheFile();
|
|
@@ -115160,9 +115149,9 @@ async function displayVersion() {
|
|
|
115160
115149
|
let localInstalledKits = [];
|
|
115161
115150
|
let globalInstalledKits = [];
|
|
115162
115151
|
const globalKitDir = PathResolver.getGlobalKitDir();
|
|
115163
|
-
const globalMetadataPath =
|
|
115152
|
+
const globalMetadataPath = join170(globalKitDir, "metadata.json");
|
|
115164
115153
|
const prefix = PathResolver.getPathPrefix(false);
|
|
115165
|
-
const localMetadataPath = prefix ?
|
|
115154
|
+
const localMetadataPath = prefix ? join170(process.cwd(), prefix, "metadata.json") : join170(process.cwd(), "metadata.json");
|
|
115166
115155
|
const isLocalSameAsGlobal = localMetadataPath === globalMetadataPath;
|
|
115167
115156
|
if (!isLocalSameAsGlobal && existsSync87(localMetadataPath)) {
|
|
115168
115157
|
try {
|