popeye-cli 1.0.1 → 1.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.
- package/README.md +521 -125
- package/dist/adapters/claude.d.ts +16 -4
- package/dist/adapters/claude.d.ts.map +1 -1
- package/dist/adapters/claude.js +679 -33
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/gemini.d.ts +55 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +318 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +41 -7
- package/dist/adapters/openai.js.map +1 -1
- package/dist/auth/claude.d.ts +11 -9
- package/dist/auth/claude.d.ts.map +1 -1
- package/dist/auth/claude.js +107 -71
- package/dist/auth/claude.js.map +1 -1
- package/dist/auth/gemini.d.ts +58 -0
- package/dist/auth/gemini.d.ts.map +1 -0
- package/dist/auth/gemini.js +172 -0
- package/dist/auth/gemini.js.map +1 -0
- package/dist/auth/index.d.ts +11 -7
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +23 -5
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/keychain.d.ts +20 -7
- package/dist/auth/keychain.d.ts.map +1 -1
- package/dist/auth/keychain.js +85 -29
- package/dist/auth/keychain.js.map +1 -1
- package/dist/auth/openai.d.ts +2 -2
- package/dist/auth/openai.d.ts.map +1 -1
- package/dist/auth/openai.js +30 -32
- package/dist/auth/openai.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +1151 -110
- package/dist/cli/interactive.js.map +1 -1
- package/dist/config/defaults.d.ts +6 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +10 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +19 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +20 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +7 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/generators/python.d.ts.map +1 -1
- package/dist/generators/python.js +1 -0
- package/dist/generators/python.js.map +1 -1
- package/dist/generators/typescript.d.ts.map +1 -1
- package/dist/generators/typescript.js +1 -0
- package/dist/generators/typescript.js.map +1 -1
- package/dist/state/index.d.ts +108 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +551 -4
- package/dist/state/index.js.map +1 -1
- package/dist/state/registry.d.ts +52 -0
- package/dist/state/registry.d.ts.map +1 -0
- package/dist/state/registry.js +215 -0
- package/dist/state/registry.js.map +1 -0
- package/dist/types/cli.d.ts +4 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/cli.js.map +1 -1
- package/dist/types/consensus.d.ts +69 -4
- package/dist/types/consensus.d.ts.map +1 -1
- package/dist/types/consensus.js +24 -3
- package/dist/types/consensus.js.map +1 -1
- package/dist/types/workflow.d.ts +55 -0
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +16 -0
- package/dist/types/workflow.js.map +1 -1
- package/dist/workflow/auto-fix.d.ts +45 -0
- package/dist/workflow/auto-fix.d.ts.map +1 -0
- package/dist/workflow/auto-fix.js +274 -0
- package/dist/workflow/auto-fix.js.map +1 -0
- package/dist/workflow/consensus.d.ts +44 -2
- package/dist/workflow/consensus.d.ts.map +1 -1
- package/dist/workflow/consensus.js +565 -17
- package/dist/workflow/consensus.js.map +1 -1
- package/dist/workflow/execution-mode.d.ts +10 -4
- package/dist/workflow/execution-mode.d.ts.map +1 -1
- package/dist/workflow/execution-mode.js +547 -58
- package/dist/workflow/execution-mode.js.map +1 -1
- package/dist/workflow/index.d.ts +14 -2
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +69 -6
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/milestone-workflow.d.ts +34 -0
- package/dist/workflow/milestone-workflow.d.ts.map +1 -0
- package/dist/workflow/milestone-workflow.js +414 -0
- package/dist/workflow/milestone-workflow.js.map +1 -0
- package/dist/workflow/plan-mode.d.ts +14 -1
- package/dist/workflow/plan-mode.d.ts.map +1 -1
- package/dist/workflow/plan-mode.js +589 -47
- package/dist/workflow/plan-mode.js.map +1 -1
- package/dist/workflow/plan-storage.d.ts +142 -0
- package/dist/workflow/plan-storage.d.ts.map +1 -0
- package/dist/workflow/plan-storage.js +331 -0
- package/dist/workflow/plan-storage.js.map +1 -0
- package/dist/workflow/project-verification.d.ts +37 -0
- package/dist/workflow/project-verification.d.ts.map +1 -0
- package/dist/workflow/project-verification.js +381 -0
- package/dist/workflow/project-verification.js.map +1 -0
- package/dist/workflow/task-workflow.d.ts +37 -0
- package/dist/workflow/task-workflow.d.ts.map +1 -0
- package/dist/workflow/task-workflow.js +383 -0
- package/dist/workflow/task-workflow.js.map +1 -0
- package/dist/workflow/test-runner.d.ts +1 -0
- package/dist/workflow/test-runner.d.ts.map +1 -1
- package/dist/workflow/test-runner.js +9 -5
- package/dist/workflow/test-runner.js.map +1 -1
- package/dist/workflow/ui-designer.d.ts +82 -0
- package/dist/workflow/ui-designer.d.ts.map +1 -0
- package/dist/workflow/ui-designer.js +234 -0
- package/dist/workflow/ui-designer.js.map +1 -0
- package/dist/workflow/ui-setup.d.ts +58 -0
- package/dist/workflow/ui-setup.d.ts.map +1 -0
- package/dist/workflow/ui-setup.js +685 -0
- package/dist/workflow/ui-setup.js.map +1 -0
- package/dist/workflow/ui-verification.d.ts +114 -0
- package/dist/workflow/ui-verification.d.ts.map +1 -0
- package/dist/workflow/ui-verification.js +258 -0
- package/dist/workflow/ui-verification.js.map +1 -0
- package/dist/workflow/workflow-logger.d.ts +110 -0
- package/dist/workflow/workflow-logger.d.ts.map +1 -0
- package/dist/workflow/workflow-logger.js +267 -0
- package/dist/workflow/workflow-logger.js.map +1 -0
- package/package.json +2 -2
- package/src/adapters/claude.ts +815 -34
- package/src/adapters/gemini.ts +373 -0
- package/src/adapters/openai.ts +40 -7
- package/src/auth/claude.ts +120 -78
- package/src/auth/gemini.ts +207 -0
- package/src/auth/index.ts +28 -8
- package/src/auth/keychain.ts +95 -28
- package/src/auth/openai.ts +29 -36
- package/src/cli/interactive.ts +1357 -115
- package/src/config/defaults.ts +10 -2
- package/src/config/index.ts +21 -0
- package/src/config/schema.ts +7 -0
- package/src/generators/python.ts +1 -0
- package/src/generators/typescript.ts +1 -0
- package/src/state/index.ts +713 -4
- package/src/state/registry.ts +278 -0
- package/src/types/cli.ts +4 -0
- package/src/types/consensus.ts +65 -6
- package/src/types/workflow.ts +35 -0
- package/src/workflow/auto-fix.ts +340 -0
- package/src/workflow/consensus.ts +750 -16
- package/src/workflow/execution-mode.ts +673 -74
- package/src/workflow/index.ts +95 -6
- package/src/workflow/milestone-workflow.ts +576 -0
- package/src/workflow/plan-mode.ts +696 -50
- package/src/workflow/plan-storage.ts +482 -0
- package/src/workflow/project-verification.ts +471 -0
- package/src/workflow/task-workflow.ts +525 -0
- package/src/workflow/test-runner.ts +10 -5
- package/src/workflow/ui-designer.ts +337 -0
- package/src/workflow/ui-setup.ts +797 -0
- package/src/workflow/ui-verification.ts +357 -0
- package/src/workflow/workflow-logger.ts +353 -0
- package/tests/config/config.test.ts +1 -1
- package/tests/types/consensus.test.ts +3 -3
- package/tests/workflow/plan-mode.test.ts +213 -0
- package/tests/workflow/test-runner.test.ts +5 -3
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Milestone-level workflow
|
|
3
|
+
* Handles: Milestone Plan → Consensus → Execute Tasks → Milestone Review → Consensus
|
|
4
|
+
*/
|
|
5
|
+
import { promises as fs } from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { createPlan as claudeCreatePlan, analyzeCodebase } from '../adapters/claude.js';
|
|
8
|
+
import { loadProject, updateState, } from '../state/index.js';
|
|
9
|
+
import { iterateUntilConsensus } from './consensus.js';
|
|
10
|
+
import { runTaskWorkflow } from './task-workflow.js';
|
|
11
|
+
import { parsePlanMilestones } from './plan-mode.js';
|
|
12
|
+
/**
|
|
13
|
+
* Update milestone in state
|
|
14
|
+
*/
|
|
15
|
+
async function updateMilestoneInState(projectDir, milestoneId, updates) {
|
|
16
|
+
const state = await loadProject(projectDir);
|
|
17
|
+
const updatedMilestones = state.milestones.map(m => m.id === milestoneId ? { ...m, ...updates } : m);
|
|
18
|
+
return updateState(projectDir, { milestones: updatedMilestones });
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a detailed plan for a milestone
|
|
22
|
+
*/
|
|
23
|
+
async function createMilestonePlan(milestone, state, onProgress) {
|
|
24
|
+
onProgress?.('Creating detailed milestone plan...');
|
|
25
|
+
const context = `
|
|
26
|
+
## Project Context
|
|
27
|
+
Project: ${state.name}
|
|
28
|
+
Language: ${state.language}
|
|
29
|
+
|
|
30
|
+
## Project Specification
|
|
31
|
+
${state.specification?.slice(0, 2000) || 'No specification available'}
|
|
32
|
+
|
|
33
|
+
## Overall Project Plan
|
|
34
|
+
${state.plan?.slice(0, 2000) || 'No overall plan available'}
|
|
35
|
+
|
|
36
|
+
## Completed Milestones
|
|
37
|
+
${state.milestones
|
|
38
|
+
.filter(m => m.status === 'complete')
|
|
39
|
+
.map(m => `- ${m.name}`)
|
|
40
|
+
.join('\n') || 'None yet'}
|
|
41
|
+
`.trim();
|
|
42
|
+
const prompt = `
|
|
43
|
+
Create a detailed implementation plan for the following milestone:
|
|
44
|
+
|
|
45
|
+
## Milestone: ${milestone.name}
|
|
46
|
+
${milestone.description}
|
|
47
|
+
|
|
48
|
+
## Tasks in This Milestone
|
|
49
|
+
${milestone.tasks.map((t, i) => `${i + 1}. ${t.name}: ${t.description}`).join('\n')}
|
|
50
|
+
|
|
51
|
+
Please provide a comprehensive plan that includes:
|
|
52
|
+
|
|
53
|
+
1. **Milestone Overview**: Summary of what will be accomplished
|
|
54
|
+
2. **Prerequisites**: What must be in place before starting
|
|
55
|
+
3. **Implementation Order**: Optimal sequence for tasks
|
|
56
|
+
4. **Integration Points**: How tasks connect to each other
|
|
57
|
+
5. **Risk Assessment**: Potential issues and mitigations
|
|
58
|
+
6. **Success Criteria**: How to verify milestone completion
|
|
59
|
+
7. **Test Strategy**: Overall testing approach for the milestone
|
|
60
|
+
|
|
61
|
+
For each task, provide:
|
|
62
|
+
- Detailed implementation steps
|
|
63
|
+
- Files to create/modify
|
|
64
|
+
- Dependencies
|
|
65
|
+
- Acceptance criteria
|
|
66
|
+
|
|
67
|
+
This plan will be reviewed for consensus before any implementation begins.
|
|
68
|
+
`.trim();
|
|
69
|
+
const result = await claudeCreatePlan(prompt, context, onProgress);
|
|
70
|
+
if (!result.success) {
|
|
71
|
+
throw new Error(`Failed to create milestone plan: ${result.error}`);
|
|
72
|
+
}
|
|
73
|
+
return result.response;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Document milestone plan
|
|
77
|
+
*/
|
|
78
|
+
async function documentMilestonePlan(projectDir, milestone, plan, consensusResult) {
|
|
79
|
+
const docsDir = path.join(projectDir, 'docs');
|
|
80
|
+
await fs.mkdir(docsDir, { recursive: true });
|
|
81
|
+
const milestoneNum = milestone.id.replace('milestone-', '');
|
|
82
|
+
const filename = `milestone_${milestoneNum}_plan.md`;
|
|
83
|
+
const docPath = path.join(docsDir, filename);
|
|
84
|
+
const content = `# Milestone Plan: ${milestone.name}
|
|
85
|
+
|
|
86
|
+
## Metadata
|
|
87
|
+
- **Milestone ID**: ${milestone.id}
|
|
88
|
+
- **Consensus Score**: ${consensusResult.finalScore}%
|
|
89
|
+
- **Iterations**: ${consensusResult.totalIterations}
|
|
90
|
+
- **Status**: ${consensusResult.approved ? 'APPROVED' : 'NOT APPROVED'}
|
|
91
|
+
${consensusResult.arbitrated ? '- **Arbitrated**: Yes' : ''}
|
|
92
|
+
- **Generated**: ${new Date().toISOString()}
|
|
93
|
+
|
|
94
|
+
## Milestone Description
|
|
95
|
+
${milestone.description}
|
|
96
|
+
|
|
97
|
+
## Tasks
|
|
98
|
+
${milestone.tasks.map((t, i) => `${i + 1}. **${t.name}**: ${t.description}`).join('\n')}
|
|
99
|
+
|
|
100
|
+
## Implementation Plan
|
|
101
|
+
${plan}
|
|
102
|
+
|
|
103
|
+
## Consensus History
|
|
104
|
+
| Iteration | Score | Key Feedback |
|
|
105
|
+
|-----------|-------|--------------|
|
|
106
|
+
${consensusResult.iterations.map(it => `| ${it.iteration} | ${it.result.score}% | ${it.result.concerns?.slice(0, 2).join('; ') || 'None'} |`).join('\n')}
|
|
107
|
+
|
|
108
|
+
${consensusResult.finalConcerns.length > 0 ? `
|
|
109
|
+
## Remaining Notes
|
|
110
|
+
${consensusResult.finalConcerns.map(c => `- ${c}`).join('\n')}
|
|
111
|
+
` : ''}
|
|
112
|
+
`;
|
|
113
|
+
await fs.writeFile(docPath, content, 'utf-8');
|
|
114
|
+
return `docs/${filename}`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create milestone completion review
|
|
118
|
+
*/
|
|
119
|
+
async function createMilestoneReview(milestone, state, _taskResults, onProgress) {
|
|
120
|
+
onProgress?.('Creating milestone completion review...');
|
|
121
|
+
// Analyze the current codebase
|
|
122
|
+
const codebaseAnalysis = await analyzeCodebase(state.id, // projectDir stored in state context
|
|
123
|
+
onProgress);
|
|
124
|
+
const context = `
|
|
125
|
+
## Project Context
|
|
126
|
+
Project: ${state.name}
|
|
127
|
+
Language: ${state.language}
|
|
128
|
+
|
|
129
|
+
## Milestone: ${milestone.name}
|
|
130
|
+
${milestone.description}
|
|
131
|
+
|
|
132
|
+
## Codebase Analysis
|
|
133
|
+
${codebaseAnalysis.success ? codebaseAnalysis.response?.slice(0, 2000) : 'Analysis not available'}
|
|
134
|
+
`.trim();
|
|
135
|
+
const prompt = `
|
|
136
|
+
Please perform a completion review for the following milestone:
|
|
137
|
+
|
|
138
|
+
## Milestone: ${milestone.name}
|
|
139
|
+
|
|
140
|
+
## Completed Tasks
|
|
141
|
+
${milestone.tasks.map((t, i) => {
|
|
142
|
+
return `${i + 1}. **${t.name}**
|
|
143
|
+
- Status: ${t.status}
|
|
144
|
+
- Tests: ${t.testsPassed ? 'Passed' : 'N/A'}
|
|
145
|
+
- Consensus Score: ${t.consensusScore || 'N/A'}%`;
|
|
146
|
+
}).join('\n')}
|
|
147
|
+
|
|
148
|
+
Please provide:
|
|
149
|
+
|
|
150
|
+
1. **Summary**: What was accomplished in this milestone
|
|
151
|
+
2. **Code Review**: Assessment of code quality and architecture
|
|
152
|
+
3. **Test Coverage**: Evaluation of test coverage and quality
|
|
153
|
+
4. **Integration Check**: How well components work together
|
|
154
|
+
5. **Technical Debt**: Any shortcuts or areas needing future attention
|
|
155
|
+
6. **Documentation**: Status of documentation
|
|
156
|
+
7. **Completion Verification**:
|
|
157
|
+
- Are all acceptance criteria met?
|
|
158
|
+
- Is the milestone truly complete?
|
|
159
|
+
- Any remaining work needed?
|
|
160
|
+
|
|
161
|
+
Provide a CONSENSUS SCORE (0-100%) indicating confidence that this milestone is complete.
|
|
162
|
+
`.trim();
|
|
163
|
+
const result = await claudeCreatePlan(prompt, context, onProgress);
|
|
164
|
+
if (!result.success) {
|
|
165
|
+
throw new Error(`Failed to create milestone review: ${result.error}`);
|
|
166
|
+
}
|
|
167
|
+
return result.response;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Document milestone completion
|
|
171
|
+
*/
|
|
172
|
+
async function documentMilestoneCompletion(projectDir, milestone, review, consensusResult, _taskResults) {
|
|
173
|
+
const docsDir = path.join(projectDir, 'docs');
|
|
174
|
+
await fs.mkdir(docsDir, { recursive: true });
|
|
175
|
+
const milestoneNum = milestone.id.replace('milestone-', '');
|
|
176
|
+
const filename = `milestone_${milestoneNum}_complete.md`;
|
|
177
|
+
const docPath = path.join(docsDir, filename);
|
|
178
|
+
const content = `# Milestone Completion: ${milestone.name}
|
|
179
|
+
|
|
180
|
+
## Metadata
|
|
181
|
+
- **Milestone ID**: ${milestone.id}
|
|
182
|
+
- **Completion Score**: ${consensusResult.finalScore}%
|
|
183
|
+
- **Review Iterations**: ${consensusResult.totalIterations}
|
|
184
|
+
- **Status**: ${consensusResult.approved ? 'COMPLETE' : 'NEEDS REVIEW'}
|
|
185
|
+
- **Completed**: ${new Date().toISOString()}
|
|
186
|
+
|
|
187
|
+
## Task Summary
|
|
188
|
+
| Task | Status | Tests | Consensus |
|
|
189
|
+
|------|--------|-------|-----------|
|
|
190
|
+
${milestone.tasks.map(t => {
|
|
191
|
+
return `| ${t.name} | ${t.status} | ${t.testsPassed ? 'Passed' : 'N/A'} | ${t.consensusScore || 'N/A'}% |`;
|
|
192
|
+
}).join('\n')}
|
|
193
|
+
|
|
194
|
+
## Completion Review
|
|
195
|
+
${review}
|
|
196
|
+
|
|
197
|
+
## Final Assessment
|
|
198
|
+
- **All Tasks Complete**: ${milestone.tasks.every(t => t.status === 'complete') ? 'Yes' : 'No'}
|
|
199
|
+
- **All Tests Passing**: ${milestone.tasks.every(t => t.testsPassed !== false) ? 'Yes' : 'No'}
|
|
200
|
+
- **Milestone Approved**: ${consensusResult.approved ? 'Yes' : 'No'}
|
|
201
|
+
`;
|
|
202
|
+
await fs.writeFile(docPath, content, 'utf-8');
|
|
203
|
+
return `docs/${filename}`;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Run the complete milestone workflow
|
|
207
|
+
*/
|
|
208
|
+
export async function runMilestoneWorkflow(milestone, options) {
|
|
209
|
+
const { projectDir, consensusConfig, onProgress, onTaskStart, onTaskComplete, } = options;
|
|
210
|
+
const taskResults = [];
|
|
211
|
+
try {
|
|
212
|
+
let state = await loadProject(projectDir);
|
|
213
|
+
// Reload milestone from state to get latest data (including any saved plan)
|
|
214
|
+
const currentMilestone = state.milestones.find(m => m.id === milestone.id);
|
|
215
|
+
if (currentMilestone) {
|
|
216
|
+
milestone = currentMilestone;
|
|
217
|
+
}
|
|
218
|
+
// Check if milestone plan was already approved (resuming scenario)
|
|
219
|
+
let planConsensus;
|
|
220
|
+
if (milestone.consensusApproved && milestone.plan) {
|
|
221
|
+
// Milestone plan already approved, skip planning phase
|
|
222
|
+
onProgress?.('milestone-plan', `Using existing approved plan for: ${milestone.name} (Score: ${milestone.consensusScore}%)`);
|
|
223
|
+
// Create a mock consensus result from saved data
|
|
224
|
+
planConsensus = {
|
|
225
|
+
approved: true,
|
|
226
|
+
finalPlan: milestone.plan,
|
|
227
|
+
finalScore: milestone.consensusScore || 95,
|
|
228
|
+
bestPlan: milestone.plan,
|
|
229
|
+
bestScore: milestone.consensusScore || 95,
|
|
230
|
+
bestIteration: milestone.consensusIterations || 1,
|
|
231
|
+
totalIterations: milestone.consensusIterations || 1,
|
|
232
|
+
iterations: [],
|
|
233
|
+
finalConcerns: [],
|
|
234
|
+
finalRecommendations: [],
|
|
235
|
+
arbitrated: false,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// Mark milestone as in-progress
|
|
240
|
+
state = await updateMilestoneInState(projectDir, milestone.id, {
|
|
241
|
+
status: 'in-progress',
|
|
242
|
+
});
|
|
243
|
+
// ============================================
|
|
244
|
+
// PHASE 1: Create Milestone Plan
|
|
245
|
+
// ============================================
|
|
246
|
+
onProgress?.('milestone-plan', `Planning milestone: ${milestone.name}`);
|
|
247
|
+
const milestonePlan = await createMilestonePlan(milestone, state, (msg) => onProgress?.('milestone-plan', msg));
|
|
248
|
+
// ============================================
|
|
249
|
+
// PHASE 2: Get Consensus on Milestone Plan
|
|
250
|
+
// ============================================
|
|
251
|
+
onProgress?.('milestone-consensus', `Getting consensus for milestone: ${milestone.name}`);
|
|
252
|
+
const context = `
|
|
253
|
+
Project: ${state.name}
|
|
254
|
+
Language: ${state.language}
|
|
255
|
+
Milestone: ${milestone.name}
|
|
256
|
+
Tasks: ${milestone.tasks.length}
|
|
257
|
+
`.trim();
|
|
258
|
+
planConsensus = await iterateUntilConsensus(milestonePlan, context, {
|
|
259
|
+
projectDir,
|
|
260
|
+
config: consensusConfig,
|
|
261
|
+
onIteration: (iteration, result) => {
|
|
262
|
+
onProgress?.('milestone-consensus', `Iteration ${iteration}: ${result.score}%`);
|
|
263
|
+
},
|
|
264
|
+
onProgress,
|
|
265
|
+
});
|
|
266
|
+
// Document the milestone plan
|
|
267
|
+
const planDocPath = await documentMilestonePlan(projectDir, milestone, planConsensus.bestPlan, planConsensus);
|
|
268
|
+
// Update milestone with plan consensus
|
|
269
|
+
state = await updateMilestoneInState(projectDir, milestone.id, {
|
|
270
|
+
plan: planConsensus.bestPlan,
|
|
271
|
+
consensusScore: planConsensus.finalScore,
|
|
272
|
+
consensusIterations: planConsensus.totalIterations,
|
|
273
|
+
consensusApproved: planConsensus.approved,
|
|
274
|
+
planDoc: planDocPath,
|
|
275
|
+
});
|
|
276
|
+
// Check if consensus was achieved
|
|
277
|
+
if (!planConsensus.approved) {
|
|
278
|
+
onProgress?.('milestone-consensus', `Milestone plan not approved: ${planConsensus.finalScore}%`);
|
|
279
|
+
state = await updateMilestoneInState(projectDir, milestone.id, {
|
|
280
|
+
status: 'failed',
|
|
281
|
+
});
|
|
282
|
+
return {
|
|
283
|
+
success: false,
|
|
284
|
+
milestone: { ...milestone, status: 'failed' },
|
|
285
|
+
planConsensus,
|
|
286
|
+
taskResults: [],
|
|
287
|
+
error: `Milestone plan not approved. Score: ${planConsensus.finalScore}%`,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
onProgress?.('milestone-consensus', `Milestone plan approved with ${planConsensus.finalScore}%`);
|
|
291
|
+
// Parse tasks from the approved plan (may have refined tasks)
|
|
292
|
+
const parsedMilestones = parsePlanMilestones(planConsensus.bestPlan);
|
|
293
|
+
if (parsedMilestones.length > 0 && parsedMilestones[0].tasks.length > 0) {
|
|
294
|
+
// Update tasks with more details from the approved plan
|
|
295
|
+
// Keep original task IDs but update descriptions
|
|
296
|
+
const updatedTasks = milestone.tasks.map((origTask, idx) => {
|
|
297
|
+
const parsedTask = parsedMilestones[0].tasks[idx];
|
|
298
|
+
if (parsedTask) {
|
|
299
|
+
return {
|
|
300
|
+
...origTask,
|
|
301
|
+
description: parsedTask.description || origTask.description,
|
|
302
|
+
testPlan: parsedTask.testPlan || origTask.testPlan,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
return origTask;
|
|
306
|
+
});
|
|
307
|
+
state = await updateMilestoneInState(projectDir, milestone.id, {
|
|
308
|
+
tasks: updatedTasks,
|
|
309
|
+
});
|
|
310
|
+
// Reload milestone with updated tasks
|
|
311
|
+
state = await loadProject(projectDir);
|
|
312
|
+
milestone = state.milestones.find(m => m.id === milestone.id) || milestone;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// ============================================
|
|
316
|
+
// PHASE 3: Execute Each Task (with per-task consensus)
|
|
317
|
+
// ============================================
|
|
318
|
+
onProgress?.('milestone-tasks', `Executing ${milestone.tasks.length} tasks...`);
|
|
319
|
+
for (const task of milestone.tasks) {
|
|
320
|
+
if (task.status === 'complete') {
|
|
321
|
+
onProgress?.('milestone-tasks', `Skipping completed task: ${task.name}`);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
onTaskStart?.(task);
|
|
325
|
+
onProgress?.('milestone-tasks', `Starting task: ${task.name}`);
|
|
326
|
+
const taskResult = await runTaskWorkflow(milestone, task, {
|
|
327
|
+
projectDir,
|
|
328
|
+
consensusConfig,
|
|
329
|
+
onProgress,
|
|
330
|
+
});
|
|
331
|
+
taskResults.push(taskResult);
|
|
332
|
+
onTaskComplete?.(task, taskResult.success);
|
|
333
|
+
if (!taskResult.success) {
|
|
334
|
+
onProgress?.('milestone-tasks', `Task failed: ${task.name}`);
|
|
335
|
+
// Update milestone status
|
|
336
|
+
state = await updateMilestoneInState(projectDir, milestone.id, {
|
|
337
|
+
status: 'failed',
|
|
338
|
+
});
|
|
339
|
+
return {
|
|
340
|
+
success: false,
|
|
341
|
+
milestone: { ...milestone, status: 'failed' },
|
|
342
|
+
planConsensus,
|
|
343
|
+
taskResults,
|
|
344
|
+
error: `Task "${task.name}" failed: ${taskResult.error}`,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
onProgress?.('milestone-tasks', `Task complete: ${task.name}`);
|
|
348
|
+
}
|
|
349
|
+
// ============================================
|
|
350
|
+
// PHASE 4: Milestone Completion Review
|
|
351
|
+
// ============================================
|
|
352
|
+
onProgress?.('milestone-review', `Reviewing milestone completion: ${milestone.name}`);
|
|
353
|
+
// Reload state to get latest task statuses
|
|
354
|
+
state = await loadProject(projectDir);
|
|
355
|
+
milestone = state.milestones.find(m => m.id === milestone.id) || milestone;
|
|
356
|
+
const completionReview = await createMilestoneReview(milestone, state, taskResults, (msg) => onProgress?.('milestone-review', msg));
|
|
357
|
+
// ============================================
|
|
358
|
+
// PHASE 5: Get Consensus on Completion
|
|
359
|
+
// ============================================
|
|
360
|
+
onProgress?.('milestone-completion', `Getting completion consensus for: ${milestone.name}`);
|
|
361
|
+
const completionConsensus = await iterateUntilConsensus(completionReview, `Milestone completion review for: ${milestone.name}`, {
|
|
362
|
+
projectDir,
|
|
363
|
+
config: consensusConfig,
|
|
364
|
+
onIteration: (iteration, result) => {
|
|
365
|
+
onProgress?.('milestone-completion', `Completion review iteration ${iteration}: ${result.score}%`);
|
|
366
|
+
},
|
|
367
|
+
onProgress,
|
|
368
|
+
});
|
|
369
|
+
// Document milestone completion
|
|
370
|
+
const completionDocPath = await documentMilestoneCompletion(projectDir, milestone, completionConsensus.bestPlan, completionConsensus, taskResults);
|
|
371
|
+
// Update milestone with completion consensus
|
|
372
|
+
const finalStatus = completionConsensus.approved ? 'complete' : 'in-progress';
|
|
373
|
+
state = await updateMilestoneInState(projectDir, milestone.id, {
|
|
374
|
+
status: finalStatus,
|
|
375
|
+
completionReview: completionConsensus.bestPlan,
|
|
376
|
+
completionScore: completionConsensus.finalScore,
|
|
377
|
+
completionApproved: completionConsensus.approved,
|
|
378
|
+
completionDoc: completionDocPath,
|
|
379
|
+
});
|
|
380
|
+
if (!completionConsensus.approved) {
|
|
381
|
+
onProgress?.('milestone-completion', `Milestone completion not approved: ${completionConsensus.finalScore}%`);
|
|
382
|
+
return {
|
|
383
|
+
success: false,
|
|
384
|
+
milestone: { ...milestone, status: 'in-progress' },
|
|
385
|
+
planConsensus,
|
|
386
|
+
completionConsensus,
|
|
387
|
+
taskResults,
|
|
388
|
+
error: `Milestone completion not approved. Score: ${completionConsensus.finalScore}%`,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
onProgress?.('milestone-complete', `Milestone complete: ${milestone.name}`);
|
|
392
|
+
return {
|
|
393
|
+
success: true,
|
|
394
|
+
milestone: { ...milestone, status: 'complete' },
|
|
395
|
+
planConsensus,
|
|
396
|
+
completionConsensus,
|
|
397
|
+
taskResults,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
catch (error) {
|
|
401
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
402
|
+
onProgress?.('milestone-error', errorMessage);
|
|
403
|
+
await updateMilestoneInState(projectDir, milestone.id, {
|
|
404
|
+
status: 'failed',
|
|
405
|
+
});
|
|
406
|
+
return {
|
|
407
|
+
success: false,
|
|
408
|
+
milestone: { ...milestone, status: 'failed' },
|
|
409
|
+
taskResults,
|
|
410
|
+
error: errorMessage,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=milestone-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"milestone-workflow.js","sourceRoot":"","sources":["../../src/workflow/milestone-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { type ConsensusProcessResult } from './consensus.js';
|
|
|
12
12
|
export interface PlanModeOptions {
|
|
13
13
|
projectDir: string;
|
|
14
14
|
consensusConfig?: Partial<ConsensusConfig>;
|
|
15
|
+
additionalContext?: string;
|
|
15
16
|
onProgress?: (phase: string, message: string) => void;
|
|
16
17
|
}
|
|
17
18
|
/**
|
|
@@ -50,15 +51,27 @@ export declare function createPlan(specification: string, context?: string, onPr
|
|
|
50
51
|
*/
|
|
51
52
|
export declare function getProjectContext(projectDir: string, onProgress?: (message: string) => void): Promise<string>;
|
|
52
53
|
/**
|
|
53
|
-
* Save the plan to a markdown file
|
|
54
|
+
* Save the plan to a markdown file in docs folder
|
|
54
55
|
*
|
|
55
56
|
* @param projectDir - The project directory
|
|
56
57
|
* @param plan - The plan content
|
|
57
58
|
* @param filename - The filename (default: PLAN.md)
|
|
58
59
|
*/
|
|
59
60
|
export declare function documentPlan(projectDir: string, plan: string, filename?: string): Promise<string>;
|
|
61
|
+
/**
|
|
62
|
+
* Detect if a plan is actually Claude's thinking/conversation instead of a real plan
|
|
63
|
+
* This happens when Claude outputs its reasoning instead of the plan content
|
|
64
|
+
*
|
|
65
|
+
* @param plan - The plan content
|
|
66
|
+
* @returns Object indicating if garbage and why
|
|
67
|
+
*/
|
|
68
|
+
export declare function detectGarbagePlan(plan: string): {
|
|
69
|
+
isGarbage: boolean;
|
|
70
|
+
reason?: string;
|
|
71
|
+
};
|
|
60
72
|
/**
|
|
61
73
|
* Parse milestones and tasks from a plan
|
|
74
|
+
* Extracts only actionable implementation tasks, not plan metadata
|
|
62
75
|
*
|
|
63
76
|
* @param plan - The plan content
|
|
64
77
|
* @returns Parsed milestones with tasks
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-mode.d.ts","sourceRoot":"","sources":["../../src/workflow/plan-mode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAQ,MAAM,sBAAsB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAW7D,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"plan-mode.d.ts","sourceRoot":"","sources":["../../src/workflow/plan-mode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAQ,MAAM,sBAAsB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAW7D,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAIpF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,GAAG,YAAY,EACjC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,MAAW,EACpB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CA2BjB;AA6FD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAuDvF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAsRzE;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAkWzB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,GAC3C,OAAO,CAAC,cAAc,CAAC,CAezB"}
|