@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.3.0-dev.7",
3
- "generatedAt": "2026-06-10T17:08:36.648Z",
2
+ "version": "1.3.0-dev.8",
3
+ "generatedAt": "2026-06-11T07:42:03.004Z",
4
4
  "commands": {
5
5
  "agents": {
6
6
  "name": "agents",
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.7",
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, relative as relative17 } from "node:path";
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 TSX_ARGS = ["--import", "tsx", "src/server.ts"];
91840
- function mcpEntryTemplate(skillName, skillsRelToProject) {
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 relPosix = skillsRelToProject.replace(/\\/g, "/");
91845
- return {
91846
- command: "node",
91847
- args: [...TSX_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, skillsRelToProject);
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 FQC_QA_PREFIX = "fqc-qa-";
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(FQC_QA_PREFIX));
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(FQC_QA_PREFIX)).map((n) => join94(root, n)).filter((p) => {
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(FQC_QA_PREFIX, "");
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 MCP_PACKAGE_NAME = "@chiendt1108/fqc-mcp-servers";
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", `${MCP_PACKAGE_NAME}@${distTag}`, "fqc-mcp", connector]
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(MCP_PACKAGE_NAME))) {
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", `${MCP_PACKAGE_NAME2}@${MCP_PACKAGE_DIST_TAG}`, "fqc-mcp", ...args], {
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", `${MCP_PACKAGE_NAME2}@${MCP_PACKAGE_DIST_TAG}`, "fqc-mcp", connector], {
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 relative19 } from "node:path";
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 relative18 } from "node:path";
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 = relative18(claudeDir3, filePath).replace(/\\/g, "/");
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 = relative19(basePath, normalizedTarget);
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 = relative19(basePath, fullPath);
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 = relative19(resolvedBase, resolvedFull);
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 = relative19(resolvedBase, resolvedParent);
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 relative20, resolve as resolve39 } from "node:path";
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 = relative20(resolvedBase, resolvedTarget);
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 relative21 } from "node:path";
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 = relative21(sourceDir, sourcePath);
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 = relative21(sourceDir, sourcePath);
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 relative22, resolve as resolve41, sep as sep11 } from "node:path";
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 = relative22(baseDir, fullPath);
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 relative24 } from "node:path";
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 relative23 } from "node:path";
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 = relative23(baseDir, fullPath);
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 = relative24(sourceDir, file);
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 = relative24(sourceDir, file);
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 relative25 } from "node:path";
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 = relative25(claudeDir3, file);
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 = relative25(claudeDir3, file).replace(/\\/g, "/");
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 relative26, resolve as resolve43 } from "node:path";
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 = relative26(basePath, fullPath);
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 relative27 } from "node:path";
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 = relative27(dirPath, file);
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 relative29 } from "node:path";
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 relative28 } from "node:path";
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 = relative28(dirPath, file);
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) => relative29(dir1, f4)).sort();
105141
- const relFiles2 = files2.map((f4) => relative29(dir2, f4)).sort();
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 = relative29(currentSkillPath, f4);
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 = relative29(baselineSkillPath, f4);
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 relative30 } from "node:path";
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: ${relative30(extractDir, from)} -> ${relative30(extractDir, to2)}`);
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: ${relative30(extractDir, from)} -> ${relative30(extractDir, to2)}`);
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 relative31 } from "node:path";
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 ${relative31(dir, fullPath)}: ${changeCount} replacement(s)`);
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 ${relative31(dir, fullPath)}: ${changeCount} replacement(s)`);
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 relative32, resolve as resolve53 } from "node:path";
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: relative32(process.cwd(), planFile), frontmatter, phases }, null, 2));
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 relative33, resolve as resolve54 } from "node:path";
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: relative33(cwd2, result.planFile),
111045
- phaseFiles: result.phaseFiles.map((f4) => relative33(cwd2, 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: relative33(process.cwd(), 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: relative33(process.cwd(), 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: relative33(process.cwd(), result.phaseFile)
111177
+ phaseFile: relative32(process.cwd(), result.phaseFile)
111178
111178
  }));
111179
111179
  return;
111180
111180
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chiendt/ack-cli",
3
- "version": "1.3.0-dev.7",
3
+ "version": "1.3.0-dev.8",
4
4
  "description": "ACK CLI - tool for bootstrapping and updating ACK kits (Claude Code agent kits)",
5
5
  "type": "module",
6
6
  "repository": {