cc-codeconductor 0.2.3 → 0.2.4

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/README.md CHANGED
@@ -130,10 +130,10 @@ bun run src/cli/main.ts --help
130
130
  #### `init` — initialize CodeConductor in a project
131
131
 
132
132
  ```bash
133
- codeconductor init # detect stack, write .codeconductor/config.yml
134
- codeconductor init --force # overwrite existing config
135
- codeconductor init --global # write to ~/.codeconductor/
136
- codeconductor init --dry-run # preview without writing
133
+ cc-codeconductor init # detect stack, write .codeconductor/config.yml
134
+ cc-codeconductor init --force # overwrite existing config
135
+ cc-codeconductor init --global # write to ~/.codeconductor/
136
+ cc-codeconductor init --dry-run # preview without writing
137
137
  ```
138
138
 
139
139
  On first run, `init` copies `council.yml` and `policy.yml` into
@@ -143,8 +143,8 @@ files. `install` reads from there first.
143
143
  #### `detect` — detect project stack
144
144
 
145
145
  ```bash
146
- codeconductor detect
147
- codeconductor detect --output json
146
+ cc-codeconductor detect
147
+ cc-codeconductor detect --output json
148
148
  ```
149
149
 
150
150
  Output:
@@ -159,17 +159,17 @@ Detected:
159
159
  #### `install` — install council preset
160
160
 
161
161
  ```bash
162
- codeconductor install council --target opencode # project-level
163
- codeconductor install council --target claude
164
- codeconductor install council --target codex
165
- codeconductor install council --target all # all three targets
162
+ cc-codeconductor install council --target opencode # project-level
163
+ cc-codeconductor install council --target claude
164
+ cc-codeconductor install council --target codex
165
+ cc-codeconductor install council --target all # all three targets
166
166
 
167
- codeconductor install council --target claude --global # write to ~/.claude/
168
- codeconductor install council --target opencode --global
169
- codeconductor install council --target all --global
167
+ cc-codeconductor install council --target claude --global # write to ~/.claude/
168
+ cc-codeconductor install council --target opencode --global
169
+ cc-codeconductor install council --target all --global
170
170
 
171
- codeconductor install council --target opencode --dry-run # preview
172
- codeconductor install council --target opencode --force # overwrite
171
+ cc-codeconductor install council --target opencode --dry-run # preview
172
+ cc-codeconductor install council --target opencode --force # overwrite
173
173
  ```
174
174
 
175
175
  Files generated per target:
@@ -185,7 +185,7 @@ With `--global`, the same files are written under `~/` instead of `./`.
185
185
  #### `doctor` — validate configuration
186
186
 
187
187
  ```bash
188
- codeconductor doctor
188
+ cc-codeconductor doctor
189
189
  ```
190
190
 
191
191
  Checks config exists and is valid, reports runner directory status.
@@ -193,9 +193,9 @@ Checks config exists and is valid, reports runner directory status.
193
193
  #### `update` — re-apply preset
194
194
 
195
195
  ```bash
196
- codeconductor update
197
- codeconductor update --force
198
- codeconductor update --dry-run
196
+ cc-codeconductor update
197
+ cc-codeconductor update --force
198
+ cc-codeconductor update --dry-run
199
199
  ```
200
200
 
201
201
  Re-generates preset files for the `defaults.target` in your config.
@@ -238,9 +238,9 @@ src/presets/models/
238
238
 
239
239
  Agent template files contain placeholders that are replaced during `install`:
240
240
 
241
- | Placeholder | Description |
242
- | ------------------ | ------------------------------ |
243
- | `{{MODEL_CLAUDE}}` | Model for the Claude provider |
241
+ | Placeholder | Description |
242
+ | -------------------- | ------------------------------- |
243
+ | `{{MODEL_CLAUDE}}` | Model for the Claude provider |
244
244
  | `{{MODEL_OPENCODE}}` | Model for the OpenCode provider |
245
245
  | `{{MODEL_CODEX}}` | Model for the Codex provider |
246
246
 
@@ -296,13 +296,13 @@ codeconductor/
296
296
 
297
297
  ## Roadmap
298
298
 
299
- | Version | Focus |
300
- | ---------- | ------------------------------------------------------------------ |
301
- | **v0.2.0** | **CLI: init, detect, install, doctor, update — shipped** ✅ |
302
- | v0.3.0 | Next.js, FastAPI, generic presets, monorepo support |
303
- | v0.4.0 | Provider compatibility matrix and target sync workflows |
304
- | v0.5.0 | Scorecard CLI, task outcome tracking, prompt regression |
305
- | v1.0.0 | Stable contracts, stable routing, documented evaluation |
299
+ | Version | Focus |
300
+ | ---------- | ----------------------------------------------------------- |
301
+ | **v0.2.0** | **CLI: init, detect, install, doctor, update — shipped** ✅ |
302
+ | v0.3.0 | Next.js, FastAPI, generic presets, monorepo support |
303
+ | v0.4.0 | Provider compatibility matrix and target sync workflows |
304
+ | v0.5.0 | Scorecard CLI, task outcome tracking, prompt regression |
305
+ | v1.0.0 | Stable contracts, stable routing, documented evaluation |
306
306
 
307
307
  See [ROADMAP.md](ROADMAP.md) for details.
308
308
 
package/dist/index.js CHANGED
@@ -7215,15 +7215,35 @@ async function detectProject(rootDir) {
7215
7215
  signals.push(...astroSignals);
7216
7216
  frameworks.push("astro");
7217
7217
  }
7218
+ const uniqueSignals = [...new Set(signals)];
7218
7219
  return {
7219
7220
  rootDir,
7220
7221
  languages: [...new Set(languages)],
7221
7222
  runtimes: [...new Set(runtimes)],
7222
7223
  packageManagers: [...new Set(packageManagers)],
7223
7224
  frameworks: [...new Set(frameworks)],
7224
- signals: [...new Set(signals)]
7225
+ signals: uniqueSignals,
7226
+ confidence: calculateConfidence({
7227
+ signals: uniqueSignals,
7228
+ runtimes: [...new Set(runtimes)],
7229
+ frameworks: [...new Set(frameworks)]
7230
+ })
7225
7231
  };
