@chiendt/ack-cli 1.0.1 → 1.1.0

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.0.1",
3
- "generatedAt": "2026-05-17T09:48:49.771Z",
2
+ "version": "1.1.0",
3
+ "generatedAt": "2026-05-22T07:51:09.132Z",
4
4
  "commands": {
5
5
  "agents": {
6
6
  "name": "agents",
@@ -1810,6 +1810,92 @@
1810
1810
  }
1811
1811
  ]
1812
1812
  }
1813
+ ],
1814
+ "subcommands": [
1815
+ {
1816
+ "name": "install",
1817
+ "description": "Run skills dependency install script (install.sh / install.ps1)",
1818
+ "usage": "ack setup install [options]",
1819
+ "examples": [
1820
+ {
1821
+ "command": "ack setup install",
1822
+ "description": "Run install script in ./.claude/skills"
1823
+ },
1824
+ {
1825
+ "command": "ack setup install --global",
1826
+ "description": "Run install script in ~/.claude/skills"
1827
+ },
1828
+ {
1829
+ "command": "ack setup install --dir /custom/path --with-sudo",
1830
+ "description": "Custom dir with sudo for system packages"
1831
+ }
1832
+ ],
1833
+ "optionGroups": [
1834
+ {
1835
+ "title": "Options",
1836
+ "options": [
1837
+ {
1838
+ "flags": "--global",
1839
+ "description": "Use ~/.claude/skills"
1840
+ },
1841
+ {
1842
+ "flags": "--dir <dir>",
1843
+ "description": "Custom skills directory"
1844
+ },
1845
+ {
1846
+ "flags": "--with-sudo",
1847
+ "description": "Allow sudo for system packages (Linux)"
1848
+ },
1849
+ {
1850
+ "flags": "-y, --yes",
1851
+ "description": "Skip confirmation prompts"
1852
+ }
1853
+ ]
1854
+ }
1855
+ ]
1856
+ }
1857
+ ]
1858
+ },
1859
+ "setup install": {
1860
+ "name": "setup install",
1861
+ "description": "Run skills dependency install script (install.sh / install.ps1)",
1862
+ "usage": "ack setup install [options]",
1863
+ "examples": [
1864
+ {
1865
+ "command": "ack setup install",
1866
+ "description": "Run install script in ./.claude/skills"
1867
+ },
1868
+ {
1869
+ "command": "ack setup install --global",
1870
+ "description": "Run install script in ~/.claude/skills"
1871
+ },
1872
+ {
1873
+ "command": "ack setup install --dir /custom/path --with-sudo",
1874
+ "description": "Custom dir with sudo for system packages"
1875
+ }
1876
+ ],
1877
+ "optionGroups": [
1878
+ {
1879
+ "title": "Options",
1880
+ "options": [
1881
+ {
1882
+ "flags": "--global",
1883
+ "description": "Use ~/.claude/skills"
1884
+ },
1885
+ {
1886
+ "flags": "--dir <dir>",
1887
+ "description": "Custom skills directory"
1888
+ },
1889
+ {
1890
+ "flags": "--with-sudo",
1891
+ "description": "Allow sudo for system packages (Linux)"
1892
+ },
1893
+ {
1894
+ "flags": "-y, --yes",
1895
+ "description": "Skip confirmation prompts"
1896
+ }
1897
+ ]
1898
+ }
1813
1899
  ]
1814
1900
  },
