workspace-maxxing 0.1.0

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 (198) hide show
  1. package/.agents/skills/workspace-maxxing/.workspace-templates/CONTEXT.md +44 -0
  2. package/.agents/skills/workspace-maxxing/.workspace-templates/SYSTEM.md +44 -0
  3. package/.agents/skills/workspace-maxxing/.workspace-templates/references/anti-patterns.md +16 -0
  4. package/.agents/skills/workspace-maxxing/.workspace-templates/references/iron-laws.md +26 -0
  5. package/.agents/skills/workspace-maxxing/.workspace-templates/references/reporting-format.md +52 -0
  6. package/.agents/skills/workspace-maxxing/.workspace-templates/scripts/benchmark.ts +171 -0
  7. package/.agents/skills/workspace-maxxing/.workspace-templates/scripts/dispatch.ts +473 -0
  8. package/.agents/skills/workspace-maxxing/.workspace-templates/scripts/generate-tests.ts +158 -0
  9. package/.agents/skills/workspace-maxxing/.workspace-templates/scripts/install-tool.ts +82 -0
  10. package/.agents/skills/workspace-maxxing/.workspace-templates/scripts/iterate.ts +265 -0
  11. package/.agents/skills/workspace-maxxing/.workspace-templates/scripts/orchestrator.ts +539 -0
  12. package/.agents/skills/workspace-maxxing/.workspace-templates/scripts/scaffold.ts +282 -0
  13. package/.agents/skills/workspace-maxxing/.workspace-templates/scripts/validate.ts +452 -0
  14. package/.agents/skills/workspace-maxxing/.workspace-templates/skills/architecture/SKILL.md +95 -0
  15. package/.agents/skills/workspace-maxxing/.workspace-templates/skills/fixer/SKILL.md +109 -0
  16. package/.agents/skills/workspace-maxxing/.workspace-templates/skills/iteration/SKILL.md +89 -0
  17. package/.agents/skills/workspace-maxxing/.workspace-templates/skills/prompt-engineering/SKILL.md +87 -0
  18. package/.agents/skills/workspace-maxxing/.workspace-templates/skills/research/SKILL.md +94 -0
  19. package/.agents/skills/workspace-maxxing/.workspace-templates/skills/testing/SKILL.md +89 -0
  20. package/.agents/skills/workspace-maxxing/.workspace-templates/skills/tooling/SKILL.md +87 -0
  21. package/.agents/skills/workspace-maxxing/.workspace-templates/skills/validation/SKILL.md +103 -0
  22. package/.agents/skills/workspace-maxxing/.workspace-templates/skills/worker/SKILL.md +79 -0
  23. package/.agents/skills/workspace-maxxing/.workspace-templates/workspace/00-meta/CONTEXT.md +6 -0
  24. package/.agents/skills/workspace-maxxing/.workspace-templates/workspace/00-meta/execution-log.md +27 -0
  25. package/.agents/skills/workspace-maxxing/.workspace-templates/workspace/01-input/CONTEXT.md +29 -0
  26. package/.agents/skills/workspace-maxxing/.workspace-templates/workspace/02-process/CONTEXT.md +29 -0
  27. package/.agents/skills/workspace-maxxing/.workspace-templates/workspace/03-output/CONTEXT.md +29 -0
  28. package/.agents/skills/workspace-maxxing/.workspace-templates/workspace/README.md +14 -0
  29. package/.agents/skills/workspace-maxxing/SKILL.md +312 -0
  30. package/.agents/skills/workspace-maxxing/scripts/benchmark.ts +171 -0
  31. package/.agents/skills/workspace-maxxing/scripts/dispatch.ts +473 -0
  32. package/.agents/skills/workspace-maxxing/scripts/generate-tests.ts +158 -0
  33. package/.agents/skills/workspace-maxxing/scripts/install-tool.ts +82 -0
  34. package/.agents/skills/workspace-maxxing/scripts/iterate.ts +265 -0
  35. package/.agents/skills/workspace-maxxing/scripts/orchestrator.ts +539 -0
  36. package/.agents/skills/workspace-maxxing/scripts/scaffold.ts +282 -0
  37. package/.agents/skills/workspace-maxxing/scripts/validate.ts +452 -0
  38. package/README.md +144 -0
  39. package/dist/agent-creator.d.ts +9 -0
  40. package/dist/agent-creator.d.ts.map +1 -0
  41. package/dist/agent-creator.js +199 -0
  42. package/dist/agent-creator.js.map +1 -0
  43. package/dist/agent-iterator.d.ts +38 -0
  44. package/dist/agent-iterator.d.ts.map +1 -0
  45. package/dist/agent-iterator.js +327 -0
  46. package/dist/agent-iterator.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +197 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/install.d.ts +18 -0
  52. package/dist/install.d.ts.map +1 -0
  53. package/dist/install.js +117 -0
  54. package/dist/install.js.map +1 -0
  55. package/dist/platforms/claude.d.ts +7 -0
  56. package/dist/platforms/claude.d.ts.map +1 -0
  57. package/dist/platforms/claude.js +70 -0
  58. package/dist/platforms/claude.js.map +1 -0
  59. package/dist/platforms/copilot.d.ts +7 -0
  60. package/dist/platforms/copilot.d.ts.map +1 -0
  61. package/dist/platforms/copilot.js +75 -0
  62. package/dist/platforms/copilot.js.map +1 -0
  63. package/dist/platforms/gemini.d.ts +7 -0
  64. package/dist/platforms/gemini.d.ts.map +1 -0
  65. package/dist/platforms/gemini.js +81 -0
  66. package/dist/platforms/gemini.js.map +1 -0
  67. package/dist/platforms/index.d.ts +8 -0
  68. package/dist/platforms/index.d.ts.map +1 -0
  69. package/dist/platforms/index.js +41 -0
  70. package/dist/platforms/index.js.map +1 -0
  71. package/dist/platforms/opencode.d.ts +7 -0
  72. package/dist/platforms/opencode.d.ts.map +1 -0
  73. package/dist/platforms/opencode.js +70 -0
  74. package/dist/platforms/opencode.js.map +1 -0
  75. package/dist/scripts/benchmark.d.ts +20 -0
  76. package/dist/scripts/benchmark.d.ts.map +1 -0
  77. package/dist/scripts/benchmark.js +170 -0
  78. package/dist/scripts/benchmark.js.map +1 -0
  79. package/dist/scripts/dispatch.d.ts +32 -0
  80. package/dist/scripts/dispatch.d.ts.map +1 -0
  81. package/dist/scripts/dispatch.js +386 -0
  82. package/dist/scripts/dispatch.js.map +1 -0
  83. package/dist/scripts/generate-tests.d.ts +11 -0
  84. package/dist/scripts/generate-tests.d.ts.map +1 -0
  85. package/dist/scripts/generate-tests.js +118 -0
  86. package/dist/scripts/generate-tests.js.map +1 -0
  87. package/dist/scripts/install-tool.d.ts +8 -0
  88. package/dist/scripts/install-tool.d.ts.map +1 -0
  89. package/dist/scripts/install-tool.js +98 -0
  90. package/dist/scripts/install-tool.js.map +1 -0
  91. package/dist/scripts/iterate.d.ts +44 -0
  92. package/dist/scripts/iterate.d.ts.map +1 -0
  93. package/dist/scripts/iterate.js +260 -0
  94. package/dist/scripts/iterate.js.map +1 -0
  95. package/dist/scripts/orchestrator.d.ts +40 -0
  96. package/dist/scripts/orchestrator.d.ts.map +1 -0
  97. package/dist/scripts/orchestrator.js +378 -0
  98. package/dist/scripts/orchestrator.js.map +1 -0
  99. package/dist/scripts/scaffold.d.ts +8 -0
  100. package/dist/scripts/scaffold.d.ts.map +1 -0
  101. package/dist/scripts/scaffold.js +279 -0
  102. package/dist/scripts/scaffold.js.map +1 -0
  103. package/dist/scripts/validate.d.ts +11 -0
  104. package/dist/scripts/validate.d.ts.map +1 -0
  105. package/dist/scripts/validate.js +472 -0
  106. package/dist/scripts/validate.js.map +1 -0
  107. package/docs/superpowers/plans/2026-04-07-autonomous-iteration-plan.md +1123 -0
  108. package/docs/superpowers/plans/2026-04-07-autonomous-iteration-sub-agent-batches.md +1923 -0
  109. package/docs/superpowers/plans/2026-04-07-autonomous-workflow-sub-skill-plan.md +1505 -0
  110. package/docs/superpowers/plans/2026-04-07-benchmarking-multi-agent-plan.md +854 -0
  111. package/docs/superpowers/plans/2026-04-07-workspace-builder-logic-plan.md +1426 -0
  112. package/docs/superpowers/plans/2026-04-07-workspace-maxxing-plan.md +1299 -0
  113. package/docs/superpowers/plans/2026-04-08-session-294c-subagent-invocation-plan.md +320 -0
  114. package/docs/superpowers/plans/2026-04-08-workflow-prompt-hardening-plan.md +1025 -0
  115. package/docs/superpowers/plans/2026-04-12-workspace-agent-creation-plan.md +992 -0
  116. package/docs/superpowers/specs/2026-04-07-autonomous-iteration-design.md +214 -0
  117. package/docs/superpowers/specs/2026-04-07-autonomous-iteration-sub-agent-batches-design.md +188 -0
  118. package/docs/superpowers/specs/2026-04-07-autonomous-workflow-sub-skill-design.md +137 -0
  119. package/docs/superpowers/specs/2026-04-07-benchmarking-multi-agent-design.md +105 -0
  120. package/docs/superpowers/specs/2026-04-07-workspace-builder-logic-design.md +179 -0
  121. package/docs/superpowers/specs/2026-04-07-workspace-maxxing-design.md +227 -0
  122. package/docs/superpowers/specs/2026-04-08-session-294c-subagent-invocation-design.md +265 -0
  123. package/docs/superpowers/specs/2026-04-08-workflow-prompt-hardening-design.md +146 -0
  124. package/docs/superpowers/specs/2026-04-12-workspace-agent-creation-design.md +239 -0
  125. package/jest.config.js +8 -0
  126. package/package.json +32 -0
  127. package/src/agent-creator.ts +180 -0
  128. package/src/agent-iterator.ts +397 -0
  129. package/src/index.ts +189 -0
  130. package/src/install.ts +105 -0
  131. package/src/platforms/claude.ts +40 -0
  132. package/src/platforms/copilot.ts +50 -0
  133. package/src/platforms/gemini.ts +55 -0
  134. package/src/platforms/index.ts +45 -0
  135. package/src/platforms/opencode.ts +41 -0
  136. package/src/scripts/benchmark.ts +171 -0
  137. package/src/scripts/dispatch.ts +473 -0
  138. package/src/scripts/generate-tests.ts +112 -0
  139. package/src/scripts/install-tool.ts +82 -0
  140. package/src/scripts/iterate.ts +271 -0
  141. package/src/scripts/orchestrator.ts +539 -0
  142. package/src/scripts/scaffold.ts +282 -0
  143. package/src/scripts/validate.ts +516 -0
  144. package/templates/.workspace-templates/CONTEXT.md +44 -0
  145. package/templates/.workspace-templates/SYSTEM.md +44 -0
  146. package/templates/.workspace-templates/references/anti-patterns.md +16 -0
  147. package/templates/.workspace-templates/references/iron-laws.md +26 -0
  148. package/templates/.workspace-templates/references/reporting-format.md +52 -0
  149. package/templates/.workspace-templates/scripts/benchmark.ts +171 -0
  150. package/templates/.workspace-templates/scripts/dispatch.ts +473 -0
  151. package/templates/.workspace-templates/scripts/generate-tests.ts +158 -0
  152. package/templates/.workspace-templates/scripts/install-tool.ts +82 -0
  153. package/templates/.workspace-templates/scripts/iterate.ts +265 -0
  154. package/templates/.workspace-templates/scripts/orchestrator.ts +539 -0
  155. package/templates/.workspace-templates/scripts/scaffold.ts +282 -0
  156. package/templates/.workspace-templates/scripts/validate.ts +452 -0
  157. package/templates/.workspace-templates/skills/architecture/SKILL.md +95 -0
  158. package/templates/.workspace-templates/skills/fixer/SKILL.md +109 -0
  159. package/templates/.workspace-templates/skills/iteration/SKILL.md +89 -0
  160. package/templates/.workspace-templates/skills/prompt-engineering/SKILL.md +87 -0
  161. package/templates/.workspace-templates/skills/research/SKILL.md +94 -0
  162. package/templates/.workspace-templates/skills/testing/SKILL.md +89 -0
  163. package/templates/.workspace-templates/skills/tooling/SKILL.md +87 -0
  164. package/templates/.workspace-templates/skills/validation/SKILL.md +103 -0
  165. package/templates/.workspace-templates/skills/worker/SKILL.md +79 -0
  166. package/templates/.workspace-templates/workspace/00-meta/CONTEXT.md +6 -0
  167. package/templates/.workspace-templates/workspace/00-meta/execution-log.md +27 -0
  168. package/templates/.workspace-templates/workspace/01-input/CONTEXT.md +29 -0
  169. package/templates/.workspace-templates/workspace/02-process/CONTEXT.md +29 -0
  170. package/templates/.workspace-templates/workspace/03-output/CONTEXT.md +29 -0
  171. package/templates/.workspace-templates/workspace/README.md +14 -0
  172. package/templates/SKILL.md +347 -0
  173. package/tests/benchmark.test.ts +158 -0
  174. package/tests/cli.test.ts +109 -0
  175. package/tests/dispatch-parallel.test.ts +124 -0
  176. package/tests/dispatch.test.ts +218 -0
  177. package/tests/fixer-skill.test.ts +203 -0
  178. package/tests/generate-tests.test.ts +101 -0
  179. package/tests/install-tool.test.ts +141 -0
  180. package/tests/install.test.ts +144 -0
  181. package/tests/integration.test.ts +324 -0
  182. package/tests/iterate.test.ts +219 -0
  183. package/tests/orchestrator.test.ts +710 -0
  184. package/tests/scaffold.test.ts +238 -0
  185. package/tests/templates-enhanced.test.ts +208 -0
  186. package/tests/templates.test.ts +219 -0
  187. package/tests/validate.test.ts +421 -0
  188. package/tests/validation-enhanced.test.ts +303 -0
  189. package/tests/worker-skill.test.ts +88 -0
  190. package/tsconfig.json +19 -0
  191. package/workspace/00-meta/CONTEXT.md +3 -0
  192. package/workspace/00-meta/execution-log.md +17 -0
  193. package/workspace/00-meta/tools.md +11 -0
  194. package/workspace/01-input/CONTEXT.md +27 -0
  195. package/workspace/CONTEXT.md +35 -0
  196. package/workspace/README.md +14 -0
  197. package/workspace/SYSTEM.md +36 -0
  198. package/workspace-maxxing-0.1.0.tgz +0 -0
