forge-cc 0.1.41 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/README.md +454 -338
  2. package/dist/cli.js +194 -935
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/loader.d.ts +1 -1
  5. package/dist/config/loader.js +49 -56
  6. package/dist/config/loader.js.map +1 -1
  7. package/dist/config/schema.d.ts +37 -125
  8. package/dist/config/schema.js +13 -28
  9. package/dist/config/schema.js.map +1 -1
  10. package/dist/doctor.d.ts +10 -0
  11. package/dist/doctor.js +148 -0
  12. package/dist/doctor.js.map +1 -0
  13. package/dist/gates/index.d.ts +14 -12
  14. package/dist/gates/index.js +53 -105
  15. package/dist/gates/index.js.map +1 -1
  16. package/dist/gates/lint-gate.d.ts +2 -2
  17. package/dist/gates/lint-gate.js +60 -66
  18. package/dist/gates/lint-gate.js.map +1 -1
  19. package/dist/gates/tests-gate.d.ts +2 -4
  20. package/dist/gates/tests-gate.js +75 -203
  21. package/dist/gates/tests-gate.js.map +1 -1
  22. package/dist/gates/types-gate.d.ts +2 -2
  23. package/dist/gates/types-gate.js +53 -59
  24. package/dist/gates/types-gate.js.map +1 -1
  25. package/dist/linear/client.d.ts +31 -108
  26. package/dist/linear/client.js +88 -388
  27. package/dist/linear/client.js.map +1 -1
  28. package/dist/linear/sync.d.ts +15 -0
  29. package/dist/linear/sync.js +102 -0
  30. package/dist/linear/sync.js.map +1 -0
  31. package/dist/runner/loop.d.ts +4 -0
  32. package/dist/runner/loop.js +168 -0
  33. package/dist/runner/loop.js.map +1 -0
  34. package/dist/runner/prompt.d.ts +14 -0
  35. package/dist/runner/prompt.js +59 -0
  36. package/dist/runner/prompt.js.map +1 -0
  37. package/dist/runner/update.d.ts +1 -0
  38. package/dist/runner/update.js +72 -0
  39. package/dist/runner/update.js.map +1 -0
  40. package/dist/server.d.ts +6 -2
  41. package/dist/server.js +43 -101
  42. package/dist/server.js.map +1 -1
  43. package/dist/setup.d.ts +5 -0
  44. package/dist/setup.js +208 -0
  45. package/dist/setup.js.map +1 -0
  46. package/dist/state/cache.d.ts +3 -0
  47. package/dist/state/cache.js +23 -0
  48. package/dist/state/cache.js.map +1 -0
  49. package/dist/state/status.d.ts +66 -0
  50. package/dist/state/status.js +96 -0
  51. package/dist/state/status.js.map +1 -0
  52. package/dist/types.d.ts +46 -114
  53. package/dist/worktree/manager.d.ts +6 -103
  54. package/dist/worktree/manager.js +25 -296
  55. package/dist/worktree/manager.js.map +1 -1
  56. package/hooks/pre-commit-verify.js +109 -109
  57. package/package.json +5 -3
  58. package/skills/forge-go.md +20 -13
  59. package/skills/forge-setup.md +149 -388
  60. package/skills/forge-spec.md +367 -342
  61. package/skills/forge-triage.md +179 -133
  62. package/skills/forge-update.md +87 -93
  63. package/dist/gates/codex-gate.d.ts +0 -51
  64. package/dist/gates/codex-gate.js +0 -121
  65. package/dist/gates/codex-gate.js.map +0 -1
  66. package/dist/gates/prd-gate.d.ts +0 -7
  67. package/dist/gates/prd-gate.js +0 -193
  68. package/dist/gates/prd-gate.js.map +0 -1
  69. package/dist/gates/remediation.d.ts +0 -46
  70. package/dist/gates/remediation.js +0 -423
  71. package/dist/gates/remediation.js.map +0 -1
  72. package/dist/gates/review-gate.d.ts +0 -16
  73. package/dist/gates/review-gate.js +0 -479
  74. package/dist/gates/review-gate.js.map +0 -1
  75. package/dist/gates/runtime-gate.d.ts +0 -5
  76. package/dist/gates/runtime-gate.js +0 -99
  77. package/dist/gates/runtime-gate.js.map +0 -1
  78. package/dist/gates/test-analysis.d.ts +0 -21
  79. package/dist/gates/test-analysis.js +0 -394
  80. package/dist/gates/test-analysis.js.map +0 -1
  81. package/dist/gates/visual-capture.d.ts +0 -24
  82. package/dist/gates/visual-capture.js +0 -144
  83. package/dist/gates/visual-capture.js.map +0 -1
  84. package/dist/gates/visual-gate.d.ts +0 -18
  85. package/dist/gates/visual-gate.js +0 -234
  86. package/dist/gates/visual-gate.js.map +0 -1
  87. package/dist/gates/visual-reviewer.d.ts +0 -11
  88. package/dist/gates/visual-reviewer.js +0 -211
  89. package/dist/gates/visual-reviewer.js.map +0 -1
  90. package/dist/go/auto-chain.d.ts +0 -136
  91. package/dist/go/auto-chain.js +0 -389
  92. package/dist/go/auto-chain.js.map +0 -1
  93. package/dist/go/executor.d.ts +0 -137
  94. package/dist/go/executor.js +0 -447
  95. package/dist/go/executor.js.map +0 -1
  96. package/dist/go/finalize.d.ts +0 -108
  97. package/dist/go/finalize.js +0 -331
  98. package/dist/go/finalize.js.map +0 -1
  99. package/dist/go/linear-sync-cli.d.ts +0 -55
  100. package/dist/go/linear-sync-cli.js +0 -192
  101. package/dist/go/linear-sync-cli.js.map +0 -1
  102. package/dist/go/linear-sync.d.ts +0 -112
  103. package/dist/go/linear-sync.js +0 -375
  104. package/dist/go/linear-sync.js.map +0 -1
  105. package/dist/go/prd-queue.d.ts +0 -43
  106. package/dist/go/prd-queue.js +0 -67
  107. package/dist/go/prd-queue.js.map +0 -1
  108. package/dist/go/prd-selector.d.ts +0 -57
  109. package/dist/go/prd-selector.js +0 -101
  110. package/dist/go/prd-selector.js.map +0 -1
  111. package/dist/go/verify-loop.d.ts +0 -64
  112. package/dist/go/verify-loop.js +0 -327
  113. package/dist/go/verify-loop.js.map +0 -1
  114. package/dist/hooks/pre-commit.d.ts +0 -5
  115. package/dist/hooks/pre-commit.js +0 -75
  116. package/dist/hooks/pre-commit.js.map +0 -1
  117. package/dist/linear/issues.d.ts +0 -22
  118. package/dist/linear/issues.js +0 -51
  119. package/dist/linear/issues.js.map +0 -1
  120. package/dist/linear/milestones.d.ts +0 -11
  121. package/dist/linear/milestones.js +0 -32
  122. package/dist/linear/milestones.js.map +0 -1
  123. package/dist/linear/projects.d.ts +0 -16
  124. package/dist/linear/projects.js +0 -51
  125. package/dist/linear/projects.js.map +0 -1
  126. package/dist/reporter/human.d.ts +0 -7
  127. package/dist/reporter/human.js +0 -93
  128. package/dist/reporter/human.js.map +0 -1
  129. package/dist/reporter/json.d.ts +0 -2
  130. package/dist/reporter/json.js +0 -4
  131. package/dist/reporter/json.js.map +0 -1
  132. package/dist/setup/structural-templates.d.ts +0 -12
  133. package/dist/setup/structural-templates.js +0 -288
  134. package/dist/setup/structural-templates.js.map +0 -1
  135. package/dist/setup/templates.d.ts +0 -17
  136. package/dist/setup/templates.js +0 -109
  137. package/dist/setup/templates.js.map +0 -1
  138. package/dist/setup/test-planner.d.ts +0 -38
  139. package/dist/setup/test-planner.js +0 -91
  140. package/dist/setup/test-planner.js.map +0 -1
  141. package/dist/setup/test-scaffold.d.ts +0 -31
  142. package/dist/setup/test-scaffold.js +0 -209
  143. package/dist/setup/test-scaffold.js.map +0 -1
  144. package/dist/setup/test-templates.d.ts +0 -37
  145. package/dist/setup/test-templates.js +0 -313
  146. package/dist/setup/test-templates.js.map +0 -1
  147. package/dist/spec/generator.d.ts +0 -34
  148. package/dist/spec/generator.js +0 -227
  149. package/dist/spec/generator.js.map +0 -1
  150. package/dist/spec/interview.d.ts +0 -142
  151. package/dist/spec/interview.js +0 -287
  152. package/dist/spec/interview.js.map +0 -1
  153. package/dist/spec/linear-sync.d.ts +0 -48
  154. package/dist/spec/linear-sync.js +0 -125
  155. package/dist/spec/linear-sync.js.map +0 -1
  156. package/dist/spec/scanner.d.ts +0 -79
  157. package/dist/spec/scanner.js +0 -566
  158. package/dist/spec/scanner.js.map +0 -1
  159. package/dist/spec/templates.d.ts +0 -375
  160. package/dist/spec/templates.js +0 -95
  161. package/dist/spec/templates.js.map +0 -1
  162. package/dist/state/prd-status.d.ts +0 -62
  163. package/dist/state/prd-status.js +0 -122
  164. package/dist/state/prd-status.js.map +0 -1
  165. package/dist/state/reader.d.ts +0 -7
  166. package/dist/state/reader.js +0 -43
  167. package/dist/state/reader.js.map +0 -1
  168. package/dist/state/writer.d.ts +0 -21
  169. package/dist/state/writer.js +0 -106
  170. package/dist/state/writer.js.map +0 -1
  171. package/dist/team/consensus.d.ts +0 -28
  172. package/dist/team/consensus.js +0 -130
  173. package/dist/team/consensus.js.map +0 -1
  174. package/dist/team/index.d.ts +0 -4
  175. package/dist/team/index.js +0 -5
  176. package/dist/team/index.js.map +0 -1
  177. package/dist/team/lifecycle.d.ts +0 -37
  178. package/dist/team/lifecycle.js +0 -92
  179. package/dist/team/lifecycle.js.map +0 -1
  180. package/dist/team/reviewer.d.ts +0 -10
  181. package/dist/team/reviewer.js +0 -345
  182. package/dist/team/reviewer.js.map +0 -1
  183. package/dist/team/types.d.ts +0 -269
  184. package/dist/team/types.js +0 -70
  185. package/dist/team/types.js.map +0 -1
  186. package/dist/utils/browser.d.ts +0 -10
  187. package/dist/utils/browser.js +0 -96
  188. package/dist/utils/browser.js.map +0 -1
  189. package/dist/utils/platform.d.ts +0 -29
  190. package/dist/utils/platform.js +0 -90
  191. package/dist/utils/platform.js.map +0 -1
  192. package/dist/worktree/identity.d.ts +0 -9
  193. package/dist/worktree/identity.js +0 -32
  194. package/dist/worktree/identity.js.map +0 -1
  195. package/dist/worktree/parallel.d.ts +0 -87
  196. package/dist/worktree/parallel.js +0 -328
  197. package/dist/worktree/parallel.js.map +0 -1
  198. package/dist/worktree/session.d.ts +0 -67
  199. package/dist/worktree/session.js +0 -194
  200. package/dist/worktree/session.js.map +0 -1
  201. package/dist/worktree/state-merge.d.ts +0 -43
  202. package/dist/worktree/state-merge.js +0 -162
  203. package/dist/worktree/state-merge.js.map +0 -1
