cc-codeconductor 1.5.1 → 1.6.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.
Files changed (32) hide show
  1. package/README.md +9 -9
  2. package/dist/core/runner/runner-target.d.ts +4 -4
  3. package/dist/core/verification/rdd-receipt.d.ts +19 -0
  4. package/dist/core/verification/verification-runner.d.ts +16 -0
  5. package/dist/index.js +1377 -635
  6. package/dist/library.js +52 -14
  7. package/dist/validation/schemas.d.ts +27 -22
  8. package/package.json +2 -1
  9. package/presets/agy/skills/cc-feature/SKILL.md +17 -16
  10. package/presets/agy/skills/cc-fix/SKILL.md +28 -34
  11. package/presets/agy/skills/openspec/SKILL.md +39 -11
  12. package/presets/agy/workflows/cc-council.md +4 -2
  13. package/presets/claude/commands/cc/council.md +2 -83
  14. package/presets/claude/commands/cc/openspec.md +20 -1
  15. package/presets/claude/skills/openspec/SKILL.md +39 -11
  16. package/presets/codex/skills/cc-council/SKILL.md +2 -93
  17. package/presets/codex/skills/cc-openspec/SKILL.md +20 -1
  18. package/presets/codex/skills/openspec/SKILL.md +39 -11
  19. package/presets/cursor/commands/cc/council.md +2 -83
  20. package/presets/cursor/commands/cc/openspec.md +20 -1
  21. package/presets/cursor/skills/openspec/SKILL.md +39 -11
  22. package/presets/gemini/commands/cc/council.toml +2 -83
  23. package/presets/gemini/commands/cc/openspec.toml +20 -1
  24. package/presets/muse/AGENTS.md +46 -0
  25. package/presets/muse/hooks.json +30 -0
  26. package/presets/opencode/commands/cc-council.md +2 -83
  27. package/presets/opencode/commands/cc-openspec.md +5 -3
  28. package/presets/opencode/skills/openspec/SKILL.md +39 -11
  29. package/src/presets/manifests/muse.yml +18 -0
  30. package/src/presets/models/muse.yml +4 -0
  31. package/src/presets/models/roles.yml +14 -0
  32. package/src/presets/targets/muse.yml +12 -0
package/dist/library.js CHANGED
@@ -25,13 +25,20 @@ var init_runner_target = __esm(() => {
25
25
  "cursor",
26
26
  "agy",
27
27
  "pi",
28
+ "muse",
28
29
  "all"
29
30
  ];
30
- INDIVIDUAL_TARGETS = ["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi"];
31
+ INDIVIDUAL_TARGETS = ["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi", "muse"];
31
32
  });
32
33
 
33
34
  // src/validation/schemas.ts
35
+ import { isAbsolute } from "node:path";
34
36
  import { z } from "zod";
37
+ function isContainedRelativePath(value) {
38
+ if (value === "" || isAbsolute(value))
39
+ return false;
40
+ return !value.replace(/\\/g, "/").split("/").includes("..");
41
+ }
35
42
  function validateCouncilSpec(data) {
36
43
  return CouncilSpecSchema.parse(data);
37
44
  }