1815
1901
  "skills": {
package/dist/index.js CHANGED
@@ -63692,7 +63692,7 @@ var package_default;
63692
63692
  var init_package = __esm(() => {
63693
63693
  package_default = {
63694
63694
  name: "@chiendt/ack-cli",
63695
- version: "1.0.1",
63695
+ version: "1.1.0",
63696
63696
  description: "ACK CLI - tool for bootstrapping and updating ACK kits (Claude Code agent kits)",
63697
63697
  type: "module",
63698
63698
  repository: {
@@ -67614,7 +67614,8 @@ var init_config_version_checker = __esm(() => {
67614
67614
  CACHE_TTL_MS = parseCacheTtl();
67615
67615
  KIT_REPOS = {
67616
67616
  engineer: { owner: "ack", repo: "ack-engineer" },
67617
- marketing: { owner: "ack", repo: "claudekit-marketing" }
67617
+ marketing: { owner: "ack", repo: "claudekit-marketing" },
67618
+ "fqc-qa": { owner: "chiendt1108", repo: "ack-fqc-qa" }
67618
67619
  };
67619
67620
  });
67620
67621
 
@@ -76591,9 +76592,9 @@ async function listActiveWorktrees(projectDir) {
76591
76592
  for (const line of output2.split(`
76592
76593
  `)) {
76593
76594
  if (line.startsWith("worktree ")) {
76594
- const path9 = line.slice(9).replace(/\\/g, "/");
76595
- if (path9.startsWith(worktreePrefix)) {
76596
- const num = Number.parseInt(path9.slice(worktreePrefix.length), 10);
76595
+ const path10 = line.slice(9).replace(/\\/g, "/");
76596
+ if (path10.startsWith(worktreePrefix)) {
76597
+ const num = Number.parseInt(path10.slice(worktreePrefix.length), 10);
76597
76598
  if (!Number.isNaN(num))
76598
76599
  issueNumbers.push(num);
76599
76600
  }
@@ -81038,9 +81039,45 @@ var init_projects_command_help = __esm(() => {
81038
81039
  };
81039
81040
  });
81040
81041
 
81042
+ // src/domains/help/commands/setup-install-command-help.ts
81043
+ var setupInstallCommandHelp;
81044
+ var init_setup_install_command_help = __esm(() => {
81045
+ setupInstallCommandHelp = {
81046
+ name: "setup install",
81047
+ description: "Run skills dependency install script (install.sh / install.ps1)",
81048
+ usage: "ack setup install [options]",
81049
+ examples: [
81050
+ {
81051
+ command: "ack setup install",
81052
+ description: "Run install script in ./.claude/skills"
81053
+ },
81054
+ {
81055
+ command: "ack setup install --global",
81056
+ description: "Run install script in ~/.claude/skills"
81057
+ },
81058
+ {
81059
+ command: "ack setup install --dir /custom/path --with-sudo",
81060
+ description: "Custom dir with sudo for system packages"
81061
+ }
81062
+ ],
81063
+ optionGroups: [
81064
+ {
81065
+ title: "Options",
81066
+ options: [
81067
+ { flags: "--global", description: "Use ~/.claude/skills" },
81068
+ { flags: "--dir <dir>", description: "Custom skills directory" },
81069
+ { flags: "--with-sudo", description: "Allow sudo for system packages (Linux)" },
81070
+ { flags: "-y, --yes", description: "Skip confirmation prompts" }
81071
+ ]
81072
+ }
81073
+ ]
81074
+ };
81075
+ });
81076
+
81041
81077
  // src/domains/help/commands/setup-command-help.ts
81042
81078
  var setupCommandHelp;
81043
81079
  var init_setup_command_help = __esm(() => {
81080
+ init_setup_install_command_help();
81044
81081
  setupCommandHelp = {
81045
81082
  name: "setup",
81046
81083
  description: "Run guided setup for provider API keys, preferred image provider, and optional packages",
@@ -81078,6 +81115,15 @@ var init_setup_command_help = __esm(() => {
81078
81115
  }
81079
81116
  ]
81080
81117
  }
81118
+ ],
81119
+ subcommands: [
81120
+ {
81121
+ name: "install",
81122
+ description: setupInstallCommandHelp.description,
81123
+ usage: setupInstallCommandHelp.usage,
81124
+ examples: setupInstallCommandHelp.examples,
81125
+ optionGroups: setupInstallCommandHelp.optionGroups
81126
+ }
81081
81127
  ]
81082
81128
  };
81083
81129
  });
@@ -81465,6 +81511,7 @@ var init_commands2 = __esm(() => {
81465
81511
  init_plan_command_help();
81466
81512
  init_projects_command_help();
81467
81513
  init_setup_command_help();
81514
+ init_setup_install_command_help();
81468
81515
  init_skills_command_help();
81469
81516
  init_uninstall_command_help();
81470
81517
  init_update_command_help();
@@ -81495,6 +81542,7 @@ var init_help_commands = __esm(() => {
81495
81542
  plan: planCommandHelp,
81496
81543
  projects: projectsCommandHelp,
81497
81544
  setup: setupCommandHelp,
81545
+ "setup install": setupInstallCommandHelp,
81498
81546
  skills: skillsCommandHelp,
81499
81547
  uninstall: uninstallCommandHelp,
81500
81548
  update: updateCommandHelp,
@@ -81671,12 +81719,12 @@ var BANNER_LINES;
81671
81719
  var init_help_banner = __esm(() => {
81672
81720
  init_help_colors();
81673
81721
  BANNER_LINES = [
81674
- " ██████╗██╗ ██╗",
81675
- "██╔════╝██║ ██╔╝",
81676
- "██║ █████╔╝ ",
81677
- "██║ ██╔═██╗ ",
81678
- "╚██████╗██║ ██╗",
81679
- " ╚═════╝╚═╝ ╚═╝"
81722
+ " █████╗ ██████╗██╗ ██╗",
81723
+ "██╔══██╗██╔════╝██║ ██╔╝",
81724
+ "███████║██║ █████╔╝ ",
81725
+ "██╔══██║██║ ██╔═██╗ ",
81726
+ "██║ ██║╚██████╗██║ ██╗",
81727
+ "╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝"
81680
81728
  ];
81681
81729
  });
81682
81730
 
@@ -81837,7 +81885,7 @@ function renderGlobalHelp(commands, options2 = DEFAULT_HELP_OPTIONS) {
81837
81885
  lines.push(` ${padEnd(theme.flag("GITHUB_TOKEN"), 20)}${theme.description("Environment variable for Classic PAT")}`);
81838
81886
  lines.push(` ${padEnd(theme.flag("gh auth login"), 20)}${theme.description("GitHub CLI authentication (default)")}`);
81839
81887
  lines.push("");
81840
- lines.push(theme.muted("Run 'ck <command> --help' for details. Start with 'ack skills --help' and 'ack config --help'."));
81888
+ lines.push(theme.muted("Run 'ack <command> --help' for details. Start with 'ack skills --help' and 'ack config --help'."));
81841
81889
  return lines.filter((s3) => s3 !== undefined).join(`
81842
81890
  `);
81843
81891
  }
@@ -100222,7 +100270,7 @@ init_types3();
100222
100270
  var import_fs_extra17 = __toESM(require_lib(), 1);
100223
100271
  async function writeManifest(claudeDir3, kitName, version, scope, kitType, trackedFiles, userConfigFiles) {
100224
100272
  const metadataPath = join111(claudeDir3, "metadata.json");
100225
- const kit = kitType || (/\bmarketing\b/i.test(kitName) ? "marketing" : "engineer");
100273
+ const kit = kitType || (/\bfqc[\s_-]?qa\b/i.test(kitName) ? "fqc-qa" : /\bmarketing\b/i.test(kitName) ? "marketing" : "engineer");
100226
100274
  await import_fs_extra17.ensureFile(metadataPath);
100227
100275
  let release = null;
100228
100276
  try {
@@ -109033,6 +109081,22 @@ async function setupCommand(options2) {
109033
109081
  f2.success(`Installed packages: ${ctx.packagesInstalled.join(", ")}`);
109034
109082
  }
109035
109083
  }
109084
+ // src/commands/setup/setup-install-command.ts
109085
+ init_package_installer();
109086
+ init_logger();
109087
+ init_path_resolver();
109088
+ import path9 from "node:path";
109089
+ async function setupInstallCommand(options2) {
109090
+ if (options2.dir && options2.global) {
109091
+ logger.error("--dir and --global are mutually exclusive. Use one or the other.");
109092
+ process.exit(1);
109093
+ }
109094
+ const resolvedDir = options2.dir ? path9.resolve(options2.dir) : PathResolver.buildSkillsPath(options2.global ? PathResolver.getGlobalKitDir() : process.cwd(), !!options2.global);
109095
+ await handleSkillsInstallation(resolvedDir, {
109096
+ skipConfirm: !!options2.yes,
109097
+ withSudo: !!options2.withSudo
109098
+ });
109099
+ }
109036
109100
  // src/commands/skills/skills-command.ts
109037
109101
  init_dist2();
109038
109102
  init_skill_catalog_generator();
@@ -112425,6 +112489,9 @@ function registerCommands(cli) {
112425
112489
  cli.command("setup", "Configure API keys and optional packages").option("--global", "Configure globally (~/.claude/)").option("--skip-packages", "Skip optional package installation").option("--dir <dir>", "Target directory (default: current directory)").action(async (options2) => {
112426
112490
  await setupCommand(options2);
112427
112491
  });
112492
+ cli.command("setup install", "Run skills dependency install script").option("--global", "Use ~/.claude/skills").option("--dir <dir>", "Custom skills directory").option("--with-sudo", "Allow sudo for system packages (Linux)").option("-y, --yes", "Skip confirmation prompts").action(async (options2) => {
112493
+ await setupInstallCommand(options2);
112494
+ });
112428
112495
  cli.command("skills", "Install AckKit skills to other coding agents").option("-n, --name <skill>", "Skill name to install/uninstall").option("-a, --agent <agents...>", "Target agents (claude-code, cursor, codex, etc.)").option("-g, --global", "Install/uninstall globally instead of project-level").option("-l, --list", "List available skills").option("--installed", "Show installed skills (use with --list)").option("--all", "Install to all supported agents").option("-u, --uninstall", "Uninstall skill(s)").option("--force", "Force uninstall even if not in registry").option("--sync", "Sync registry with filesystem (remove orphans)").option("-y, --yes", "Skip confirmation prompts").option("--catalog", "Show skill catalog stats").option("--regenerate", "Force regenerate catalog (use with --catalog)").option("--search <query>", "BM25 full-text search over skill catalog").option("--json", "Output search results as JSON (use with --search)").option("--limit <n>", "Max search results, default 10 (use with --search)").option("--validate", "Validate SKILL.md frontmatter fields").action(async (options2) => {
112429
112496
  if (options2.agent && !Array.isArray(options2.agent)) {
112430
112497
  options2.agent = [options2.agent];
@@ -112449,8 +112516,8 @@ function registerCommands(cli) {
112449
112516
  cli.command("plan [action] [target]", "Plan management: parse, validate, status, kanban, create, check, uncheck, add-phase").option("--json", "Output in JSON format").option("--strict", "Strict validation mode").option("--port <port>", "Port for kanban dashboard").option("--no-open", "Don't auto-open browser").option("--dev", "Development mode for dashboard").option("-g, --global", "Use global plans scope (~/.claude/plans or configured global root)").option("--title <title>", "Plan title (for create)").option("--phases <phases>", "Comma-separated phase names (for create)").option("--dir <dir>", "Plan directory (for create)").option("--priority <priority>", "Priority: P1, P2, P3 (for create)").option("--issue <issue>", "GitHub issue number (for create)").option("--after <after>", "Insert after phase ID (for add-phase)").option("--start", "Mark as in-progress instead of completed (for check)").option("--source <source>", "Creation source: skill | cli | dashboard (for create)").option("--session-id <id>", "Claude session ID for tracking (for create)").action(async (action, target, options2) => {
112450
112517
  await planCommand(action, target, options2);
112451
112518
  });
112452
- cli.command("api [action] [service] [path]", "Interact with AckKit API and proxy services").option("--method <method>", "HTTP method for proxy requests (default: GET)").option("--body <json>", "Request body as JSON string (proxy only)").option("--query <json>", "Query params as JSON string (proxy only)").option("--key <key>", "API key to use (setup only)").option("--force", "Force re-setup even if key exists (setup only)").option("--json", "Output raw JSON instead of formatted display").option("--locale <locale>", "Locale for vidcap summary/caption (default: en)").option("--max-results <n>", "Max results for vidcap search").option("--second <s>", "Timestamp in seconds for vidcap screenshot").option("--order <order>", "Sort order for vidcap comments (time/relevance)").option("--format <fmt>", "Summary format for reviewweb (bullet/paragraph)").option("--max-length <n>", "Max summary length for reviewweb").option("--instructions <text>", "Extraction instructions for reviewweb extract").option("--template <json>", "JSON template for reviewweb extract").option("--type <type>", "Link type filter for reviewweb links (web/image/file/all)").option("--country <code>", "Country code for reviewweb SEO commands").action(async (action, service, path9, options2) => {
112453
- await apiCommand(action, service, path9, options2);
112519
+ cli.command("api [action] [service] [path]", "Interact with AckKit API and proxy services").option("--method <method>", "HTTP method for proxy requests (default: GET)").option("--body <json>", "Request body as JSON string (proxy only)").option("--query <json>", "Query params as JSON string (proxy only)").option("--key <key>", "API key to use (setup only)").option("--force", "Force re-setup even if key exists (setup only)").option("--json", "Output raw JSON instead of formatted display").option("--locale <locale>", "Locale for vidcap summary/caption (default: en)").option("--max-results <n>", "Max results for vidcap search").option("--second <s>", "Timestamp in seconds for vidcap screenshot").option("--order <order>", "Sort order for vidcap comments (time/relevance)").option("--format <fmt>", "Summary format for reviewweb (bullet/paragraph)").option("--max-length <n>", "Max summary length for reviewweb").option("--instructions <text>", "Extraction instructions for reviewweb extract").option("--template <json>", "JSON template for reviewweb extract").option("--type <type>", "Link type filter for reviewweb links (web/image/file/all)").option("--country <code>", "Country code for reviewweb SEO commands").action(async (action, service, path10, options2) => {
112520
+ await apiCommand(action, service, path10, options2);
112454
112521
  });
112455
112522
  cli.command("migrate", "Migrate agents, commands, skills, config, rules, and hooks to other providers").option("-a, --agent <agents...>", "Target providers (cursor, codex, droid, opencode, etc.)").option("-g, --global", "Install globally instead of project-level").option("--all", "Migrate to all supported providers").option("-y, --yes", "Skip confirmation prompts").option("--only-agents", "Migrate agents only").option("--only-commands", "Migrate commands only").option("--only-skills", "Migrate skills only").option("--config", "Migrate CLAUDE.md config only").option("--rules", "Migrate .claude/rules/ only").option("--hooks", "Migrate .claude/hooks/ only").option("--skip-agents", "Skip agents migration").option("--skip-commands", "Skip commands migration").option("--skip-skills", "Skip skills migration (preserve symlinks/custom layouts)").option("--skip-config", "Skip config migration").option("--skip-rules", "Skip rules migration").option("--skip-hooks", "Skip hooks migration").option("--source <path>", "Custom CLAUDE.md source path (config only, not agents/commands/skills/hooks)").option("--dry-run", "Preview migration targets without writing files").option("-f, --force", "Force reinstall deleted/edited items").option("--install", "Opt-in install picker mode (select specific items to install)").option("--reconcile", "Force reconcile mode (current default when registry is valid)").option("--reinstall-empty-dirs", "Reinstall all items when their type directory is empty (default: true)").option("--respect-deletions", "Preserve deletion even when type directory is empty (disables reinstall-empty-dirs)").action(async (options2) => {
112456
112523
  if (options2.agent && !Array.isArray(options2.agent)) {
@@ -112550,10 +112617,13 @@ class VersionCacheManager {
112550
112617
 
112551
112618
  // src/domains/versioning/checking/kit-version-checker.ts
112552
112619
  init_version_utils();
112553
- async function fetchLatestRelease(currentVersion) {
112620
+ async function fetchLatestRelease(currentVersion, kitType) {
112554
112621
  try {
112555
112622
  const githubClient = new GitHubClient;
112556
- const kit = AVAILABLE_KITS.engineer;
112623
+ const kit = AVAILABLE_KITS[kitType];
112624
+ if (!kit) {
112625
+ throw new Error(`Unsupported kit type: ${kitType}`);
112626
+ }
112557
112627
  const timeoutPromise = new Promise((_4, reject) => setTimeout(() => reject(new Error("Timeout")), 5000));
112558
112628
  const releasePromise = githubClient.getLatestRelease(kit);
112559
112629
  const release = await Promise.race([releasePromise, timeoutPromise]);
@@ -112574,7 +112644,7 @@ async function fetchLatestRelease(currentVersion) {
112574
112644
  }
112575
112645
 
112576
112646
  class VersionChecker {
112577
- static async check(currentVersion) {
112647
+ static async check(currentVersion, kitType) {
112578
112648
  if (isUpdateCheckDisabled()) {
112579
112649
  logger.debug("Update check disabled by environment");
112580
112650
  return null;
@@ -112590,7 +112660,7 @@ class VersionChecker {
112590
112660
  };
112591
112661
  }
112592
112662
  logger.debug("Cache expired or invalid, fetching latest release");
112593
- const result = await fetchLatestRelease(currentVersion);
112663
+ const result = await fetchLatestRelease(currentVersion, kitType);
112594
112664
  if (result) {
112595
112665
  await VersionCacheManager.save({
112596
112666
  lastCheck: Date.now(),
@@ -112718,8 +112788,8 @@ function displayCliNotification(result) {
112718
112788
  }
112719
112789
  // src/domains/versioning/version-checker.ts
112720
112790
  class VersionChecker2 {
112721
- static async check(currentVersion) {
112722
- return VersionChecker.check(currentVersion);
112791
+ static async check(currentVersion, kitType) {
112792
+ return VersionChecker.check(currentVersion, kitType);
112723
112793
  }
112724
112794
  static displayNotification(result, options2 = {}) {
112725
112795
  displayKitNotification(result, options2);
@@ -112758,7 +112828,11 @@ function getInstalledKitTypes(metadata) {
112758
112828
  return Object.keys(metadata.kits);
112759
112829
  }
112760
112830
  function inferLegacyKitType(metadata) {
112761
- if (/\bmarketing\b/i.test(metadata.name ?? "")) {
112831
+ const name = metadata.name ?? "";
112832
+ if (/\bfqc[\s_-]?qa\b/i.test(name)) {
112833
+ return "fqc-qa";
112834
+ }
112835
+ if (/\bmarketing\b/i.test(name)) {
112762
112836
  return "marketing";
112763
112837
  }
112764
112838
  return "engineer";
@@ -112911,18 +112985,18 @@ class Logger2 {
112911
112985
  isVerbose() {
112912
112986
  return this.verboseEnabled;
112913
112987
  }
112914
- setLogFile(path9) {
112988
+ setLogFile(path10) {
112915
112989
  if (this.logFileStream) {
112916
112990
  this.logFileStream.end();
112917
112991
  this.logFileStream = undefined;
112918
112992
  }
112919
- if (path9) {
112920
- this.logFileStream = createWriteStream5(path9, {
112993
+ if (path10) {
112994
+ this.logFileStream = createWriteStream5(path10, {
112921
112995
  flags: "a",
112922
112996
  mode: 384
112923
112997
  });
112924
112998
  this.registerExitHandler();
112925
- this.verbose(`Logging to file: ${path9}`);
112999
+ this.verbose(`Logging to file: ${path10}`);
112926
113000
  }
112927
113001
  }
112928
113002
  close() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chiendt/ack-cli",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "ACK CLI - tool for bootstrapping and updating ACK kits (Claude Code agent kits)",
5
5
  "type": "module",
6
6
  "repository": {