@@ -0,0 +1,1123 @@
1
+ # Autonomous Iteration & Validation Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Implement an autonomous iteration engine (iterate.ts) and test case generator (generate-tests.ts) that enable agents to self-test, self-evaluate, and improve workspaces without human involvement.
6
+
7
+ **Architecture:** Two zero-dependency TypeScript scripts. `iterate.ts` orchestrates a 3-pass improvement loop (validate-fix → score → checklist) and returns structured JSON results. `generate-tests.ts` produces test cases per stage for agent-driven sub-agent evaluation. SKILL.md is enhanced with autonomous iteration instructions.
8
+
9
+ **Tech Stack:** TypeScript, Node.js builtins only (`fs`, `path`, `process`), Jest for testing
10
+
11
+ ---
12
+
13
+ ## File Structure
14
+
15
+ **New files:**
16
+ - `src/scripts/iterate.ts` — 3-pass orchestration script
17
+ - `src/scripts/generate-tests.ts` — Test case generator
18
+ - `templates/.workspace-templates/scripts/iterate.ts` — Copy for distribution
19
+ - `templates/.workspace-templates/scripts/generate-tests.ts` — Copy for distribution
20
+ - `tests/iterate.test.ts` — Tests for iterate
21
+ - `tests/generate-tests.test.ts` — Tests for generate-tests
22
+
23
+ **Modified files:**
24
+ - `templates/SKILL.md` — Add "## Autonomous Iteration" section
25
+ - `tests/integration.test.ts` — Add assertions for new scripts
26
+
27
+ ---
28
+
29
+ ### Task 1: Iterate Script — Tests
30
+
31
+ **Files:**
32
+ - Test: `tests/iterate.test.ts`
33
+
34
+ - [ ] **Step 1: Write iterate tests**
35
+
36
+ ```typescript
37
+ // tests/iterate.test.ts
38
+ import * as fs from 'fs';
39
+ import * as path from 'path';
40
+ import * as os from 'os';
41
+ import { iterateWorkspace, IterateResult } from '../src/scripts/iterate';
42
+ import * as validate from '../src/scripts/validate';
43
+
44
+ jest.mock('../src/scripts/validate');
45
+
46
+ describe('iterate', () => {
47
+ let tempDir: string;
48
+
49
+ beforeEach(() => {
50
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'iterate-test-'));
51
+ });
52
+
53
+ afterEach(() => {
54
+ fs.rmSync(tempDir, { recursive: true, force: true });
55
+ jest.clearAllMocks();
56
+ });
57
+
58
+ function createBasicWorkspace(): string {
59
+ const ws = path.join(tempDir, 'workspace');
60
+ fs.mkdirSync(ws, { recursive: true });
61
+ fs.writeFileSync(path.join(ws, 'SYSTEM.md'), '# Test\n\n## Role\nWorkspace role\n\n## Folder Map\n\n- `01-input/`\n- `02-output/`\n\n## Rules\nICM rules\n');
62
+ fs.writeFileSync(path.join(ws, 'CONTEXT.md'), '# Router\n\n## Routing Table\n\n- `01-input/` → `01-input/CONTEXT.md`\n- `02-output/` → `02-output/CONTEXT.md`\n');
63
+ fs.mkdirSync(path.join(ws, '01-input'), { recursive: true });
64
+ fs.writeFileSync(path.join(ws, '01-input', 'CONTEXT.md'), '# 01-input\n\n## Purpose\nInput stage\n\n## Inputs\nRaw data\n\n## Outputs\nValidated data\n\n## Dependencies\nNone\n');
65
+ fs.mkdirSync(path.join(ws, '02-output'), { recursive: true });
66
+ fs.writeFileSync(path.join(ws, '02-output', 'CONTEXT.md'), '# 02-output\n\n## Purpose\nOutput stage\n\n## Inputs\nProcessed data\n\n## Outputs\nFinal report\n\n## Dependencies\n01-input\n');
67
+ fs.mkdirSync(path.join(ws, '00-meta'), { recursive: true });
68
+ fs.writeFileSync(path.join(ws, '00-meta', 'tools.md'), '# Tool Inventory\n\n## Installed Tools\n\n| Tool | Version | Manager | Installed |\n|------|---------|---------|-----------|\n| — | — | — | — |\n');
69
+ fs.writeFileSync(path.join(ws, 'README.md'), '# Test Workspace\n\n## Usage\nFollow stages in order.\n');
70
+ return ws;
71
+ }
72
+
73
+ describe('iterateWorkspace', () => {
74
+ it('passes all three passes on a good workspace', () => {
75
+ const ws = createBasicWorkspace();
76
+ (validate.validateWorkspace as jest.Mock).mockReturnValue({
77
+ passed: true,
78
+ checks: [],
79
+ });
80
+
81
+ const result = iterateWorkspace(ws, { maxRetries: 3 });
82
+
83
+ expect(result.passes.validate.status).toBe('passed');
84
+ expect(result.passes.score.score).toBeGreaterThan(0);
85
+ expect(result.passes.checklist.items).toBeGreaterThan(0);
86
+ expect(result.escalate).toBe(false);
87
+ });
88
+
89
+ it('retries validation failures up to maxRetries', () => {
90
+ const ws = createBasicWorkspace();
91
+ (validate.validateWorkspace as jest.Mock)
92
+ .mockReturnValueOnce({ passed: false, checks: [{ name: 'SYSTEM.md exists', passed: false, message: 'Missing' }] })
93
+ .mockReturnValueOnce({ passed: true, checks: [] });
94
+
95
+ const result = iterateWorkspace(ws, { maxRetries: 3 });
96
+
97
+ expect(result.passes.validate.retries).toBe(1);
98
+ expect(result.passes.validate.status).toBe('passed');
99
+ });
100
+
101
+ it('escalates when validation fails after max retries', () => {
102
+ const ws = createBasicWorkspace();
103
+ (validate.validateWorkspace as jest.Mock).mockReturnValue({
104
+ passed: false,
105
+ checks: [{ name: 'SYSTEM.md exists', passed: false, message: 'Missing' }],
106
+ });
107
+
108
+ const result = iterateWorkspace(ws, { maxRetries: 2 });
109
+
110
+ expect(result.escalate).toBe(true);
111
+ expect(result.passes.validate.status).toBe('escalated');
112
+ expect(result.passes.validate.retries).toBe(2);
113
+ });
114
+
115
+ it('returns score with improvements for low-quality workspace', () => {
116
+ const ws = path.join(tempDir, 'workspace');
117
+ fs.mkdirSync(ws, { recursive: true });
118
+ fs.writeFileSync(path.join(ws, 'SYSTEM.md'), '# Minimal\n');
119
+ fs.writeFileSync(path.join(ws, 'CONTEXT.md'), '# Router\n');
120
+ fs.mkdirSync(path.join(ws, '01-input'), { recursive: true });
121
+ fs.writeFileSync(path.join(ws, '01-input', 'CONTEXT.md'), '# 01-input\n');
122
+ fs.mkdirSync(path.join(ws, '00-meta'), { recursive: true });
123
+ fs.writeFileSync(path.join(ws, '00-meta', 'tools.md'), '# Tools\n');
124
+
125
+ (validate.validateWorkspace as jest.Mock).mockReturnValue({
126
+ passed: true,
127
+ checks: [],
128
+ });
129
+
130
+ const result = iterateWorkspace(ws, { maxRetries: 1 });
131
+
132
+ expect(result.passes.score.score).toBeLessThan(80);
133
+ expect(result.passes.score.improvements.length).toBeGreaterThan(0);
134
+ });
135
+
136
+ it('checklist reports pass/fail per item', () => {
137
+ const ws = createBasicWorkspace();
138
+ (validate.validateWorkspace as jest.Mock).mockReturnValue({
139
+ passed: true,
140
+ checks: [],
141
+ });
142
+
143
+ const result = iterateWorkspace(ws, { maxRetries: 1 });
144
+
145
+ expect(result.passes.checklist.items).toBe(result.passes.checklist.passed + result.passes.checklist.failed);
146
+ });
147
+ });
148
+
149
+ describe('scoreWorkspace', () => {
150
+ it('scores a perfect workspace 100', () => {
151
+ const ws = createBasicWorkspace();
152
+ const score = scoreWorkspace(ws);
153
+
154
+ expect(score.total).toBe(100);
155
+ expect(score.improvements).toHaveLength(0);
156
+ });
157
+
158
+ it('deducts points for missing SYSTEM.md sections', () => {
159
+ const ws = path.join(tempDir, 'workspace');
160
+ fs.mkdirSync(ws, { recursive: true });
161
+ fs.writeFileSync(path.join(ws, 'SYSTEM.md'), '# Minimal\n');
162
+
163
+ const score = scoreWorkspace(ws);
164
+
165
+ expect(score.system).toBeLessThan(20);
166
+ });
167
+
168
+ it('deducts points for missing CONTEXT.md routing', () => {
169
+ const ws = path.join(tempDir, 'workspace');
170
+ fs.mkdirSync(ws, { recursive: true });
171
+ fs.writeFileSync(path.join(ws, 'SYSTEM.md'), '# Test\n\n## Folder Map\n\n');
172
+ fs.writeFileSync(path.join(ws, 'CONTEXT.md'), '# Router\n');
173
+
174
+ const score = scoreWorkspace(ws);
175
+
176
+ expect(score.context).toBeLessThan(20);
177
+ });
178
+
179
+ it('deducts points for incomplete stage CONTEXT.md', () => {
180
+ const ws = path.join(tempDir, 'workspace');
181
+ fs.mkdirSync(ws, { recursive: true });
182
+ fs.writeFileSync(path.join(ws, 'SYSTEM.md'), '# Test\n\n## Folder Map\n\n- `01-input/`\n');
183
+ fs.writeFileSync(path.join(ws, 'CONTEXT.md'), '# Router\n\n## Routing Table\n\n- `01-input/`\n');
184
+ fs.mkdirSync(path.join(ws, '01-input'), { recursive: true });
185
+ fs.writeFileSync(path.join(ws, '01-input', 'CONTEXT.md'), '# 01-input\n');
186
+
187
+ const score = scoreWorkspace(ws);
188
+
189
+ expect(score.stages).toBeLessThan(15);
190
+ });
191
+
192
+ it('deducts points for missing tools.md', () => {
193
+ const ws = path.join(tempDir, 'workspace');
194
+ fs.mkdirSync(ws, { recursive: true });
195
+ fs.writeFileSync(path.join(ws, 'SYSTEM.md'), '# Test\n\n## Role\nRole\n\n## Folder Map\n\n');
196
+ fs.writeFileSync(path.join(ws, 'CONTEXT.md'), '# Router\n\n## Routing Table\n\n');
197
+
198
+ const score = scoreWorkspace(ws);
199
+
200
+ expect(score.tools).toBe(0);
201
+ });
202
+ });
203
+
204
+ describe('runChecklist', () => {
205
+ it('passes all items on a complete workspace', () => {
206
+ const ws = createBasicWorkspace();
207
+ const result = runChecklist(ws);
208
+
209
+ expect(result.failed).toBe(0);
210
+ expect(result.passed).toBe(result.items);
211
+ });
212
+
213
+ it('fails items for incomplete stages', () => {
214
+ const ws = path.join(tempDir, 'workspace');
215
+ fs.mkdirSync(ws, { recursive: true });
216
+ fs.writeFileSync(path.join(ws, 'SYSTEM.md'), '# Test\n\n## Folder Map\n\n- `01-input/`\n');
217
+ fs.writeFileSync(path.join(ws, 'CONTEXT.md'), '# Router\n\n## Routing Table\n\n- `01-input/`\n');
218
+ fs.mkdirSync(path.join(ws, '01-input'), { recursive: true });
219
+ fs.writeFileSync(path.join(ws, '01-input', 'CONTEXT.md'), '# 01-input\n');
220
+ fs.writeFileSync(path.join(ws, 'README.md'), '# README\n');
221
+
222
+ const result = runChecklist(ws);
223
+
224
+ expect(result.failed).toBeGreaterThan(0);
225
+ });
226
+ });
227
+ });
228
+ ```
229
+
230
+ - [ ] **Step 2: Run tests to verify they fail**
231
+
232
+ Run: `npm test -- tests/iterate.test.ts`
233
+ Expected: FAIL — module not found
234
+
235
+ ---
236
+
237
+ ### Task 2: Iterate Script — Implementation
238
+
239
+ **Files:**
240
+ - Create: `src/scripts/iterate.ts`
241
+
242
+ - [ ] **Step 1: Implement iterate script**
243
+
244
+ ```typescript
245
+ // src/scripts/iterate.ts
246
+ import * as fs from 'fs';
247
+ import * as path from 'path';
248
+ import { validateWorkspace } from './validate';
249
+
250
+ export interface IterateOptions {
251
+ maxRetries?: number;
252
+ }
253
+
254
+ export interface ValidatePassResult {
255
+ status: 'passed' | 'failed' | 'escalated';
256
+ retries: number;
257
+ failures?: string[];
258
+ }
259
+
260
+ export interface ScorePassResult {
261
+ score: number;
262
+ improvements: string[];
263
+ }
264
+
265
+ export interface ChecklistResult {
266
+ items: number;
267
+ passed: number;
268
+ failed: number;
269
+ details: { name: string; passed: boolean }[];
270
+ }
271
+
272
+ export interface IterateResult {
273
+ passes: {
274
+ validate: ValidatePassResult;
275
+ score: ScorePassResult;
276
+ checklist: ChecklistResult;
277
+ };
278
+ escalate: boolean;
279
+ }
280
+
281
+ export interface ScoreBreakdown {
282
+ system: number;
283
+ context: number;
284
+ stages: number;
285
+ tools: number;
286
+ total: number;
287
+ improvements: string[];
288
+ }
289
+
290
+ export function iterateWorkspace(
291
+ workspacePath: string,
292
+ options: IterateOptions = {},
293
+ ): IterateResult {
294
+ const { maxRetries = 3 } = options;
295
+ const ws = path.resolve(workspacePath);
296
+
297
+ // Pass 1: Validate-Fix Loop
298
+ const validateResult = runValidatePass(ws, maxRetries);
299
+
300
+ // If escalated, still run score and checklist for diagnostics but mark escalate
301
+ const scoreResult = runScorePass(ws);
302
+ const checklistResult = runChecklist(ws);
303
+
304
+ const result: IterateResult = {
305
+ passes: {
306
+ validate: validateResult,
307
+ score: scoreResult,
308
+ checklist: checklistResult,
309
+ },
310
+ escalate: validateResult.status === 'escalated',
311
+ };
312
+
313
+ // Print results
314
+ console.log(JSON.stringify(result, null, 2));
315
+
316
+ return result;
317
+ }
318
+
319
+ function runValidatePass(ws: string, maxRetries: number): ValidatePassResult {
320
+ let retries = 0;
321
+
322
+ for (let i = 0; i < maxRetries; i++) {
323
+ const result = validateWorkspace(ws);
324
+
325
+ if (result.passed) {
326
+ return { status: 'passed', retries: i };
327
+ }
328
+
329
+ retries = i + 1;
330
+ }
331
+
332
+ // Collect failure details
333
+ const lastResult = validateWorkspace(ws);
334
+ const failures = lastResult.checks.filter((c) => !c.passed).map((c) => `${c.name}: ${c.message}`);
335
+
336
+ return {
337
+ status: 'escalated',
338
+ retries,
339
+ failures,
340
+ };
341
+ }
342
+
343
+ function runScorePass(ws: string): ScorePassResult {
344
+ const score = scoreWorkspace(ws);
345
+ return {
346
+ score: score.total,
347
+ improvements: score.improvements,
348
+ };
349
+ }
350
+
351
+ export function scoreWorkspace(workspacePath: string): ScoreBreakdown {
352
+ const ws = path.resolve(workspacePath);
353
+ const improvements: string[] = [];
354
+ let system = 0;
355
+ let context = 0;
356
+ let stages = 0;
357
+ let tools = 0;
358
+
359
+ // SYSTEM.md quality (20 points)
360
+ const systemMdPath = path.join(ws, 'SYSTEM.md');
361
+ if (fs.existsSync(systemMdPath)) {
362
+ const content = fs.readFileSync(systemMdPath, 'utf-8');
363
+ if (content.toLowerCase().includes('## role') || content.toLowerCase().includes('role')) system += 7;
364
+ else improvements.push('SYSTEM.md missing Role section');
365
+ if (content.toLowerCase().includes('folder map')) system += 7;
366
+ else improvements.push('SYSTEM.md missing Folder Map');
367
+ if (content.toLowerCase().includes('## rules') || content.toLowerCase().includes('rule')) system += 6;
368
+ else improvements.push('SYSTEM.md missing Rules section');
369
+ } else {
370
+ improvements.push('SYSTEM.md missing entirely');
371
+ }
372
+
373
+ // CONTEXT.md quality (20 points)
374
+ const contextMdPath = path.join(ws, 'CONTEXT.md');
375
+ if (fs.existsSync(contextMdPath)) {
376
+ const content = fs.readFileSync(contextMdPath, 'utf-8');
377
+ if (content.toLowerCase().includes('routing table')) context += 10;
378
+ else improvements.push('CONTEXT.md missing Routing Table');
379
+ // Check if it references all numbered folders
380
+ const numberedFolders = getNumberedFolders(ws);
381
+ const allReferenced = numberedFolders.every((f) => content.includes(f));
382
+ if (allReferenced && numberedFolders.length > 0) context += 10;
383
+ else if (numberedFolders.length > 0) improvements.push('CONTEXT.md does not reference all stages');
384
+ } else {
385
+ improvements.push('CONTEXT.md missing entirely');
386
+ }
387
+
388
+ // Stage CONTEXT.md quality (15 points per stage, capped at 45)
389
+ const stageFolders = getNumberedFolders(ws);
390
+ let stageScore = 0;
391
+ for (const folder of stageFolders) {
392
+ const stageContextPath = path.join(ws, folder, 'CONTEXT.md');
393
+ let folderScore = 0;
394
+ if (fs.existsSync(stageContextPath)) {
395
+ const content = fs.readFileSync(stageContextPath, 'utf-8');
396
+ if (content.toLowerCase().includes('purpose') || content.toLowerCase().includes('## purpose')) folderScore += 4;
397
+ else improvements.push(`${folder}/CONTEXT.md missing Purpose`);
398
+ if (content.toLowerCase().includes('input')) folderScore += 4;
399
+ else improvements.push(`${folder}/CONTEXT.md missing Inputs`);
400
+ if (content.toLowerCase().includes('output')) folderScore += 4;
401
+ else improvements.push(`${folder}/CONTEXT.md missing Outputs`);
402
+ if (content.toLowerCase().includes('dependenc')) folderScore += 3;
403
+ else improvements.push(`${folder}/CONTEXT.md missing Dependencies`);
404
+ } else {
405
+ improvements.push(`${folder}/CONTEXT.md missing`);
406
+ }
407
+ stageScore += folderScore;
408
+ }
409
+ stages = Math.min(stageScore, 45);
410
+
411
+ // tools.md (15 points)
412
+ const toolsMdPath = path.join(ws, '00-meta', 'tools.md');
413
+ if (fs.existsSync(toolsMdPath)) {
414
+ const content = fs.readFileSync(toolsMdPath, 'utf-8');
415
+ if (content.trim().length > 20) tools += 15;
416
+ else {
417
+ tools += 5;
418
+ improvements.push('tools.md exists but has minimal content');
419
+ }
420
+ } else {
421
+ improvements.push('tools.md missing');
422
+ }
423
+
424
+ return {
425
+ system,
426
+ context,
427
+ stages,
428
+ tools,
429
+ total: system + context + stages + tools,
430
+ improvements,
431
+ };
432
+ }
433
+
434
+ export function runChecklist(workspacePath: string): ChecklistResult {
435
+ const ws = path.resolve(workspacePath);
436
+ const details: { name: string; passed: boolean }[] = [];
437
+
438
+ const stageFolders = getNumberedFolders(ws);
439
+
440
+ for (const folder of stageFolders) {
441
+ const contextPath = path.join(ws, folder, 'CONTEXT.md');
442
+ if (fs.existsSync(contextPath)) {
443
+ const content = fs.readFileSync(contextPath, 'utf-8');
444
+ details.push({
445
+ name: `${folder} has inputs defined`,
446
+ passed: content.toLowerCase().includes('input'),
447
+ });
448
+ details.push({
449
+ name: `${folder} has outputs defined`,
450
+ passed: content.toLowerCase().includes('output'),
451
+ });
452
+ details.push({
453
+ name: `${folder} has dependencies defined`,
454
+ passed: content.toLowerCase().includes('dependenc'),
455
+ });
456
+ } else {
457
+ details.push({ name: `${folder} has CONTEXT.md`, passed: false });
458
+ details.push({ name: `${folder} has inputs defined`, passed: false });
459
+ details.push({ name: `${folder} has outputs defined`, passed: false });
460
+ details.push({ name: `${folder} has dependencies defined`, passed: false });
461
+ }
462
+ }
463
+
464
+ // Routing table references all numbered folders
465
+ const contextMdPath = path.join(ws, 'CONTEXT.md');
466
+ if (fs.existsSync(contextMdPath)) {
467
+ const content = fs.readFileSync(contextMdPath, 'utf-8');
468
+ const allReferenced = stageFolders.every((f) => content.includes(f));
469
+ details.push({
470
+ name: 'Routing table references all numbered folders',
471
+ passed: allReferenced,
472
+ });
473
+ } else {
474
+ details.push({
475
+ name: 'Routing table references all numbered folders',
476
+ passed: false,
477
+ });
478
+ }
479
+
480
+ // README.md exists
481
+ const readmePath = path.join(ws, 'README.md');
482
+ details.push({
483
+ name: 'README.md exists and has usage instructions',
484
+ passed: fs.existsSync(readmePath) && fs.readFileSync(readmePath, 'utf-8').trim().length > 0,
485
+ });
486
+
487
+ const passed = details.filter((d) => d.passed).length;
488
+ const failed = details.filter((d) => !d.passed).length;
489
+
490
+ return {
491
+ items: details.length,
492
+ passed,
493
+ failed,
494
+ details,
495
+ };
496
+ }
497
+
498
+ function getNumberedFolders(workspacePath: string): string[] {
499
+ const entries = fs.readdirSync(workspacePath, { withFileTypes: true });
500
+ return entries
501
+ .filter((e) => e.isDirectory() && /^\d/.test(e.name))
502
+ .map((e) => e.name);
503
+ }
504
+
505
+ // CLI entry point
506
+ if (require.main === module) {
507
+ const args = process.argv.slice(2);
508
+ const parseArg = (flag: string): string | undefined => {
509
+ const idx = args.indexOf(flag);
510
+ return idx !== -1 ? args[idx + 1] : undefined;
511
+ };
512
+
513
+ const workspace = parseArg('--workspace');
514
+ const maxRetriesStr = parseArg('--max-retries');
515
+ const maxRetries = maxRetriesStr ? parseInt(maxRetriesStr, 10) : 3;
516
+
517
+ if (!workspace) {
518
+ console.error('Usage: node iterate.ts --workspace <path> [--max-retries <n>]');
519
+ process.exit(1);
520
+ }
521
+
522
+ iterateWorkspace(workspace, { maxRetries });
523
+ }
524
+ ```
525
+
526
+ - [ ] **Step 2: Run tests to verify they pass**
527
+
528
+ Run: `npm test -- tests/iterate.test.ts`
529
+ Expected: All 10 tests PASS
530
+
531
+ - [ ] **Step 3: Commit**
532
+
533
+ ```bash
534
+ git add src/scripts/iterate.ts tests/iterate.test.ts
535
+ git commit -m "feat: add iterate script with 3-pass loop and tests"
536
+ ```
537
+
538
+ ---
539
+
540
+ ### Task 3: Generate-Tests Script — Tests
541
+
542
+ **Files:**
543
+ - Test: `tests/generate-tests.test.ts`
544
+
545
+ - [ ] **Step 1: Write generate-tests tests**
546
+
547
+ ```typescript
548
+ // tests/generate-tests.test.ts
549
+ import * as fs from 'fs';
550
+ import * as path from 'path';
551
+ import * as os from 'os';
552
+ import { generateTestCases, TestCase } from '../src/scripts/generate-tests';
553
+
554
+ describe('generate-tests', () => {
555
+ let tempDir: string;
556
+
557
+ beforeEach(() => {
558
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'generate-tests-'));
559
+ });
560
+
561
+ afterEach(() => {
562
+ fs.rmSync(tempDir, { recursive: true, force: true });
563
+ });
564
+
565
+ function createWorkspaceWithStages(stageNames: string[]): string {
566
+ const ws = path.join(tempDir, 'workspace');
567
+ fs.mkdirSync(ws, { recursive: true });
568
+ fs.writeFileSync(path.join(ws, 'SYSTEM.md'), `# Test\n\n## Folder Map\n\n${stageNames.map((s) => `- \`${s}/\``).join('\n')}\n`);
569
+ fs.writeFileSync(path.join(ws, 'CONTEXT.md'), `# Router\n\n## Routing Table\n\n${stageNames.map((s) => `- \`${s}/\``).join('\n')}\n`);
570
+
571
+ for (const stage of stageNames) {
572
+ const stageDir = path.join(ws, stage);
573
+ fs.mkdirSync(stageDir, { recursive: true });
574
+ fs.writeFileSync(path.join(stageDir, 'CONTEXT.md'), `# ${stage}\n\n## Purpose\nTest stage\n\n## Inputs\nRaw data\n\n## Outputs\nProcessed data\n\n## Dependencies\nNone\n`);
575
+ }
576
+
577
+ return ws;
578
+ }
579
+
580
+ describe('generateTestCases', () => {
581
+ it('generates test cases for each stage', () => {
582
+ const ws = createWorkspaceWithStages(['01-input', '02-process', '03-output']);
583
+ const result = generateTestCases(ws);
584
+
585
+ const stages = [...new Set(result.testCases.map((tc) => tc.stage))];
586
+ expect(stages).toContain('01-input');
587
+ expect(stages).toContain('02-process');
588
+ expect(stages).toContain('03-output');
589
+ });
590
+
591
+ it('generates 2-3 test cases per stage', () => {
592
+ const ws = createWorkspaceWithStages(['01-input', '02-process']);
593
+ const result = generateTestCases(ws);
594
+
595
+ const inputCases = result.testCases.filter((tc) => tc.stage === '01-input');
596
+ const processCases = result.testCases.filter((tc) => tc.stage === '02-process');
597
+
598
+ expect(inputCases.length).toBeGreaterThanOrEqual(2);
599
+ expect(inputCases.length).toBeLessThanOrEqual(3);
600
+ expect(processCases.length).toBeGreaterThanOrEqual(2);
601
+ expect(processCases.length).toBeLessThanOrEqual(3);
602
+ });
603
+
604
+ it('includes sample, edge-case, and empty test types', () => {
605
+ const ws = createWorkspaceWithStages(['01-input']);
606
+ const result = generateTestCases(ws);
607
+
608
+ const types = result.testCases.map((tc) => tc.type);
609
+ expect(types).toContain('sample');
610
+ expect(types).toContain('edge-case');
611
+ expect(types).toContain('empty');
612
+ });
613
+
614
+ it('returns empty test cases for workspace with no stages', () => {
615
+ const ws = path.join(tempDir, 'workspace');
616
+ fs.mkdirSync(ws, { recursive: true });
617
+ fs.writeFileSync(path.join(ws, 'SYSTEM.md'), '# Test\n');
618
+ fs.writeFileSync(path.join(ws, 'CONTEXT.md'), '# Router\n');
619
+
620
+ const result = generateTestCases(ws);
621
+
622
+ expect(result.testCases).toHaveLength(0);
623
+ });
624
+
625
+ it('each test case has required fields', () => {
626
+ const ws = createWorkspaceWithStages(['01-input']);
627
+ const result = generateTestCases(ws);
628
+
629
+ for (const tc of result.testCases) {
630
+ expect(tc).toHaveProperty('stage');
631
+ expect(tc).toHaveProperty('type');
632
+ expect(tc).toHaveProperty('input');
633
+ expect(tc).toHaveProperty('expected');
634
+ }
635
+ });
636
+
637
+ it('writes valid JSON to output file', () => {
638
+ const ws = createWorkspaceWithStages(['01-input', '02-output']);
639
+ const outputPath = path.join(tempDir, 'tests.json');
640
+
641
+ generateTestCases(ws, outputPath);
642
+
643
+ const content = fs.readFileSync(outputPath, 'utf-8');
644
+ const parsed = JSON.parse(content);
645
+ expect(parsed).toHaveProperty('testCases');
646
+ expect(Array.isArray(parsed.testCases)).toBe(true);
647
+ });
648
+ });
649
+ });
650
+ ```
651
+
652
+ - [ ] **Step 2: Run tests to verify they fail**
653
+
654
+ Run: `npm test -- tests/generate-tests.test.ts`
655
+ Expected: FAIL — module not found
656
+
657
+ ---
658
+
659
+ ### Task 4: Generate-Tests Script — Implementation
660
+
661
+ **Files:**
662
+ - Create: `src/scripts/generate-tests.ts`
663
+
664
+ - [ ] **Step 1: Implement generate-tests script**
665
+
666
+ ```typescript
667
+ // src/scripts/generate-tests.ts
668
+ import * as fs from 'fs';
669
+ import * as path from 'path';
670
+
671
+ export interface TestCase {
672
+ stage: string;
673
+ type: 'sample' | 'edge-case' | 'empty';
674
+ input: string;
675
+ expected: string;
676
+ }
677
+
678
+ export interface TestCasesOutput {
679
+ testCases: TestCase[];
680
+ }
681
+
682
+ export function generateTestCases(
683
+ workspacePath: string,
684
+ outputPath?: string,
685
+ ): TestCasesOutput {
686
+ const ws = path.resolve(workspacePath);
687
+ const testCases: TestCase[] = [];
688
+
689
+ const stageFolders = getNumberedFolders(ws);
690
+
691
+ if (stageFolders.length === 0) {
692
+ console.warn('Warning: No numbered stage folders found in workspace');
693
+ }
694
+
695
+ for (const stage of stageFolders) {
696
+ const contextPath = path.join(ws, stage, 'CONTEXT.md');
697
+ let purpose = '';
698
+ if (fs.existsSync(contextPath)) {
699
+ const content = fs.readFileSync(contextPath, 'utf-8');
700
+ const purposeMatch = content.match(/## Purpose\n([\s\S]*?)(?=##|$)/i);
701
+ if (purposeMatch) {
702
+ purpose = purposeMatch[1].trim();
703
+ }
704
+ }
705
+
706
+ testCases.push({
707
+ stage,
708
+ type: 'sample',
709
+ input: generateSampleInput(stage, purpose),
710
+ expected: `Stage should fulfill its purpose: ${purpose || 'handle stage-specific processing'}`,
711
+ });
712
+
713
+ testCases.push({
714
+ stage,
715
+ type: 'edge-case',
716
+ input: generateEdgeCaseInput(stage),
717
+ expected: `Stage should handle edge case gracefully`,
718
+ });
719
+
720
+ testCases.push({
721
+ stage,
722
+ type: 'empty',
723
+ input: '',
724
+ expected: `Stage should handle empty input gracefully`,
725
+ });
726
+ }
727
+
728
+ const result: TestCasesOutput = { testCases };
729
+
730
+ if (outputPath) {
731
+ fs.writeFileSync(outputPath, JSON.stringify(result, null, 2));
732
+ console.log(`Test cases written to: ${outputPath}`);
733
+ }
734
+
735
+ return result;
736
+ }
737
+
738
+ function generateSampleInput(stage: string, purpose: string): string {
739
+ const samples: Record<string, string> = {
740
+ '01-input': 'A sample input document with valid data for processing',
741
+ '02-process': 'Processed data from the input stage ready for transformation',
742
+ '03-output': 'Final processed data ready for report generation',
743
+ };
744
+ return samples[stage] || `Sample data for ${stage}`;
745
+ }
746
+
747
+ function generateEdgeCaseInput(stage: string): string {
748
+ const edgeCases: Record<string, string> = {
749
+ '01-input': 'Input with special characters: <>&"\' and very long text that exceeds normal length expectations',
750
+ '02-process': 'Data with missing fields and inconsistent formatting',
751
+ '03-output': 'Conflicting output requirements from upstream stages',
752
+ };
753
+ return edgeCases[stage] || `Edge case data for ${stage}`;
754
+ }
755
+
756
+ function getNumberedFolders(workspacePath: string): string[] {
757
+ const entries = fs.readdirSync(workspacePath, { withFileTypes: true });
758
+ return entries
759
+ .filter((e) => e.isDirectory() && /^\d/.test(e.name))
760
+ .map((e) => e.name);
761
+ }
762
+
763
+ // CLI entry point
764
+ if (require.main === module) {
765
+ const args = process.argv.slice(2);
766
+ const parseArg = (flag: string): string | undefined => {
767
+ const idx = args.indexOf(flag);
768
+ return idx !== -1 ? args[idx + 1] : undefined;
769
+ };
770
+
771
+ const workspace = parseArg('--workspace');
772
+ const output = parseArg('--output');
773
+
774
+ if (!workspace) {
775
+ console.error('Usage: node generate-tests.ts --workspace <path> [--output <path>]');
776
+ process.exit(1);
777
+ }
778
+
779
+ generateTestCases(workspace, output);
780
+ }
781
+ ```
782
+
783
+ - [ ] **Step 2: Run tests to verify they pass**
784
+
785
+ Run: `npm test -- tests/generate-tests.test.ts`
786
+ Expected: All 6 tests PASS
787
+
788
+ - [ ] **Step 3: Commit**
789
+
790
+ ```bash
791
+ git add src/scripts/generate-tests.ts tests/generate-tests.test.ts
792
+ git commit -m "feat: add generate-tests script with tests"
793
+ ```
794
+
795
+ ---
796
+
797
+ ### Task 5: Copy Scripts to Templates & Update Integration Test
798
+
799
+ **Files:**
800
+ - Create: `templates/.workspace-templates/scripts/iterate.ts`
801
+ - Create: `templates/.workspace-templates/scripts/generate-tests.ts`
802
+ - Modify: `tests/integration.test.ts`
803
+
804
+ - [ ] **Step 1: Copy scripts to templates**
805
+
806
+ ```bash
807
+ cp src/scripts/iterate.ts templates/.workspace-templates/scripts/iterate.ts
808
+ cp src/scripts/generate-tests.ts templates/.workspace-templates/scripts/generate-tests.ts
809
+ ```
810
+
811
+ - [ ] **Step 2: Update integration test expected files**
812
+
813
+ In `tests/integration.test.ts`, add to the `expectedFiles` array:
814
+
815
+ ```typescript
816
+ // In the first integration test, add to expectedFiles array:
817
+ const expectedFiles = [
818
+ 'SKILL.md',
819
+ '.workspace-templates/SYSTEM.md',
820
+ '.workspace-templates/CONTEXT.md',
821
+ '.workspace-templates/workspace/00-meta/CONTEXT.md',
822
+ '.workspace-templates/workspace/01-input/CONTEXT.md',
823
+ '.workspace-templates/workspace/02-process/CONTEXT.md',
824
+ '.workspace-templates/workspace/03-output/CONTEXT.md',
825
+ '.workspace-templates/workspace/README.md',
826
+ 'scripts/scaffold.ts',
827
+ 'scripts/validate.ts',
828
+ 'scripts/install-tool.ts',
829
+ 'scripts/iterate.ts',
830
+ 'scripts/generate-tests.ts',
831
+ ];
832
+ ```
833
+
834
+ - [ ] **Step 3: Run all tests to verify**
835
+
836
+ Run: `npm test`
837
+ Expected: All tests PASS (57 existing + 16 new = 73 total)
838
+
839
+ - [ ] **Step 4: Commit**
840
+
841
+ ```bash
842
+ git add templates/.workspace-templates/scripts/iterate.ts templates/.workspace-templates/scripts/generate-tests.ts tests/integration.test.ts
843
+ git commit -m "feat: add iterate and generate-tests scripts to templates"
844
+ ```
845
+
846
+ ---
847
+
848
+ ### Task 6: Enhance SKILL.md with Autonomous Iteration Section
849
+
850
+ **Files:**
851
+ - Modify: `templates/SKILL.md`
852
+
853
+ - [ ] **Step 1: Update SKILL.md with autonomous iteration instructions**
854
+
855
+ Replace the entire SKILL.md content with:
856
+
857
+ ```markdown
858
+ # Workspace-Maxxing Skill
859
+
860
+ ## Role
861
+ You are a workspace architect. You create structured, ICM-compliant workspaces.
862
+
863
+ ## Available Scripts
864
+
865
+ Use these scripts to programmatically build, validate, and equip workspaces. Invoke them via shell commands from the skill directory.
866
+
867
+ ### scaffold.ts — Generate ICM Workspace
868
+
869
+ Creates a complete ICM workspace structure from a plan.
870
+
871
+ ```bash
872
+ node scripts/scaffold.ts --name "research" --stages "01-research,02-analysis,03-report" --output ./workspace
873
+ ```
874
+
875
+ Options:
876
+ - `--name <name>` — Workspace name
877
+ - `--stages <s1,s2,...>` — Comma-separated stage folder names
878
+ - `--output <path>` — Where to create the workspace
879
+ - `--force` — Overwrite if output directory already exists
880
+
881
+ ### validate.ts — Check ICM Compliance
882
+
883
+ Validates a workspace against ICM rules.
884
+
885
+ ```bash
886
+ node scripts/validate.ts --workspace ./workspace
887
+ ```
888
+
889
+ Checks:
890
+ - SYSTEM.md exists and contains a folder map
891
+ - CONTEXT.md exists at root level
892
+ - Every numbered folder has a CONTEXT.md
893
+ - No empty CONTEXT.md files
894
+ - No duplicate content across files
895
+
896
+ Exit code: 0 = all pass, 1 = some failed
897
+
898
+ ### install-tool.ts — Install Packages
899
+
900
+ Installs a tool and updates the workspace inventory.
901
+
902
+ ```bash
903
+ node scripts/install-tool.ts --tool "pdf-lib" --manager npm --workspace ./workspace
904
+ ```
905
+
906
+ Supported managers: `npm`, `pip`, `npx`, `brew`
907
+
908
+ ### iterate.ts — Autonomous Iteration
909
+
910
+ Runs a 3-pass improvement loop: validate-fix → score → checklist.
911
+
912
+ ```bash
913
+ node scripts/iterate.ts --workspace ./workspace --max-retries 3
914
+ ```
915
+
916
+ Output is JSON with pass results and an `escalate` flag.
917
+
918
+ ### generate-tests.ts — Generate Test Cases
919
+
920
+ Creates test cases for each stage (sample, edge-case, empty).
921
+
922
+ ```bash
923
+ node scripts/generate-tests.ts --workspace ./workspace --output ./tests.json
924
+ ```
925
+
926
+ ## Process
927
+
928
+ 1. CAPTURE INTENT — Ask: "What workflow do you want to automate?"
929
+ 2. PROPOSE STRUCTURE — Design workspace with numbered folders, CONTEXT.md routing files, canonical sources
930
+ 3. GET APPROVAL — Present plan. Wait. Do not build until approved.
931
+ 4. BUILD WORKSPACE — Run: `node scripts/scaffold.ts --name "<name>" --stages "<stages>" --output ./workspace`
932
+ 5. VALIDATE — Run: `node scripts/validate.ts --workspace ./workspace`. Fix any failures.
933
+ 6. ASSESS TOOLS — Scan environment. List available tools. Propose missing tools needed. Get approval.
934
+ 7. INSTALL TOOLS — For each approved tool: `node scripts/install-tool.ts --tool "<name>" --manager <mgr> --workspace ./workspace`
935
+ 8. ITERATE — Run: `node scripts/iterate.ts --workspace ./workspace`. Follow the Autonomous Iteration workflow below.
936
+ 9. FINAL VALIDATE — Run validate.ts one more time to confirm compliance.
937
+ 10. DELIVER — Output: workspace folder + skill package + usage guide
938
+
939
+ ## Autonomous Iteration
940
+
941
+ After scaffolding and initial validation, run the iteration loop:
942
+
943
+ ### Step 1: Run iterate.ts
944
+
945
+ ```bash
946
+ node scripts/iterate.ts --workspace ./workspace --max-retries 3
947
+ ```
948
+
949
+ Read the JSON output. It has three passes:
950
+
951
+ **Pass 1 — Validate-Fix Loop:**
952
+ - If `status: "passed"` → move to Pass 2
953
+ - If `status: "escalated"` → read the `failures` array. Attempt to fix each failure manually, then re-run iterate.ts. If still failing after your fix attempt, escalate to human with the specific failures and your proposed fix.
954
+
955
+ **Pass 2 — Score-Driven Content Quality:**
956
+ - Read the `score` (0-100) and `improvements` array
957
+ - For each improvement item, update the relevant CONTEXT.md or SYSTEM.md file
958
+ - Re-run iterate.ts to see if the score improved
959
+ - Repeat until score plateaus (no improvement between runs) or score > 90
960
+
961
+ **Pass 3 — Completeness Checklist:**
962
+ - Read the `checklist` results showing items passed/failed
963
+ - For each failed item, fill in the missing content
964
+ - Re-run iterate.ts to confirm all items pass
965
+
966
+ ### Step 2: Generate and Run Test Cases
967
+
968
+ ```bash
969
+ node scripts/generate-tests.ts --workspace ./workspace --output ./tests.json
970
+ ```
971
+
972
+ Read the generated test cases. Then:
973
+
974
+ 1. **Split test cases:** Divide them into two groups — half for generation, half for evaluation
975
+ 2. **Generation sub-agents:** For each test case in the generation group, create sample content that the stage should produce. Document what good output looks like.
976
+ 3. **Evaluation sub-agents:** For each test case in the evaluation group, review the workspace's current CONTEXT.md and determine if it would handle that test case correctly. Flag gaps.
977
+ 4. **Aggregate results:** Combine findings from both groups. Identify patterns — are certain stages consistently weak? Are there structural issues?
978
+ 5. **Fix identified gaps:** Update CONTEXT.md files, routing tables, or stage instructions to address findings.
979
+
980
+ ### Step 3: Confidence Assessment
981
+
982
+ After iteration and testing, assess your confidence:
983
+
984
+ **High confidence (deliver):**
985
+ - All validation checks pass
986
+ - Score > 80
987
+ - All checklist items pass
988
+ - Test case evaluation shows no critical gaps
989
+
990
+ **Low confidence (escalate to human):**
991
+ Present to the human:
992
+ - Current score and checklist results
993
+ - Specific failures or gaps found
994
+ - What you attempted to fix
995
+ - Your proposed next steps
996
+
997
+ Wait for human guidance before proceeding.
998
+
999
+ ## When to Use Scripts vs Manual
1000
+
1001
+ - **Scripts:** For structure creation, validation, tool installation, and iteration loops
1002
+ - **Manual:** For writing content inside CONTEXT.md files, customizing stage descriptions, adding domain-specific instructions, fixing validation failures between retries
1003
+
1004
+ ## ICM Rules
1005
+ - Canonical sources: each fact lives in exactly one file
1006
+ - One-way dependencies only: A → B, never B → A
1007
+ - Selective loading: route to sections, not whole files
1008
+ - Numbered folders for workflow stages
1009
+
1010
+ ## Output Format
1011
+ - workspace/ — the built workspace
1012
+ - .agents/skills/<workspace-name>/ — installable skill
1013
+ - USAGE.md — how to use this workspace in future sessions
1014
+ ```
1015
+
1016
+ - [ ] **Step 2: Update integration test for new SKILL.md sections**
1017
+
1018
+ Add assertions to `tests/integration.test.ts`:
1019
+
1020
+ ```typescript
1021
+ // Add to the SKILL.md assertions in the first integration test:
1022
+ expect(skillContent).toContain('## Autonomous Iteration');
1023
+ expect(skillContent).toContain('iterate.ts');
1024
+ expect(skillContent).toContain('generate-tests.ts');
1025
+ ```
1026
+
1027
+ - [ ] **Step 3: Run all tests to verify**
1028
+
1029
+ Run: `npm test`
1030
+ Expected: All tests PASS
1031
+
1032
+ - [ ] **Step 4: Commit**
1033
+
1034
+ ```bash
1035
+ git add templates/SKILL.md tests/integration.test.ts
1036
+ git commit -m "feat: enhance SKILL.md with Autonomous Iteration section"
1037
+ ```
1038
+
1039
+ ---
1040
+
1041
+ ### Task 7: Final Verification & All Tests
1042
+
1043
+ **Files:**
1044
+ - All files
1045
+
1046
+ - [ ] **Step 1: Run full test suite**
1047
+
1048
+ ```bash
1049
+ npm test
1050
+ ```
1051
+
1052
+ Expected output: All tests pass (Phase 1 + 2 + 3 = ~73 total)
1053
+
1054
+ - [ ] **Step 2: Build and verify no TypeScript errors**
1055
+
1056
+ ```bash
1057
+ npm run build
1058
+ ```
1059
+
1060
+ Expected: No errors, output in `dist/`
1061
+
1062
+ - [ ] **Step 3: Verify dist/scripts/ contains all scripts**
1063
+
1064
+ ```bash
1065
+ ls dist/scripts/
1066
+ ```
1067
+
1068
+ Expected: `scaffold.js`, `validate.js`, `install-tool.js`, `iterate.js`, `generate-tests.js`
1069
+
1070
+ - [ ] **Step 4: Commit final state**
1071
+
1072
+ ```bash
1073
+ git add -A
1074
+ git commit -m "feat: autonomous iteration complete — iterate, generate-tests scripts"
1075
+ ```
1076
+
1077
+ ---
1078
+
1079
+ ## Self-Review
1080
+
1081
+ ### 1. Spec Coverage Check
1082
+
1083
+ | Spec Requirement | Task |
1084
+ |---|---|
1085
+ | iterate.ts runs 3-pass loop (validate-fix, score, checklist) | Task 1-2 |
1086
+ | iterate.ts imports validateWorkspace from validate.ts | Task 2 |
1087
+ | iterate.ts returns structured JSON output | Task 2 |
1088
+ | iterate.ts escalates after max retries | Task 1-2 |
1089
+ | iterate.ts CLI: --workspace, --max-retries | Task 2 |
1090
+ | Score: SYSTEM.md (20pts), CONTEXT.md (20pts), stages (15pt/stage, cap 45), tools.md (15pts) | Task 2 |
1091
+ | Score identifies improvements | Task 1-2 |
1092
+ | Checklist: inputs, outputs, dependencies, routing, README | Task 1-2 |
1093
+ | generate-tests.ts creates 2-3 test cases per stage | Task 3-4 |
1094
+ | generate-tests.ts test types: sample, edge-case, empty | Task 3-4 |
1095
+ | generate-tests.ts writes JSON output file | Task 3-4 |
1096
+ | generate-tests.ts handles no stages gracefully | Task 3-4 |
1097
+ | Enhanced SKILL.md with Autonomous Iteration | Task 6 |
1098
+ | SKILL.md: iteration workflow instructions | Task 6 |
1099
+ | SKILL.md: sub-agent spawning instructions | Task 6 |
1100
+ | SKILL.md: escalation criteria | Task 6 |
1101
+ | Installer copies new scripts (via templates/.workspace-templates/scripts/) | Task 5 |
1102
+ | Tests for iterate.ts (5 iterate + 5 score + 2 checklist = 12 tests) | Task 1 |
1103
+ | Tests for generate-tests.ts (6 tests) | Task 3 |
1104
+ | Integration test updated for new scripts | Task 5 |
1105
+
1106
+ All requirements covered. ✓
1107
+
1108
+ ### 2. Placeholder Scan
1109
+
1110
+ No TBD, TODO, "add tests for the above", "handle edge cases", or "similar to Task N" patterns found. All steps contain complete code. ✓
1111
+
1112
+ ### 3. Type Consistency
1113
+
1114
+ - `IterateOptions`, `IterateResult`, `ValidatePassResult`, `ScorePassResult`, `ChecklistResult`, `ScoreBreakdown` interfaces defined in Task 2, used in Task 1 tests ✓
1115
+ - `TestCase`, `TestCasesOutput` interfaces defined in Task 4, used in Task 3 tests ✓
1116
+ - `validateWorkspace` imported from `./validate` in Task 2, mocked in Task 1 tests ✓
1117
+ - `scoreWorkspace` and `runChecklist` exported in Task 2, tested directly in Task 1 ✓
1118
+ - All scripts use `require.main === module` pattern for CLI entry ✓
1119
+ - `getNumberedFolders` helper used consistently in both scripts ✓
1120
+
1121
+ ---
1122
+
1123
+ Plan complete. Ready for execution.