7226
7232
  }
7233
+ function calculateConfidence(profile) {
7234
+ if (profile.signals.length === 0) {
7235
+ return "low";
7236
+ }
7237
+ const hasFramework = profile.frameworks.length > 0;
7238
+ const hasRuntime = profile.runtimes.length > 0;
7239
+ if (hasFramework && profile.signals.length >= 2 || hasRuntime && profile.signals.length >= 3) {
7240
+ return "high";
7241
+ }
7242
+ if (hasFramework || profile.signals.length >= 2 || hasRuntime) {
7243
+ return "medium";
7244
+ }
7245
+ return "low";
7246
+ }
7227
7247
  async function detectNode(rootDir) {
7228
7248
  const { fileExists: fileExists2 } = await Promise.resolve().then(() => (init_safety(), exports_safety));
7229
7249
  const signals = [];
@@ -7286,6 +7306,57 @@ var SRC_PRESETS_DIR = resolve2(PACKAGE_ROOT, "src", "presets");
7286
7306
  var ROOT_PRESETS_DIR = resolve2(PACKAGE_ROOT, "presets");
7287
7307
  var POLICY_PATH = resolve2(PACKAGE_ROOT, "policy.yml");
7288
7308
 
7309
+ // src/core/presets/preset-resolver.ts
7310
+ var CURRENT_PRESET_VERSION = "v0.2.0";
7311
+ function resolvePreset(target, profile) {
7312
+ const stack = resolveStack(profile);
7313
+ const architecture = profile.signals.length > 0 ? "single-project" : "unknown";
7314
+ const warnings = [];
7315
+ if (profile.confidence === "low") {
7316
+ warnings.push("Detection confidence is low; review the selected preset before applying it.");
7317
+ }
7318
+ if (stack === "unknown") {
7319
+ warnings.push("No supported stack was detected; using the generic CodeConductor workflow preset.");
7320
+ } else {
7321
+ warnings.push(`${stack} projects currently receive the generic ${target} workflow plus matching skills; stack-specific asset pruning is not implemented yet.`);
7322
+ }
7323
+ if (architecture === "unknown") {
7324
+ warnings.push("Project architecture could not be inferred from available signals.");
7325
+ }
7326
+ return {
7327
+ target,
7328
+ stack,
7329
+ architecture,
7330
+ confidence: profile.confidence,
7331
+ presetVersion: CURRENT_PRESET_VERSION,
7332
+ assets: resolveAssets(target),
7333
+ warnings
7334
+ };
7335
+ }
7336
+ function resolveStack(profile) {
7337
+ if (profile.frameworks.includes("spring"))
7338
+ return "spring";
7339
+ if (profile.frameworks.includes("django"))
7340
+ return "django";
7341
+ if (profile.frameworks.includes("astro"))
7342
+ return "astro";
7343
+ if (profile.runtimes.includes("bun"))
7344
+ return "bun";
7345
+ if (profile.runtimes.includes("node"))
7346
+ return "node";
7347
+ return "unknown";
7348
+ }
7349
+ function resolveAssets(target) {
7350
+ switch (target) {
7351
+ case "opencode":
7352
+ return ["opencode.jsonc", "agents", "commands", "prompts/v0.2.0", "skills"];
7353
+ case "claude":
7354
+ return ["CLAUDE.md", "settings.json", "commands", "skills", "agents", "prompts/v0.2.0"];
7355
+ case "codex":
7356
+ return ["AGENTS.md", "skills", "prompts/v0.2.0"];
7357
+ }
7358
+ }
7359
+
7289
7360
  // src/commands/init.command.ts
7290
7361
  async function initCommand(options) {
7291
7362
  const { projectRoot, dryRun, force, global: isGlobal, output } = options;
@@ -7324,6 +7395,7 @@ async function initCommand(options) {
7324
7395
  overwrite: force
7325
7396
  }
7326
7397
  };
7398
+ const presetResolution = profile ? resolvePreset("opencode", profile) : null;
7327
7399
  const wouldCreate = [".codeconductor/config.yml"];
7328
7400
  const presetsToCopy = await resolvePresetsToCopy();
7329
7401
  for (const p of presetsToCopy) {
@@ -7341,8 +7413,11 @@ async function initCommand(options) {
7341
7413
  detected: {
7342
7414
  languages: profile.languages,
7343
7415
  runtimes: profile.runtimes,
7344
- frameworks: profile.frameworks
7345
- }
7416
+ frameworks: profile.frameworks,
7417
+ signals: profile.signals,
7418
+ confidence: profile.confidence
7419
+ },
7420
+ presetResolution
7346
7421
  } : { global: true }
7347
7422
  }
7348
7423
  };
@@ -7369,8 +7444,11 @@ async function initCommand(options) {
7369
7444
  detected: {
7370
7445
  languages: profile.languages,
7371
7446
  runtimes: profile.runtimes,
7372
- frameworks: profile.frameworks
7373
- }
7447
+ frameworks: profile.frameworks,
7448
+ signals: profile.signals,
7449
+ confidence: profile.confidence
7450
+ },
7451
+ presetResolution
7374
7452
  } : { global: true }
7375
7453
  }
7376
7454
  };
@@ -7454,7 +7532,8 @@ async function detectCommand(options) {
7454
7532
  runtimes: profile.runtimes,
7455
7533
  packageManagers: profile.packageManagers,
7456
7534
  frameworks: profile.frameworks,
7457
- signals: profile.signals
7535
+ signals: profile.signals,
7536
+ confidence: profile.confidence
7458
7537
  },
7459
7538
  recommendedPresets: getRecommendedPresets(profile)
7460
7539
  }
@@ -11486,7 +11565,8 @@ var ProjectProfileSchema = exports_external.object({
11486
11565
  runtimes: exports_external.array(exports_external.string()),
11487
11566
  packageManagers: exports_external.array(exports_external.string()),
11488
11567
  frameworks: exports_external.array(exports_external.string()),
11489
- signals: exports_external.array(exports_external.string())
11568
+ signals: exports_external.array(exports_external.string()),
11569
+ confidence: exports_external.enum(["low", "medium", "high"])
11490
11570
  });