@@ -1,447 +0,0 @@
1
- /**
2
- * Milestone Execution Engine
3
- *
4
- * Programmatic module that reads a PRD milestone definition, prepares
5
- * wave-based agent prompts, tracks results, runs verification between
6
- * waves, and produces structured output.
7
- *
8
- * This module does NOT spawn agents — that is the skill file's job
9
- * (via Claude Code's Task tool). The executor is the data/logic layer.
10
- */
11
- import { readFile } from "node:fs/promises";
12
- import { join } from "node:path";
13
- import { readSessionContext } from "../state/reader.js";
14
- import { runPipeline } from "../gates/index.js";
15
- import { formatHumanReport } from "../reporter/human.js";
16
- import { createTeamConfig, shouldIncludeNotetaker } from "../team/lifecycle.js";
17
- // ---------------------------------------------------------------------------
18
- // Helpers
19
- // ---------------------------------------------------------------------------
20
- async function safeRead(filePath) {
21
- try {
22
- return await readFile(filePath, "utf-8");
23
- }
24
- catch {
25
- return "";
26
- }
27
- }
28
- /**
29
- * Parse a milestone section from PRD markdown into structured wave data.
30
- *
31
- * The PRD milestone section has this structure:
32
- * ```
33
- * ### Milestone N: Name
34
- * **Assigned To:** ...
35
- * **Goal:** ...
36
- *
37
- * **Wave 1 (N agents parallel):**
38
- * 1. **agent-name**: task description
39
- * - Files: file1, file2
40
- * ```
41
- *
42
- * If a structured Milestone object is available (from templates.ts schema),
43
- * prefer using it directly. This parser handles the markdown fallback.
44
- */
45
- function parseMilestoneSection(section) {
46
- // Extract milestone name
47
- const nameMatch = section.match(/###\s*Milestone\s+\d+\s*[:\u2014\u2013-]\s*(.+)/);
48
- const name = nameMatch ? nameMatch[1].trim() : "Unknown Milestone";
49
- // Extract goal
50
- const goalMatch = section.match(/\*\*Goal:\*\*\s*(.+)/);
51
- const goal = goalMatch ? goalMatch[1].trim() : "";
52
- // Parse waves
53
- const waves = [];
54
- const wavePattern = /\*\*Wave\s+(\d+)\s*[^*]*\*\*:?\s*\n([\s\S]*?)(?=\*\*Wave\s+\d+|\*\*Verification|\*\*Acceptance|$)/g;
55
- let waveMatch;
56
- while ((waveMatch = wavePattern.exec(section)) !== null) {
57
- const waveNumber = parseInt(waveMatch[1], 10);
58
- const waveBody = waveMatch[2];
59
- const agents = [];
60
- // Parse agent entries: "1. **agent-name**: task description"
61
- const agentPattern = /\d+\.\s+\*\*([^*]+)\*\*[:\s]+([^\n]+)\n(?:\s+-\s+(?:Files|Creates|Modifies|Deletes):\s*([^\n]+)\n?)*/g;
62
- let agentMatch;
63
- while ((agentMatch = agentPattern.exec(waveBody)) !== null) {
64
- const agentName = agentMatch[1].trim();
65
- const agentTask = agentMatch[2].trim();
66
- // Collect all file references from sub-items
67
- const files = [];
68
- const fileLinePattern = /\s+-\s+(?:Files|Creates|Modifies|Deletes):\s*([^\n]+)/g;
69
- const agentBlock = waveBody.slice(agentMatch.index, agentPattern.lastIndex);
70
- let fileMatch;
71
- while ((fileMatch = fileLinePattern.exec(agentBlock)) !== null) {
72
- const fileList = fileMatch[1]
73
- .split(",")
74
- .map((f) => f.trim())
75
- .filter(Boolean);
76
- files.push(...fileList);
77
- }
78
- agents.push({ name: agentName, task: agentTask, files });
79
- }
80
- if (agents.length > 0) {
81
- waves.push({ waveNumber, agents });
82
- }
83
- }
84
- // Parse verification commands
85
- const verificationCommands = [];
86
- const verifySection = section.match(/\*\*Verification:\*\*\s*\n```(?:bash)?\s*\n([\s\S]*?)```/);
87
- if (verifySection) {
88
- const lines = verifySection[1].split("\n");
89
- for (const line of lines) {
90
- const trimmed = line.trim();
91
- if (trimmed && !trimmed.startsWith("#")) {
92
- verificationCommands.push(trimmed);
93
- }
94
- }
95
- }
96
- // Compute max agents across all waves for team sizing
97
- const maxAgentsPerWave = waves.reduce((max, w) => Math.max(max, w.agents.length), 0);
98
- return { name, goal, waves, verificationCommands, maxAgentsPerWave };
99
- }
100
- // ---------------------------------------------------------------------------
101
- // Context Building
102
- // ---------------------------------------------------------------------------
103
- /**
104
- * Build the full context needed to execute a milestone.
105
- * Reads PRD milestone section, CLAUDE.md, lessons, and per-PRD status JSON.
106
- */
107
- export async function buildMilestoneContext(options) {
108
- const { projectDir, prdPath, milestoneNumber } = options;
109
- // Read session context (milestone section from PRD)
110
- const sessionContext = await readSessionContext(prdPath, milestoneNumber, options.prdSlug ?? "unknown");
111
- const milestoneSection = sessionContext.currentMilestoneSection;
112
- if (!milestoneSection) {
113
- throw new Error(`Milestone ${milestoneNumber} not found in PRD at ${prdPath}`);
114
- }
115
- // Parse the milestone section into structured data
116
- const parsed = parseMilestoneSection(milestoneSection);
117
- const prdSlug = options.prdSlug ?? "unknown";
118
- // Read supporting files and PRD status in parallel
119
- const [lessons, claudeMd] = await Promise.all([
120
- safeRead(join(projectDir, "tasks", "lessons.md")),
121
- safeRead(join(projectDir, "CLAUDE.md")),
122
- ]);
123
- // Build team config based on wave structure
124
- const builderCount = parsed.maxAgentsPerWave;
125
- const includeNotetaker = shouldIncludeNotetaker(parsed.waves.length, parsed.maxAgentsPerWave);
126
- const teamConfig = createTeamConfig({
127
- prdSlug,
128
- milestoneNumber,
129
- builderCount,
130
- includeNotetaker,
131
- });
132
- return {
133
- milestoneNumber,
134
- milestoneName: parsed.name,
135
- milestoneGoal: parsed.goal,
136
- milestoneSection,
137
- waves: parsed.waves,
138
- verificationCommands: parsed.verificationCommands,
139
- sessionContext,
140
- lessons,
141
- claudeMd,
142
- teamConfig,
143
- };
144
- }
145
- // ---------------------------------------------------------------------------
146
- // Agent Prompt Building
147
- // ---------------------------------------------------------------------------
148
- /**
149
- * Build a prompt for a single agent within a milestone wave.
150
- *
151
- * The prompt includes:
152
- * - The agent's specific task and files
153
- * - Milestone goal and context
154
- * - Key existing code (inlined, not just paths)
155
- * - Lessons from tasks/lessons.md
156
- * - CLAUDE.md rules (abbreviated)
157
- */
158
- export function buildAgentPrompt(agent, context, existingCode) {
159
- const lines = [];
160
- // Header
161
- lines.push(`# Agent: ${agent.name}`);
162
- lines.push("");
163
- lines.push(`You are working on **Milestone ${context.milestoneNumber}: ${context.milestoneName}**.`);
164
- lines.push("");
165
- lines.push(`**Milestone Goal:** ${context.milestoneGoal}`);
166
- lines.push("");
167
- // Agent-specific task
168
- lines.push("## Your Task");
169
- lines.push("");
170
- lines.push(agent.task);
171
- lines.push("");
172
- // Files to create/modify
173
- if (agent.files.length > 0) {
174
- lines.push("## Files");
175
- lines.push("");
176
- for (const file of agent.files) {
177
- lines.push(`- ${file}`);
178
- }
179
- lines.push("");
180
- }
181
- // Inline existing code if provided
182
- if (existingCode) {
183
- lines.push("## Existing Code (Reference)");
184
- lines.push("");
185
- lines.push(existingCode);
186
- lines.push("");
187
- }
188
- // Lessons
189
- if (context.lessons) {
190
- lines.push("## Lessons (Follow These)");
191
- lines.push("");
192
- lines.push(context.lessons);
193
- lines.push("");
194
- }
195
- // Rules from CLAUDE.md (abbreviated to key rules only)
196
- if (context.claudeMd) {
197
- // Extract just the critical rules section if present
198
- const rulesMatch = context.claudeMd.match(/## Critical Rules\s*\n([\s\S]*?)(?=\n##\s|$)/);
199
- if (rulesMatch) {
200
- lines.push("## Rules");
201
- lines.push("");
202
- lines.push(rulesMatch[1].trim());
203
- lines.push("");
204
- }
205
- }
206
- // Team Communication (M2 integration)
207
- if (context.teamConfig) {
208
- const teamName = context.teamConfig.teamName;
209
- lines.push("## Team Communication");
210
- lines.push("");
211
- lines.push(`You are part of team **${teamName}**.`);
212
- lines.push("");
213
- lines.push("Use the **SendMessage** tool to communicate with teammates:");
214
- lines.push('- Send a direct message: `{ "type": "message", "recipient": "<name>", "content": "...", "summary": "..." }`');
215
- lines.push("- Only use broadcast for critical blocking issues that affect all teammates.");
216
- lines.push("- When your task is complete, send a message to the executive summarizing what you did.");
217
- lines.push("- If you encounter a blocker, message the executive immediately rather than guessing.");
218
- lines.push("");
219
- lines.push("## Subagent Spawning");
220
- lines.push("");
221
- lines.push("You may spawn subagents for research or exploration using the **Task** tool:");
222
- lines.push('- Use `subagent_type: "Explore"` for read-only research tasks (searching code, reading files).');
223
- lines.push('- Use `subagent_type: "general-purpose"` for tasks that require file edits or shell commands.');
224
- lines.push("- Always provide a clear, self-contained prompt — subagents do not share your conversation context.");
225
- lines.push("- Prefer subagents for tasks like: finding usage patterns, reading large files, running diagnostic commands.");
226
- lines.push("");
227
- }
228
- // Verification
229
- lines.push("## Verification");
230
- lines.push("");
231
- lines.push("After completing your work, verify:");
232
- lines.push("- `npx tsc --noEmit` passes");
233
- if (context.verificationCommands.length > 0) {
234
- for (const cmd of context.verificationCommands) {
235
- lines.push(`- \`${cmd}\``);
236
- }
237
- }
238
- lines.push("");
239
- // Git rules
240
- lines.push("## Git Rules");
241
- lines.push("");
242
- lines.push("- Stage only the files you created/modified (never use `git add .`)");
243
- lines.push("- Do not commit — the orchestrator handles commits");
244
- lines.push("- Use ES module imports with `.js` extension in import paths");
245
- lines.push("");
246
- return lines.join("\n");
247
- }
248
- // ---------------------------------------------------------------------------
249
- // Wave Execution Preparation
250
- // ---------------------------------------------------------------------------
251
- /**
252
- * Prepare all waves for execution.
253
- * Returns structured wave data with agent prompts ready for the skill
254
- * to pass to Claude Code's Task tool.
255
- */
256
- export function prepareWaves(context, existingCodeMap) {
257
- return context.waves.map((wave) => ({
258
- waveNumber: wave.waveNumber,
259
- agents: wave.agents.map((agent) => ({
260
- name: agent.name,
261
- task: agent.task,
262
- files: agent.files,
263
- prompt: buildAgentPrompt(agent, context, existingCodeMap?.get(agent.name)),
264
- })),
265
- }));
266
- }
267
- // ---------------------------------------------------------------------------
268
- // Verification
269
- // ---------------------------------------------------------------------------
270
- /**
271
- * Run forge verification pipeline after a wave completes.
272
- * Returns the pipeline result with human-readable report.
273
- */
274
- export async function runWaveVerification(options) {
275
- const { projectDir, config, prdPath } = options;
276
- // Filter out post-pipeline gates (codex is handled after PR creation, not during waves)
277
- const waveGates = config.gates?.filter((g) => g !== "codex");
278
- const pipelineInput = {
279
- projectDir,
280
- gates: waveGates,
281
- prdPath: config.prdPath ?? prdPath,
282
- maxIterations: config.maxIterations,
283
- devServerCommand: config.devServer?.command,
284
- devServerPort: config.devServer?.port,
285
- };
286
- const result = await runPipeline(pipelineInput);
287
- // Attach human-readable report
288
- if (!result.report) {
289
- result.report = formatHumanReport(result);
290
- }
291
- return result;
292
- }
293
- // ---------------------------------------------------------------------------
294
- // Result Tracking
295
- // ---------------------------------------------------------------------------
296
- /**
297
- * Create an empty execution result for a milestone.
298
- */
299
- export function createExecutionResult(context) {
300
- return {
301
- milestoneNumber: context.milestoneNumber,
302
- milestoneName: context.milestoneName,
303
- success: false,
304
- waves: [],
305
- totalFilesCreated: 0,
306
- totalFilesModified: 0,
307
- errors: [],
308
- };
309
- }
310
- /**
311
- * Record a completed wave's results into the execution result.
312
- */
313
- export function recordWaveResult(execution, waveResult) {
314
- const updatedWaves = [...execution.waves, waveResult];
315
- let totalCreated = 0;
316
- let totalModified = 0;
317
- const allErrors = [];
318
- for (const wave of updatedWaves) {
319
- for (const agent of wave.agents) {
320
- totalCreated += agent.filesCreated.length;
321
- totalModified += agent.filesModified.length;
322
- if (agent.error) {
323
- allErrors.push(`[${agent.name}] ${agent.error}`);
324
- }
325
- }
326
- if (wave.verification && !wave.verification.passed) {
327
- const failedGates = wave.verification.gates
328
- .filter((g) => !g.passed)
329
- .map((g) => g.gate);
330
- allErrors.push(`Wave ${wave.waveNumber} verification failed: ${failedGates.join(", ")}`);
331
- }
332
- }
333
- // Success = all waves complete + last wave verification passed (if any)
334
- const lastWave = updatedWaves[updatedWaves.length - 1];
335
- const lastVerificationPassed = lastWave?.verification?.passed ?? true;
336
- const allAgentsSucceeded = updatedWaves.every((w) => w.agents.every((a) => a.success));
337
- const success = allAgentsSucceeded && lastVerificationPassed;
338
- return {
339
- ...execution,
340
- waves: updatedWaves,
341
- success,
342
- totalFilesCreated: totalCreated,
343
- totalFilesModified: totalModified,
344
- errors: allErrors,
345
- };
346
- }
347
- // ---------------------------------------------------------------------------
348
- // Execution Orchestrator
349
- // ---------------------------------------------------------------------------
350
- /**
351
- * Execute a single milestone end-to-end.
352
- *
353
- * In dryRun mode: builds context and prompts, runs no verification, returns
354
- * the prepared execution plan.
355
- *
356
- * In normal mode: the caller (skill file) should use this module's functions
357
- * step by step:
358
- * 1. `buildMilestoneContext()` — read PRD and build context
359
- * 2. `prepareWaves()` — get agent prompts for each wave
360
- * 3. For each wave: spawn agents, collect results
361
- * 4. `runWaveVerification()` — verify after each wave
362
- * 5. `recordWaveResult()` — track results
363
- *
364
- * This `executeMilestone` function is the simplified orchestrator for
365
- * programmatic/testing use. For real execution, the skill drives each step.
366
- */
367
- export async function executeMilestone(options) {
368
- // 1. Build context
369
- const context = await buildMilestoneContext(options);
370
- // 2. Prepare waves
371
- const waves = prepareWaves(context);
372
- // 3. Create result tracker
373
- const result = createExecutionResult(context);
374
- if (options.dryRun) {
375
- // In dry run, return the plan without executing
376
- return { context, waves, result };
377
- }
378
- // In non-dry-run mode, the executor only runs verification.
379
- // Agent spawning is the caller's (skill's) responsibility.
380
- // This path is for programmatic testing only.
381
- return { context, waves, result };
382
- }
383
- // ---------------------------------------------------------------------------
384
- // Formatting
385
- // ---------------------------------------------------------------------------
386
- /**
387
- * Format an execution result as a human-readable summary.
388
- */
389
- export function formatExecutionSummary(result) {
390
- const lines = [];
391
- const status = result.success ? "COMPLETE" : "FAILED";
392
- lines.push(`## Milestone ${result.milestoneNumber}: ${result.milestoneName} -- ${status}`);
393
- lines.push("");
394
- // Wave summary
395
- for (const wave of result.waves) {
396
- const agentStatus = wave.agents
397
- .map((a) => `${a.name}: ${a.success ? "OK" : "FAIL"}`)
398
- .join(", ");
399
- const verifyStatus = wave.verification
400
- ? wave.verification.passed
401
- ? "PASSED"
402
- : "FAILED"
403
- : "SKIPPED";
404
- lines.push(`**Wave ${wave.waveNumber}:** ${agentStatus} | Verify: ${verifyStatus}`);
405
- }
406
- lines.push("");
407
- // Stats
408
- lines.push(`**Files Created:** ${result.totalFilesCreated}`);
409
- lines.push(`**Files Modified:** ${result.totalFilesModified}`);
410
- lines.push("");
411
- // Errors
412
- if (result.errors.length > 0) {
413
- lines.push("### Errors");
414
- for (const error of result.errors) {
415
- lines.push(`- ${error}`);
416
- }
417
- lines.push("");
418
- }
419
- return lines.join("\n");
420
- }
421
- /**
422
- * Format verification errors into a structured prompt for fix agents.
423
- * Used by the self-healing verify loop.
424
- */
425
- export function formatErrorsForFixAgent(verification) {
426
- const lines = [];
427
- lines.push("## Verification Errors to Fix");
428
- lines.push("");
429
- for (const gate of verification.gates) {
430
- if (gate.passed)
431
- continue;
432
- lines.push(`### ${gate.gate} Gate — FAILED`);
433
- for (const error of gate.errors) {
434
- const loc = error.file
435
- ? `${error.file}${error.line ? `:${error.line}` : ""}`
436
- : "";
437
- const prefix = loc ? `**${loc}:** ` : "";
438
- lines.push(`- ${prefix}${error.message}`);
439
- if (error.remediation) {
440
- lines.push(` > Fix: ${error.remediation}`);
441
- }
442
- }
443
- lines.push("");
444
- }
445
- return lines.join("\n");
446
- }
447
- //# sourceMappingURL=executor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/go/executor.ts"],"names":[],"mappings":"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"}
@@ -1,108 +0,0 @@
1
- /**
2
- * Final Milestone Detection and PR Creation
3
- *
4
- * Handles the transition from "last milestone complete" to "PR ready for review".
5
- * Uses `gh pr create` to open a pull request with a forge verification report
6
- * in the body. Designed to be called by the execution engine after the final
7
- * milestone passes verification.
8
- */
9
- import type { PipelineResult, GateResult, CodexComment } from "../types.js";
10
- export interface CreatePROptions {
11
- projectDir: string;
12
- branch: string;
13
- baseBranch?: string;
14
- title: string;
15
- milestones: Array<{
16
- number: number;
17
- name: string;
18
- success: boolean;
19
- }>;
20
- verificationReport?: string;
21
- commitSha?: string;
22
- linearIssueIdentifiers?: string[];
23
- }
24
- export interface PRResult {
25
- url: string;
26
- number: number;
27
- title: string;
28
- created: boolean;
29
- }
30
- export interface PRError {
31
- url: "";
32
- number: 0;
33
- title: string;
34
- created: false;
35
- error: string;
36
- }
37
- export interface FinalizeWithCodexOptions extends CreatePROptions {
38
- /** GitHub owner/org for the repo */
39
- owner: string;
40
- /** GitHub repo name */
41
- repo: string;
42
- /** Codex gate poll interval in milliseconds (default: 60_000) */
43
- codexPollIntervalMs?: number;
44
- /** Maximum number of poll cycles (default: 8) */
45
- codexMaxPolls?: number;
46
- /** Called for each unresolved PR comment; return true if fix was pushed */
47
- onFixComment?: (comment: CodexComment) => Promise<boolean>;
48
- }
49
- export interface FinalizeResult {
50
- pr: PRResult | PRError;
51
- codexGate?: GateResult;
52
- allCommentsResolved: boolean;
53
- }
54
- /**
55
- * Extract the owner and repo name from the current Git remote using `gh`.
56
- * Returns `null` if `gh` is unavailable or the command fails.
57
- */
58
- export declare function extractRepoInfo(projectDir: string): {
59
- owner: string;
60
- repo: string;
61
- } | null;
62
- /**
63
- * Poll for Codex review comments on a PR and attempt to resolve them
64
- * using the provided `onFixComment` callback. Returns the list of
65
- * comments that remain unresolved after the fix cycle.
66
- */
67
- export declare function pollAndResolvePRComments(options: {
68
- owner: string;
69
- repo: string;
70
- prNumber: number;
71
- projectDir?: string;
72
- pollIntervalMs?: number;
73
- maxPolls?: number;
74
- onFixComment?: (comment: CodexComment) => Promise<boolean>;
75
- }): Promise<{
76
- unresolved: CodexComment[];
77
- gateResult: GateResult;
78
- }>;
79
- /**
80
- * Create a PR and run the Codex review gate. The milestone only marks
81
- * complete when 0 unresolved PR comments remain. If the Codex gate
82
- * times out with no comments, the milestone still completes (gate is
83
- * optional).
84
- */
85
- export declare function finalizeWithCodexGate(options: FinalizeWithCodexOptions): Promise<FinalizeResult>;
86
- /**
87
- * Generate a PR title summarizing all completed milestones.
88
- *
89
- * Examples:
90
- * - `feat: my-project — Milestone 1 complete`
91
- * - `feat: my-project — Milestones 1-5 complete`
92
- */
93
- export declare function buildPRTitle(project: string, milestoneCount: number): string;
94
- /**
95
- * Format a PipelineResult into a PR-ready verification section.
96
- *
97
- * Includes gate-level pass/fail status with error counts and
98
- * duration information. Designed to be embedded in a PR body.
99
- */
100
- export declare function buildVerificationSection(result: PipelineResult): string;
101
- /**
102
- * Create a GitHub pull request using the `gh` CLI.
103
- *
104
- * Builds a structured PR body with milestone status, verification report,
105
- * and metadata, then calls `gh pr create`. If `gh` is not installed or the
106
- * command fails, returns a descriptive error result instead of throwing.
107
- */
108
- export declare function createPullRequest(options: CreatePROptions): PRResult | PRError;