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 +114 -70
- package/dist/library.js +29 -1
- package/dist/utils/cli-bin.d.ts +16 -0
- package/docs/generated/cli.md +25 -25
- package/package.json +1 -1
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.
|
|
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(
|
|
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
|
|
13035
|
-
const name =
|
|
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
|
|
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 (
|
|
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 =
|
|
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
|
|
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:
|
|
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
|
|
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 (
|
|
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 =
|
|
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
|
-
|
|
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(
|
|
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
|
|
20744
|
-
const idMatch =
|
|
20745
|
-
const id = idMatch ? `adr-${idMatch[1]}` : slugify(
|
|
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() ??
|
|
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 `
|
|
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
|
|
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 =
|
|
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
|
-
|
|
30743
|
+
` ${bin} setup --dry-run`,
|
|
30707
30744
|
" 2. Configure the harness",
|
|
30708
|
-
|
|
30745
|
+
` ${bin} setup`,
|
|
30709
30746
|
" 3. Verify the installation",
|
|
30710
|
-
|
|
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
|
-
|
|
30717
|
-
|
|
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
|
-
|
|
30741
|
-
|
|
30742
|
-
|
|
30777
|
+
` ${bin} status`,
|
|
30778
|
+
` ${bin} doctor`,
|
|
30779
|
+
` ${bin} update --check`,
|
|
30743
30780
|
"",
|
|
30744
30781
|
"Other commands:",
|
|
30745
|
-
|
|
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
|
-
|
|
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}`, "",
|
|
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 [
|
|
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(
|
|
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;
|
package/docs/generated/cli.md
CHANGED
|
@@ -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
|
|