@chiendt/ack-cli 1.3.0-dev.7 → 1.3.0-dev.8
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 +90 -90
- package/package.json +1 -1
package/cli-manifest.json
CHANGED
package/dist/index.js
CHANGED
|
@@ -63756,7 +63756,7 @@ var package_default;
|
|
|
63756
63756
|
var init_package = __esm(() => {
|
|
63757
63757
|
package_default = {
|
|
63758
63758
|
name: "@chiendt/ack-cli",
|
|
63759
|
-
version: "1.3.0-dev.
|
|
63759
|
+
version: "1.3.0-dev.8",
|
|
63760
63760
|
description: "ACK CLI - tool for bootstrapping and updating ACK kits (Claude Code agent kits)",
|
|
63761
63761
|
type: "module",
|
|
63762
63762
|
repository: {
|
|
@@ -91728,7 +91728,7 @@ init_logger();
|
|
|
91728
91728
|
|
|
91729
91729
|
// src/commands/fqc-qa/setup-pipeline.ts
|
|
91730
91730
|
init_logger();
|
|
91731
|
-
import { join as join93
|
|
91731
|
+
import { join as join93 } from "node:path";
|
|
91732
91732
|
|
|
91733
91733
|
// src/commands/fqc-qa/env-template-writer.ts
|
|
91734
91734
|
import { mkdirSync as mkdirSync4 } from "node:fs";
|
|
@@ -91835,19 +91835,42 @@ function runNpm(args, cwd2) {
|
|
|
91835
91835
|
});
|
|
91836
91836
|
}
|
|
91837
91837
|
|
|
91838
|
+
// src/commands/fqc-qa/mcp/mcp-spawn-helper.ts
|
|
91839
|
+
import { spawn as spawn6 } from "node:child_process";
|
|
91840
|
+
var MCP_PACKAGE_NAME = "@chiendt1108/fqc-mcp-servers";
|
|
91841
|
+
var MCP_PACKAGE_DIST_TAG = "latest";
|
|
91842
|
+
function spawnConnector(opts) {
|
|
91843
|
+
const env3 = { ...process.env, ...opts.env ?? {} };
|
|
91844
|
+
if (opts.useLocal) {
|
|
91845
|
+
return spawn6("fqc-mcp", [opts.connector, ...opts.args ?? []], {
|
|
91846
|
+
env: env3,
|
|
91847
|
+
stdio: ["pipe", "pipe", "inherit"]
|
|
91848
|
+
});
|
|
91849
|
+
}
|
|
91850
|
+
return spawn6("npx", [
|
|
91851
|
+
"-y",
|
|
91852
|
+
"-p",
|
|
91853
|
+
`${MCP_PACKAGE_NAME}@${MCP_PACKAGE_DIST_TAG}`,
|
|
91854
|
+
"fqc-mcp",
|
|
91855
|
+
opts.connector,
|
|
91856
|
+
...opts.args ?? []
|
|
91857
|
+
], { env: env3, stdio: ["pipe", "pipe", "inherit"] });
|
|
91858
|
+
}
|
|
91859
|
+
|
|
91838
91860
|
// src/commands/fqc-qa/mcp-entry-templates.ts
|
|
91839
|
-
var
|
|
91840
|
-
function mcpEntryTemplate(skillName
|
|
91861
|
+
var FQC_QA_PREFIX = "fqc-qa-";
|
|
91862
|
+
function mcpEntryTemplate(skillName) {
|
|
91841
91863
|
const env3 = ENV_FOR.get(skillName);
|
|
91842
91864
|
if (!env3)
|
|
91843
91865
|
return null;
|
|
91844
|
-
const
|
|
91845
|
-
|
|
91846
|
-
command: "
|
|
91847
|
-
args: [
|
|
91848
|
-
cwd: `${relPosix}/${skillName}/scripts`,
|
|
91849
|
-
env: env3
|
|
91866
|
+
const connector = skillName.slice(FQC_QA_PREFIX.length);
|
|
91867
|
+
const entry = {
|
|
91868
|
+
command: "npx",
|
|
91869
|
+
args: ["-y", "-p", `${MCP_PACKAGE_NAME}@${MCP_PACKAGE_DIST_TAG}`, "fqc-mcp", connector]
|
|
91850
91870
|
};
|
|
91871
|
+
if (Object.keys(env3).length > 0)
|
|
91872
|
+
entry.env = env3;
|
|
91873
|
+
return entry;
|
|
91851
91874
|
}
|
|
91852
91875
|
var ENV_FOR = new Map([
|
|
91853
91876
|
["fqc-qa-jira", { JIRA_BASE_URL: "${JIRA_BASE_URL}", JIRA_PAT: "${JIRA_PAT}" }],
|
|
@@ -91978,14 +92001,13 @@ async function runSetup(skills, ctx) {
|
|
|
91978
92001
|
results.push(r2);
|
|
91979
92002
|
}
|
|
91980
92003
|
const mcpSkills = skills.filter((s) => s.kind === "mcp" && !results.find((r2) => r2.skill === s)?.error);
|
|
91981
|
-
const skillsRelToProject = relative17(ctx.projectRoot, ctx.skillsRoot) || ".";
|
|
91982
92004
|
let mcpBackupPath = null;
|
|
91983
92005
|
if (mcpSkills.length > 0 && !ctx.dryRun) {
|
|
91984
92006
|
try {
|
|
91985
92007
|
const mutation = await withLockedMcpJson(ctx.mcpJsonPath, (parsed) => {
|
|
91986
92008
|
parsed.mcpServers ??= {};
|
|
91987
92009
|
for (const s of mcpSkills) {
|
|
91988
|
-
const entry = mcpEntryTemplate(s.name
|
|
92010
|
+
const entry = mcpEntryTemplate(s.name);
|
|
91989
92011
|
if (!entry) {
|
|
91990
92012
|
const r3 = results.find((x3) => x3.skill === s);
|
|
91991
92013
|
if (r3)
|
|
@@ -92031,7 +92053,7 @@ function defaultMcpJsonPath(projectRoot) {
|
|
|
92031
92053
|
var import_gray_matter12 = __toESM(require_gray_matter(), 1);
|
|
92032
92054
|
import { existsSync as existsSync63, readFileSync as readFileSync18, readdirSync as readdirSync7, statSync as statSync11 } from "node:fs";
|
|
92033
92055
|
import { basename as basename26, join as join94, resolve as resolve36 } from "node:path";
|
|
92034
|
-
var
|
|
92056
|
+
var FQC_QA_PREFIX2 = "fqc-qa-";
|
|
92035
92057
|
var VALID_KINDS = new Set(["mcp", "lib", "gate"]);
|
|
92036
92058
|
function deriveDirName(skillDir) {
|
|
92037
92059
|
return basename26(skillDir.replace(/\\/g, "/"));
|
|
@@ -92068,14 +92090,14 @@ function resolveSkillsRoot(opts = {}) {
|
|
|
92068
92090
|
}
|
|
92069
92091
|
function hasFqcQaChild(dir) {
|
|
92070
92092
|
try {
|
|
92071
|
-
return readdirSync7(dir).some((n) => n.startsWith(
|
|
92093
|
+
return readdirSync7(dir).some((n) => n.startsWith(FQC_QA_PREFIX2));
|
|
92072
92094
|
} catch {
|
|
92073
92095
|
return false;
|
|
92074
92096
|
}
|
|
92075
92097
|
}
|
|
92076
92098
|
function discoverSkills2(opts = {}) {
|
|
92077
92099
|
const root = resolveSkillsRoot(opts);
|
|
92078
|
-
const entries = readdirSync7(root).filter((n) => n.startsWith(
|
|
92100
|
+
const entries = readdirSync7(root).filter((n) => n.startsWith(FQC_QA_PREFIX2)).map((n) => join94(root, n)).filter((p) => {
|
|
92079
92101
|
try {
|
|
92080
92102
|
return statSync11(p).isDirectory();
|
|
92081
92103
|
} catch {
|
|
@@ -92095,7 +92117,7 @@ function discoverSkills2(opts = {}) {
|
|
|
92095
92117
|
}
|
|
92096
92118
|
const dirName = deriveDirName(skillDir);
|
|
92097
92119
|
const registeredName = String(fm.name ?? dirName);
|
|
92098
|
-
const shortName = dirName.replace(
|
|
92120
|
+
const shortName = dirName.replace(FQC_QA_PREFIX2, "");
|
|
92099
92121
|
const scriptsDir = join94(skillDir, "scripts");
|
|
92100
92122
|
const hasScripts2 = existsSync63(join94(scriptsDir, "package.json"));
|
|
92101
92123
|
const hasLockfile = existsSync63(join94(scriptsDir, "package-lock.json"));
|
|
@@ -92595,11 +92617,11 @@ var FQC_QA_CONNECTOR_NAMES = [
|
|
|
92595
92617
|
"akawork"
|
|
92596
92618
|
];
|
|
92597
92619
|
var FQC_QA_KEY_RE = /^fqc-qa-([a-z]+)$/i;
|
|
92598
|
-
var
|
|
92620
|
+
var MCP_PACKAGE_NAME2 = "@chiendt1108/fqc-mcp-servers";
|
|
92599
92621
|
function buildEntry(connector, distTag, existingEnv) {
|
|
92600
92622
|
const entry = {
|
|
92601
92623
|
command: "npx",
|
|
92602
|
-
args: ["-y", "-p", `${
|
|
92624
|
+
args: ["-y", "-p", `${MCP_PACKAGE_NAME2}@${distTag}`, "fqc-mcp", connector]
|
|
92603
92625
|
};
|
|
92604
92626
|
if (existingEnv && Object.keys(existingEnv).length > 0) {
|
|
92605
92627
|
entry.env = existingEnv;
|
|
@@ -92638,35 +92660,13 @@ function isAlreadyMigrated(input) {
|
|
|
92638
92660
|
if (!m2)
|
|
92639
92661
|
continue;
|
|
92640
92662
|
const cmd = entry.command;
|
|
92641
|
-
if (cmd !== "npx" || !entry.args?.some((a3) => typeof a3 === "string" && a3.startsWith(
|
|
92663
|
+
if (cmd !== "npx" || !entry.args?.some((a3) => typeof a3 === "string" && a3.startsWith(MCP_PACKAGE_NAME2))) {
|
|
92642
92664
|
return false;
|
|
92643
92665
|
}
|
|
92644
92666
|
}
|
|
92645
92667
|
return true;
|
|
92646
92668
|
}
|
|
92647
92669
|
|
|
92648
|
-
// src/commands/fqc-qa/mcp/mcp-spawn-helper.ts
|
|
92649
|
-
import { spawn as spawn6 } from "node:child_process";
|
|
92650
|
-
var MCP_PACKAGE_NAME2 = "@chiendt1108/fqc-mcp-servers";
|
|
92651
|
-
var MCP_PACKAGE_DIST_TAG = "latest";
|
|
92652
|
-
function spawnConnector(opts) {
|
|
92653
|
-
const env3 = { ...process.env, ...opts.env ?? {} };
|
|
92654
|
-
if (opts.useLocal) {
|
|
92655
|
-
return spawn6("fqc-mcp", [opts.connector, ...opts.args ?? []], {
|
|
92656
|
-
env: env3,
|
|
92657
|
-
stdio: ["pipe", "pipe", "inherit"]
|
|
92658
|
-
});
|
|
92659
|
-
}
|
|
92660
|
-
return spawn6("npx", [
|
|
92661
|
-
"-y",
|
|
92662
|
-
"-p",
|
|
92663
|
-
`${MCP_PACKAGE_NAME2}@${MCP_PACKAGE_DIST_TAG}`,
|
|
92664
|
-
"fqc-mcp",
|
|
92665
|
-
opts.connector,
|
|
92666
|
-
...opts.args ?? []
|
|
92667
|
-
], { env: env3, stdio: ["pipe", "pipe", "inherit"] });
|
|
92668
|
-
}
|
|
92669
|
-
|
|
92670
92670
|
// src/commands/fqc-qa/fqc-qa-migrate-mcp-command.ts
|
|
92671
92671
|
async function fqcQaMigrateMcpCommand(opts) {
|
|
92672
92672
|
const projectRoot = process.cwd();
|
|
@@ -92852,7 +92852,7 @@ async function fqcQaMcpGatewayCommand(opts) {
|
|
|
92852
92852
|
const args = ["gateway", "--port", port];
|
|
92853
92853
|
if (opts.only)
|
|
92854
92854
|
args.push("--only", opts.only);
|
|
92855
|
-
const child = opts.useLocal ? spawn7("fqc-mcp", args, { stdio: "inherit" }) : spawn7("npx", ["-y", "-p", `${
|
|
92855
|
+
const child = opts.useLocal ? spawn7("fqc-mcp", args, { stdio: "inherit" }) : spawn7("npx", ["-y", "-p", `${MCP_PACKAGE_NAME}@${MCP_PACKAGE_DIST_TAG}`, "fqc-mcp", ...args], {
|
|
92856
92856
|
stdio: "inherit"
|
|
92857
92857
|
});
|
|
92858
92858
|
const stop = () => {
|
|
@@ -92893,7 +92893,7 @@ async function fqcQaMcpServeCommand(opts) {
|
|
|
92893
92893
|
process.exitCode = 1;
|
|
92894
92894
|
return;
|
|
92895
92895
|
}
|
|
92896
|
-
const child = opts.useLocal ? spawn8("fqc-mcp", [connector], { stdio: "inherit" }) : spawn8("npx", ["-y", "-p", `${
|
|
92896
|
+
const child = opts.useLocal ? spawn8("fqc-mcp", [connector], { stdio: "inherit" }) : spawn8("npx", ["-y", "-p", `${MCP_PACKAGE_NAME}@${MCP_PACKAGE_DIST_TAG}`, "fqc-mcp", connector], {
|
|
92897
92897
|
stdio: "inherit"
|
|
92898
92898
|
});
|
|
92899
92899
|
await new Promise((resolve37, reject) => {
|
|
@@ -92917,13 +92917,13 @@ init_config_version_checker();
|
|
|
92917
92917
|
|
|
92918
92918
|
// src/domains/sync/sync-engine.ts
|
|
92919
92919
|
import { lstat as lstat6, readFile as readFile49, readlink as readlink2, realpath as realpath7, stat as stat14 } from "node:fs/promises";
|
|
92920
|
-
import { isAbsolute as isAbsolute10, join as join98, normalize as normalize8, relative as
|
|
92920
|
+
import { isAbsolute as isAbsolute10, join as join98, normalize as normalize8, relative as relative18 } from "node:path";
|
|
92921
92921
|
|
|
92922
92922
|
// src/services/file-operations/ownership-checker.ts
|
|
92923
92923
|
init_metadata_migration();
|
|
92924
92924
|
import { createHash as createHash7 } from "node:crypto";
|
|
92925
92925
|
import { readFile as readFile48, stat as stat13 } from "node:fs/promises";
|
|
92926
|
-
import { relative as
|
|
92926
|
+
import { relative as relative17 } from "node:path";
|
|
92927
92927
|
|
|
92928
92928
|
// src/shared/concurrent-file-ops.ts
|
|
92929
92929
|
init_p_limit();
|
|
@@ -92953,7 +92953,7 @@ class OwnershipChecker {
|
|
|
92953
92953
|
if (!metadata || allTrackedFiles.length === 0) {
|
|
92954
92954
|
return { path: filePath, ownership: "user", exists: true };
|
|
92955
92955
|
}
|
|
92956
|
-
const relativePath =
|
|
92956
|
+
const relativePath = relative17(claudeDir3, filePath).replace(/\\/g, "/");
|
|
92957
92957
|
const tracked = allTrackedFiles.find((f3) => f3.path.replace(/\\/g, "/") === relativePath);
|
|
92958
92958
|
if (!tracked) {
|
|
92959
92959
|
return { path: filePath, ownership: "user", exists: true };
|
|
@@ -93765,7 +93765,7 @@ async function validateSymlinkChain(path9, basePath, maxDepth = MAX_SYMLINK_DEPT
|
|
|
93765
93765
|
const target = await readlink2(current);
|
|
93766
93766
|
const resolvedTarget = isAbsolute10(target) ? target : join98(current, "..", target);
|
|
93767
93767
|
const normalizedTarget = normalize8(resolvedTarget);
|
|
93768
|
-
const rel =
|
|
93768
|
+
const rel = relative18(basePath, normalizedTarget);
|
|
93769
93769
|
if (rel.startsWith("..") || isAbsolute10(rel)) {
|
|
93770
93770
|
throw new Error(`Symlink chain escapes base directory at depth ${depth}: ${path9}`);
|
|
93771
93771
|
}
|
|
@@ -93800,7 +93800,7 @@ async function validateSyncPath(basePath, filePath) {
|
|
|
93800
93800
|
throw new Error(`Path traversal not allowed: ${filePath}`);
|
|
93801
93801
|
}
|
|
93802
93802
|
const fullPath = join98(basePath, normalized);
|
|
93803
|
-
const rel =
|
|
93803
|
+
const rel = relative18(basePath, fullPath);
|
|
93804
93804
|
if (rel.startsWith("..") || isAbsolute10(rel)) {
|
|
93805
93805
|
throw new Error(`Path escapes base directory: ${filePath}`);
|
|
93806
93806
|
}
|
|
@@ -93808,7 +93808,7 @@ async function validateSyncPath(basePath, filePath) {
|
|
|
93808
93808
|
try {
|
|
93809
93809
|
const resolvedBase = await realpath7(basePath);
|
|
93810
93810
|
const resolvedFull = await realpath7(fullPath);
|
|
93811
|
-
const resolvedRel =
|
|
93811
|
+
const resolvedRel = relative18(resolvedBase, resolvedFull);
|
|
93812
93812
|
if (resolvedRel.startsWith("..") || isAbsolute10(resolvedRel)) {
|
|
93813
93813
|
throw new Error(`Symlink escapes base directory: ${filePath}`);
|
|
93814
93814
|
}
|
|
@@ -93818,7 +93818,7 @@ async function validateSyncPath(basePath, filePath) {
|
|
|
93818
93818
|
try {
|
|
93819
93819
|
const resolvedBase = await realpath7(basePath);
|
|
93820
93820
|
const resolvedParent = await realpath7(parentPath);
|
|
93821
|
-
const resolvedRel =
|
|
93821
|
+
const resolvedRel = relative18(resolvedBase, resolvedParent);
|
|
93822
93822
|
if (resolvedRel.startsWith("..") || isAbsolute10(resolvedRel)) {
|
|
93823
93823
|
throw new Error(`Parent symlink escapes base directory: ${filePath}`);
|
|
93824
93824
|
}
|
|
@@ -95347,7 +95347,7 @@ init_types3();
|
|
|
95347
95347
|
// src/domains/installation/utils/path-security.ts
|
|
95348
95348
|
init_types3();
|
|
95349
95349
|
import { lstatSync as lstatSync2, realpathSync as realpathSync4 } from "node:fs";
|
|
95350
|
-
import { relative as
|
|
95350
|
+
import { relative as relative19, resolve as resolve39 } from "node:path";
|
|
95351
95351
|
var MAX_EXTRACTION_SIZE = 500 * 1024 * 1024;
|
|
95352
95352
|
function isPathSafe(basePath, targetPath) {
|
|
95353
95353
|
const resolvedBase = resolve39(basePath);
|
|
@@ -95361,7 +95361,7 @@ function isPathSafe(basePath, targetPath) {
|
|
|
95361
95361
|
}
|
|
95362
95362
|
} catch {}
|
|
95363
95363
|
const resolvedTarget = resolve39(targetPath);
|
|
95364
|
-
const relativePath =
|
|
95364
|
+
const relativePath = relative19(resolvedBase, resolvedTarget);
|
|
95365
95365
|
return !relativePath.startsWith("..") && !relativePath.startsWith("/") && resolvedTarget.startsWith(resolvedBase);
|
|
95366
95366
|
}
|
|
95367
95367
|
|
|
@@ -98832,7 +98832,7 @@ function decodeFilePath(path9) {
|
|
|
98832
98832
|
init_logger();
|
|
98833
98833
|
init_types3();
|
|
98834
98834
|
import { copyFile as copyFile4, lstat as lstat7, mkdir as mkdir27, readdir as readdir24, realpath as realpath8, rm as rm12 } from "node:fs/promises";
|
|
98835
|
-
import { join as join109, relative as
|
|
98835
|
+
import { join as join109, relative as relative20 } from "node:path";
|
|
98836
98836
|
async function withRetry(fn2, retries = 3) {
|
|
98837
98837
|
for (let i = 0;i < retries; i++) {
|
|
98838
98838
|
try {
|
|
@@ -98892,7 +98892,7 @@ async function moveDirectoryContents(sourceDir, destDir, shouldExclude, sizeTrac
|
|
|
98892
98892
|
for (const entry of entries) {
|
|
98893
98893
|
const sourcePath = join109(sourceDir, entry);
|
|
98894
98894
|
const destPath = join109(destDir, entry);
|
|
98895
|
-
const relativePath =
|
|
98895
|
+
const relativePath = relative20(sourceDir, sourcePath);
|
|
98896
98896
|
if (!isPathSafe(destDir, destPath)) {
|
|
98897
98897
|
logger.warning(`Skipping unsafe path: ${relativePath}`);
|
|
98898
98898
|
throw new ExtractionError(`Path traversal attempt detected: ${relativePath}`);
|
|
@@ -98920,7 +98920,7 @@ async function copyDirectory(sourceDir, destDir, shouldExclude, sizeTracker) {
|
|
|
98920
98920
|
for (const entry of entries) {
|
|
98921
98921
|
const sourcePath = join109(sourceDir, entry);
|
|
98922
98922
|
const destPath = join109(destDir, entry);
|
|
98923
|
-
const relativePath =
|
|
98923
|
+
const relativePath = relative20(sourceDir, sourcePath);
|
|
98924
98924
|
if (!isPathSafe(destDir, destPath)) {
|
|
98925
98925
|
logger.warning(`Skipping unsafe path: ${relativePath}`);
|
|
98926
98926
|
throw new ExtractionError(`Path traversal attempt detected: ${relativePath}`);
|
|
@@ -99713,7 +99713,7 @@ import { join as join129 } from "node:path";
|
|
|
99713
99713
|
|
|
99714
99714
|
// src/domains/installation/deletion-handler.ts
|
|
99715
99715
|
import { existsSync as existsSync71, lstatSync as lstatSync3, readdirSync as readdirSync8, rmSync as rmSync2, rmdirSync, unlinkSync as unlinkSync5 } from "node:fs";
|
|
99716
|
-
import { dirname as dirname36, join as join115, relative as
|
|
99716
|
+
import { dirname as dirname36, join as join115, relative as relative21, resolve as resolve41, sep as sep11 } from "node:path";
|
|
99717
99717
|
|
|
99718
99718
|
// src/services/file-operations/manifest/manifest-reader.ts
|
|
99719
99719
|
init_metadata_migration();
|
|
@@ -99909,7 +99909,7 @@ function collectFilesRecursively(dir, baseDir) {
|
|
|
99909
99909
|
const entries = readdirSync8(dir, { withFileTypes: true });
|
|
99910
99910
|
for (const entry of entries) {
|
|
99911
99911
|
const fullPath = join115(dir, entry.name);
|
|
99912
|
-
const relativePath =
|
|
99912
|
+
const relativePath = relative21(baseDir, fullPath);
|
|
99913
99913
|
if (entry.isDirectory()) {
|
|
99914
99914
|
results.push(...collectFilesRecursively(fullPath, baseDir));
|
|
99915
99915
|
} else {
|
|
@@ -100071,7 +100071,7 @@ init_logger();
|
|
|
100071
100071
|
init_types3();
|
|
100072
100072
|
var import_fs_extra15 = __toESM(require_lib(), 1);
|
|
100073
100073
|
var import_ignore3 = __toESM(require_ignore(), 1);
|
|
100074
|
-
import { dirname as dirname39, join as join119, relative as
|
|
100074
|
+
import { dirname as dirname39, join as join119, relative as relative23 } from "node:path";
|
|
100075
100075
|
|
|
100076
100076
|
// src/domains/installation/selective-merger.ts
|
|
100077
100077
|
import { stat as stat18 } from "node:fs/promises";
|
|
@@ -100249,7 +100249,7 @@ class SelectiveMerger {
|
|
|
100249
100249
|
init_logger();
|
|
100250
100250
|
var import_fs_extra13 = __toESM(require_lib(), 1);
|
|
100251
100251
|
var import_ignore2 = __toESM(require_ignore(), 1);
|
|
100252
|
-
import { relative as
|
|
100252
|
+
import { relative as relative22 } from "node:path";
|
|
100253
100253
|
import { join as join116 } from "node:path";
|
|
100254
100254
|
|
|
100255
100255
|
// node_modules/balanced-match/dist/esm/index.js
|
|
@@ -101952,7 +101952,7 @@ class FileScanner {
|
|
|
101952
101952
|
const entries = await import_fs_extra13.readdir(dir, { encoding: "utf8" });
|
|
101953
101953
|
for (const entry of entries) {
|
|
101954
101954
|
const fullPath = join116(dir, entry);
|
|
101955
|
-
const relativePath =
|
|
101955
|
+
const relativePath = relative22(baseDir, fullPath);
|
|
101956
101956
|
const normalizedRelativePath = relativePath.replace(/\\/g, "/");
|
|
101957
101957
|
const stats = await import_fs_extra13.lstat(fullPath);
|
|
101958
101958
|
if (stats.isSymbolicLink()) {
|
|
@@ -102654,7 +102654,7 @@ class CopyExecutor {
|
|
|
102654
102654
|
const conflicts = [];
|
|
102655
102655
|
const files = await this.fileScanner.getFiles(sourceDir, sourceDir);
|
|
102656
102656
|
for (const file of files) {
|
|
102657
|
-
const relativePath =
|
|
102657
|
+
const relativePath = relative23(sourceDir, file);
|
|
102658
102658
|
const normalizedRelativePath = relativePath.replace(/\\/g, "/");
|
|
102659
102659
|
const destPath = join119(destDir, relativePath);
|
|
102660
102660
|
if (await import_fs_extra15.pathExists(destPath)) {
|
|
@@ -102676,7 +102676,7 @@ class CopyExecutor {
|
|
|
102676
102676
|
let copiedCount = 0;
|
|
102677
102677
|
let skippedCount = 0;
|
|
102678
102678
|
for (const file of files) {
|
|
102679
|
-
const relativePath =
|
|
102679
|
+
const relativePath = relative23(sourceDir, file);
|
|
102680
102680
|
const normalizedRelativePath = relativePath.replace(/\\/g, "/");
|
|
102681
102681
|
const destPath = join119(destDir, relativePath);
|
|
102682
102682
|
if (this.fileScanner.shouldNeverCopy(normalizedRelativePath)) {
|
|
@@ -102851,7 +102851,7 @@ class FileMerger {
|
|
|
102851
102851
|
|
|
102852
102852
|
// src/domains/migration/legacy-migration.ts
|
|
102853
102853
|
import { readdir as readdir28, stat as stat19 } from "node:fs/promises";
|
|
102854
|
-
import { join as join123, relative as
|
|
102854
|
+
import { join as join123, relative as relative24 } from "node:path";
|
|
102855
102855
|
// src/services/file-operations/manifest/manifest-tracker.ts
|
|
102856
102856
|
import { join as join122 } from "node:path";
|
|
102857
102857
|
|
|
@@ -103304,7 +103304,7 @@ class LegacyMigration {
|
|
|
103304
103304
|
static async classifyFiles(claudeDir3, manifest) {
|
|
103305
103305
|
const files = await LegacyMigration.scanFiles(claudeDir3);
|
|
103306
103306
|
const relevantFiles = files.filter((file) => {
|
|
103307
|
-
const relativePath =
|
|
103307
|
+
const relativePath = relative24(claudeDir3, file);
|
|
103308
103308
|
return !hasSkippedDirectorySegment(relativePath);
|
|
103309
103309
|
});
|
|
103310
103310
|
const skippedRuntimeArtifacts = files.length - relevantFiles.length;
|
|
@@ -103319,7 +103319,7 @@ class LegacyMigration {
|
|
|
103319
103319
|
};
|
|
103320
103320
|
const filesInManifest = [];
|
|
103321
103321
|
for (const file of relevantFiles) {
|
|
103322
|
-
const relativePath =
|
|
103322
|
+
const relativePath = relative24(claudeDir3, file).replace(/\\/g, "/");
|
|
103323
103323
|
const manifestEntry = ReleaseManifestLoader.findFile(manifest, relativePath);
|
|
103324
103324
|
if (!manifestEntry) {
|
|
103325
103325
|
preview.userCreated.push(relativePath);
|
|
@@ -103515,7 +103515,7 @@ function buildConflictSummary(fileConflicts, hookConflicts, mcpConflicts) {
|
|
|
103515
103515
|
init_logger();
|
|
103516
103516
|
init_skip_directories();
|
|
103517
103517
|
var import_fs_extra19 = __toESM(require_lib(), 1);
|
|
103518
|
-
import { join as join124, relative as
|
|
103518
|
+
import { join as join124, relative as relative25, resolve as resolve43 } from "node:path";
|
|
103519
103519
|
|
|
103520
103520
|
class FileScanner2 {
|
|
103521
103521
|
static async getFiles(dirPath, relativeTo) {
|
|
@@ -103554,7 +103554,7 @@ class FileScanner2 {
|
|
|
103554
103554
|
const subFiles = await FileScanner2.getFiles(fullPath, basePath);
|
|
103555
103555
|
files.push(...subFiles);
|
|
103556
103556
|
} else if (stats.isFile()) {
|
|
103557
|
-
const relativePath =
|
|
103557
|
+
const relativePath = relative25(basePath, fullPath);
|
|
103558
103558
|
files.push(FileScanner2.toPosixPath(relativePath));
|
|
103559
103559
|
}
|
|
103560
103560
|
}
|
|
@@ -104220,7 +104220,7 @@ init_types3();
|
|
|
104220
104220
|
var import_fs_extra24 = __toESM(require_lib(), 1);
|
|
104221
104221
|
import { createHash as createHash8 } from "node:crypto";
|
|
104222
104222
|
import { readFile as readFile59, readdir as readdir34, writeFile as writeFile32 } from "node:fs/promises";
|
|
104223
|
-
import { join as join130, relative as
|
|
104223
|
+
import { join as join130, relative as relative26 } from "node:path";
|
|
104224
104224
|
|
|
104225
104225
|
class SkillsManifestManager {
|
|
104226
104226
|
static MANIFEST_FILENAME = ".skills-manifest.json";
|
|
@@ -104324,7 +104324,7 @@ class SkillsManifestManager {
|
|
|
104324
104324
|
const files = await SkillsManifestManager.getAllFiles(dirPath);
|
|
104325
104325
|
files.sort();
|
|
104326
104326
|
for (const file of files) {
|
|
104327
|
-
const relativePath =
|
|
104327
|
+
const relativePath = relative26(dirPath, file);
|
|
104328
104328
|
const content = await readFile59(file);
|
|
104329
104329
|
hash.update(relativePath);
|
|
104330
104330
|
hash.update(content);
|
|
@@ -105059,14 +105059,14 @@ init_logger();
|
|
|
105059
105059
|
|
|
105060
105060
|
// src/domains/skills/customization/comparison-engine.ts
|
|
105061
105061
|
var import_fs_extra29 = __toESM(require_lib(), 1);
|
|
105062
|
-
import { relative as
|
|
105062
|
+
import { relative as relative28 } from "node:path";
|
|
105063
105063
|
|
|
105064
105064
|
// src/domains/skills/customization/hash-calculator.ts
|
|
105065
105065
|
init_skip_directories();
|
|
105066
105066
|
import { createHash as createHash9 } from "node:crypto";
|
|
105067
105067
|
import { createReadStream as createReadStream2 } from "node:fs";
|
|
105068
105068
|
import { readFile as readFile60, readdir as readdir38 } from "node:fs/promises";
|
|
105069
|
-
import { join as join134, relative as
|
|
105069
|
+
import { join as join134, relative as relative27 } from "node:path";
|
|
105070
105070
|
async function getAllFiles(dirPath) {
|
|
105071
105071
|
const files = [];
|
|
105072
105072
|
const entries = await readdir38(dirPath, { withFileTypes: true });
|
|
@@ -105103,7 +105103,7 @@ async function hashDirectory(dirPath) {
|
|
|
105103
105103
|
const files = await getAllFiles(dirPath);
|
|
105104
105104
|
files.sort();
|
|
105105
105105
|
for (const file of files) {
|
|
105106
|
-
const relativePath =
|
|
105106
|
+
const relativePath = relative27(dirPath, file);
|
|
105107
105107
|
const content = await readFile60(file);
|
|
105108
105108
|
hash.update(relativePath);
|
|
105109
105109
|
hash.update(content);
|
|
@@ -105137,8 +105137,8 @@ async function compareDirectories(dir1, dir2) {
|
|
|
105137
105137
|
if (files1.length !== files2.length) {
|
|
105138
105138
|
return true;
|
|
105139
105139
|
}
|
|
105140
|
-
const relFiles1 = files1.map((f4) =>
|
|
105141
|
-
const relFiles2 = files2.map((f4) =>
|
|
105140
|
+
const relFiles1 = files1.map((f4) => relative28(dir1, f4)).sort();
|
|
105141
|
+
const relFiles2 = files2.map((f4) => relative28(dir2, f4)).sort();
|
|
105142
105142
|
if (JSON.stringify(relFiles1) !== JSON.stringify(relFiles2)) {
|
|
105143
105143
|
return true;
|
|
105144
105144
|
}
|
|
@@ -105156,12 +105156,12 @@ async function detectFileChanges(currentSkillPath, baselineSkillPath) {
|
|
|
105156
105156
|
const currentFiles = await getAllFiles(currentSkillPath);
|
|
105157
105157
|
const baselineFiles = await import_fs_extra29.pathExists(baselineSkillPath) ? await getAllFiles(baselineSkillPath) : [];
|
|
105158
105158
|
const currentFileMap = new Map(await Promise.all(currentFiles.map(async (f4) => {
|
|
105159
|
-
const relPath =
|
|
105159
|
+
const relPath = relative28(currentSkillPath, f4);
|
|
105160
105160
|
const hash = await hashFile(f4);
|
|
105161
105161
|
return [relPath, hash];
|
|
105162
105162
|
})));
|
|
105163
105163
|
const baselineFileMap = new Map(await Promise.all(baselineFiles.map(async (f4) => {
|
|
105164
|
-
const relPath =
|
|
105164
|
+
const relPath = relative28(baselineSkillPath, f4);
|
|
105165
105165
|
const hash = await hashFile(f4);
|
|
105166
105166
|
return [relPath, hash];
|
|
105167
105167
|
})));
|
|
@@ -107071,7 +107071,7 @@ init_logger();
|
|
|
107071
107071
|
init_types3();
|
|
107072
107072
|
var import_fs_extra38 = __toESM(require_lib(), 1);
|
|
107073
107073
|
import { rename as rename14, rm as rm19 } from "node:fs/promises";
|
|
107074
|
-
import { join as join145, relative as
|
|
107074
|
+
import { join as join145, relative as relative29 } from "node:path";
|
|
107075
107075
|
async function collectDirsToRename(extractDir, folders) {
|
|
107076
107076
|
const dirsToRename = [];
|
|
107077
107077
|
if (folders.docs !== DEFAULT_FOLDERS.docs) {
|
|
@@ -107125,11 +107125,11 @@ async function renameFolders(dirsToRename, extractDir, options2) {
|
|
|
107125
107125
|
let foldersRenamed = 0;
|
|
107126
107126
|
for (const { from, to: to2 } of dirsToRename) {
|
|
107127
107127
|
if (options2.dryRun) {
|
|
107128
|
-
logger.info(`[dry-run] Would rename: ${
|
|
107128
|
+
logger.info(`[dry-run] Would rename: ${relative29(extractDir, from)} -> ${relative29(extractDir, to2)}`);
|
|
107129
107129
|
} else {
|
|
107130
107130
|
try {
|
|
107131
107131
|
await moveAcrossDevices(from, to2);
|
|
107132
|
-
logger.debug(`Renamed: ${
|
|
107132
|
+
logger.debug(`Renamed: ${relative29(extractDir, from)} -> ${relative29(extractDir, to2)}`);
|
|
107133
107133
|
foldersRenamed++;
|
|
107134
107134
|
} catch (error) {
|
|
107135
107135
|
logger.warning(`Failed to rename ${from}: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
@@ -107143,7 +107143,7 @@ async function renameFolders(dirsToRename, extractDir, options2) {
|
|
|
107143
107143
|
init_logger();
|
|
107144
107144
|
init_types3();
|
|
107145
107145
|
import { readFile as readFile63, readdir as readdir43, writeFile as writeFile36 } from "node:fs/promises";
|
|
107146
|
-
import { join as join146, relative as
|
|
107146
|
+
import { join as join146, relative as relative30 } from "node:path";
|
|
107147
107147
|
var TRANSFORMABLE_FILE_PATTERNS = [
|
|
107148
107148
|
".md",
|
|
107149
107149
|
".txt",
|
|
@@ -107223,10 +107223,10 @@ async function transformFileContents(dir, compiledReplacements, options2) {
|
|
|
107223
107223
|
}
|
|
107224
107224
|
if (changeCount > 0) {
|
|
107225
107225
|
if (options2.dryRun) {
|
|
107226
|
-
logger.debug(`[dry-run] Would update ${
|
|
107226
|
+
logger.debug(`[dry-run] Would update ${relative30(dir, fullPath)}: ${changeCount} replacement(s)`);
|
|
107227
107227
|
} else {
|
|
107228
107228
|
await writeFile36(fullPath, newContent, "utf-8");
|
|
107229
|
-
logger.debug(`Updated ${
|
|
107229
|
+
logger.debug(`Updated ${relative30(dir, fullPath)}: ${changeCount} replacement(s)`);
|
|
107230
107230
|
}
|
|
107231
107231
|
filesChanged++;
|
|
107232
107232
|
replacementsCount += changeCount;
|
|
@@ -110622,7 +110622,7 @@ init_logger();
|
|
|
110622
110622
|
init_output_manager();
|
|
110623
110623
|
var import_picocolors37 = __toESM(require_picocolors(), 1);
|
|
110624
110624
|
import { existsSync as existsSync76, statSync as statSync12 } from "node:fs";
|
|
110625
|
-
import { basename as basename31, dirname as dirname46, join as join156, relative as
|
|
110625
|
+
import { basename as basename31, dirname as dirname46, join as join156, relative as relative31, resolve as resolve53 } from "node:path";
|
|
110626
110626
|
|
|
110627
110627
|
// src/commands/plan/plan-dependencies.ts
|
|
110628
110628
|
init_config();
|
|
@@ -110717,7 +110717,7 @@ async function handleParse(target, options2) {
|
|
|
110717
110717
|
return;
|
|
110718
110718
|
}
|
|
110719
110719
|
if (isJsonOutput(options2)) {
|
|
110720
|
-
console.log(JSON.stringify({ file:
|
|
110720
|
+
console.log(JSON.stringify({ file: relative31(process.cwd(), planFile), frontmatter, phases }, null, 2));
|
|
110721
110721
|
return;
|
|
110722
110722
|
}
|
|
110723
110723
|
const title = typeof frontmatter.title === "string" ? frontmatter.title : basename31(dirname46(planFile));
|
|
@@ -110975,7 +110975,7 @@ init_plan_parser();
|
|
|
110975
110975
|
init_plans_registry();
|
|
110976
110976
|
init_output_manager();
|
|
110977
110977
|
var import_picocolors38 = __toESM(require_picocolors(), 1);
|
|
110978
|
-
import { basename as basename32, dirname as dirname47, relative as
|
|
110978
|
+
import { basename as basename32, dirname as dirname47, relative as relative32, resolve as resolve54 } from "node:path";
|
|
110979
110979
|
async function handleCreate(target, options2) {
|
|
110980
110980
|
if (!options2.title) {
|
|
110981
110981
|
output.error("[X] --title is required for create");
|
|
@@ -111041,8 +111041,8 @@ async function handleCreate(target, options2) {
|
|
|
111041
111041
|
if (isJsonOutput(options2)) {
|
|
111042
111042
|
const cwd2 = process.cwd();
|
|
111043
111043
|
console.log(JSON.stringify({
|
|
111044
|
-
planFile:
|
|
111045
|
-
phaseFiles: result.phaseFiles.map((f4) =>
|
|
111044
|
+
planFile: relative32(cwd2, result.planFile),
|
|
111045
|
+
phaseFiles: result.phaseFiles.map((f4) => relative32(cwd2, f4))
|
|
111046
111046
|
}, null, 2));
|
|
111047
111047
|
return;
|
|
111048
111048
|
}
|
|
@@ -111098,7 +111098,7 @@ async function handleCheck(target, options2) {
|
|
|
111098
111098
|
console.log(JSON.stringify({
|
|
111099
111099
|
phaseId: target,
|
|
111100
111100
|
status: newStatus,
|
|
111101
|
-
planFile:
|
|
111101
|
+
planFile: relative32(process.cwd(), planFile)
|
|
111102
111102
|
}));
|
|
111103
111103
|
return;
|
|
111104
111104
|
}
|
|
@@ -111142,7 +111142,7 @@ async function handleUncheck(target, options2) {
|
|
|
111142
111142
|
console.log(JSON.stringify({
|
|
111143
111143
|
phaseId: target,
|
|
111144
111144
|
status: "pending",
|
|
111145
|
-
planFile:
|
|
111145
|
+
planFile: relative32(process.cwd(), planFile)
|
|
111146
111146
|
}));
|
|
111147
111147
|
return;
|
|
111148
111148
|
}
|
|
@@ -111174,7 +111174,7 @@ async function handleAddPhase(target, options2) {
|
|
|
111174
111174
|
if (isJsonOutput(options2)) {
|
|
111175
111175
|
console.log(JSON.stringify({
|
|
111176
111176
|
phaseId: result.phaseId,
|
|
111177
|
-
phaseFile:
|
|
111177
|
+
phaseFile: relative32(process.cwd(), result.phaseFile)
|
|
111178
111178
|
}));
|
|
111179
111179
|
return;
|
|
111180
111180
|
}
|