@@ -149,7 +156,7 @@ function validateProductEvent(data) {
149
156
  function validateSkillsRegistry(data) {
150
157
  return SkillsRegistrySchema.parse(data);
151
158
  }
152
- var CouncilAgentSpecSchema, CouncilSpecSchema, ProjectProfileSchema, CompileCheckConfigSchema, LoopConfigSchema, CodeConductorConfigSchema, RunnerTargetSchema, InstallStrategySchema, ManifestEntrySchema, InstallManifestSchema, ToolProviderNamesSchema, PermissionProviderNamesSchema, ModelConfigSchema, SkillFrontmatterSchema, CommandFrontmatterSchema, TargetCapabilitiesSchema, ContractTargetSchema, ContractFormatSchema, AgentContractSchema, CouncilFindingSchema, CouncilVerdictInputSchema, ConsensusConfigSchema, CouncilVerdictSchema, ClaudeAgentFileSchema, OpenCodeAgentFileSchema, SentryStackFrameSchema, SentryWebhookSchema, MemoryPointerSchema, MemoryIndexSchema, GoalTaskSchema, GoalGraphSchema, ConfidenceLevelSchema, ProductNodeTypeSchema, GraphRelationSchema, KnowledgeEntitySchema, DecisionSchema, EvidenceSchema, CanonicalTaskCardStatusSchema, CanonicalTaskCardSchema, ProductGraphNodeSchema, ProductGraphEdgeSchema, ProductGraphSchema, ProductMetaSchema, ProductEventTypeSchema, ProductEventSchema, OperationalStateSchema, StrategicMemorySchema, ImpactReportSchema, BusinessReviewOutputSchema, VerificationReportSchema, BacklogStatusSchema, BacklogTypeSchema, BacklogPrioritySchema, BacklogGlobalSchema, BacklogItemSchema, BacklogDocumentSchema, OpenspecTaskCardPhaseSchema, OpenspecTaskCardStatusSchema, OpenspecTaskCardSchema, OpenspecStateSchema, SpecAnalyzeFindingSchema, SpecAnalyzeReportSchema, WorkflowCommandSchema, CcepOutputFormatSchema, CommandEnvelopeSchema, WorkflowPhaseSchema, WorkflowRiskRuleSchema, WorkflowProfileSchema, ExecutionContextSchema, PlannerOutputSchema, AgentArtifactSchema, AgentOutputSchema, ImplementerTestsSchema, ImplementerOutputSchema, ReviewAxisSchema, ReviewFindingSchema, ReviewerOutputSchema, TechnicalPlanOutputSchema, FixIntakeOutputSchema, ScorecardVerdictSchema, ScorecardCriterionIdSchema, ScorecardCriterionSchema, ScorecardRecordSchema, TaskOutcomeSourceSchema, TaskOutcomeStatusSchema, DeliveryRouteSchema, TokenUsageSchema, DeliveryTelemetrySchema, DeliveryLedgerTaskSchema, DeliveryLedgerSchema, HandoffEnvelopeSchema, RepoRelativePathSchema, DeliveryLedgerRequestSchema, TaskOutcomeSchema, HarnessComponentIdSchema, HarnessComponentLayerSchema, HarnessToggleKindSchema, HarnessCatalogEntrySchema, HarnessCatalogSchema, HarnessOverlaySchema, HarnessExperimentSchema, HarnessSuiteTaskSchema, HarnessSuiteSchema, EvaluationIndexSchema, ExecutionProfileNameSchema, ExecutionProfileSchema, SkillsRegistrySchema;
159
+ var CouncilAgentSpecSchema, CouncilSpecSchema, ProjectProfileSchema, CompileCheckConfigSchema, LoopConfigSchema, CodeConductorConfigSchema, RunnerTargetSchema, InstallStrategySchema, ContainedRelativePathSchema, ManifestEntrySchema, InstallManifestSchema, ToolProviderNamesSchema, PermissionProviderNamesSchema, ModelConfigSchema, SkillFrontmatterSchema, CommandFrontmatterSchema, TargetCapabilitiesSchema, ContractTargetSchema, ContractFormatSchema, AgentContractSchema, CouncilFindingSchema, CouncilVerdictInputSchema, ConsensusConfigSchema, CouncilVerdictSchema, ClaudeAgentFileSchema, OpenCodeAgentFileSchema, SentryStackFrameSchema, SentryWebhookSchema, MemoryPointerSchema, MemoryIndexSchema, GoalTaskSchema, GoalGraphSchema, ConfidenceLevelSchema, ProductNodeTypeSchema, GraphRelationSchema, KnowledgeEntitySchema, DecisionSchema, EvidenceSchema, CanonicalTaskCardStatusSchema, CanonicalTaskCardSchema, ProductGraphNodeSchema, ProductGraphEdgeSchema, ProductGraphSchema, ProductMetaSchema, ProductEventTypeSchema, ProductEventSchema, OperationalStateSchema, StrategicMemorySchema, ImpactReportSchema, BusinessReviewOutputSchema, VerificationReportSchema, BacklogStatusSchema, BacklogTypeSchema, BacklogPrioritySchema, BacklogGlobalSchema, BacklogItemSchema, BacklogDocumentSchema, OpenspecTaskCardPhaseSchema, OpenspecTaskCardStatusSchema, OpenspecTaskCardSchema, OpenspecStateSchema, SpecAnalyzeFindingSchema, SpecAnalyzeReportSchema, WorkflowCommandSchema, CcepOutputFormatSchema, CommandEnvelopeSchema, WorkflowPhaseSchema, WorkflowRiskRuleSchema, WorkflowProfileSchema, ExecutionContextSchema, PlannerOutputSchema, AgentArtifactSchema, AgentOutputSchema, ImplementerTestsSchema, ImplementerOutputSchema, ReviewAxisSchema, ReviewFindingSchema, ReviewerOutputSchema, TechnicalPlanOutputSchema, FixIntakeOutputSchema, ScorecardVerdictSchema, ScorecardCriterionIdSchema, ScorecardCriterionSchema, ScorecardRecordSchema, TaskOutcomeSourceSchema, TaskOutcomeStatusSchema, DeliveryRouteSchema, TokenUsageSchema, DeliveryTelemetrySchema, DeliveryLedgerTaskSchema, DeliveryLedgerSchema, HandoffEnvelopeSchema, RepoRelativePathSchema, DeliveryLedgerRequestSchema, TaskOutcomeSchema, HarnessComponentIdSchema, HarnessComponentLayerSchema, HarnessToggleKindSchema, HarnessCatalogEntrySchema, HarnessCatalogSchema, HarnessOverlaySchema, HarnessExperimentSchema, HarnessSuiteTaskSchema, HarnessSuiteSchema, EvaluationIndexSchema, ExecutionProfileNameSchema, ExecutionProfileSchema, SkillsRegistrySchema;
153
160
  var init_schemas = __esm(() => {
154
161
  init_runner_target();
155
162
  CouncilAgentSpecSchema = z.object({
@@ -229,9 +236,12 @@ var init_schemas = __esm(() => {
229
236
  "create-only",
230
237
  "skip"
231
238
  ]);
239
+ ContainedRelativePathSchema = z.string().refine(isContainedRelativePath, (value) => ({
240
+ message: `Path must be relative without ".." segments: ${value}`
241
+ }));
232
242
  ManifestEntrySchema = z.object({
233
- src: z.string(),
234
- dest: z.string(),
243
+ src: ContainedRelativePathSchema,
244
+ dest: ContainedRelativePathSchema,
235
245
  strategy: InstallStrategySchema,
236
246
  globalStrategy: InstallStrategySchema.optional(),
237
247
  template: z.boolean().optional()
@@ -252,7 +262,8 @@ var init_schemas = __esm(() => {
252
262
  cursor: z.string().optional(),
253
263
  agy: z.string().optional(),
254
264
  pi: z.string().optional(),
255
- grok: z.string().optional()
265
+ grok: z.string().optional(),
266
+ muse: z.string().optional()
256
267
  })),
257
268
  tools: z.record(z.string(), ToolProviderNamesSchema).optional(),
258
269
  permissions: PermissionProviderNamesSchema.optional()
@@ -1745,11 +1756,11 @@ async function runCompileCheck(options) {
1745
1756
  }
1746
1757
  }
1747
1758
  // src/core/verification/verification-runner.ts
1748
- import { mkdir as mkdir5, readdir as readdir2, writeFile as writeFile4 } from "node:fs/promises";
1759
+ import { mkdir as mkdir6, readdir as readdir2, writeFile as writeFile5 } from "node:fs/promises";
1749
1760
 
1750
1761
  // src/core/verification/rdd-receipt.ts
1751
- import { createHash } from "node:crypto";
1752
- import { readdir, readFile as readFile6 } from "node:fs/promises";
1762
+ import { createHash, randomBytes } from "node:crypto";
1763
+ import { mkdir as mkdir5, readdir, readFile as readFile6, writeFile as writeFile4 } from "node:fs/promises";
1753
1764
  import { join as join2, relative, resolve as resolve5, sep } from "node:path";
1754
1765
  var EXCLUDED_DIRECTORIES = new Set([
1755
1766
  ".git",
@@ -1790,6 +1801,23 @@ function manifestHash(paths) {
1790
1801
  return sha256(paths.map((entry) => `${entry.path}\x00${entry.hash}`).join(`
1791
1802
  `));
1792
1803
  }
1804
+ function receiptRegistryDir(projectRoot) {
1805
+ return join2(resolve5(projectRoot), ".codeconductor", "rdd-receipts");
1806
+ }
1807
+ function isWellFormedNonce(nonce) {
1808
+ return typeof nonce === "string" && /^[0-9a-f]{32}$/.test(nonce);
1809
+ }
1810
+ async function isRegisteredReceipt(projectRoot, receipt) {
1811
+ if (!isWellFormedNonce(receipt.nonce))
1812
+ return false;
1813
+ try {
1814
+ const raw = await readFile6(join2(receiptRegistryDir(projectRoot), `${receipt.nonce}.json`), "utf-8");
1815
+ const entry = JSON.parse(raw);
1816
+ return entry.manifestHash === receipt.manifestHash;
1817
+ } catch {
1818
+ return false;
1819
+ }
1820
+ }
1793
1821
  function isRddReceipt(value) {
1794
1822
  if (!value || typeof value !== "object")
1795
1823
  return false;
@@ -1803,17 +1831,26 @@ async function captureReceipt(projectRoot, input) {
1803
1831
  throw new Error("RDD receipts require at least one protected path");
1804
1832
  }
1805
1833
  const paths = await fingerprint(projectRoot, input.paths);
1806
- return {
1834
+ const hashed = manifestHash(paths);
1835
+ const nonce = randomBytes(16).toString("hex");
1836
+ const capturedAt = new Date().toISOString();
1837
+ const receipt = {
1807
1838
  version: 1,
1808
1839
  taskId: input.taskId,
1809
1840
  phase: input.phase,
1810
1841
  paths,
1811
1842
  coverage: input.coverage ?? "paths",
1812
- manifestHash: manifestHash(paths),
1843
+ manifestHash: hashed,
1813
1844
  command: input.command,
1814
1845
  outcome: input.outcome,
1815
- capturedAt: new Date().toISOString()
1846
+ capturedAt,
1847
+ nonce
1816
1848
  };
1849
+ const directory = receiptRegistryDir(projectRoot);
1850
+ await mkdir5(directory, { recursive: true });
1851
+ const entry = { manifestHash: hashed, taskId: input.taskId, capturedAt };
1852
+ await writeFile4(join2(directory, `${nonce}.json`), JSON.stringify(entry, null, 2), "utf-8");
1853
+ return receipt;
1817
1854
  }
1818
1855
  async function collectReceiptPaths(projectRoot) {
1819
1856
  const root = resolve5(projectRoot);
@@ -1834,6 +1871,7 @@ async function collectReceiptPaths(projectRoot) {
1834
1871
  return paths.sort();
1835
1872
  }
1836
1873
  async function verifyReceipt(projectRoot, receipt) {
1874
+ const registered = await isRegisteredReceipt(projectRoot, receipt);
1837
1875
  const expected = new Map(receipt.paths.map((entry) => [entry.path, entry.hash]));
1838
1876
  const changedPaths = [];
1839
1877
  const current = [];
@@ -1859,7 +1897,7 @@ async function verifyReceipt(projectRoot, receipt) {
1859
1897
  changedPaths.sort();
1860
1898
  const actualHash = manifestHash(current.sort((left, right) => left.path.localeCompare(right.path)));
1861
1899
  return {
1862
- valid: changedPaths.length === 0 && actualHash === receipt.manifestHash,
1900
+ valid: registered && changedPaths.length === 0 && actualHash === receipt.manifestHash,
1863
1901
  expectedHash: receipt.manifestHash,
1864
1902
  actualHash,
1865
1903
  changedPaths
@@ -1904,8 +1942,8 @@ async function persistEvidence(projectRoot, evidence) {
1904
1942
  if (!evidencePath.success)
1905
1943
  return evidencePath;
1906
1944
  try {
1907
- await mkdir5(evDir, { recursive: true });
1908
- await writeFile4(evidencePath.data, JSON.stringify(evidence, null, 2), "utf-8");
1945
+ await mkdir6(evDir, { recursive: true });
1946
+ await writeFile5(evidencePath.data, JSON.stringify(evidence, null, 2), "utf-8");
1909
1947
  } catch (e) {
1910
1948
  return err(e instanceof Error ? e : new Error(String(e)));
1911
1949
  }
@@ -182,15 +182,15 @@ export declare const CodeConductorConfigSchema: z.ZodObject<{
182
182
  profile?: string | undefined;
183
183
  }>;
184
184
  defaults: z.ZodObject<{
185
- target: z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi"]>;
185
+ target: z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi", "muse"]>;
186
186
  overwrite: z.ZodBoolean;
187
187
  locale: z.ZodDefault<z.ZodOptional<z.ZodEnum<["en", "es"]>>>;
188
188
  }, "strip", z.ZodTypeAny, {
189
- target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi";
189
+ target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse";
190
190
  overwrite: boolean;
191
191
  locale: "en" | "es";
192
192
  }, {
193
- target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi";
193
+ target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse";
194
194
  overwrite: boolean;
195
195
  locale?: "en" | "es" | undefined;
196
196
  }>;
@@ -287,7 +287,7 @@ export declare const CodeConductorConfigSchema: z.ZodObject<{
287
287
  profile?: string | undefined;
288
288
  };
289
289
  defaults: {
290
- target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi";
290
+ target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse";
291
291
  overwrite: boolean;
292
292
  locale: "en" | "es";
293
293
  };
@@ -322,7 +322,7 @@ export declare const CodeConductorConfigSchema: z.ZodObject<{
322
322
  profile?: string | undefined;
323
323
  };
324
324
  defaults: {
325
- target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi";
325
+ target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse";
326
326
  overwrite: boolean;
327
327
  locale?: "en" | "es" | undefined;
328
328
  };
@@ -354,14 +354,14 @@ export declare const CodeConductorConfigSchema: z.ZodObject<{
354
354
  /**
355
355
  * Runner target schema
356
356
  */
357
- export declare const RunnerTargetSchema: z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi", "all"]>;
357
+ export declare const RunnerTargetSchema: z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi", "muse", "all"]>;
358
358
  /**
359
359
  * Install manifest schemas
360
360
  */
361
361
  export declare const InstallStrategySchema: z.ZodEnum<["overwrite", "append", "merge-json", "merge-managed", "create-only", "skip"]>;
362
362
  export declare const ManifestEntrySchema: z.ZodObject<{
363
- src: z.ZodString;
364
- dest: z.ZodString;
363
+ src: z.ZodEffects<z.ZodString, string, string>;
364
+ dest: z.ZodEffects<z.ZodString, string, string>;
365
365
  strategy: z.ZodEnum<["overwrite", "append", "merge-json", "merge-managed", "create-only", "skip"]>;
366
366
  globalStrategy: z.ZodOptional<z.ZodEnum<["overwrite", "append", "merge-json", "merge-managed", "create-only", "skip"]>>;
367
367
  template: z.ZodOptional<z.ZodBoolean>;
@@ -379,10 +379,10 @@ export declare const ManifestEntrySchema: z.ZodObject<{
379
379
  template?: boolean | undefined;
380
380
  }>;
381
381
  export declare const InstallManifestSchema: z.ZodObject<{
382
- target: z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi"]>;
382
+ target: z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi", "muse"]>;
383
383
  entries: z.ZodArray<z.ZodObject<{
384
- src: z.ZodString;
385
- dest: z.ZodString;
384
+ src: z.ZodEffects<z.ZodString, string, string>;
385
+ dest: z.ZodEffects<z.ZodString, string, string>;
386
386
  strategy: z.ZodEnum<["overwrite", "append", "merge-json", "merge-managed", "create-only", "skip"]>;
387
387
  globalStrategy: z.ZodOptional<z.ZodEnum<["overwrite", "append", "merge-json", "merge-managed", "create-only", "skip"]>>;
388
388
  template: z.ZodOptional<z.ZodBoolean>;
@@ -407,7 +407,7 @@ export declare const InstallManifestSchema: z.ZodObject<{
407
407
  globalStrategy?: "overwrite" | "append" | "merge-json" | "merge-managed" | "create-only" | "skip" | undefined;
408
408
  template?: boolean | undefined;
409
409
  }[];
410
- target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi";
410
+ target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse";
411
411
  }, {
412
412
  entries: {
413
413
  src: string;
@@ -416,7 +416,7 @@ export declare const InstallManifestSchema: z.ZodObject<{
416
416
  globalStrategy?: "overwrite" | "append" | "merge-json" | "merge-managed" | "create-only" | "skip" | undefined;
417
417
  template?: boolean | undefined;
418
418
  }[];
419
- target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi";
419
+ target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse";
420
420
  }>;
421
421
  /**
422
422
  * Tool provider names schema — maps base tool names to provider-specific names
@@ -427,7 +427,7 @@ export declare const PermissionProviderNamesSchema: z.ZodRecord<z.ZodString, z.Z
427
427
  * Model config schema — defines model names per provider per agent role
428
428
  */
429
429
  export declare const ModelConfigSchema: z.ZodObject<{
430
- target: z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi"]>;
430
+ target: z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi", "muse"]>;
431
431
  agents: z.ZodRecord<z.ZodString, z.ZodObject<{
432
432
  claude: z.ZodOptional<z.ZodString>;
433
433
  opencode: z.ZodOptional<z.ZodString>;
@@ -437,6 +437,7 @@ export declare const ModelConfigSchema: z.ZodObject<{
437
437
  agy: z.ZodOptional<z.ZodString>;
438
438
  pi: z.ZodOptional<z.ZodString>;
439
439
  grok: z.ZodOptional<z.ZodString>;
440
+ muse: z.ZodOptional<z.ZodString>;
440
441
  }, "strip", z.ZodTypeAny, {
441
442
  opencode?: string | undefined;
442
443
  claude?: string | undefined;
@@ -445,6 +446,7 @@ export declare const ModelConfigSchema: z.ZodObject<{
445
446
  cursor?: string | undefined;
446
447
  agy?: string | undefined;
447
448
  pi?: string | undefined;
449
+ muse?: string | undefined;
448
450
  grok?: string | undefined;
449
451
  }, {
450
452
  opencode?: string | undefined;
@@ -454,6 +456,7 @@ export declare const ModelConfigSchema: z.ZodObject<{
454
456
  cursor?: string | undefined;
455
457
  agy?: string | undefined;
456
458
  pi?: string | undefined;
459
+ muse?: string | undefined;
457
460
  grok?: string | undefined;
458
461
  }>>;
459
462
  tools: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>>;
@@ -467,9 +470,10 @@ export declare const ModelConfigSchema: z.ZodObject<{
467
470
  cursor?: string | undefined;
468
471
  agy?: string | undefined;
469
472
  pi?: string | undefined;
473
+ muse?: string | undefined;
470
474
  grok?: string | undefined;
471
475
  }>;
472
- target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi";
476
+ target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse";
473
477
  tools?: Record<string, Record<string, string>> | undefined;
474
478
  permissions?: Record<string, string> | undefined;
475
479
  }, {
@@ -481,9 +485,10 @@ export declare const ModelConfigSchema: z.ZodObject<{
481
485
  cursor?: string | undefined;
482
486
  agy?: string | undefined;
483
487
  pi?: string | undefined;
488
+ muse?: string | undefined;
484
489
  grok?: string | undefined;
485
490
  }>;
486
- target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi";
491
+ target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse";
487
492
  tools?: Record<string, Record<string, string>> | undefined;
488
493
  permissions?: Record<string, string> | undefined;
489
494
  }>;
@@ -550,7 +555,7 @@ export type CommandFrontmatter = z.infer<typeof CommandFrontmatterSchema>;
550
555
  * preset doesn't ship an MCP config, so `mcp: false` here).
551
556
  */
552
557
  export declare const TargetCapabilitiesSchema: z.ZodObject<{
553
- target: z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi"]>;
558
+ target: z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi", "muse"]>;
554
559
  invocation: z.ZodEnum<["colon", "hyphen", "dollar"]>;
555
560
  commandFormat: z.ZodEnum<["markdown", "toml", "skill"]>;
556
561
  contextFile: z.ZodString;
@@ -580,7 +585,7 @@ export declare const TargetCapabilitiesSchema: z.ZodObject<{
580
585
  mcp: boolean;
581
586
  }>;
582
587
  }, "strip", z.ZodTypeAny, {
583
- target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi";
588
+ target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse";
584
589
  invocation: "colon" | "hyphen" | "dollar";
585
590
  commandFormat: "markdown" | "toml" | "skill";
586
591
  contextFile: string;
@@ -592,7 +597,7 @@ export declare const TargetCapabilitiesSchema: z.ZodObject<{
592
597
  };
593
598
  subagentInvocationStyle?: "task-tool" | "adopt-role" | "invoke-with-context" | undefined;
594
599
  }, {
595
- target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi";
600
+ target: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse";
596
601
  invocation: "colon" | "hyphen" | "dollar";
597
602
  commandFormat: "markdown" | "toml" | "skill";
598
603
  contextFile: string;
@@ -4714,7 +4719,7 @@ export declare const EvaluationIndexSchema: z.ZodObject<{
4714
4719
  export declare const ExecutionProfileNameSchema: z.ZodEnum<["balanced", "quality", "economical"]>;
4715
4720
  export declare const ExecutionProfileSchema: z.ZodObject<{
4716
4721
  profile: z.ZodDefault<z.ZodEnum<["balanced", "quality", "economical"]>>;
4717
- target: z.ZodOptional<z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi"]>>;
4722
+ target: z.ZodOptional<z.ZodEnum<["opencode", "claude", "codex", "gemini", "cursor", "agy", "pi", "muse"]>>;
4718
4723
  overrides: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
4719
4724
  subagentPolicy: z.ZodOptional<z.ZodObject<{
4720
4725
  orchestrator: z.ZodOptional<z.ZodEnum<["primary", "delegate"]>>;
@@ -4729,14 +4734,14 @@ export declare const ExecutionProfileSchema: z.ZodObject<{
4729
4734
  }, "strip", z.ZodTypeAny, {
4730
4735
  profile: "balanced" | "quality" | "economical";
4731
4736
  overrides: Record<string, string>;
4732
- target?: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | undefined;
4737
+ target?: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse" | undefined;
4733
4738
  subagentPolicy?: {
4734
4739
  orchestrator?: "primary" | "delegate" | undefined;
4735
4740
  testerReviewer?: "primary" | "delegate" | undefined;
4736
4741
  } | undefined;
4737
4742
  }, {
4738
4743
  profile?: "balanced" | "quality" | "economical" | undefined;
4739
- target?: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | undefined;
4744
+ target?: "opencode" | "claude" | "codex" | "gemini" | "cursor" | "agy" | "pi" | "muse" | undefined;
4740
4745
  overrides?: Record<string, string> | undefined;
4741
4746
  subagentPolicy?: {
4742
4747
  orchestrator?: "primary" | "delegate" | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-codeconductor",
3
- "version": "1.5.1",
3
+ "version": "1.6.1",
4
4
  "description": "A multi-agent orchestration framework for AI-assisted software engineering workflows.",
5
5
  "keywords": [
6
6
  "ai",
@@ -54,6 +54,7 @@
54
54
  "test:fast": "bun run scripts/test-fast.ts",
55
55
  "typecheck": "tsc --noEmit",
56
56
  "lint": "bun run scripts/lint.ts",
57
+ "check:council-redirect": "bun run scripts/check-council-redirect.ts",
57
58
  "check:coverage": "bun run scripts/check-coverage.ts",
58
59
  "check:prompt-changelog": "bun run scripts/check-prompt-changelog.ts",
59
60
  "check:drift": "bun run scripts/check-drift.ts",
@@ -66,31 +66,32 @@ not invoke implementer until the plan is approved.**
66
66
 
67
67
  ---
68
68
 
69
- ## Step 3 — Implementation (implementer)
69
+ ## Step 3 — Test coverage (tester)
70
70
 
71
- Invoke `implementer` with the approved Technical Plan and the Task Card.
72
- Implementer creates a Git Worktree before touching any file; all edits happen inside it.
71
+ Invoke `tester` with the approved Technical Plan and the Task Card.
73
72
 
74
- implementer must:
73
+ tester must:
75
74
 
76
- 1. Read the Technical Plan before touching any file
77
- 2. Apply the minimal diff — only what the plan specifies
78
- 3. Run the project test suite after implementation
79
- 4. Produce an Implementation Summary: what changed, which files, how to verify
80
- locally
75
+ 1. Write failing tests to cover the new behavior (RED)
76
+ 2. Ensure all acceptance criteria from the Task Card have at least one test
77
+ 3. Confirm the new tests fail for the right reason before implementation
78
+ 4. Produce a Coverage Summary: test files added or modified, cases covered
81
79
 
82
80
  ---
83
81
 
84
- ## Step 4 — Test coverage (tester)
82
+ ## Step 4 — Implementation (implementer)
85
83
 
86
- Invoke `tester` with the Implementation Summary and the Task Card.
84
+ Invoke `implementer` with the approved Technical Plan, the Task Card, and the
85
+ failing tests from Step 3.
86
+ Implementer creates a Git Worktree before touching any file; all edits happen inside it.
87
87
 
88
- tester must:
88
+ implementer must:
89
89
 
90
- 1. Write or extend tests to cover the new behavior
91
- 2. Ensure all acceptance criteria from the Task Card have at least one test
92
- 3. Run the full test suite and confirm it passes
93
- 4. Produce a Coverage Summary: test files added or modified, cases covered
90
+ 1. Read the Technical Plan before touching any file
91
+ 2. Apply the minimal diff to make the failing tests pass — only what the plan specifies
92
+ 3. Run the project test suite after implementation
93
+ 4. Produce an Implementation Summary: what changed, which files, how to verify
94
+ locally
94
95
 
95
96
  ---
96
97
 
@@ -21,24 +21,17 @@ Provide the following information in $ARGUMENTS:
21
21
 
22
22
  ## Web interface scope
23
23
 
24
- When the task concerns web layout, component states, feedback, motion, or a
25
- requested UI audit, apply skill `web-design-engineering` from the installed skill
26
- library. Use it during intake/discovery, design, test/implement, and review as
27
- applicable; keep this workflow’s gates and TDD order. Framework presence alone
28
- does not activate it; backend-only and native mobile work are excluded. Record
29
- required visual checks as pending when unavailable. Keep findings in the existing
30
- Review Report: contract failures in Spec Axis, technical issues in existing
31
- subchecks, and aesthetic preferences as suggestions; do not add an axis.
24
+ Same web scope as `cc-feature`: when the fix concerns web layout, component
25
+ states, feedback, motion, or a requested UI audit, apply skill
26
+ `web-design-engineering` during test/implementation and review; keep this
27
+ workflow's gates and TDD order. See `cc-feature` for the full scope rule.
32
28
 
33
29
  ## Android phone interface scope
34
30
 
35
- When the task concerns concrete Jetpack Compose phone layout, component states,
36
- interaction, accessibility, visual behavior, or a requested UI audit, apply skill
37
- `android-ui-design`. Use it during design, test/implementation, and review as
38
- applicable while keeping this workflow's gates and TDD order. Kotlin, Compose,
39
- framework, or dependency presence alone does not activate it; non-UI Android work
40
- stays with the general `android` skill. Audit-only requests remain read-only, and
41
- unavailable visual or emulator checks remain pending rather than claimed complete.
31
+ Same Android scope as `cc-feature`: when the fix concerns concrete Jetpack
32
+ Compose phone UI or a requested UI audit, apply skill `android-ui-design`
33
+ during test/implementation and review; keep this workflow's gates and TDD
34
+ order. See `cc-feature` for the full scope rule.
42
35
 
43
36
 
44
37
  ## Step 1 — Task Card validation (task-coach)
@@ -71,7 +64,7 @@ the affected code, and no public API or shared state is involved.
71
64
 
72
65
  Route: `task-coach` → `tester` → `implementer`
73
66
 
74
- Proceed directly to Step 3a.
67
+ Proceed directly to Step 3.
75
68
 
76
69
  ### Medium or high-risk route
77
70
 
@@ -92,23 +85,37 @@ before continuing.**
92
85
 
93
86
  ---
94
87
 
95
- ## Step 3a — Implementation, low-risk (implementer)
88
+ ## Step 3 — Regression tests (tester)
96
89
 
97
- Invoke `implementer` with the Task Card.
90
+ Invoke `tester` for all risk levels.
91
+
92
+ tester must:
93
+
94
+ 1. Write a regression test that reproduces the original bug (fails before the
95
+ fix, passes after)
96
+ 2. Verify that existing tests still pass
97
+ 3. Produce a Coverage Summary: test added, case covered
98
+
99
+ ---
100
+
101
+ ## Step 4a — Implementation, low-risk (implementer)
102
+
103
+ Invoke `implementer` with the Task Card and the failing regression test from Step 3.
98
104
  Implementer creates a Git Worktree before touching any file; all edits happen inside it.
99
105
 
100
106
  implementer must:
101
107
 
102
108
  1. Locate the defect using the reproduction steps
103
- 2. Apply the minimal fix — no unrelated changes
109
+ 2. Apply the minimal fix to make the regression test pass — no unrelated changes
104
110
  3. Run the test suite
105
111
  4. Produce an Implementation Summary: root cause, fix applied, files changed
106
112
 
107
113
  ---
108
114
 
109
- ## Step 3b — Implementation, medium/high-risk (implementer)
115
+ ## Step 4b — Implementation, medium/high-risk (implementer)
110
116
 
111
- Invoke `implementer` with the approved Technical Plan and the Task Card.
117
+ Invoke `implementer` with the approved Technical Plan, the Task Card, and the
118
+ failing regression test from Step 3.
112
119
  Implementer creates a Git Worktree before touching any file; all edits happen inside it.
113
120
 
114
121
  implementer must follow the plan exactly. Any deviation requires a new Technical
@@ -116,19 +123,6 @@ Plan approval. After implementation, run the full test suite.
116
123
 
117
124
  ---
118
125
 
119
- ## Step 4 — Regression tests (tester)
120
-
121
- Invoke `tester` for all risk levels.
122
-
123
- tester must:
124
-
125
- 1. Write a regression test that reproduces the original bug (fails before the
126
- fix, passes after)
127
- 2. Verify that existing tests still pass
128
- 3. Produce a Coverage Summary: test added, case covered
129
-
130
- ---
131
-
132
126
  ## Step 5 — Review (reviewer) — medium/high-risk only
133
127
 
134
128
  Invoke `reviewer` with the diff and Task Card.
@@ -16,7 +16,7 @@ gates, not a reference doc. Specs describe WHAT; `design.md` describes HOW.
16
16
 
17
17
  ## When to Use
18
18
 
19
- - `/cc-openspec` or `openspec next` / `plan` / `done` / `archive`
19
+ - `/cc-openspec` or `openspec plan` / `next` / `done` / `sync` / `verify` / `archive`
20
20
  - An item is `READY` or later and must move through the state machine
21
21
 
22
22
  **NOT** for creating `BACKLOG.md` (use skill `backlog`) or for stack-specific
@@ -26,22 +26,43 @@ coding rules.
26
26
 
27
27
  Local CLI is `bun run dev`. Published package is `npx cc-codeconductor`.
28
28
 
29
- 1. `openspec validate` — must pass before delivery.
30
- 2. `openspec plan BC-xxx` if the item is not yet `PLANNED`.
31
- 3. `openspec analyze --output json` — CRITICAL findings exit 1. Do not implement.
32
- 4. Phases: discover (`repo-explorer`) → design (`architect`) → test (`tester`) →
29
+ 1. `openspec validate` — must pass before delivery. If you reached this
30
+ workflow on your own (the user did not ask for OpenSpec) and there is no
31
+ `BACKLOG.md` / `openspec/` root, answer normally instead — never scaffold
32
+ one as a side effect.
33
+ 2. `openspec plan BC-xxx` if the item is not yet `PLANNED`. Planning only: it
34
+ writes TaskCards plus proposal/design/tasks/specs under
35
+ `openspec/changes/<slug>/` and stops. Never implement in this step.
36
+ 3. Review the plan before `start`: read proposal → delta specs → tasks, in that
37
+ order, and confirm intent, scope, testable FR/SC, and edge-case scenarios.
38
+ Fix the Markdown directly or ask for revisions — code comes later.
39
+ 4. `openspec analyze --output json` — CRITICAL findings exit 1. Do not implement.
40
+ 5. Phases: discover (`repo-explorer`) → design (`architect`) → test (`tester`) →
33
41
  implement (`implementer`) → review (`reviewer`). If Global `TDD required: yes`,
34
- test runs before implement.
35
- 5. `openspec done` on test/implement requires `captureTddSuiteEvidence`. Handmade
36
- evidence JSON is rejected.
37
- 6. `scorecard create --task BC-xxx --from-diff` then record a verdict.
38
- 7. `openspec archive` only after human review when `Review required: yes` and
39
- the scorecard is PASS.
42
+ test runs before implement. Discover is read-only: it never writes code.
43
+ 6. `openspec done` on test/implement requires `captureTddSuiteEvidence`. Handmade
44
+ evidence JSON is rejected. The implementer ticks `tasks.md` boxes
45
+ (`- [ ]` → `- [x]`) as each FR lands; only `x`/`X` counts as done.
46
+ 7. When implementation reveals a design problem, pause and reconcile the planning
47
+ artifacts first — in any direction (a later artifact may force revising an
48
+ earlier one). Planning artifacts only in that step, never code; confirm each
49
+ edit. If the item's intent changed rather than its details, open a fresh item
50
+ with `/cc-backlog` (`/cc:backlog`) instead of warping this one.
51
+ 8. `openspec verify --output json` — advisory pre-archive checklist
52
+ (`archiveReady` plus Completeness/Correctness/Coherence issues). Optional:
53
+ `openspec sync` merges delta specs into `openspec/specs/` without closing.
54
+ 9. `scorecard create --task BC-xxx --from-diff` then record a verdict.
55
+ 10. `openspec archive` only after human review when `Review required: yes` and
56
+ the scorecard is PASS. Archive re-checks planning artifacts and analyze
57
+ CRITICALs, and warns on unchecked `tasks.md` boxes.
40
58
 
41
59
  Status machine: `TODO` → `READY` → `PLANNED` → `IN_PROGRESS` → `REVIEW` → `DONE`
42
60
  → Archive. `BLOCKED` returns to `READY`. Reviewer rejection: `REVIEW` →
43
61
  `IN_PROGRESS`.
44
62
 
63
+ `openspec status --output json` also reports artifact presence, `tasks.md`
64
+ checkbox progress, and `nextSteps` for the next CLI call.
65
+
45
66
  ## Web interface scope
46
67
 
47
68
  When the task concerns web layout, component states, feedback, motion, or a
@@ -70,17 +91,24 @@ delivery read-only and record unavailable visual or emulator evidence as pending
70
91
  | I'll add tests after green | Global TDD required means tester before implementer. |
71
92
  | I'll write the evidence JSON myself | Handmade TDD JSON is rejected. Use the verification runner. |
72
93
  | The item is small; skip analyze | `openspec analyze` CRITICAL still stops implement. |
94
+ | The plan is generated; skip reading it | Read proposal → specs → tasks before `start`. Generated is not reviewed. |
95
+ | I'll fix the spec after shipping | Reconcile planning artifacts before continuing to implement. |
73
96
 
74
97
  ## Red Flags
75
98
 
76
99
  - Implementing while analyze reports CRITICAL
100
+ - Starting cards before reading the generated plan
77
101
  - Archive without a PASS scorecard when review is required
102
+ - Archive while `openspec verify` reports CRITICAL
78
103
  - Acceptance like "improve UX" with no measurable check
79
104
 
80
105
  ## Verification
81
106
 
82
107
  - [ ] `openspec validate` exit 0
108
+ - [ ] Plan reviewed (proposal → specs → tasks) before `start`
83
109
  - [ ] `openspec analyze --output json` has no CRITICAL
84
110
  - [ ] TDD evidence from the runner when TDD is required
111
+ - [ ] `tasks.md` boxes ticked as FRs land
112
+ - [ ] `openspec verify --output json` checked before archive
85
113
  - [ ] `scorecard create --from-diff` recorded
86
114
  - [ ] Suite check (optional): `bun run dev scorecard suite-run --suite workflow-gates`
@@ -3,6 +3,8 @@ name: cc-council
3
3
  description: Run the full Council-Driven Development workflow — SDD spec creation, TDD enforcement, surgical implementation, and multi-perspective review.
4
4
  ---
5
5
 
6
+ <!-- Source of truth for the council workflow command. The cursor, claude and opencode copies are generated from this template by scripts/inject-ccep-bootstrap.ts; gemini and codex derive from the cursor copy via scripts/render-agent-commands.ts. Edit here, then regenerate. -->
7
+
6
8
  # Council-Driven Workflow
7
9
 
8
10
  Task request: $ARGUMENTS
@@ -63,7 +65,7 @@ implementer must:
63
65
  1. Write the minimal code required to pass the tests.
64
66
  2. Touch ONLY the files specified in the Technical Plan (Surgical Changes).
65
67
  3. NOT refactor adjacent code, change existing styles, or build speculative features.
66
- 4. Run the tests. Loop `implementer` -> `tester` until all tests pass (Green state).
68
+ 4. Run the tests. Loop `implementer` -> `tester` until all tests pass (Green state), at most 3 iterations -- then stop and report the failing tests instead of looping.
67
69
 
68
70
  ---
69
71
 
@@ -75,7 +77,7 @@ The council will evaluate the diff against the 6 axes (Architecture, Security, P
75
77
 
76
78
  If ANY agent votes CRITICAL (especially due to over-engineering, scope creep, or missing the verifiable goals):
77
79
  - The Review Report status is **BLOCKED**.
78
- - Return to Step 4 with the feedback.
80
+ - Return to Step 4 with the feedback (at most 3 review rounds in total -- then deliver the BLOCKED verdict with the unresolved findings instead of looping).
79
81
 
80
82
  If APPROVED (no CRITICAL findings):
81
83
  - Deliver the final Council Verdict and the diff summary.