11491
11571
  var CodeConductorConfigSchema = exports_external.object({
11492
11572
  version: exports_external.string(),
@@ -11510,7 +11590,7 @@ var CodeConductorConfigSchema = exports_external.object({
11510
11590
  })
11511
11591
  });
11512
11592
  var RunnerTargetSchema = exports_external.enum(["opencode", "claude", "codex", "all"]);
11513
- var InstallStrategySchema = exports_external.enum(["overwrite", "append", "merge-json", "skip"]);
11593
+ var InstallStrategySchema = exports_external.enum(["overwrite", "append", "merge-json", "merge-managed", "skip"]);
11514
11594
  var ManifestEntrySchema = exports_external.object({
11515
11595
  src: exports_external.string(),
11516
11596
  dest: exports_external.string(),
@@ -11589,6 +11669,43 @@ async function loadModelConfig(target) {
11589
11669
  // src/core/presets/file-copier.ts
11590
11670
  import { readFile as readFile4, writeFile as writeFile3, mkdir as mkdir3, readdir, stat } from "node:fs/promises";
11591
11671
  import { resolve as resolve5, join as join2, relative, dirname as dirname2 } from "node:path";
11672
+
11673
+ // src/core/filesystem/safe-merger.ts
11674
+ var MANAGED_BEGIN_MARKER = "<!-- CODECONDUCTOR:BEGIN managed -->";
11675
+ var MANAGED_END_MARKER = "<!-- CODECONDUCTOR:END managed -->";
11676
+ function mergeManagedBlock(existing, incoming) {
11677
+ validateMarkers(incoming, "incoming content");
11678
+ if (!existing) {
11679
+ return { content: incoming, action: "written" };
11680
+ }
11681
+ validateMarkers(existing, "existing content");
11682
+ const existingBlock = getManagedBlockRange(existing);
11683
+ const incomingBlock = getManagedBlockRange(incoming);
11684
+ return {
11685
+ content: existing.slice(0, existingBlock.start) + incoming.slice(incomingBlock.start, incomingBlock.end) + existing.slice(existingBlock.end),
11686
+ action: "merged"
11687
+ };
11688
+ }
11689
+ function validateMarkers(content, label) {
11690
+ const beginCount = countOccurrences(content, MANAGED_BEGIN_MARKER);
11691
+ const endCount = countOccurrences(content, MANAGED_END_MARKER);
11692
+ if (beginCount !== 1 || endCount !== 1) {
11693
+ throw new Error(`${label} must contain exactly one managed begin marker and one managed end marker`);
11694
+ }
11695
+ if (content.indexOf(MANAGED_BEGIN_MARKER) > content.indexOf(MANAGED_END_MARKER)) {
11696
+ throw new Error(`${label} has managed markers in the wrong order`);
11697
+ }
11698
+ }
11699
+ function getManagedBlockRange(content) {
11700
+ const start = content.indexOf(MANAGED_BEGIN_MARKER);
11701
+ const end = content.indexOf(MANAGED_END_MARKER) + MANAGED_END_MARKER.length;
11702
+ return { start, end };
11703
+ }
11704
+ function countOccurrences(content, needle) {
11705
+ return content.split(needle).length - 1;
11706
+ }
11707
+
11708
+ // src/core/presets/file-copier.ts
11592
11709
  async function listFilesRecursive(dir, base = dir) {
11593
11710
  const entries = await readdir(dir, { withFileTypes: true });
11594
11711
  const files = [];
@@ -11674,7 +11791,8 @@ async function applySingleFile(srcPath, destPath, strategy, force, dryRun, isTem
11674
11791
  } catch (e) {
11675
11792
  return { src: srcPath, dest: destPath, action: "error", error: `Cannot read source: ${e}` };
11676
11793
  }
11677
- let finalContent = content;
11794
+ const incomingContent = isTemplate && modelConfig ? renderTemplate(content, modelConfig, srcPath) : content;
11795
+ let finalContent = incomingContent;
11678
11796
  let action = "written";
11679
11797
  if (strategy === "append" && !force) {
11680
11798
  let existing = "";
@@ -11686,7 +11804,7 @@ async function applySingleFile(srcPath, destPath, strategy, force, dryRun, isTem
11686
11804
 
11687
11805
  ---
11688
11806
 
11689
- ` + content;
11807
+ ` + incomingContent;
11690
11808
  }
11691
11809
  action = "appended";
11692
11810
  } else if (strategy === "merge-json" && !force) {
@@ -11695,15 +11813,24 @@ async function applySingleFile(srcPath, destPath, strategy, force, dryRun, isTem
11695
11813
  existing = JSON.parse(await readFile4(destPath, "utf-8"));
11696
11814
  } catch {}
11697
11815
  try {
11698
- const incoming = JSON.parse(content);
11816
+ const incoming = JSON.parse(incomingContent);
11699
11817
  finalContent = JSON.stringify(mergeDeep(existing, incoming), null, 2);
11700
11818
  } catch (e) {
11701
11819
  return { src: srcPath, dest: destPath, action: "error", error: `JSON merge failed: ${e}` };
11702
11820
  }
11703
11821
  action = "merged";
11704
- }
11705
- if (isTemplate && modelConfig) {
11706
- finalContent = renderTemplate(finalContent, modelConfig, srcPath);
11822
+ } else if (strategy === "merge-managed") {
11823
+ let existing = null;
11824
+ try {
11825
+ existing = await readFile4(destPath, "utf-8");
11826
+ } catch {}
11827
+ try {
11828
+ const merged = mergeManagedBlock(existing, incomingContent);
11829
+ finalContent = merged.content;
11830
+ action = merged.action;
11831
+ } catch (e) {
11832
+ return { src: srcPath, dest: destPath, action: "error", error: `Managed merge failed: ${e}` };
11833
+ }
11707
11834
  }
11708
11835
  if (dryRun) {
11709
11836
  return { src: srcPath, dest: destPath, action, dryRun: true };
@@ -12186,6 +12313,8 @@ async function installPresetCommand(options) {
12186
12313
  try {
12187
12314
  const runnerTarget = parseRunnerTarget(target);
12188
12315
  const targets = getIndividualTargets(runnerTarget);
12316
+ const profile = await detectProject(projectRoot);
12317
+ const presetResolution = targets.map((t) => resolvePreset(t, profile));
12189
12318
  const allFileResults = [];
12190
12319
  for (const t of targets) {
12191
12320
  const manifest = await loadManifest(t);
@@ -12205,6 +12334,7 @@ async function installPresetCommand(options) {
12205
12334
  targets,
12206
12335
  global: isGlobal,
12207
12336
  dryRun,
12337
+ presetResolution,
12208
12338
  fileResults: allFileResults
12209
12339
  }
12210
12340
  };
@@ -12257,6 +12387,32 @@ async function configExists(projectRoot) {
12257
12387
  }
12258
12388
  }
12259
12389
 
12390
+ // src/core/security/target-compatibility.ts
12391
+ import { readFile as readFile6 } from "node:fs/promises";
12392
+ async function loadTargetSecurityCompatibility() {
12393
+ const policy = $parse(await readFile6(POLICY_PATH, "utf-8"));
12394
+ const targets = ["opencode", "claude", "codex"];
12395
+ return targets.map((target) => {
12396
+ const policyTarget = policy.targets?.[target];
12397
+ if (!policyTarget) {
12398
+ return {
12399
+ target,
12400
+ status: "fail",
12401
+ unsupportedRules: [],
12402
+ warnings: [`No security compatibility policy found for ${target}.`]
12403
+ };
12404
+ }
12405
+ const unsupportedRules = policyTarget.unsupportedRules ?? [];
12406
+ const warnings = policyTarget.warnings ?? [];
12407
+ return {
12408
+ target,
12409
+ status: unsupportedRules.length > 0 || warnings.length > 0 ? "warn" : "pass",
12410
+ unsupportedRules,
12411
+ warnings
12412
+ };
12413
+ });
12414
+ }
12415
+
12260
12416
  // src/commands/doctor.command.ts
12261
12417
  async function doctorCommand(options) {
12262
12418
  const { projectRoot, output } = options;
@@ -12332,6 +12488,14 @@ async function doctorCommand(options) {
12332
12488
  message: `Council preset enabled (v${config.presets.council.version})`
12333
12489
  });
12334
12490
  }
12491
+ const securityCompatibility = await loadTargetSecurityCompatibility();
12492
+ for (const compatibility of securityCompatibility) {
12493
+ checks.push({
12494
+ name: `security-${compatibility.target}`,
12495
+ status: compatibility.status,
12496
+ message: compatibility.status === "pass" ? `${compatibility.target} can represent the canonical policy model` : `${compatibility.target} cannot enforce: ${compatibility.unsupportedRules.join(", ") || "see warnings"}`
12497
+ });
12498
+ }
12335
12499
  const failedCount = checks.filter((c) => c.status === "fail").length;
12336
12500
  if (failedCount > 0) {
12337
12501
  return {
@@ -12348,7 +12512,8 @@ async function doctorCommand(options) {
12348
12512
  data: {
12349
12513
  success: true,
12350
12514
  command: "doctor",
12351
- checks
12515
+ checks,
12516
+ securityCompatibility
12352
12517
  }
12353
12518
  };
12354
12519
  } catch (error) {
@@ -12490,7 +12655,7 @@ async function updateCommand(options) {
12490
12655
  // package.json
12491
12656
  var package_default = {
12492
12657
  name: "cc-codeconductor",
12493
- version: "0.2.2",
12658
+ version: "0.2.3",
12494
12659
  description: "A multi-agent orchestration framework for AI-assisted software engineering workflows.",
12495
12660
  keywords: [
12496
12661
  "ai",
@@ -12524,6 +12689,7 @@ var package_default = {
12524
12689
  build: "bun build src/cli/main.ts --target=node --outfile=dist/index.js",
12525
12690
  test: "bun test",
12526
12691
  typecheck: "tsc --noEmit",
12692
+ "check:prompt-changelog": "bun run scripts/check-prompt-changelog.ts",
12527
12693
  "release:patch": "bash release.sh patch",
12528
12694
  "release:minor": "bash release.sh minor",
12529
12695
  "release:major": "bash release.sh major",
@@ -12777,8 +12943,10 @@ ${count} files processed${errCount > 0 ? `, ${errCount} errors` : ""}${note}`);
12777
12943
  console.log("Detected:");
12778
12944
  const detected = data.detected;
12779
12945
  Object.entries(detected).forEach(([key, value]) => {
12780
- if (value.length > 0) {
12946
+ if (Array.isArray(value) && value.length > 0) {
12781
12947
  console.log(` - ${key}: ${value.join(", ")}`);
12948
+ } else if (typeof value === "string" && value.length > 0) {
12949
+ console.log(` - ${key}: ${value}`);
12782
12950
  }
12783
12951
  });
12784
12952
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-codeconductor",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "A multi-agent orchestration framework for AI-assisted software engineering workflows.",
5
5
  "keywords": [
6
6
  "ai",
@@ -34,6 +34,7 @@
34
34
  "build": "bun build src/cli/main.ts --target=node --outfile=dist/index.js",
35
35
  "test": "bun test",
36
36
  "typecheck": "tsc --noEmit",
37
+ "check:prompt-changelog": "bun run scripts/check-prompt-changelog.ts",
37
38
  "release:patch": "bash release.sh patch",
38
39
  "release:minor": "bash release.sh minor",
39
40
  "release:major": "bash release.sh major",
@@ -0,0 +1,58 @@
1
+ ---
2
+ description: >-
3
+ [cc: alias] Run the API contract workflow for public interface changes,
4
+ compatibility constraints, contract tests, documentation, and review.
5
+ ---
6
+
7
+ # API Contract Workflow
8
+
9
+ API contract request: $ARGUMENTS
10
+
11
+ ## Step 1 — Task Card validation (Task Coach role)
12
+
13
+ Adopt the **Task Coach** role as defined in `CLAUDE.md`.
14
+
15
+ The Task Card must classify the task as high risk by default and include the
16
+ affected public interface, request/response examples, compatibility notes,
17
+ versioning impact, consumer impact, contract tests, and docs acceptance
18
+ criteria.
19
+
20
+ **STOP here. Show the completed Task Card and wait for human confirmation.**
21
+
22
+ ---
23
+
24
+ ## Step 2 — Technical Plan (Architect role)
25
+
26
+ Adopt the **Architect** role as defined in `CLAUDE.md`.
27
+
28
+ Define the API contract, validation strategy, compatibility behavior, docs or
29
+ OpenAPI changes, and reviewer blocking conditions.
30
+
31
+ **STOP here. Show the Technical Plan and wait for explicit human approval.**
32
+
33
+ ---
34
+
35
+ ## Step 3 — Implementation (Implementer role)
36
+
37
+ Adopt the **Implementer** role as defined in `CLAUDE.md`.
38
+
39
+ Apply the minimal diff, preserve compatible behavior unless explicitly approved
40
+ as breaking, and update only the planned files.
41
+
42
+ ---
43
+
44
+ ## Step 4 — Contract Tests (Tester role)
45
+
46
+ Adopt the **Tester** role as defined in `CLAUDE.md`.
47
+
48
+ Add or update tests for request shape, response shape, status/error behavior,
49
+ and backward compatibility.
50
+
51
+ ---
52
+
53
+ ## Step 5 — Review (Reviewer role)
54
+
55
+ Adopt the **Reviewer** role as defined in `CLAUDE.md`.
56
+
57
+ Block on missing contract tests, undocumented breaking changes, or docs/OpenAPI
58
+ drift.
@@ -0,0 +1,58 @@
1
+ ---
2
+ description: >-
3
+ [cc: alias] Run the database migration workflow for schema/data changes,
4
+ operational sequencing, tests, and review.
5
+ ---
6
+
7
+ # Database Migration Workflow
8
+
9
+ Migration request: $ARGUMENTS
10
+
11
+ ## Step 1 — Task Card validation (Task Coach role)
12
+
13
+ Adopt the **Task Coach** role as defined in `CLAUDE.md`.
14
+
15
+ The Task Card must classify the task as high risk and include affected schema,
16
+ model, and migration files; data backfill needs; deployment ordering;
17
+ rollback/forward-fix strategy; lock risk; data risk; and verification commands.
18
+
19
+ **STOP here. Show the completed Task Card and wait for human confirmation.**
20
+
21
+ ---
22
+
23
+ ## Step 2 — Migration Plan (Architect role)
24
+
25
+ Adopt the **Architect** role as defined in `CLAUDE.md`.
26
+
27
+ Define the schema/data plan, operational sequencing, compatibility strategy,
28
+ rollback/forward-fix notes, and test approach.
29
+
30
+ **STOP here. Show the Technical Plan and wait for explicit human approval.**
31
+
32
+ ---
33
+
34
+ ## Step 3 — Implementation (Implementer role)
35
+
36
+ Adopt the **Implementer** role as defined in `CLAUDE.md`.
37
+
38
+ Keep model and migration changes together, avoid unrelated refactors, and
39
+ preserve the deployment order specified by architect.
40
+
41
+ ---
42
+
43
+ ## Step 4 — Migration Tests (Tester role)
44
+
45
+ Adopt the **Tester** role as defined in `CLAUDE.md`.
46
+
47
+ Cover migration-sensitive behavior where the stack supports it, including
48
+ existing-data edge cases and rollback/forward-fix notes when automated rollback
49
+ tests are not practical.
50
+
51
+ ---
52
+
53
+ ## Step 5 — Review (Reviewer role)
54
+
55
+ Adopt the **Reviewer** role as defined in `CLAUDE.md`.
56
+
57
+ Block on missing migration tests, missing data-risk notes, undocumented
58
+ deployment sequencing, or model/migration drift.
@@ -1,3 +1,5 @@
1
+ <!-- CODECONDUCTOR:BEGIN managed -->
2
+
1
3
  # CodeConductor — Codex Preset
2
4
 
3
5
  This file configures CodeConductor for **OpenAI Codex CLI**. Place it at your
@@ -37,6 +39,8 @@ language patterns to activate each workflow:
37
39
  | Full feature | "Run the feature workflow for: [description]" |
38
40
  | Bug fix | "Run the fix workflow for: [description]" |
39
41
  | Refactor | "Run the refactor workflow for: [scope]" |
42
+ | API contract | "Run the API contract workflow for: [change]" |
43
+ | DB migration | "Run the database migration workflow for: [scope]" |
40
44
  | Code review | "Run a structured review of: [target]" |
41
45
  | Test plan | "Create a test plan for: [scope]" |
42
46
  | Task intake | "Help me define a Task Card for: [vague request]" |
@@ -881,3 +885,5 @@ Contract version:** v0.1.0 **Date:** [YYYY-MM-DD] **Evaluator:** [human name or
881
885
  - If the task type differs from the previous one, execute "/clear" before
882
886
  starting.
883
887
  - Delegate verbose operations to sub-agents.
888
+
889
+ <!-- CODECONDUCTOR:END managed -->
@@ -70,6 +70,8 @@ language trigger phrases:
70
70
  | Full feature | `Run the feature workflow for: [description]` |
71
71
  | Bug fix | `Run the fix workflow for: [description]` |
72
72
  | Refactor | `Run the refactor workflow for: [scope]` |
73
+ | API contract | `Run the API contract workflow for: [change]` |
74
+ | DB migration | `Run the database migration workflow for: [scope]` |
73
75
  | Code review | `Run a structured review of: [target]` |
74
76
  | Test plan | `Create a test plan for: [scope]` |
75
77
  | Task intake | `Help me define a Task Card for: [vague request]` |
@@ -0,0 +1,70 @@
1
+ ---
2
+ description:
3
+ Run the API contract workflow for request/response shape changes,
4
+ compatibility constraints, contract tests, documentation, and review.
5
+ ---
6
+
7
+ # API Contract Workflow
8
+
9
+ API contract request: $ARGUMENTS
10
+
11
+ ## Step 1 — Task Card validation (task-coach)
12
+
13
+ Invoke `task-coach` with the request above.
14
+
15
+ The Task Card must classify the task as `feature` or `refactor` with `high`
16
+ risk unless the human provides a narrower validated risk. It must include:
17
+
18
+ - affected endpoint, command, or public interface
19
+ - request and response examples
20
+ - backward compatibility and versioning impact
21
+ - consumers that must remain compatible
22
+ - contract tests and documentation acceptance criteria
23
+
24
+ **STOP here. Show the Task Card and wait for human confirmation.**
25
+
26
+ ---
27
+
28
+ ## Step 2 — Technical Plan (architect)
29
+
30
+ Invoke `architect` with the approved Task Card.
31
+
32
+ architect must define the API contract, compatibility strategy, validation
33
+ rules, docs/OpenAPI impact, and migration path for consumers.
34
+
35
+ **STOP here. Show the Technical Plan and wait for explicit human approval.**
36
+
37
+ ---
38
+
39
+ ## Step 3 — Implementation (implementer)
40
+
41
+ Invoke `implementer` with the approved plan.
42
+
43
+ implementer must apply the minimal diff, preserve compatible behavior unless a
44
+ breaking change was explicitly approved, and update only the files named in the
45
+ plan.
46
+
47
+ ---
48
+
49
+ ## Step 4 — Contract tests (tester)
50
+
51
+ Invoke `tester`.
52
+
53
+ tester must add or update contract tests covering request shape, response shape,
54
+ status/error behavior, and backward compatibility constraints.
55
+
56
+ ---
57
+
58
+ ## Step 5 — Review (reviewer)
59
+
60
+ Invoke `reviewer`.
61
+
62
+ reviewer must block on missing contract tests, undocumented breaking changes,
63
+ or docs/OpenAPI drift.
64
+
65
+ ---
66
+
67
+ ## Completion
68
+
69
+ Report the final Task Card, Technical Plan, implementation summary, test report,
70
+ review report, docs updated, compatibility impact, and residual risks.
@@ -0,0 +1,69 @@
1
+ ---
2
+ description:
3
+ Run the database migration workflow for schema/data changes, operational
4
+ sequencing, tests, and review.
5
+ ---
6
+
7
+ # Database Migration Workflow
8
+
9
+ Migration request: $ARGUMENTS
10
+
11
+ ## Step 1 — Task Card validation (task-coach)
12
+
13
+ Invoke `task-coach` with the request above.
14
+
15
+ The Task Card must classify the task as `high` risk and include:
16
+
17
+ - tables, collections, models, or migration files in scope
18
+ - data backfill or data cleanup requirements
19
+ - deployment ordering and compatibility window
20
+ - rollback or forward-fix strategy
21
+ - lock risk, data risk, and verification commands
22
+
23
+ **STOP here. Show the Task Card and wait for human confirmation.**
24
+
25
+ ---
26
+
27
+ ## Step 2 — Migration Plan (architect)
28
+
29
+ Invoke `architect` with the approved Task Card.
30
+
31
+ architect must define the schema/data plan, operational sequencing,
32
+ compatibility strategy, rollback/forward-fix notes, and test approach.
33
+
34
+ **STOP here. Show the Technical Plan and wait for explicit human approval.**
35
+
36
+ ---
37
+
38
+ ## Step 3 — Implementation (implementer)
39
+
40
+ Invoke `implementer` with the approved plan.
41
+
42
+ implementer must keep model and migration changes together, avoid unrelated
43
+ refactors, and preserve the deployment order specified by architect.
44
+
45
+ ---
46
+
47
+ ## Step 4 — Migration tests (tester)
48
+
49
+ Invoke `tester`.
50
+
51
+ tester must cover migration-sensitive behavior where the stack supports it,
52
+ including happy path, existing-data edge cases, and rollback/forward-fix notes
53
+ when automated rollback tests are not practical.
54
+
55
+ ---
56
+
57
+ ## Step 5 — Review (reviewer)
58
+
59
+ Invoke `reviewer`.
60
+
61
+ reviewer must block on missing migration tests, missing data-risk notes,
62
+ undocumented deployment sequencing, or model/migration drift.
63
+
64
+ ---
65
+
66
+ ## Completion
67
+
68
+ Report migration files changed, model files changed, tests run, lock risk, data
69
+ risk, operational sequencing, rollback/forward-fix notes, and residual risk.
@@ -2,7 +2,7 @@
2
2
  // CodeConductor policies are declarative until the policy compiler exists.
3
3
  // Enforcement depends on OpenCode permission support.
4
4
  "$schema": "https://opencode.ai/config.json",
5
- "model": "anthropic/claude-sonnet-4-6",
5
+ "model": "opencode-go/qwen3.7-max",
6
6
  "permission": {
7
7
  "*": "ask",
8
8
  "read": {
@@ -15,7 +15,7 @@
15
15
  "~/.kube/**": "deny",
16
16
  "~/.gnupg/**": "deny",
17
17
  "~/.npmrc": "deny",
18
- "~/.pypirc": "deny",
18
+ "~/.pypirc": "deny"
19
19
  },
20
20
  "edit": {
21
21
  "*": "ask",
@@ -24,12 +24,12 @@
24
24
  ".opencode/**": "deny",
25
25
  ".claude/**": "deny",
26
26
  "*.env": "deny",
27
- "*.env.*": "deny",
27
+ "*.env.*": "deny"
28
28
  },
29
29
  "glob": "allow",
30
30
  "grep": "allow",
31
31
  "external_directory": {
32
- "*": "deny",
32
+ "*": "deny"
33
33
  },
34
34
  "bash": {
35
35
  "*": "ask",
@@ -75,15 +75,15 @@
75
75
  "git push --force*": "deny",
76
76
  "git push -f*": "deny",
77
77
  "git rebase *": "deny",
78
- "git reset --hard *": "deny",
78
+ "git reset --hard *": "deny"
79
79
  },
80
80
  "webfetch": "ask",
81
81
  "websearch": "ask",
82
82
  "task": {
83
- "*": "ask",
83
+ "*": "ask"
84
84
  },
85
85
  "skill": {
86
- "*": "ask",
87
- },
88
- },
86
+ "*": "ask"
87
+ }
88
+ }
89
89
  }
@@ -9,8 +9,8 @@ description:
9
9
  | Provider | Model | Use Case |
10
10
  |----------|-------|----------|
11
11
  | Claude | claude-opus-4-7 | Complex architecture, design |
12
- | OpenCode Go | deepseek-v4-pro | Best — reasoning, technical design |
13
- | OpenCode Go | mimo-v2.5-pro | Alternative |
12
+ | OpenCode Go | opencode-go/deepseek-v4-pro | Best — reasoning, technical design |
13
+ | OpenCode Go | opencode-go/mimo-v2.5-pro | Alternative |
14
14
  ---
15
15
 
16
16
  # Agent Contract — architect v0.1.0
@@ -8,8 +8,8 @@ description:
8
8
  | Provider | Model | Use Case |
9
9
  |----------|-------|----------|
10
10
  | Claude | claude-haiku-4-5-20251001 | Fast — documentation |
11
- | OpenCode Go | qwen-3.6-plus | Best — efficient docs |
12
- | OpenCode Go | kimi-k2.6 | Alternative |
11
+ | OpenCode Go | opencode-go/qwen-3.6-plus | Best — efficient docs |
12
+ | OpenCode Go | opencode-go/kimi-k2.6 | Alternative |
13
13
  ---
14
14
 
15
15
  # Agent Contract — docs v0.1.0
@@ -8,8 +8,8 @@ description:
8
8
  | Provider | Model | Use Case |
9
9
  |----------|-------|----------|
10
10
  | Claude | claude-sonnet-4-6 | Default — code implementation |
11
- | OpenCode Go | mimo-v2.5-pro | Best — reasoning for code |
12
- | OpenCode Go | minimax-m2.7 | Alternative |
11
+ | OpenCode Go | opencode-go/mimo-v2.5-pro | Best — reasoning for code |
12
+ | OpenCode Go | opencode-go/minimax-m2.7 | Alternative |
13
13
  ---
14
14
 
15
15
  # Agent Contract — implementer v0.1.0
@@ -41,8 +41,8 @@ If either is missing, escalate to the orchestrator. Do not begin without both.
41
41
  Complete this checklist before opening any file for editing:
42
42
 
43
43
  0. Create a Git Worktree for this session before opening any file for editing:
44
- `git worktree add ../<branch>-session <branch>`
45
- All changes happen inside this worktree. Never modify the main working tree directly.
44
+ `git worktree add ../<branch>-session <branch>` All changes happen inside
45
+ this worktree. Never modify the main working tree directly.
46
46
  1. Read the Technical Plan completely.
47
47
  2. Read every file listed under "Affected Files and Modules."
48
48
  3. Understand the existing patterns in those files: naming, error handling,
@@ -9,8 +9,8 @@ description:
9
9
  | Provider | Model | Use Case |
10
10
  |----------|-------|----------|
11
11
  | Claude | claude-sonnet-4-6 | Default — coordination, routing |
12
- | OpenCode Go | deepseek-v4-pro | Complex routing, delegation |
13
- | OpenCode Go | minimax-m2.7 | Alternative |
12
+ | OpenCode Go | opencode-go/deepseek-v4-pro | Complex routing, delegation |
13
+ | OpenCode Go | opencode-go/minimax-m2.7 | Alternative |
14
14
  ---
15
15
 
16
16
  # Agent Contract — orchestrator v0.1.0
@@ -9,8 +9,8 @@ description:
9
9
  | Provider | Model | Use Case |
10
10
  |----------|-------|----------|
11
11
  | Claude | claude-haiku-4-5-20251001 | Fast — exploration |
12
- | OpenCode Go | qwen-3.6-plus | Best — quick mapping |
13
- | OpenCode Go | kimi-k2.6 | Alternative |
12
+ | OpenCode Go | opencode-go/qwen-3.6-plus | Best — quick mapping |
13
+ | OpenCode Go | opencode-go/kimi-k2.6 | Alternative |
14
14
  ---
15
15
 
16
16
  You are the Repo Explorer — the codebase mapping agent in the CodeConductor
@@ -9,8 +9,8 @@ description:
9
9
  | Provider | Model | Use Case |
10
10
  |----------|-------|----------|
11
11
  | Claude | claude-sonnet-4-6 | Default — code review |
12
- | OpenCode Go | qwen-3.6-plus | Best — efficient reviews |
13
- | OpenCode Go | minimax-m2.7 | Detailed reviews |
12
+ | OpenCode Go | opencode-go/qwen-3.6-plus | Best — efficient reviews |
13
+ | OpenCode Go | opencode-go/minimax-m2.7 | Detailed reviews |
14
14
  ---
15
15
 
16
16
  # Agent Contract — reviewer v0.1.0
@@ -9,8 +9,8 @@ description:
9
9
  | Provider | Model | Use Case |
10
10
  |----------|-------|----------|
11
11
  | Claude | claude-haiku-4-5-20251001 | Fast — intake, Q&A |
12
- | OpenCode Go | qwen-3.6-plus | Best — efficient Q&A |
13
- | OpenCode Go | kimi-k2.6 | Alternative |
12
+ | OpenCode Go | opencode-go/qwen-3.6-plus | Best — efficient Q&A |
13
+ | OpenCode Go | opencode-go/kimi-k2.6 | Alternative |
14
14
  ---
15
15
 
16
16
  # Agent Contract — task-coach v0.1.0
@@ -9,8 +9,8 @@ description:
9
9
  | Provider | Model | Use Case |
10
10
  |----------|-------|----------|
11
11
  | Claude | claude-sonnet-4-6 | Default — test generation |
12
- | OpenCode Go | minimax-m2.7 | Best — balanced reasoning |
13
- | OpenCode Go | deepseek-v4-pro | Complex test scenarios |
12
+ | OpenCode Go | opencode-go/minimax-m2.7 | Best — balanced reasoning |
13
+ | OpenCode Go | opencode-go/deepseek-v4-pro | Complex test scenarios |
14
14
  ---
15
15
 
16
16
  # Agent Contract — tester v0.1.0
@@ -20,4 +20,4 @@ entries:
20
20
  template: true
21
21
  - src: opencode/prompts/v0.2.0
22
22
  dest: .claude/prompts/v0.2.0
23
- strategy: overwrite
23
+ strategy: overwrite
@@ -2,11 +2,11 @@ target: codex
2
2
  entries:
3
3
  - src: codex/AGENTS.md
4
4
  dest: .codex/AGENTS.md
5
- strategy: overwrite
5
+ strategy: merge-managed
6
6
  template: true
7
7
  - src: codex/skills
8
8
  dest: .codex/skills
9
9
  strategy: overwrite
10
10
  - src: opencode/prompts/v0.2.0
11
11
  dest: .codex/prompts/v0.2.0
12
- strategy: overwrite
12
+ strategy: overwrite
@@ -5,33 +5,33 @@ target: claude
5
5
  agents:
6
6
  architect:
7
7
  claude: claude-opus-4-7
8
- opencode: deepseek-v4-pro
8
+ opencode: opencode-go/deepseek-v4-pro
9
9
  codex: gpt-5.5
10
10
  implementer:
11
11
  claude: claude-sonnet-4-6
12
- opencode: mimo-v2.5-pro
12
+ opencode: opencode-go/mimo-v2.5-pro
13
13
  codex: gpt-5.3-codex
14
14
  tester:
15
15
  claude: claude-sonnet-4-6
16
- opencode: minimax-m2.7
16
+ opencode: opencode-go/minimax-m2.7
17
17
  codex: gpt-5.3-codex
18
18
  orchestrator:
19
19
  claude: claude-sonnet-4-6
20
- opencode: deepseek-v4-pro
20
+ opencode: opencode-go/deepseek-v4-pro
21
21
  codex: gpt-5.2
22
22
  reviewer:
23
23
  claude: claude-sonnet-4-6
24
- opencode: qwen-3.6-plus
24
+ opencode: opencode-go/qwen-3.6-plus
25
25
  codex: gpt-5.4
26
26
  docs:
27
27
  claude: claude-haiku-4-5-20251001
28
- opencode: qwen-3.6-plus
28
+ opencode: opencode-go/qwen-3.6-plus
29
29
  codex: gpt-5.4-mini
30
30
  task-coach:
31
31
  claude: claude-haiku-4-5-20251001
32
- opencode: qwen-3.6-plus
32
+ opencode: opencode-go/kimi-k2.6
33
33
  codex: gpt-5.4-mini
34
34
  repo-explorer:
35
35
  claude: claude-haiku-4-5-20251001
36
- opencode: qwen-3.6-plus
37
- codex: gpt-5.4-mini
36
+ opencode: opencode-go/qwen3.5-plus
37
+ codex: gpt-5.4-mini
@@ -6,33 +6,33 @@ target: codex
6
6
  agents:
7
7
  architect:
8
8
  claude: claude-opus-4-7
9
- opencode: deepseek-v4-pro
9
+ opencode: opencode-go/deepseek-v4-pro
10
10
  codex: gpt-5.5
11
11
  implementer:
12
12
  claude: claude-sonnet-4-6
13
- opencode: mimo-v2.5-pro
13
+ opencode: opencode-go/mimo-v2.5-pro
14
14
  codex: gpt-5.3-codex
15
15
  tester:
16
16
  claude: claude-sonnet-4-6
17
- opencode: minimax-m2.7
17
+ opencode: opencode-go/minimax-m2.7
18
18
  codex: gpt-5.3-codex
19
19
  orchestrator:
20
20
  claude: claude-sonnet-4-6
21
- opencode: deepseek-v4-pro
21
+ opencode: opencode-go/deepseek-v4-pro
22
22
  codex: gpt-5.2
23
23
  reviewer:
24
24
  claude: claude-sonnet-4-6
25
- opencode: qwen-3.6-plus
25
+ opencode: opencode-go/qwen-3.6-plus
26
26
  codex: gpt-5.4
27
27
  docs:
28
28
  claude: claude-haiku-4-5-20251001
29
- opencode: qwen-3.6-plus
29
+ opencode: opencode-go/qwen-3.6-plus
30
30
  codex: gpt-5.4-mini
31
31
  task-coach:
32
32
  claude: claude-haiku-4-5-20251001
33
- opencode: qwen-3.6-plus
33
+ opencode: opencode-go/kimi-k2.6
34
34
  codex: gpt-5.4-mini
35
35
  repo-explorer:
36
36
  claude: claude-haiku-4-5-20251001
37
- opencode: qwen-3.6-plus
38
- codex: gpt-5.4-mini
37
+ opencode: opencode-go/qwen3.5-plus
38
+ codex: gpt-5.4-mini
@@ -5,33 +5,33 @@ target: opencode
5
5
  agents:
6
6
  architect:
7
7
  claude: claude-opus-4-7
8
- opencode: deepseek-v4-pro
8
+ opencode: opencode-go/deepseek-v4-pro
9
9
  codex: gpt-5.5
10
10
  implementer:
11
11
  claude: claude-sonnet-4-6
12
- opencode: mimo-v2.5-pro
12
+ opencode: opencode-go/mimo-v2.5-pro
13
13
  codex: gpt-5.3-codex
14
14
  tester:
15
15
  claude: claude-sonnet-4-6
16
- opencode: minimax-m2.7
16
+ opencode: opencode-go/minimax-m2.7
17
17
  codex: gpt-5.3-codex
18
18
  orchestrator:
19
19
  claude: claude-sonnet-4-6
20
- opencode: deepseek-v4-pro
20
+ opencode: opencode-go/deepseek-v4-pro
21
21
  codex: gpt-5.2
22
22
  reviewer:
23
23
  claude: claude-sonnet-4-6
24
- opencode: qwen-3.6-plus
24
+ opencode: opencode-go/qwen-3.6-plus
25
25
  codex: gpt-5.4
26
26
  docs:
27
27
  claude: claude-haiku-4-5-20251001
28
- opencode: qwen-3.6-plus
28
+ opencode: opencode-go/qwen-3.6-plus
29
29
  codex: gpt-5.4-mini
30
30
  task-coach:
31
31
  claude: claude-haiku-4-5-20251001
32
- opencode: qwen-3.6-plus
32
+ opencode: opencode-go/kimi-k2.6
33
33
  codex: gpt-5.4-mini
34
34
  repo-explorer:
35
35
  claude: claude-haiku-4-5-20251001
36
- opencode: qwen-3.6-plus
37
- codex: gpt-5.4-mini
36
+ opencode: opencode-go/qwen3.5-plus
37
+ codex: gpt-5.4-mini