create-harness-vibe-coding 0.8.6 → 0.8.8
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-CN.md +157 -105
- package/README.md +160 -244
- package/bin/create-harness-vibe-coding.js +2 -2
- package/docs/images/harness-architecture-light.png +0 -0
- package/docs/images/harness-architecture.drawio +164 -0
- package/package.json +46 -44
- package/src/generator.js +30 -11
- package/src/index.js +143 -14
- package/src/prompts.js +37 -37
- package/templates/common/.claude/agents/architect-manager.md +45 -45
- package/templates/common/.claude/agents/context-master.md +75 -75
- package/templates/common/.claude/agents/debugger.md +41 -41
- package/templates/common/.claude/agents/explore-manager.md +41 -41
- package/templates/common/.claude/agents/implement-manager.md +49 -49
- package/templates/common/.claude/agents/implementer.md +40 -40
- package/templates/common/.claude/agents/memory-master.md +64 -64
- package/templates/common/.claude/agents/planner.md +34 -34
- package/templates/common/.claude/agents/reflector.md +35 -0
- package/templates/common/.claude/agents/researcher.md +41 -41
- package/templates/common/.claude/agents/review-manager.md +56 -56
- package/templates/common/.claude/agents/verifier.md +34 -32
- package/templates/common/.claude/commands/wf-help.md +2 -3
- package/templates/common/.claude/rules/ecc/common.md +44 -44
- package/templates/common/.claude/skills/subagent-orchestrator/SKILL.md +10 -4
- package/templates/common/.claude/skills/wf/SKILL.md +7 -3
- package/templates/common/.claude/skills/wf-auto/SKILL.md +61 -107
- package/templates/common/.claude/skills/wf-auto-spark/SKILL.md +19 -17
- package/templates/common/.claude/skills/wf-max/SKILL.md +40 -21
- package/templates/common/.claude/skills/wf-readme/SKILL.md +49 -49
- package/templates/common/.claude/skills/wf-remove/SKILL.md +7 -7
- package/templates/common/.claude/skills/wf-update/SKILL.md +9 -4
- package/templates/common/.codex/config.toml +5 -0
- package/templates/common/.harness-version +78 -36
- package/templates/common/.opencode/agents/architect-manager.md +52 -0
- package/templates/common/.opencode/agents/architect.md +35 -0
- package/templates/common/.opencode/agents/context-master.md +81 -0
- package/templates/common/.opencode/agents/debugger.md +43 -0
- package/templates/common/.opencode/agents/docs-researcher.md +42 -0
- package/templates/common/.opencode/agents/explore-manager.md +49 -0
- package/templates/common/.opencode/agents/implement-manager.md +56 -0
- package/templates/common/.opencode/agents/implementer.md +42 -0
- package/templates/common/.opencode/agents/memory-master.md +70 -0
- package/templates/common/.opencode/agents/planner.md +38 -0
- package/templates/common/.opencode/agents/reflector.md +39 -0
- package/templates/common/.opencode/agents/researcher.md +42 -0
- package/templates/common/.opencode/agents/review-manager.md +63 -0
- package/templates/common/.opencode/agents/reviewer.md +37 -0
- package/templates/common/.opencode/agents/tdd-guide.md +83 -0
- package/templates/common/.opencode/agents/test-writer.md +54 -0
- package/templates/common/.opencode/agents/verifier.md +37 -0
- package/templates/common/.opencode/commands/wf-help.md +23 -0
- package/templates/common/AGENTS.md +26 -25
- package/templates/common/CLAUDE.md +86 -88
- package/templates/common/Harness/ACCEPTANCE_PROTOCOL.md +12 -4
- package/templates/common/Harness/PROGRESS.md +17 -17
- package/templates/common/Harness/README.md +26 -16
- package/templates/common/Harness/WF-AUTO-ANGLES.md +170 -0
- package/templates/common/Harness/WF-AUTO-SPARK.md +23 -6
- package/templates/common/Harness/WF-AUTO.md +508 -493
- package/templates/common/Harness/WF-MAX.md +284 -232
- package/templates/common/Harness/WF.md +47 -29
- package/templates/common/Harness/agent-workflow.md +108 -76
- package/templates/common/Harness/architecture.md +124 -124
- package/templates/common/Harness/context-loading.md +111 -111
- package/templates/common/Harness/dispatch.md +96 -95
- package/templates/common/Harness/extension.md +67 -67
- package/templates/common/Harness/lifecycle.md +20 -20
- package/templates/common/Harness/research/PRD.md +56 -56
- package/templates/common/Harness/research/README.md +169 -169
- package/templates/common/Harness/research/research-results.md +66 -66
- package/templates/common/Harness/subagents.md +192 -170
- package/templates/common/Harness/tasks/_template/ARTIFACTS.md +3 -3
- package/templates/common/Harness/tasks/_template/NOTES.md +3 -3
- package/templates/common/Harness/tasks/_template/PLAN.md +53 -60
- package/templates/common/Harness/tasks/_template/PROGRESS.md +26 -29
- package/templates/common/MEMORY.md +27 -30
- package/templates/common/README.md +36 -36
- package/templates/common/SETUP.md +1 -1
- package/templates/common/memory/agent-lessons-patterns.md +21 -21
- package/templates/common/memory/tool-usage-reflections.md +21 -21
- package/templates/common/memory/user-corrections-preferences.md +21 -21
- package/templates/common/opencode.json +19 -0
- package/templates/common/scripts/scan-clean.mjs +487 -448
- package/templates/common/scripts/validate-harness.mjs +245 -146
- package/templates/common/scripts/wf-remove.mjs +311 -293
- package/templates/common/scripts/wf-update-check.mjs +511 -311
- package/templates/optional/catalog.json +41 -33
- package/templates/optional/skills/browser-e2e/.claude/skills/wf-browser/SKILL.md +194 -194
- package/templates/optional/skills/browser-e2e/Harness/workflows/browser-e2e.md +105 -69
- package/templates/optional/skills/github-pr-review/Harness/workflows/github-pr-review.md +28 -28
- package/templates/optional/skills/python-backend/Harness/workflows/python-backend.md +34 -34
- package/templates/optional/skills/ts-react-frontend/Harness/workflows/ts-react-frontend.md +34 -34
- package/templates/optional/skills/ui-ux-review/Harness/workflows/ui-ux-review.md +26 -26
|
@@ -25,6 +25,7 @@ const commonAgents = [
|
|
|
25
25
|
'debugger',
|
|
26
26
|
'reviewer',
|
|
27
27
|
'verifier',
|
|
28
|
+
'reflector',
|
|
28
29
|
'memory-master',
|
|
29
30
|
'context-master',
|
|
30
31
|
'explore-manager',
|
|
@@ -33,12 +34,12 @@ const commonAgents = [
|
|
|
33
34
|
'review-manager',
|
|
34
35
|
];
|
|
35
36
|
|
|
36
|
-
const commonSkills = [
|
|
37
|
-
'wf',
|
|
38
|
-
'tdd',
|
|
39
|
-
'wf-update',
|
|
40
|
-
'wf-max',
|
|
41
|
-
'wf-review',
|
|
37
|
+
const commonSkills = [
|
|
38
|
+
'wf',
|
|
39
|
+
'tdd',
|
|
40
|
+
'wf-update',
|
|
41
|
+
'wf-max',
|
|
42
|
+
'wf-review',
|
|
42
43
|
'wf-learn',
|
|
43
44
|
'subagent-orchestrator',
|
|
44
45
|
'wf-readme',
|
|
@@ -57,27 +58,30 @@ const required = [
|
|
|
57
58
|
'AGENTS.md',
|
|
58
59
|
'CLAUDE.md',
|
|
59
60
|
'README.md',
|
|
60
|
-
'Harness/MEMORY.md',
|
|
61
|
-
'Harness/WF.md',
|
|
62
|
-
'Harness/WF-MAX.md',
|
|
63
|
-
'Harness/ACCEPTANCE_PROTOCOL.md',
|
|
64
|
-
'Harness/AGENT_ISOLATION.md',
|
|
65
|
-
'Harness/HARNESS_BRIDGE.md',
|
|
66
|
-
'Harness/DEBUG_PROTOCOL.md',
|
|
67
|
-
'Harness/MEMORY_PROTOCOL.md',
|
|
68
|
-
'Harness/templates/PRD.template.md',
|
|
69
|
-
'Harness/templates/ACCEPTANCE.template.md',
|
|
70
|
-
'Harness/templates/UI_CONTRACT.template.md',
|
|
71
|
-
'Harness/templates/API_CONTRACT.template.md',
|
|
72
|
-
'Harness/templates/TEST_PLAN.template.md',
|
|
73
|
-
'Harness/templates/PLAYWRIGHT_SPEC.template.ts',
|
|
74
|
-
'Harness/templates/VALIDATION_REPORT.template.md',
|
|
75
|
-
...memoryFiles,
|
|
76
|
-
'.codex/config.toml',
|
|
77
|
-
'.
|
|
78
|
-
'.claude/
|
|
79
|
-
'.claude/
|
|
61
|
+
'Harness/MEMORY.md',
|
|
62
|
+
'Harness/WF.md',
|
|
63
|
+
'Harness/WF-MAX.md',
|
|
64
|
+
'Harness/ACCEPTANCE_PROTOCOL.md',
|
|
65
|
+
'Harness/AGENT_ISOLATION.md',
|
|
66
|
+
'Harness/HARNESS_BRIDGE.md',
|
|
67
|
+
'Harness/DEBUG_PROTOCOL.md',
|
|
68
|
+
'Harness/MEMORY_PROTOCOL.md',
|
|
69
|
+
'Harness/templates/PRD.template.md',
|
|
70
|
+
'Harness/templates/ACCEPTANCE.template.md',
|
|
71
|
+
'Harness/templates/UI_CONTRACT.template.md',
|
|
72
|
+
'Harness/templates/API_CONTRACT.template.md',
|
|
73
|
+
'Harness/templates/TEST_PLAN.template.md',
|
|
74
|
+
'Harness/templates/PLAYWRIGHT_SPEC.template.ts',
|
|
75
|
+
'Harness/templates/VALIDATION_REPORT.template.md',
|
|
76
|
+
...memoryFiles,
|
|
77
|
+
'.codex/config.toml',
|
|
78
|
+
'opencode.json',
|
|
79
|
+
'.claude/settings.json',
|
|
80
|
+
'.claude/commands/wf-help.md',
|
|
81
|
+
'.opencode/commands/wf-help.md',
|
|
82
|
+
'.claude/rules/ecc/common.md',
|
|
80
83
|
...commonAgents.map(agent => `.claude/agents/${agent}.md`),
|
|
84
|
+
...commonAgents.map(agent => `.opencode/agents/${agent}.md`),
|
|
81
85
|
...commonSkills.map(skill => `.claude/skills/${skill}/SKILL.md`),
|
|
82
86
|
...commonSkills.map(skill => `.agents/skills/${skill}/SKILL.md`),
|
|
83
87
|
'Harness/README.md',
|
|
@@ -91,8 +95,8 @@ const required = [
|
|
|
91
95
|
'Harness/architecture.md',
|
|
92
96
|
'Harness/research/README.md',
|
|
93
97
|
'Harness/research/research-results.md',
|
|
94
|
-
'Harness/research/PRD.md',
|
|
95
|
-
'Harness/scripts/wf-update-check.mjs',
|
|
98
|
+
'Harness/research/PRD.md',
|
|
99
|
+
'Harness/scripts/wf-update-check.mjs',
|
|
96
100
|
'Harness/scripts/wf-remove.mjs',
|
|
97
101
|
'Harness/scripts/scan-clean.mjs',
|
|
98
102
|
'Harness/.harness-version',
|
|
@@ -134,16 +138,16 @@ function read(rel) {
|
|
|
134
138
|
return fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
|
|
135
139
|
}
|
|
136
140
|
|
|
137
|
-
function requireText(rel, text, label = text) {
|
|
138
|
-
const body = read(rel);
|
|
139
|
-
if (body && !body.includes(text)) errors.push(`${rel} missing ${label}`);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function forbidText(rel, text, label = text) {
|
|
143
|
-
const body = read(rel);
|
|
144
|
-
if (body && body.includes(text)) errors.push(`${rel} contains forbidden ${label}`);
|
|
145
|
-
}
|
|
146
|
-
|
|
141
|
+
function requireText(rel, text, label = text) {
|
|
142
|
+
const body = read(rel);
|
|
143
|
+
if (body && !body.includes(text)) errors.push(`${rel} missing ${label}`);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function forbidText(rel, text, label = text) {
|
|
147
|
+
const body = read(rel);
|
|
148
|
+
if (body && body.includes(text)) errors.push(`${rel} contains forbidden ${label}`);
|
|
149
|
+
}
|
|
150
|
+
|
|
147
151
|
function frontmatterField(text, field) {
|
|
148
152
|
const match = text.match(new RegExp(`^${field}:\\s*(.+)$`, 'm'));
|
|
149
153
|
return match ? match[1].trim() : '';
|
|
@@ -227,25 +231,40 @@ function registeredWorkflowFiles(...texts) {
|
|
|
227
231
|
return [...files].sort();
|
|
228
232
|
}
|
|
229
233
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
];
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
234
|
+
function listedWorkflowCommands(...texts) {
|
|
235
|
+
const commands = new Set();
|
|
236
|
+
const pattern = /`\/(wf(?:-[a-z0-9]+)?)(?:\s+[^`]*)?`/g;
|
|
237
|
+
|
|
238
|
+
for (const text of texts) {
|
|
239
|
+
for (const match of text.matchAll(pattern)) {
|
|
240
|
+
const command = `/${match[1]}`;
|
|
241
|
+
if (command === '/wf-help') continue;
|
|
242
|
+
commands.add(command);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return [...commands].sort();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
for (const rel of required) {
|
|
250
|
+
if (!fs.existsSync(path.join(root, rel))) {
|
|
251
|
+
errors.push(`missing required file: ${rel}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const removedHookArtifacts = [
|
|
256
|
+
'Harness/HOOK_PROTOCOL.md',
|
|
257
|
+
'Harness/scripts/wf-mode-hook.mjs',
|
|
258
|
+
'Harness/scripts/wf-statusline.sh',
|
|
259
|
+
'Harness/scripts/wf-statusline.ps1',
|
|
260
|
+
'tests/e2e-wf-hooks.test.mjs',
|
|
261
|
+
];
|
|
262
|
+
|
|
263
|
+
for (const rel of removedHookArtifacts) {
|
|
264
|
+
if (fs.existsSync(path.join(root, rel))) {
|
|
265
|
+
errors.push(`removed hook artifact should not exist: ${rel}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
249
268
|
|
|
250
269
|
// Task capsule template files
|
|
251
270
|
const taskTemplateDir = path.join(root, 'Harness', 'tasks', '_template');
|
|
@@ -312,17 +331,17 @@ for (const rel of durableCommunicationDocs) {
|
|
|
312
331
|
requireText(rel, 'chat/subagent transcript state is non-authoritative', 'non-authoritative transcript invariant');
|
|
313
332
|
}
|
|
314
333
|
|
|
315
|
-
requireText('
|
|
316
|
-
requireText('
|
|
334
|
+
requireText('Harness/MEMORY_PROTOCOL.md', 'same tool or command pattern fails 3+ times', 'tool reflection trigger');
|
|
335
|
+
requireText('Harness/MEMORY_PROTOCOL.md', 'user corrects the same assumption or preference 2+ times', 'user correction reflection trigger');
|
|
317
336
|
requireText('CLAUDE.md', 'If `Harness/` exists, this repository is governed by the Harness contract', 'Harness binding contract');
|
|
318
|
-
requireText('CLAUDE.md', '
|
|
319
|
-
requireText('
|
|
320
|
-
requireText('CLAUDE.md', 'Harness/SETUP.md` exists, follow it before normal project work', 'setup bootstrap contract');
|
|
321
|
-
requireText('Harness/SETUP.md', 'Harness/MEMORY_PROTOCOL.md', 'setup memory protocol reference');
|
|
322
|
-
requireText('
|
|
323
|
-
requireText('
|
|
337
|
+
requireText('CLAUDE.md', 'memory and resource router', 'memory/resource router');
|
|
338
|
+
requireText('Harness/README.md', 'Load By Task', 'Harness task router');
|
|
339
|
+
requireText('CLAUDE.md', 'Harness/SETUP.md` exists, follow it before normal project work', 'setup bootstrap contract');
|
|
340
|
+
requireText('Harness/SETUP.md', 'Harness/MEMORY_PROTOCOL.md', 'setup memory protocol reference');
|
|
341
|
+
requireText('Harness/README.md', 'subagent-orchestrator', 'subagent orchestrator entry trigger');
|
|
342
|
+
requireText('Harness/README.md', 'PROGRESS.md', 'PROGRESS global task index');
|
|
324
343
|
requireText('CLAUDE.md', 'Harness/tasks/', 'task capsule directory reference');
|
|
325
|
-
requireText('
|
|
344
|
+
requireText('Harness/subagents.md', 'Subagents are readers and reporters', 'subagent state committer rule');
|
|
326
345
|
for (const heading of ['## 2. Think Before Coding', '## 3. Simplicity First', '## 4. Surgical Changes', '## 5. Goal-Driven Execution']) {
|
|
327
346
|
requireText('CLAUDE.md', heading, `Karpathy-style rule heading: ${heading}`);
|
|
328
347
|
}
|
|
@@ -386,6 +405,18 @@ for (const skillFile of registeredSkillFiles(docsReadme, memory)) {
|
|
|
386
405
|
}
|
|
387
406
|
}
|
|
388
407
|
|
|
408
|
+
for (const command of listedWorkflowCommands(docsReadme, read('.claude/commands/wf-help.md'))) {
|
|
409
|
+
const skill = command.slice(1);
|
|
410
|
+
const claudeSkill = `.claude/skills/${skill}/SKILL.md`;
|
|
411
|
+
const codexSkill = `.agents/skills/${skill}/SKILL.md`;
|
|
412
|
+
if (!fs.existsSync(path.join(root, claudeSkill))) {
|
|
413
|
+
errors.push(`command docs list missing Claude skill: ${command} -> ${claudeSkill}`);
|
|
414
|
+
}
|
|
415
|
+
if (!fs.existsSync(path.join(root, codexSkill))) {
|
|
416
|
+
errors.push(`command docs list missing Codex skill: ${command} -> ${codexSkill}`);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
389
420
|
for (const workflowFile of registeredWorkflowFiles(docsReadme, memory)) {
|
|
390
421
|
if (!fs.existsSync(path.join(root, workflowFile))) {
|
|
391
422
|
// Optional workflows (browser-e2e, ts-react-frontend, etc.) may not be installed
|
|
@@ -476,20 +507,44 @@ for (const agent of commonAgents) {
|
|
|
476
507
|
}
|
|
477
508
|
}
|
|
478
509
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
510
|
+
for (const agent of commonAgents) {
|
|
511
|
+
const rel = `.opencode/agents/${agent}.md`;
|
|
512
|
+
const text = read(rel);
|
|
513
|
+
if (!text) continue;
|
|
514
|
+
|
|
515
|
+
for (const field of ['description', 'mode']) {
|
|
516
|
+
if (!frontmatterField(text, field)) errors.push(`${rel} missing frontmatter field: ${field}:`);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
const mode = frontmatterField(text, 'mode');
|
|
520
|
+
if (mode && mode !== 'subagent') {
|
|
521
|
+
errors.push(`${rel} frontmatter mode should be subagent (got: ${mode})`);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
requireText('Harness/extension.md', 'Skills should extend the harness');
|
|
526
|
+
requireText('Harness/agent-workflow.md', 'Harness/tasks/<task-id>/PROGRESS.md');
|
|
527
|
+
requireText('Harness/README.md', 'Task records are compact by default', 'compact task record router rule');
|
|
528
|
+
requireText('Harness/agent-workflow.md', 'AC record size', 'compact AC record size rule');
|
|
529
|
+
requireText('Harness/ACCEPTANCE_PROTOCOL.md', 'Default to 1-3 concise ACs', 'compact AC default');
|
|
530
|
+
requireText('Harness/WF.md', 'Do not paste command logs or subagent transcripts', 'compact heartbeat rule');
|
|
531
|
+
requireText('Harness/tasks/_template/PLAN.md', 'Compact task record', 'compact task PLAN template');
|
|
532
|
+
requireText('Harness/tasks/_template/PLAN.md', 'Default: keep 1-3 concise ACs', 'compact task PLAN AC guidance');
|
|
533
|
+
requireText('Harness/tasks/_template/PROGRESS.md', 'Compact heartbeat', 'compact task PROGRESS template');
|
|
534
|
+
requireText('Harness/agent-workflow.md', 'TDD-GUIDE.md', 'agent workflow loads TDD guide');
|
|
535
|
+
requireText('Harness/agent-workflow.md', 'real user-path test', 'agent workflow real user path requirement');
|
|
536
|
+
requireText('Harness/research/README.md', 'research-results.md');
|
|
484
537
|
requireText('Harness/WF.md', 'Ralph-style harness loop', 'WF loop description');
|
|
485
538
|
requireText('Harness/WF.md', 'Heartbeat Protocol', 'heartbeat protocol');
|
|
486
|
-
requireText('Harness/WF.md', 'WF mode requires
|
|
487
|
-
requireText('Harness/WF.md', '
|
|
539
|
+
requireText('Harness/WF.md', 'WF mode requires the complete role chain by default', 'WF complete role chain default');
|
|
540
|
+
requireText('Harness/WF.md', 'MUST cover every mandatory role class before closeout', 'explicit WF/WK complete role chain');
|
|
541
|
+
requireText('Harness/WF.md', 'Independent Validation', 'WF independent validation role');
|
|
542
|
+
requireText('Harness/WF.md', 'reflector', 'WF reflector gate');
|
|
488
543
|
requireText('Harness/WF.md', '.claude/agents/', 'WF built-in agent roster path');
|
|
489
|
-
requireText('Harness/WF.md', 'Collaboration decision tree', 'WF decision tree');
|
|
490
|
-
requireText('Harness/WF.md', 'Harness/tasks/', 'WF task directory reference');
|
|
491
|
-
requireText('Harness/WF.md', 'IMPLEMENT-GATE', 'WF implement gate naming');
|
|
492
|
-
requireText('Harness/README.md', '`wf mode`, `workflow mode`, or `wk mode`', 'WF/WK router aliases');
|
|
544
|
+
requireText('Harness/WF.md', 'Collaboration decision tree', 'WF decision tree');
|
|
545
|
+
requireText('Harness/WF.md', 'Harness/tasks/', 'WF task directory reference');
|
|
546
|
+
requireText('Harness/WF.md', 'IMPLEMENT-GATE', 'WF implement gate naming');
|
|
547
|
+
requireText('Harness/README.md', '`wf mode`, `workflow mode`, or `wk mode`', 'WF/WK router aliases');
|
|
493
548
|
requireText('Harness/README.md', 'explicit WF/WK loads subagent docs immediately', 'explicit WF/WK router output');
|
|
494
549
|
requireText('.claude/skills/wf/SKILL.md', 'Harness/WF.md', 'wf skill loads core WF doc');
|
|
495
550
|
requireText('.agents/skills/wf/SKILL.md', 'Harness/WF.md', 'Codex wf skill loads core WF doc');
|
|
@@ -506,89 +561,133 @@ requireText('Harness/subagents.md', '## Built-in Agent Roster', 'built-in agent
|
|
|
506
561
|
requireText('Harness/subagents.md', '## WF Default Fan-Out', 'WF default fan-out');
|
|
507
562
|
requireText('Harness/subagents.md', 'concrete conditions', 'subagent decision tree');
|
|
508
563
|
requireText('Harness/subagents.md', 'parallel planner/researcher/docs-researcher/architect subagents', 'WF roster orchestration shape');
|
|
564
|
+
requireText('Harness/subagents.md', '`reflector`', 'reflector agent roster');
|
|
565
|
+
requireText('Harness/subagents.md', 'reflector PASS', 'reflector review gate');
|
|
509
566
|
requireText('Harness/subagents.md', '## Efficiency Ladder', 'subagent efficiency ladder');
|
|
510
567
|
requireText('Harness/subagents.md', '## Review Gates', 'subagent review gates');
|
|
511
568
|
requireText('Harness/architecture.md', '## 2. Interface Decoupling', 'architecture interface decoupling');
|
|
512
569
|
requireText('Harness/architecture.md', '## 3. State Design', 'architecture state design');
|
|
513
570
|
requireText('Harness/architecture.md', 'Avoid speculative abstraction', 'anti-overengineering architecture rule');
|
|
514
571
|
requireText('CLAUDE.md', 'Use explicit interfaces or state models only when they protect a real boundary', 'CLAUDE interface/state simplicity rule');
|
|
515
|
-
requireText('
|
|
572
|
+
requireText('Harness/README.md', '/wf-update', 'wf update startup instruction');
|
|
516
573
|
requireText('Harness/README.md', 'Need harness update', 'update routing row');
|
|
517
574
|
requireText('Harness/WF-MAX.md', 'three-layer architecture', 'WF-MAX three-layer architecture');
|
|
518
575
|
requireText('Harness/WF-MAX.md', 'agent role', 'WF-MAX agent role separation');
|
|
519
576
|
requireText('Harness/WF-MAX.md', 'write-set coloring', 'WF-MAX coloring algorithm');
|
|
520
577
|
requireText('Harness/WF-MAX.md', 'wave dispatch', 'WF-MAX wave dispatch');
|
|
578
|
+
requireText('Harness/WF-MAX.md', 'strict superset', 'WF-MAX strict superset');
|
|
579
|
+
requireText('Harness/WF-MAX.md', 'cross-CLI overflow', 'WF-MAX cross-CLI overflow');
|
|
580
|
+
requireText('Harness/WF-MAX.md', 'claude -p', 'WF-MAX Claude CLI overflow');
|
|
581
|
+
requireText('Harness/WF-MAX.md', 'codex exec', 'WF-MAX Codex CLI overflow');
|
|
582
|
+
requireText('Harness/WF-MAX.md', 'agents.max_threads', 'WF-MAX Codex max_threads config');
|
|
583
|
+
requireText('Harness/WF-MAX.md', 'agents.max_depth', 'WF-MAX Codex max_depth config');
|
|
584
|
+
requireText('Harness/WF-MAX.md', 'max_threads = 12', 'WF-MAX Codex scaffold max_threads default');
|
|
585
|
+
requireText('Harness/WF-MAX.md', 'max_depth = 1', 'WF-MAX Codex scaffold max_depth default');
|
|
586
|
+
requireText('Harness/WF-MAX.md', 'ask the user before raising `agents.max_threads`', 'WF-MAX asks before raising Codex thread cap');
|
|
587
|
+
requireText('Harness/WF-MAX.md', 'Close completed agents', 'WF-MAX close completed agents before overflow');
|
|
588
|
+
requireText('Harness/WF-MAX.md', 'Codex++', 'WF-MAX forbids relying on Codex++ as stable capacity');
|
|
589
|
+
requireText('.claude/skills/wf-max/SKILL.md', 'agents.max_threads', 'wf-max skill Codex thread config');
|
|
590
|
+
requireText('.claude/skills/wf-max/SKILL.md', 'max_threads = 12', 'wf-max skill Codex scaffold max_threads default');
|
|
591
|
+
requireText('.claude/skills/wf-max/SKILL.md', 'ask the user before raising', 'wf-max skill asks before raising Codex thread cap');
|
|
592
|
+
requireText('.claude/skills/wf-max/SKILL.md', 'Codex++', 'wf-max skill forbids Codex++ capacity assumption');
|
|
593
|
+
requireText('.codex/config.toml', '[agents]', 'Codex agents config table');
|
|
594
|
+
requireText('.codex/config.toml', 'max_threads = 12', 'Codex scaffold max_threads default');
|
|
595
|
+
requireText('.codex/config.toml', 'max_depth = 1', 'Codex scaffold max_depth default');
|
|
596
|
+
requireText('opencode.json', '"$schema": "https://opencode.ai/config.json"', 'OpenCode config schema');
|
|
597
|
+
requireText('opencode.json', '.claude/rules/ecc/common.md', 'OpenCode instructions reference to ECC rules');
|
|
521
598
|
requireText('Harness/README.md', '/wf-max', 'wf max router alias');
|
|
522
|
-
requireText('Harness/README.md', 'WF-MAX.md', 'WF-MAX router reference');
|
|
523
|
-
requireText('Harness/README.md', 'ACCEPTANCE_PROTOCOL.md', 'acceptance protocol router reference');
|
|
524
|
-
requireText('Harness/README.md', 'TDD-GUIDE.md', 'TDD guide router reference');
|
|
525
|
-
requireText('Harness/ACCEPTANCE_PROTOCOL.md', 'PRD-GATE', 'acceptance PRD gate');
|
|
526
|
-
requireText('Harness/ACCEPTANCE_PROTOCOL.md', 'AC-GATE', 'acceptance AC gate');
|
|
527
|
-
requireText('Harness/ACCEPTANCE_PROTOCOL.md', 'Acceptance Result', 'acceptance result matrix');
|
|
528
|
-
requireText('Harness/ACCEPTANCE_PROTOCOL.md', 'Syntax-only checks', 'syntax-only checks are not browser acceptance evidence');
|
|
529
|
-
requireText('Harness/AGENT_ISOLATION.md', 'implementer', 'agent isolation implementer rule');
|
|
530
|
-
requireText('Harness/HARNESS_BRIDGE.md', 'Network Trace Collector', 'harness bridge network trace collector');
|
|
531
|
-
requireText('Harness/WF-AUTO.md', 'Intent Checkpoint', 'wf-auto intent checkpoint');
|
|
532
|
-
requireText('Harness/
|
|
533
|
-
requireText('Harness/
|
|
534
|
-
requireText('Harness/
|
|
535
|
-
requireText('Harness/
|
|
536
|
-
requireText('Harness/
|
|
537
|
-
requireText('Harness/
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
requireText('
|
|
543
|
-
requireText('
|
|
544
|
-
requireText('
|
|
545
|
-
requireText('
|
|
546
|
-
requireText('
|
|
547
|
-
requireText('
|
|
548
|
-
requireText('
|
|
549
|
-
requireText('
|
|
550
|
-
requireText('
|
|
551
|
-
requireText('
|
|
552
|
-
requireText('Harness/
|
|
553
|
-
requireText('Harness/
|
|
554
|
-
requireText('Harness/
|
|
599
|
+
requireText('Harness/README.md', 'WF-MAX.md', 'WF-MAX router reference');
|
|
600
|
+
requireText('Harness/README.md', 'ACCEPTANCE_PROTOCOL.md', 'acceptance protocol router reference');
|
|
601
|
+
requireText('Harness/README.md', 'TDD-GUIDE.md', 'TDD guide router reference');
|
|
602
|
+
requireText('Harness/ACCEPTANCE_PROTOCOL.md', 'PRD-GATE', 'acceptance PRD gate');
|
|
603
|
+
requireText('Harness/ACCEPTANCE_PROTOCOL.md', 'AC-GATE', 'acceptance AC gate');
|
|
604
|
+
requireText('Harness/ACCEPTANCE_PROTOCOL.md', 'Acceptance Result', 'acceptance result matrix');
|
|
605
|
+
requireText('Harness/ACCEPTANCE_PROTOCOL.md', 'Syntax-only checks', 'syntax-only checks are not browser acceptance evidence');
|
|
606
|
+
requireText('Harness/AGENT_ISOLATION.md', 'implementer', 'agent isolation implementer rule');
|
|
607
|
+
requireText('Harness/HARNESS_BRIDGE.md', 'Network Trace Collector', 'harness bridge network trace collector');
|
|
608
|
+
requireText('Harness/WF-AUTO.md', 'Intent Checkpoint', 'wf-auto intent checkpoint');
|
|
609
|
+
requireText('Harness/WF-AUTO.md', 'Adaptive Coverage Exhaustion Gate', 'wf-auto adaptive coverage exhaustion gate');
|
|
610
|
+
requireText('Harness/WF-AUTO.md', 'dynamic high-risk obligations', 'wf-auto dynamic high-risk obligations');
|
|
611
|
+
requireText('Harness/WF-AUTO.md', 'two different confirmation strategies', 'wf-auto two different confirmation strategies');
|
|
612
|
+
requireText('Harness/WF-AUTO-ANGLES.md', 'Selection algorithm', 'wf-auto adaptive angle selection');
|
|
613
|
+
requireText('Harness/WF-AUTO-ANGLES.md', 'Dynamic obligations', 'wf-auto dynamic obligations');
|
|
614
|
+
requireText('Harness/WF-AUTO-ANGLES.md', 'Common probe recipes', 'wf-auto common probe recipes');
|
|
615
|
+
forbidText('Harness/WF-AUTO.md', 'All 8 exhausted', 'stale eight-angle exhaustion rule');
|
|
616
|
+
forbidText('Harness/WF-AUTO.md', '3 consecutive all-exhausted rounds', 'stale three-consecutive-all-exhausted stop rule');
|
|
617
|
+
forbidText('Harness/WF-AUTO.md', '8-Angle Exhaustion Gate', 'stale eight-angle exhaustion gate name');
|
|
618
|
+
forbidText('Harness/WF-AUTO-SPARK.md', '8 parallel external searches', 'stale eight-spark fixed-count search');
|
|
619
|
+
requireText('Harness/WF-AUTO.md', 'Inherited WF/WF-MAX Constraints', 'wf-auto inherited WF/WF-MAX constraints');
|
|
620
|
+
requireText('Harness/WF-AUTO.md', 'Mini PRD -> AC IDs -> test/validation plan -> implementer -> verifier', 'wf-auto per-cycle WF chain');
|
|
621
|
+
requireText('Harness/WF-AUTO.md', 'reflector PASS', 'wf-auto reflector gate');
|
|
622
|
+
requireText('Harness/WF-AUTO-SPARK.md', 'Inherited Execution Chain', 'wf-auto-spark inherited execution chain');
|
|
623
|
+
requireText('Harness/WF-AUTO-SPARK.md', 'External spark search replaces discovery only', 'wf-auto-spark discovery-only inheritance');
|
|
624
|
+
requireText('Harness/WF-AUTO-SPARK.md', 'reflector PASS', 'wf-auto-spark reflector gate');
|
|
625
|
+
requireText('Harness/MEMORY_PROTOCOL.md', 'Scenario Memory Hints', 'memory protocol scenario hints');
|
|
626
|
+
requireText('Harness/MEMORY_PROTOCOL.md', 'WF closeout', 'memory protocol WF closeout injection row');
|
|
627
|
+
requireText('Harness/MEMORY_PROTOCOL.md', 'memory-master owns writes', 'memory protocol memory write ownership');
|
|
628
|
+
requireText('Harness/TDD-GUIDE.md', 'Browser/UI Acceptance TDD Gate', 'browser UI acceptance TDD gate');
|
|
629
|
+
requireText('Harness/TDD-GUIDE.md', 'syntax-only', 'syntax-only acceptance prohibition');
|
|
630
|
+
requireText('Harness/TDD-GUIDE.md', 'Playwright/CDP', 'Playwright/CDP acceptance requirement');
|
|
631
|
+
requireText('Harness/TDD-GUIDE.md', 'AC-by-AC result matrix', 'AC-by-AC TDD evidence matrix');
|
|
632
|
+
requireText('Harness/tasks/_template/PLAN.md', 'Expanded evidence required when triggered', 'task template expanded evidence trigger');
|
|
633
|
+
requireText('Harness/templates/TEST_PLAN.template.md', 'syntax-only checks', 'test plan template syntax-only prohibition');
|
|
634
|
+
requireText('.claude/skills/tdd/SKILL.md', 'Harness/ACCEPTANCE_PROTOCOL.md', 'tdd skill loads acceptance protocol');
|
|
635
|
+
requireText('.claude/skills/tdd/SKILL.md', 'Harness/HARNESS_BRIDGE.md', 'tdd skill loads harness bridge');
|
|
636
|
+
requireText('.claude/skills/tdd/SKILL.md', 'No syntax-only acceptance', 'tdd skill forbids syntax-only acceptance');
|
|
637
|
+
requireText('.claude/skills/wf-remove/SKILL.md', 'User-facing removal is the slash/skill command', 'wf-remove slash command is user-facing');
|
|
638
|
+
requireText('.claude/skills/wf-remove/SKILL.md', 'agent-internal execution steps', 'wf-remove script commands are agent-internal');
|
|
639
|
+
requireText('.claude/skills/wf-remove/SKILL.md', 'verify residual discovery folders', 'wf-remove residual discovery verification');
|
|
640
|
+
requireText('.claude/agents/tdd-guide.md', 'Browser Acceptance Rules', 'tdd-guide browser acceptance rules');
|
|
641
|
+
requireText('.claude/agents/tdd-guide.md', 'real user actions', 'tdd-guide real user action requirement');
|
|
642
|
+
requireText('.claude/agents/test-writer.md', 'Harness/ACCEPTANCE_PROTOCOL.md', 'test-writer loads acceptance protocol');
|
|
643
|
+
requireText('.claude/agents/test-writer.md', 'real user-path test', 'test-writer real user path requirement');
|
|
644
|
+
requireText('.claude/agents/test-writer.md', 'network URL, method, payload', 'test-writer network assertion requirement');
|
|
645
|
+
requireText('.claude/agents/reflector.md', 'PASS, RETURN_TO_DEBUG, or BLOCKED', 'reflector verdict contract');
|
|
646
|
+
requireText('Harness/DEBUG_PROTOCOL.md', 'Layer Classification', 'debug layer classification');
|
|
647
|
+
requireText('Harness/MEMORY_PROTOCOL.md', 'AC ID', 'memory AC traceability');
|
|
648
|
+
requireText('Harness/subagents.md', 'Max parallelism', 'subagents max parallelism row');
|
|
555
649
|
requireText('Harness/dispatch.md', 'Concurrency group', 'dispatch concurrency group field');
|
|
556
650
|
requireText('Harness/dispatch.md', 'File claim', 'dispatch file claim field');
|
|
557
|
-
requireText('CLAUDE.md', '/wf-max', 'wf max startup instruction');
|
|
558
|
-
requireText('.claude/commands/wf-help.md', 'Do not invoke a skill', 'wf-help direct command boundary');
|
|
559
|
-
requireText('.claude/commands/wf-help.md', '| `/wf-help` |', 'wf-help command row');
|
|
560
|
-
requireText('.claude/commands/wf-help.md', '| `/wf-max <task>` |', 'wf-help wf-max row');
|
|
561
|
-
requireText('.claude/commands/wf-help.md', '| `/wf-auto` |', 'wf-help wf-auto row');
|
|
562
|
-
requireText('.claude/commands/wf-help.md', '| `/wf-readme <task>` |', 'wf-help wf-readme row');
|
|
563
|
-
requireText('Harness/README.md', '## Direct Commands', 'direct commands section');
|
|
564
|
-
requireText('Harness/README.md', '.claude/commands/wf-help.md', 'wf-help router reference');
|
|
565
|
-
requireText('
|
|
566
|
-
requireText('
|
|
567
|
-
requireText('Harness/README.md', 'no runtime hook state', 'README no-hook runtime statement');
|
|
568
|
-
requireText('Harness/WF-AUTO.md', 'WF-AUTO Hook Exception', 'wf-auto-only hook exception');
|
|
569
|
-
requireText('Harness/WF-AUTO.md', 'only `/wf-auto` may use a runtime hook', 'wf-auto-only hook boundary');
|
|
570
|
-
forbidText('CLAUDE.md', 'Enforced by hooks', 'WF-MAX hook enforcement claim');
|
|
571
|
-
forbidText('
|
|
572
|
-
forbidText('Harness/
|
|
573
|
-
forbidText('Harness/
|
|
574
|
-
forbidText('
|
|
575
|
-
forbidText('Harness/README.md', '
|
|
576
|
-
forbidText('Harness/
|
|
577
|
-
forbidText('Harness/
|
|
578
|
-
forbidText('
|
|
579
|
-
forbidText('
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
651
|
+
requireText('CLAUDE.md', '/wf-max', 'wf max startup instruction');
|
|
652
|
+
requireText('.claude/commands/wf-help.md', 'Do not invoke a skill', 'wf-help direct command boundary');
|
|
653
|
+
requireText('.claude/commands/wf-help.md', '| `/wf-help` |', 'wf-help command row');
|
|
654
|
+
requireText('.claude/commands/wf-help.md', '| `/wf-max <task>` |', 'wf-help wf-max row');
|
|
655
|
+
requireText('.claude/commands/wf-help.md', '| `/wf-auto` |', 'wf-help wf-auto row');
|
|
656
|
+
requireText('.claude/commands/wf-help.md', '| `/wf-readme <task>` |', 'wf-help wf-readme row');
|
|
657
|
+
requireText('Harness/README.md', '## Direct Commands', 'direct commands section');
|
|
658
|
+
requireText('Harness/README.md', '.claude/commands/wf-help.md', 'wf-help router reference');
|
|
659
|
+
requireText('Harness/WF-MAX.md', 'three-layer architecture', 'CLAUDE.md three-layer role architecture');
|
|
660
|
+
requireText('Harness/README.md', 'no runtime hook state', 'CLAUDE no-hook role enforcement statement');
|
|
661
|
+
requireText('Harness/README.md', 'no runtime hook state', 'README no-hook runtime statement');
|
|
662
|
+
requireText('Harness/WF-AUTO.md', 'WF-AUTO Hook Exception', 'wf-auto-only hook exception');
|
|
663
|
+
requireText('Harness/WF-AUTO.md', 'only `/wf-auto` may use a runtime hook', 'wf-auto-only hook boundary');
|
|
664
|
+
forbidText('CLAUDE.md', 'Enforced by hooks', 'WF-MAX hook enforcement claim');
|
|
665
|
+
forbidText('Harness/WF.md', 'MUST use at least 3 distinct role passes', 'old WF role-pass minimum');
|
|
666
|
+
forbidText('Harness/WF.md', 'at least three distinct role passes', 'old WF role-pass wording');
|
|
667
|
+
forbidText('Harness/dispatch.md', 'requires ≥3 distinct subagents', 'old dispatch WF role minimum');
|
|
668
|
+
forbidText('CLAUDE.md', 'WF-MAX hooks', 'WF-MAX hook enforcement claim');
|
|
669
|
+
forbidText('Harness/README.md', 'PreToolUse hook', 'WF-MAX PreToolUse hook claim');
|
|
670
|
+
forbidText('Harness/README.md', 'SessionStart hook', 'WF-MAX SessionStart hook claim');
|
|
671
|
+
forbidText('Harness/README.md', 'hook-managed', 'hook-managed runtime claim');
|
|
672
|
+
forbidText('Harness/README.md', 'HOOK_PROTOCOL.md', 'removed hook protocol reference');
|
|
673
|
+
forbidText('Harness/WF-AUTO.md', 'Hook-Assisted Long Loop', 'wf-auto hook loop section');
|
|
674
|
+
forbidText('Harness/dispatch.md', 'removes the cap entirely', 'unbounded runtime-cap claim');
|
|
675
|
+
forbidText('Harness/WF-MAX.md', 'no hard agent cap; recursion governed', 'unbounded agent-cap claim');
|
|
676
|
+
forbidText('Harness/MEMORY_PROTOCOL.md', 'Hooks may', 'hook-triggered memory claim');
|
|
677
|
+
forbidText('.claude/settings.json', 'wf-mode-hook.mjs', 'Claude WF hook command registration');
|
|
678
|
+
forbidText('.codex/hooks.json', 'wf-mode-hook.mjs', 'Codex WF hook command registration');
|
|
679
|
+
const codexHookConfig = read('.codex/hooks.json');
|
|
680
|
+
const claudeSettings = read('.claude/settings.json');
|
|
681
|
+
if (codexHookConfig && !codexHookConfig.includes('wf-auto')) {
|
|
682
|
+
errors.push('.codex/hooks.json may only exist for a wf-auto hook configuration');
|
|
683
|
+
}
|
|
684
|
+
if (claudeSettings.includes('"hooks"') && !claudeSettings.includes('wf-auto')) {
|
|
685
|
+
errors.push('.claude/settings.json hooks may only be used for wf-auto');
|
|
686
|
+
}
|
|
687
|
+
if (read('.codex/config.toml').includes('hooks = true') && !codexHookConfig.includes('wf-auto')) {
|
|
688
|
+
errors.push('.codex/config.toml may enable hooks only with a wf-auto hook configuration');
|
|
689
|
+
}
|
|
690
|
+
if (errors.length) {
|
|
592
691
|
console.error(`Harness validation failed${strict ? ' (strict)' : ''}:`);
|
|
593
692
|
for (const error of errors) console.error(`- ${error}`);
|
|
594
693
|
process.exit(1);
|