cc-codeconductor 1.4.0 → 1.4.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/dist/index.js CHANGED
@@ -72,7 +72,7 @@ var package_default;
72
72
  var init_package = __esm(() => {
73
73
  package_default = {
74
74
  name: "cc-codeconductor",
75
- version: "1.4.0",
75
+ version: "1.4.1",
76
76
  description: "A multi-agent orchestration framework for AI-assisted software engineering workflows.",
77
77
  keywords: [
78
78
  "ai",
@@ -4145,6 +4145,38 @@ var init_runner_target = __esm(() => {
4145
4145
  INDIVIDUAL_TARGETS = ["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi"];
4146
4146
  });
4147
4147
 
4148
+ // src/utils/cli-bin.ts
4149
+ import { basename } from "node:path";
4150
+ function resolveCliBin(env = process.env, argv = process.argv) {
4151
+ if (env.CC_CLI_BIN) {
4152
+ return env.CC_CLI_BIN;
4153
+ }
4154
+ if (env.npm_lifecycle_event === "npx" || env.npm_command === "exec" || env._?.endsWith("/npx") || env._ === "npx") {
4155
+ return "npx cc-codeconductor";
4156
+ }
4157
+ if (env._?.endsWith("/bunx") || env._ === "bunx") {
4158
+ return "bunx cc-codeconductor";
4159
+ }
4160
+ if (env.npm_lifecycle_event === "dev") {
4161
+ return env.npm_lifecycle_script?.startsWith("bun") ? "bun run dev" : "npm run dev";
4162
+ }
4163
+ if (argv && argv.length > 1 && argv[1]) {
4164
+ const script = argv[1];
4165
+ const binName = basename(script);
4166
+ if (binName === "main.ts") {
4167
+ return "bun run dev";
4168
+ }
4169
+ if (binName === "cc-codeconductor" || binName === "codeconductor") {
4170
+ return binName;
4171
+ }
4172
+ }
4173
+ return "cc-codeconductor";
4174
+ }
4175
+ function formatUsage(usage, bin = resolveCliBin()) {
4176
+ return usage.replace(/^(?:cc-codeconductor|codeconductor|cc)\b/, bin);
4177
+ }
4178
+ var init_cli_bin = () => {};
4179
+
4148
4180
  // node_modules/yaml/dist/nodes/identity.js
4149
4181
  var require_identity = __commonJS(function(exports) {
4150
4182
  var ALIAS = Symbol.for("yaml.alias");
@@ -12670,7 +12702,7 @@ var init_safety = __esm(() => {
12670
12702
  // src/core/filesystem/path-containment.ts
12671
12703
  import { constants as constants2 } from "node:fs";
12672
12704
  import { lstat, mkdir, open, realpath } from "node:fs/promises";
12673
- import { basename, dirname as dirname2, isAbsolute, join as join2, relative, resolve as resolve3, sep as sep2 } from "node:path";
12705
+ import { basename as basename2, dirname as dirname2, isAbsolute, join as join2, relative, resolve as resolve3, sep as sep2 } from "node:path";
12674
12706
  function isInside(root, target) {
12675
12707
  const rel = relative(root, target);
12676
12708
  return rel !== "" && rel !== ".." && !rel.startsWith(`..${sep2}`) && !isAbsolute(rel);
@@ -12745,7 +12777,7 @@ async function canonicalizeExistingPrefix(target) {
12745
12777
  if (parent === current) {
12746
12778
  throw error;
12747
12779
  }
12748
- pending.unshift(basename(current));
12780
+ pending.unshift(basename2(current));
12749
12781
  current = parent;
12750
12782
  }
12751
12783
  }
@@ -13031,8 +13063,8 @@ function mergeDeep(target, source) {
13031
13063
  }
13032
13064
  function extractAgentRole(filePath) {
13033
13065
  const parts = filePath.replace(/\\/g, "/").split("/");
13034
- const basename2 = parts[parts.length - 1];
13035
- const name = basename2.replace(/\.md$/, "");
13066
+ const basename3 = parts[parts.length - 1];
13067
+ const name = basename3.replace(/\.md$/, "");
13036
13068
  const knownRoles = [
13037
13069
  "architect",
13038
13070
  "implementer",
@@ -14282,7 +14314,7 @@ var init_agy_installer = __esm(() => {
14282
14314
 
14283
14315
  // src/core/presets/update-checker.ts
14284
14316
  import { stat as stat2, readFile as readFile7 } from "node:fs/promises";
14285
- import { resolve as resolve7, join as join5, basename as basename2, dirname as dirname4 } from "node:path";
14317
+ import { resolve as resolve7, join as join5, basename as basename3, dirname as dirname4 } from "node:path";
14286
14318
  import { homedir as homedir3 } from "node:os";
14287
14319
  function getTargetInstallationPath(target, basePath, isGlobal) {
14288
14320
  if (target === "agy") {
@@ -14399,7 +14431,7 @@ async function validateSkillFrontmatterFiles(basePath, isGlobal) {
14399
14431
  }
14400
14432
  const files = await resolveEntryFiles(resolvedEntry, PRESETS_DIR, targetBaseDir);
14401
14433
  for (const { dest } of files) {
14402
- if (basename2(dest) !== "SKILL.md")
14434
+ if (basename3(dest) !== "SKILL.md")
14403
14435
  continue;
14404
14436
  let content;
14405
14437
  try {
@@ -14412,7 +14444,7 @@ async function validateSkillFrontmatterFiles(basePath, isGlobal) {
14412
14444
  results.push({ path: dest, error: `${parsed.error.kind}: ${parsed.error.message}` });
14413
14445
  continue;
14414
14446
  }
14415
- const dir = basename2(dirname4(dest));
14447
+ const dir = basename3(dirname4(dest));
14416
14448
  const ident = skillIdentifier(parsed.frontmatter);
14417
14449
  if (ident !== dir) {
14418
14450
  results.push({
@@ -16149,7 +16181,7 @@ __export(exports_init_command, {
16149
16181
  });
16150
16182
  import { access as access4, mkdir as mkdir5, readFile as readFile10, writeFile as writeFile4 } from "node:fs/promises";
16151
16183
  import { homedir as homedir6 } from "node:os";
16152
- import { basename as basename3, resolve as resolve11 } from "node:path";
16184
+ import { basename as basename4, resolve as resolve11 } from "node:path";
16153
16185
  async function initCommand(options) {
16154
16186
  const { projectRoot, dryRun, force, global: isGlobal, output, locale } = options;
16155
16187
  const baseDir = isGlobal ? homedir6() : projectRoot;
@@ -16170,7 +16202,7 @@ async function initCommand(options) {
16170
16202
  }
16171
16203
  const config = profile ? {
16172
16204
  project: {
16173
- name: basename3(projectRoot) || "unnamed-project",
16205
+ name: basename4(projectRoot) || "unnamed-project",
16174
16206
  profile: profile.runtimes[0] || "unknown"
16175
16207
  },
16176
16208
  defaults: {
@@ -16887,7 +16919,7 @@ __export(exports_install_command, {
16887
16919
  });
16888
16920
  import { readFile as readFile11 } from "node:fs/promises";
16889
16921
  import { homedir as homedir7 } from "node:os";
16890
- import { basename as basename4, dirname as dirname6, resolve as resolve12, sep as sep3 } from "node:path";
16922
+ import { basename as basename5, dirname as dirname6, resolve as resolve12, sep as sep3 } from "node:path";
16891
16923
  async function installCommand(options) {
16892
16924
  const { target, dryRun, force, global: isGlobal, output, projectRoot } = options;
16893
16925
  const baseDir = isGlobal ? homedir7() : projectRoot;
@@ -17026,12 +17058,12 @@ async function verifyRenderedFiles(manifest, baseDir, results) {
17026
17058
  if (leaked.length > 0) {
17027
17059
  warnings.push(`${r.dest}: unresolved placeholder(s) ${leaked.join(", ")}`);
17028
17060
  }
17029
- if (basename4(r.dest) === "SKILL.md") {
17061
+ if (basename5(r.dest) === "SKILL.md") {
17030
17062
  const parsed = parseSkillFrontmatter(content);
17031
17063
  if (!parsed.ok) {
17032
17064
  warnings.push(`${r.dest}: ${parsed.error.kind} — ${parsed.error.message}`);
17033
17065
  } else {
17034
- const dir = basename4(dirname6(r.dest));
17066
+ const dir = basename5(dirname6(r.dest));
17035
17067
  const ident = skillIdentifier(parsed.frontmatter);
17036
17068
  if (ident !== dir) {
17037
17069
  warnings.push(`${r.dest}: identifier "${ident}" does not match its directory "${dir}"`);
@@ -17274,6 +17306,7 @@ __export(exports_status_command, {
17274
17306
  });
17275
17307
  import { resolve as resolve13 } from "node:path";
17276
17308
  async function statusCommand(options) {
17309
+ const bin = resolveCliBin();
17277
17310
  const [configResult, state] = await Promise.all([
17278
17311
  loadConfig(options.projectRoot),
17279
17312
  readInstallationState(options.projectRoot)
@@ -17316,7 +17349,7 @@ async function statusCommand(options) {
17316
17349
  ...modifiedFiles.length ? [` locally modified managed files: ${modifiedFiles.length}`] : [],
17317
17350
  ...data.updates?.conflicts.length ? [` conflicts: ${data.updates.conflicts.join(", ")}`] : [],
17318
17351
  "",
17319
- "Run `cc doctor` for diagnostics."
17352
+ `Run \`${bin} doctor\` for diagnostics.`
17320
17353
  ].join(`
17321
17354
  `);
17322
17355
  return { code: 0, data: { ...data, output } };
@@ -17326,6 +17359,7 @@ var init_status_command = __esm(() => {
17326
17359
  init_installation_state();
17327
17360
  init_update_checker();
17328
17361
  init_runner_target();
17362
+ init_cli_bin();
17329
17363
  });
17330
17364
 
17331
17365
  // src/commands/detect.command.ts
@@ -20118,7 +20152,7 @@ async function loadGraph(projectRoot) {
20118
20152
  return ok(ProductGraphSchema.parse(JSON.parse(raw)));
20119
20153
  } catch (e) {
20120
20154
  if (e.code === "ENOENT") {
20121
- return err(new Error("Product graph not found. Run `cc ingest` first."));
20155
+ return err(new Error(`Product graph not found. Run \`${resolveCliBin()} ingest\` first.`));
20122
20156
  }
20123
20157
  return err(e instanceof Error ? e : new Error(String(e)));
20124
20158
  }
@@ -20212,6 +20246,7 @@ function getNeighbors(graph, nodeId, relation) {
20212
20246
  }
20213
20247
  var init_graph_store = __esm(() => {
20214
20248
  init_schemas();
20249
+ init_cli_bin();
20215
20250
  init_paths();
20216
20251
  });
20217
20252
 
@@ -20740,9 +20775,9 @@ import { join as join15 } from "node:path";
20740
20775
  async function parseAdrFile(filePath) {
20741
20776
  try {
20742
20777
  const content = await readFile19(filePath, "utf-8");
20743
- const basename5 = filePath.split("/").pop() ?? "";
20744
- const idMatch = basename5.match(/adr-(\d+)/i);
20745
- const id = idMatch ? `adr-${idMatch[1]}` : slugify(basename5);
20778
+ const basename6 = filePath.split("/").pop() ?? "";
20779
+ const idMatch = basename6.match(/adr-(\d+)/i);
20780
+ const id = idMatch ? `adr-${idMatch[1]}` : slugify(basename6);
20746
20781
  const titleMatch = content.match(/^#\s+ADR-\d+:\s*(.+)$/m);
20747
20782
  const statusMatch = content.match(/\*\*Status:\*\*\s*(\w+)/i);
20748
20783
  const contextSection = extractSection(content, "Context");
@@ -20752,7 +20787,7 @@ async function parseAdrFile(filePath) {
20752
20787
  `).filter((l) => l.trim().startsWith("-") || l.trim().startsWith("*")).map((l) => l.replace(/^[\s*-]+/, "").trim()).filter(Boolean);
20753
20788
  return {
20754
20789
  id,
20755
- title: titleMatch?.[1]?.trim() ?? basename5,
20790
+ title: titleMatch?.[1]?.trim() ?? basename6,
20756
20791
  status: statusMatch?.[1]?.toLowerCase() ?? "unknown",
20757
20792
  context: contextSection.trim(),
20758
20793
  decision: decisionSection.trim(),
@@ -23230,7 +23265,7 @@ async function handleRun(projectRoot, output, taskId, complete, allowCompileChec
23230
23265
  data: {
23231
23266
  success: false,
23232
23267
  command: "orchestrate",
23233
- errors: ["Verification failed. Run `cc verify --task " + taskId + "`"]
23268
+ errors: ["Verification failed. Run `" + resolveCliBin() + " verify --task " + taskId + "`"]
23234
23269
  }
23235
23270
  };
23236
23271
  }
@@ -23294,6 +23329,7 @@ var init_orchestrate_command = __esm(() => {
23294
23329
  init_product_planner();
23295
23330
  init_graph_store();
23296
23331
  init_loop_engine();
23332
+ init_cli_bin();
23297
23333
  });
23298
23334
 
23299
23335
  // src/core/impact/impact-engine.ts
@@ -25722,7 +25758,7 @@ var init_backlog_planner = __esm(() => {
25722
25758
 
25723
25759
  // src/core/openspec/openspec-generator.ts
25724
25760
  import { mkdir as mkdir21, rename as rename4, writeFile as writeFile21 } from "node:fs/promises";
25725
- import { basename as basename5, resolve as resolve30 } from "node:path";
25761
+ import { basename as basename6, resolve as resolve30 } from "node:path";
25726
25762
  function pad3(n) {
25727
25763
  return String(n).padStart(3, "0");
25728
25764
  }
@@ -25869,7 +25905,7 @@ capabilities:
25869
25905
  }
25870
25906
  async function archiveChangeFolder(projectRoot, changePath) {
25871
25907
  const src = resolve30(projectRoot, changePath);
25872
- const slug = basename5(changePath);
25908
+ const slug = basename6(changePath);
25873
25909
  const destDir = resolve30(projectRoot, "openspec", "changes", "archive");
25874
25910
  await mkdir21(destDir, { recursive: true });
25875
25911
  const dest = resolve30(destDir, slug);
@@ -30680,6 +30716,7 @@ __export(exports_onboarding_command, {
30680
30716
  onboardingCommand: () => onboardingCommand
30681
30717
  });
30682
30718
  async function onboardingCommand(projectRoot) {
30719
+ const bin = resolveCliBin();
30683
30720
  const [config, profile, state] = await Promise.all([
30684
30721
  loadConfig(projectRoot),
30685
30722
  detectProject(projectRoot),
@@ -30703,18 +30740,18 @@ async function onboardingCommand(projectRoot) {
30703
30740
  "",
30704
30741
  "Get started:",
30705
30742
  " 1. Inspect what will be installed",
30706
- " cc setup --dry-run",
30743
+ ` ${bin} setup --dry-run`,
30707
30744
  " 2. Configure the harness",
30708
- " cc setup",
30745
+ ` ${bin} setup`,
30709
30746
  " 3. Verify the installation",
30710
- " cc doctor",
30747
+ ` ${bin} doctor`,
30711
30748
  "",
30712
30749
  `Detected project: ${[...profile.runtimes, ...profile.frameworks].join(", ") || "unknown"}`,
30713
30750
  `Recommended preset: ${recommendation.stack}`,
30714
30751
  "",
30715
30752
  "Documentation:",
30716
- " cc help setup",
30717
- " cc docs getting-started"
30753
+ ` ${bin} help setup`,
30754
+ ` ${bin} docs getting-started`
30718
30755
  ].join(`
30719
30756
  `)
30720
30757
  }
@@ -30737,12 +30774,12 @@ async function onboardingCommand(projectRoot) {
30737
30774
  ` locale ${config.data.defaults.locale}`,
30738
30775
  "",
30739
30776
  "Run:",
30740
- " cc status",
30741
- " cc doctor",
30742
- " cc update --check",
30777
+ ` ${bin} status`,
30778
+ ` ${bin} doctor`,
30779
+ ` ${bin} update --check`,
30743
30780
  "",
30744
30781
  "Other commands:",
30745
- " cc help"
30782
+ ` ${bin} help`
30746
30783
  ].join(`
30747
30784
  `)
30748
30785
  }
@@ -30753,6 +30790,7 @@ var init_onboarding_command = __esm(() => {
30753
30790
  init_config_loader();
30754
30791
  init_project_detector();
30755
30792
  init_installation_state();
30793
+ init_cli_bin();
30756
30794
  });
30757
30795
 
30758
30796
  // src/cli/execute.ts
@@ -30765,36 +30803,37 @@ init_runner_target();
30765
30803
 
30766
30804
  // src/cli/command-registry.ts
30767
30805
  init_package();
30806
+ init_cli_bin();
30768
30807
  var COMMANDS = [
30769
- { name: "setup", group: "getting-started", summary: "Configure and install CodeConductor.", usage: ["cc setup [--target <target>] [--locale en|es] [--yes] [--dry-run]"] },
30770
- { name: "detect", group: "getting-started", summary: "Inspect the project stack and recommended presets.", usage: ["cc detect"] },
30771
- { name: "init", group: "getting-started", summary: "Initialize low-level CodeConductor configuration.", usage: ["cc init [--locale en|es]"] },
30772
- { name: "install", group: "getting-started", summary: "Install harness components.", usage: ["cc install preset --target <target>"], options: ["--target opencode|claude|codex|gemini|cursor|agy|pi|all"], subcommands: [
30773
- { name: "preset", group: "getting-started", summary: "Install agents, prompts, skills, and commands.", usage: ["cc install preset --target <target> [--locale en|es]"] },
30774
- { name: "council", group: "getting-started", summary: "Install generated council files.", usage: ["cc install council --target <target>"] },
30775
- { name: "lsp", group: "getting-started", summary: "Install supported language servers.", usage: ["cc install lsp --target <target> [--lang typescript,python]"] }
30808
+ { name: "setup", group: "getting-started", summary: "Configure and install CodeConductor.", usage: ["cc-codeconductor setup [--target <target>] [--locale en|es] [--yes] [--dry-run]"] },
30809
+ { name: "detect", group: "getting-started", summary: "Inspect the project stack and recommended presets.", usage: ["cc-codeconductor detect"] },
30810
+ { name: "init", group: "getting-started", summary: "Initialize low-level CodeConductor configuration.", usage: ["cc-codeconductor init [--locale en|es]"] },
30811
+ { name: "install", group: "getting-started", summary: "Install harness components.", usage: ["cc-codeconductor install preset --target <target>"], options: ["--target opencode|claude|codex|gemini|cursor|agy|pi|all"], subcommands: [
30812
+ { name: "preset", group: "getting-started", summary: "Install agents, prompts, skills, and commands.", usage: ["cc-codeconductor install preset --target <target> [--locale en|es]"] },
30813
+ { name: "council", group: "getting-started", summary: "Install generated council files.", usage: ["cc-codeconductor install council --target <target>"] },
30814
+ { name: "lsp", group: "getting-started", summary: "Install supported language servers.", usage: ["cc-codeconductor install lsp --target <target> [--lang typescript,python]"] }
30776
30815
  ] },
30777
- { name: "version", group: "maintenance", summary: "Show CLI and project harness versions.", usage: ["cc version [--json]"] },
30778
- { name: "status", group: "maintenance", summary: "Show installed harness state.", usage: ["cc status [--json]"] },
30779
- { name: "doctor", group: "maintenance", summary: "Diagnose the installation.", usage: ["cc doctor"] },
30780
- { name: "update", group: "maintenance", summary: "Safely reconcile managed harness files.", usage: ["cc update [--dry-run] [--force]"] },
30781
- { name: "migrate", group: "maintenance", summary: "Apply compatibility migrations.", usage: ["cc migrate [--dry-run]"] },
30782
- { name: "docs", group: "maintenance", summary: "Read bundled command documentation.", usage: ["cc docs [command]"] },
30783
- { name: "completion", group: "maintenance", summary: "Generate shell completion.", usage: ["cc completion <bash|zsh|fish|powershell>"] },
30784
- { name: "hook", group: "maintenance", summary: "Run installed agent hooks.", usage: ["cc hook <pre-tool|post-tool|session-start>"] },
30785
- { name: "cc-help", group: "maintenance", summary: "Show a target preset inventory.", usage: ["cc cc-help --target <target>"] },
30786
- { name: "ask", group: "workflow", summary: "Recommend a slash-command workflow.", usage: ['cc ask "problem"'] },
30787
- { name: "goal", aliases: ["cc-goal"], group: "workflow", summary: "Plan a goal into dependent tasks.", usage: ['cc goal "objective"'] },
30788
- { name: "ingest", group: "workflow", summary: "Ingest repository knowledge into the product graph.", usage: ["cc ingest"] },
30789
- { name: "product", group: "workflow", summary: "Explore the product graph and memory.", usage: ["cc product <subcommand>"] },
30790
- { name: "ccep", group: "workflow", summary: "Run CCEP contract workflows.", usage: ["cc ccep <subcommand>"] },
30791
- { name: "openspec", group: "workflow", summary: "Run the OpenSpec delivery loop.", usage: ["cc openspec <subcommand>"] },
30792
- { name: "scorecard", group: "workflow", summary: "Record and aggregate outcomes.", usage: ["cc scorecard <subcommand>"] },
30793
- { name: "orchestrate", group: "workflow", summary: "Run goal execution orchestration.", usage: ["cc orchestrate <subcommand>"] },
30794
- { name: "impact", group: "workflow", summary: "Analyze change impact.", usage: ["cc impact [--files <paths>]"] },
30795
- { name: "verify", group: "workflow", summary: "Verify task completion with evidence.", usage: ["cc verify --task <id>"] },
30796
- { name: "seo", group: "tool", summary: "Audit SEO and generate llms.txt.", usage: ["cc seo audit --url <url>"] },
30797
- { name: "debt-harvest", aliases: ["harvest"], group: "tool", summary: "Scan source files for deferred debt.", usage: ["cc debt-harvest"] }
30816
+ { name: "version", group: "maintenance", summary: "Show CLI and project harness versions.", usage: ["cc-codeconductor version [--json]"] },
30817
+ { name: "status", group: "maintenance", summary: "Show installed harness state.", usage: ["cc-codeconductor status [--json]"] },
30818
+ { name: "doctor", group: "maintenance", summary: "Diagnose the installation.", usage: ["cc-codeconductor doctor"] },
30819
+ { name: "update", group: "maintenance", summary: "Safely reconcile managed harness files.", usage: ["cc-codeconductor update [--dry-run] [--force]"] },
30820
+ { name: "migrate", group: "maintenance", summary: "Apply compatibility migrations.", usage: ["cc-codeconductor migrate [--dry-run]"] },
30821
+ { name: "docs", group: "maintenance", summary: "Read bundled command documentation.", usage: ["cc-codeconductor docs [command]"] },
30822
+ { name: "completion", group: "maintenance", summary: "Generate shell completion.", usage: ["cc-codeconductor completion <bash|zsh|fish|powershell>"] },
30823
+ { name: "hook", group: "maintenance", summary: "Run installed agent hooks.", usage: ["cc-codeconductor hook <pre-tool|post-tool|session-start>"] },
30824
+ { name: "cc-help", group: "maintenance", summary: "Show a target preset inventory.", usage: ["cc-codeconductor cc-help --target <target>"] },
30825
+ { name: "ask", group: "workflow", summary: "Recommend a slash-command workflow.", usage: ['cc-codeconductor ask "problem"'] },
30826
+ { name: "goal", aliases: ["cc-goal"], group: "workflow", summary: "Plan a goal into dependent tasks.", usage: ['cc-codeconductor goal "objective"'] },
30827
+ { name: "ingest", group: "workflow", summary: "Ingest repository knowledge into the product graph.", usage: ["cc-codeconductor ingest"] },
30828
+ { name: "product", group: "workflow", summary: "Explore the product graph and memory.", usage: ["cc-codeconductor product <subcommand>"] },
30829
+ { name: "ccep", group: "workflow", summary: "Run CCEP contract workflows.", usage: ["cc-codeconductor ccep <subcommand>"] },
30830
+ { name: "openspec", group: "workflow", summary: "Run the OpenSpec delivery loop.", usage: ["cc-codeconductor openspec <subcommand>"] },
30831
+ { name: "scorecard", group: "workflow", summary: "Record and aggregate outcomes.", usage: ["cc-codeconductor scorecard <subcommand>"] },
30832
+ { name: "orchestrate", group: "workflow", summary: "Run goal execution orchestration.", usage: ["cc-codeconductor orchestrate <subcommand>"] },
30833
+ { name: "impact", group: "workflow", summary: "Analyze change impact.", usage: ["cc-codeconductor impact [--files <paths>]"] },
30834
+ { name: "verify", group: "workflow", summary: "Verify task completion with evidence.", usage: ["cc-codeconductor verify --task <id>"] },
30835
+ { name: "seo", group: "tool", summary: "Audit SEO and generate llms.txt.", usage: ["cc-codeconductor seo audit --url <url>"] },
30836
+ { name: "debt-harvest", aliases: ["harvest"], group: "tool", summary: "Scan source files for deferred debt.", usage: ["cc-codeconductor debt-harvest"] }
30798
30837
  ];
30799
30838
  var GROUP_LABELS = {
30800
30839
  "getting-started": "GETTING STARTED",
@@ -30806,7 +30845,7 @@ function findCommand(name, subcommand) {
30806
30845
  const command = COMMANDS.find((candidate) => candidate.name === name || candidate.aliases?.includes(name ?? ""));
30807
30846
  return subcommand ? command?.subcommands?.find((candidate) => candidate.name === subcommand) : command;
30808
30847
  }
30809
- function renderHelp(command, subcommand, all = false) {
30848
+ function renderHelp(command, subcommand, all = false, bin = resolveCliBin()) {
30810
30849
  const definition = findCommand(command, subcommand);
30811
30850
  if (definition) {
30812
30851
  return [
@@ -30815,11 +30854,11 @@ function renderHelp(command, subcommand, all = false) {
30815
30854
  definition.summary,
30816
30855
  "",
30817
30856
  "Usage:",
30818
- ...definition.usage.map((usage) => ` ${usage}`),
30857
+ ...definition.usage.map((usage) => ` ${formatUsage(usage, bin)}`),
30819
30858
  ...definition.options?.length ? ["", "Options:", ...definition.options.map((option) => ` ${option}`)] : [],
30820
30859
  ...definition.subcommands?.length ? ["", "Subcommands:", ...definition.subcommands.map((item) => ` ${item.name.padEnd(12)} ${item.summary}`)] : [],
30821
30860
  "",
30822
- "Run `cc help --all` for every command."
30861
+ `Run \`${bin} help --all\` for every command.`
30823
30862
  ].join(`
30824
30863
  `);
30825
30864
  }
@@ -30830,14 +30869,14 @@ function renderHelp(command, subcommand, all = false) {
30830
30869
  ]);
30831
30870
  const details = all ? COMMANDS.flatMap((item) => [
30832
30871
  `## ${item.name}`,
30833
- ...item.usage.map((usage) => ` ${usage}`),
30872
+ ...item.usage.map((usage) => ` ${formatUsage(usage, bin)}`),
30834
30873
  ...item.subcommands?.map((sub) => ` ${item.name} ${sub.name} — ${sub.summary}`) ?? [],
30835
30874
  ""
30836
30875
  ]) : [];
30837
- return [`CodeConductor CLI v${package_default.version}`, "", "Usage: cc <command> [options]", "", ...grouped, ...details, "Run `cc help <command>` for details."].join(`
30876
+ return [`CodeConductor CLI v${package_default.version}`, "", `Usage: ${bin} <command> [options]`, "", ...grouped, ...details, `Run \`${bin} help <command>\` for details.`].join(`
30838
30877
  `);
30839
30878
  }
30840
- function renderDocs(command) {
30879
+ function renderDocs(command, bin = "cc-codeconductor") {
30841
30880
  const groupAliases = {
30842
30881
  "getting-started": "getting-started",
30843
30882
  maintenance: "maintenance",
@@ -30853,7 +30892,7 @@ function renderDocs(command) {
30853
30892
  item.summary,
30854
30893
  "",
30855
30894
  "```text",
30856
- ...item.usage,
30895
+ ...item.usage.map((usage) => formatUsage(usage, bin)),
30857
30896
  "```",
30858
30897
  ""
30859
30898
  ])].join(`
@@ -30864,15 +30903,20 @@ function renderCompletion(shell) {
30864
30903
  const targets = "opencode claude codex gemini cursor agy pi all";
30865
30904
  if (shell === "bash")
30866
30905
  return `_cc(){ local cur="${"${COMP_WORDS[COMP_CWORD]}"}"; local prev="${"${COMP_WORDS[COMP_CWORD-1]}"}"; if [[ "$prev" == "--target" ]]; then COMPREPLY=( $(compgen -W "${targets}" -- "$cur") ); else COMPREPLY=( $(compgen -W "${names}" -- "$cur") ); fi; }
30867
- complete -F _cc cc codeconductor`;
30906
+ complete -F _cc cc-codeconductor codeconductor cc`;
30868
30907
  if (shell === "zsh")
30869
- return `#compdef cc codeconductor
30908
+ return `#compdef cc-codeconductor codeconductor cc
30870
30909
  _arguments '1:command:(${names})' '--target[target]:target:(${targets})'`;
30871
30910
  if (shell === "fish")
30872
- return [...COMMANDS.map((item) => `complete -c cc -a ${item.name} -d '${item.summary}'`), `complete -c cc -l target -a '${targets}'`].join(`
30911
+ return [
30912
+ ...["cc-codeconductor", "codeconductor", "cc"].flatMap((bin) => [
30913
+ ...COMMANDS.map((item) => `complete -c ${bin} -a ${item.name} -d '${item.summary}'`),
30914
+ `complete -c ${bin} -l target -a '${targets}'`
30915
+ ])
30916
+ ].join(`
30873
30917
  `);
30874
30918
  if (shell === "powershell")
30875
- return `Register-ArgumentCompleter -CommandName cc,codeconductor -ScriptBlock { param($wordToComplete,$commandAst,$cursorPosition) $values = if ($commandAst.ToString() -match '--target\\s+$') { '${targets}' } else { '${names}' }; $values.Split(' ') | Where-Object { $_ -like "$wordToComplete*" } }`;
30919
+ return `Register-ArgumentCompleter -CommandName cc-codeconductor,codeconductor,cc -ScriptBlock { param($wordToComplete,$commandAst,$cursorPosition) $values = if ($commandAst.ToString() -match '--target\\s+$') { '${targets}' } else { '${names}' }; $values.Split(' ') | Where-Object { $_ -like "$wordToComplete*" } }`;
30876
30920
  return null;
30877
30921
  }
30878
30922
 
package/dist/library.js CHANGED
@@ -1134,6 +1134,34 @@ var init_goal_state = __esm(() => {
1134
1134
  import { mkdir, readFile, writeFile } from "node:fs/promises";
1135
1135
  init_schemas();
1136
1136
 
1137
+ // src/utils/cli-bin.ts
1138
+ import { basename } from "node:path";
1139
+ function resolveCliBin(env = process.env, argv = process.argv) {
1140
+ if (env.CC_CLI_BIN) {
1141
+ return env.CC_CLI_BIN;
1142
+ }
1143
+ if (env.npm_lifecycle_event === "npx" || env.npm_command === "exec" || env._?.endsWith("/npx") || env._ === "npx") {
1144
+ return "npx cc-codeconductor";
1145
+ }
1146
+ if (env._?.endsWith("/bunx") || env._ === "bunx") {
1147
+ return "bunx cc-codeconductor";
1148
+ }
1149
+ if (env.npm_lifecycle_event === "dev") {
1150
+ return env.npm_lifecycle_script?.startsWith("bun") ? "bun run dev" : "npm run dev";
1151
+ }
1152
+ if (argv && argv.length > 1 && argv[1]) {
1153
+ const script = argv[1];
1154
+ const binName = basename(script);
1155
+ if (binName === "main.ts") {
1156
+ return "bun run dev";
1157
+ }
1158
+ if (binName === "cc-codeconductor" || binName === "codeconductor") {
1159
+ return binName;
1160
+ }
1161
+ }
1162
+ return "cc-codeconductor";
1163
+ }
1164
+
1137
1165
  // src/core/product-graph/paths.ts
1138
1166
  import { join } from "node:path";
1139
1167
  var PRODUCT_DIR = ".codeconductor";
@@ -1161,7 +1189,7 @@ async function loadGraph(projectRoot) {
1161
1189
  return ok(ProductGraphSchema.parse(JSON.parse(raw)));
1162
1190
  } catch (e) {
1163
1191
  if (e.code === "ENOENT") {
1164
- return err(new Error("Product graph not found. Run `cc ingest` first."));
1192
+ return err(new Error(`Product graph not found. Run \`${resolveCliBin()} ingest\` first.`));
1165
1193
  }
1166
1194
  return err(e instanceof Error ? e : new Error(String(e)));
1167
1195
  }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Resolve the CLI command prefix based on execution context.
3
+ *
4
+ * - When invoked via npx (e.g. `npx cc-codeconductor ...`), returns `npx cc-codeconductor`.
5
+ * - When invoked via bunx, returns `bunx cc-codeconductor`.
6
+ * - When invoked during local development (`bun run dev` or executing `src/cli/main.ts`), returns `bun run dev`.
7
+ * - When invoked via an installed binary (`cc-codeconductor` or `codeconductor`), returns that binary name.
8
+ * - Respects the `CC_CLI_BIN` environment variable for testing or explicit overrides.
9
+ * - Defaults to `cc-codeconductor`.
10
+ */
11
+ export declare function resolveCliBin(env?: NodeJS.ProcessEnv, argv?: readonly string[]): string;
12
+ /**
13
+ * Formats a command usage string replacing any legacy or alternative command prefix
14
+ * (`cc `, `cc-codeconductor `, or `codeconductor `) with the resolved bin prefix.
15
+ */
16
+ export declare function formatUsage(usage: string, bin?: string): string;
@@ -5,7 +5,7 @@
5
5
  Configure and install CodeConductor.
6
6
 
7
7
  ```text
8
- cc setup [--target <target>] [--locale en|es] [--yes] [--dry-run]
8
+ cc-codeconductor setup [--target <target>] [--locale en|es] [--yes] [--dry-run]
9
9
  ```
10
10
 
11
11
  ## detect
@@ -13,7 +13,7 @@ cc setup [--target <target>] [--locale en|es] [--yes] [--dry-run]
13
13
  Inspect the project stack and recommended presets.
14
14
 
15
15
  ```text
16
- cc detect
16
+ cc-codeconductor detect
17
17
  ```
18
18
 
19
19
  ## init
@@ -21,7 +21,7 @@ cc detect
21
21
  Initialize low-level CodeConductor configuration.
22
22
 
23
23
  ```text
24
- cc init [--locale en|es]
24
+ cc-codeconductor init [--locale en|es]
25
25
  ```
26
26
 
27
27
  ## install
@@ -29,7 +29,7 @@ cc init [--locale en|es]
29
29
  Install harness components.
30
30
 
31
31
  ```text
32
- cc install preset --target <target>
32
+ cc-codeconductor install preset --target <target>
33
33
  ```
34
34
 
35
35
  ## version
@@ -37,7 +37,7 @@ cc install preset --target <target>
37
37
  Show CLI and project harness versions.
38
38
 
39
39
  ```text
40
- cc version [--json]
40
+ cc-codeconductor version [--json]
41
41
  ```
42
42
 
43
43
  ## status
@@ -45,7 +45,7 @@ cc version [--json]
45
45
  Show installed harness state.
46
46
 
47
47
  ```text
48
- cc status [--json]
48
+ cc-codeconductor status [--json]
49
49
  ```
50
50
 
51
51
  ## doctor
@@ -53,7 +53,7 @@ cc status [--json]
53
53
  Diagnose the installation.
54
54
 
55
55
  ```text
56
- cc doctor
56
+ cc-codeconductor doctor
57
57
  ```
58
58
 
59
59
  ## update
@@ -61,7 +61,7 @@ cc doctor
61
61
  Safely reconcile managed harness files.
62
62
 
63
63
  ```text
64
- cc update [--dry-run] [--force]
64
+ cc-codeconductor update [--dry-run] [--force]
65
65
  ```
66
66
 
67
67
  ## migrate
@@ -69,7 +69,7 @@ cc update [--dry-run] [--force]
69
69
  Apply compatibility migrations.
70
70
 
71
71
  ```text
72
- cc migrate [--dry-run]
72
+ cc-codeconductor migrate [--dry-run]
73
73
  ```
74
74
 
75
75
  ## docs
@@ -77,7 +77,7 @@ cc migrate [--dry-run]
77
77
  Read bundled command documentation.
78
78
 
79
79
  ```text
80
- cc docs [command]
80
+ cc-codeconductor docs [command]
81
81
  ```
82
82
 
83
83
  ## completion
@@ -85,7 +85,7 @@ cc docs [command]
85
85
  Generate shell completion.
86
86
 
87
87
  ```text
88
- cc completion <bash|zsh|fish|powershell>
88
+ cc-codeconductor completion <bash|zsh|fish|powershell>
89
89
  ```
90
90
 
91
91
  ## hook
@@ -93,7 +93,7 @@ cc completion <bash|zsh|fish|powershell>
93
93
  Run installed agent hooks.
94
94
 
95
95
  ```text
96
- cc hook <pre-tool|post-tool|session-start>
96
+ cc-codeconductor hook <pre-tool|post-tool|session-start>
97
97
  ```
98
98
 
99
99
  ## cc-help
@@ -101,7 +101,7 @@ cc hook <pre-tool|post-tool|session-start>
101
101
  Show a target preset inventory.
102
102
 
103
103
  ```text
104
- cc cc-help --target <target>
104
+ cc-codeconductor cc-help --target <target>
105
105
  ```
106
106
 
107
107
  ## ask
@@ -109,7 +109,7 @@ cc cc-help --target <target>
109
109
  Recommend a slash-command workflow.
110
110
 
111
111
  ```text
112
- cc ask "problem"
112
+ cc-codeconductor ask "problem"
113
113
  ```
114
114
 
115
115
  ## goal
@@ -117,7 +117,7 @@ cc ask "problem"
117
117
  Plan a goal into dependent tasks.
118
118
 
119
119
  ```text
120
- cc goal "objective"
120
+ cc-codeconductor goal "objective"
121
121
  ```
122
122
 
123
123
  ## ingest
@@ -125,7 +125,7 @@ cc goal "objective"
125
125
  Ingest repository knowledge into the product graph.
126
126
 
127
127
  ```text
128
- cc ingest
128
+ cc-codeconductor ingest
129
129
  ```
130
130
 
131
131
  ## product
@@ -133,7 +133,7 @@ cc ingest
133
133
  Explore the product graph and memory.
134
134
 
135
135
  ```text
136
- cc product <subcommand>
136
+ cc-codeconductor product <subcommand>
137
137
  ```
138
138
 
139
139
  ## ccep
@@ -141,7 +141,7 @@ cc product <subcommand>
141
141
  Run CCEP contract workflows.
142
142
 
143
143
  ```text
144
- cc ccep <subcommand>
144
+ cc-codeconductor ccep <subcommand>
145
145
  ```
146
146
 
147
147
  ## openspec
@@ -149,7 +149,7 @@ cc ccep <subcommand>
149
149
  Run the OpenSpec delivery loop.
150
150
 
151
151
  ```text
152
- cc openspec <subcommand>
152
+ cc-codeconductor openspec <subcommand>
153
153
  ```
154
154
 
155
155
  ## scorecard
@@ -157,7 +157,7 @@ cc openspec <subcommand>
157
157
  Record and aggregate outcomes.
158
158
 
159
159
  ```text
160
- cc scorecard <subcommand>
160
+ cc-codeconductor scorecard <subcommand>
161
161
  ```
162
162
 
163
163
  ## orchestrate
@@ -165,7 +165,7 @@ cc scorecard <subcommand>
165
165
  Run goal execution orchestration.
166
166
 
167
167
  ```text
168
- cc orchestrate <subcommand>
168
+ cc-codeconductor orchestrate <subcommand>
169
169
  ```
170
170
 
171
171
  ## impact
@@ -173,7 +173,7 @@ cc orchestrate <subcommand>
173
173
  Analyze change impact.
174
174
 
175
175
  ```text
176
- cc impact [--files <paths>]
176
+ cc-codeconductor impact [--files <paths>]
177
177
  ```
178
178
 
179
179
  ## verify
@@ -181,7 +181,7 @@ cc impact [--files <paths>]
181
181
  Verify task completion with evidence.
182
182
 
183
183
  ```text
184
- cc verify --task <id>
184
+ cc-codeconductor verify --task <id>
185
185
  ```
186
186
 
187
187
  ## seo
@@ -189,7 +189,7 @@ cc verify --task <id>
189
189
  Audit SEO and generate llms.txt.
190
190
 
191
191
  ```text
192
- cc seo audit --url <url>
192
+ cc-codeconductor seo audit --url <url>
193
193
  ```
194
194
 
195
195
  ## debt-harvest
@@ -197,6 +197,6 @@ cc seo audit --url <url>
197
197
  Scan source files for deferred debt.
198
198
 
199
199
  ```text
200
- cc debt-harvest
200
+ cc-codeconductor debt-harvest
201
201
  ```
202
202
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-codeconductor",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "A multi-agent orchestration framework for AI-assisted software engineering workflows.",
5
5
  "keywords": [
6
6
  "ai",