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.
- package/README.md +9 -9
- package/dist/core/runner/runner-target.d.ts +4 -4
- package/dist/core/verification/rdd-receipt.d.ts +19 -0
- package/dist/core/verification/verification-runner.d.ts +16 -0
- package/dist/index.js +1377 -635
- package/dist/library.js +52 -14
- package/dist/validation/schemas.d.ts +27 -22
- package/package.json +2 -1
- package/presets/agy/skills/cc-feature/SKILL.md +17 -16
- package/presets/agy/skills/cc-fix/SKILL.md +28 -34
- package/presets/agy/skills/openspec/SKILL.md +39 -11
- package/presets/agy/workflows/cc-council.md +4 -2
- package/presets/claude/commands/cc/council.md +2 -83
- package/presets/claude/commands/cc/openspec.md +20 -1
- package/presets/claude/skills/openspec/SKILL.md +39 -11
- package/presets/codex/skills/cc-council/SKILL.md +2 -93
- package/presets/codex/skills/cc-openspec/SKILL.md +20 -1
- package/presets/codex/skills/openspec/SKILL.md +39 -11
- package/presets/cursor/commands/cc/council.md +2 -83
- package/presets/cursor/commands/cc/openspec.md +20 -1
- package/presets/cursor/skills/openspec/SKILL.md +39 -11
- package/presets/gemini/commands/cc/council.toml +2 -83
- package/presets/gemini/commands/cc/openspec.toml +20 -1
- package/presets/muse/AGENTS.md +46 -0
- package/presets/muse/hooks.json +30 -0
- package/presets/opencode/commands/cc-council.md +2 -83
- package/presets/opencode/commands/cc-openspec.md +5 -3
- package/presets/opencode/skills/openspec/SKILL.md +39 -11
- package/src/presets/manifests/muse.yml +18 -0
- package/src/presets/models/muse.yml +4 -0
- package/src/presets/models/roles.yml +14 -0
- 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:
|
|
234
|
-
dest:
|
|
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
|
|
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
|
-
|
|
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:
|
|
1843
|
+
manifestHash: hashed,
|
|
1813
1844
|
command: input.command,
|
|
1814
1845
|
outcome: input.outcome,
|
|
1815
|
-
capturedAt
|
|
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
|
|
1908
|
-
await
|
|
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.
|
|
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 —
|
|
69
|
+
## Step 3 — Test coverage (tester)
|
|
70
70
|
|
|
71
|
-
Invoke `
|
|
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
|
-
|
|
73
|
+
tester must:
|
|
75
74
|
|
|
76
|
-
1.
|
|
77
|
-
2.
|
|
78
|
-
3.
|
|
79
|
-
4. Produce
|
|
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 —
|
|
82
|
+
## Step 4 — Implementation (implementer)
|
|
85
83
|
|
|
86
|
-
Invoke `
|
|
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
|
-
|
|
88
|
+
implementer must:
|
|
89
89
|
|
|
90
|
-
1.
|
|
91
|
-
2.
|
|
92
|
-
3. Run the
|
|
93
|
-
4. Produce
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
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
|
|
88
|
+
## Step 3 — Regression tests (tester)
|
|
96
89
|
|
|
97
|
-
Invoke `
|
|
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
|
|
115
|
+
## Step 4b — Implementation, medium/high-risk (implementer)
|
|
110
116
|
|
|
111
|
-
Invoke `implementer` with the approved Technical Plan
|
|
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
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
36
|
-
evidence JSON is rejected.
|
|
37
|
-
|
|
38
|
-
7.
|
|
39
|
-
|
|
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.
|