popeye-cli 1.0.1 → 1.2.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/.env.example +24 -1
- package/CONTRIBUTING.md +275 -0
- package/OPEN_SOURCE_MANIFESTO.md +172 -0
- package/README.md +832 -123
- package/dist/adapters/claude.d.ts +19 -4
- package/dist/adapters/claude.d.ts.map +1 -1
- package/dist/adapters/claude.js +908 -42
- 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/grok.d.ts +73 -0
- package/dist/adapters/grok.d.ts.map +1 -0
- package/dist/adapters/grok.js +430 -0
- package/dist/adapters/grok.js.map +1 -0
- package/dist/adapters/openai.d.ts +1 -1
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +47 -8
- 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/grok.d.ts +73 -0
- package/dist/auth/grok.d.ts.map +1 -0
- package/dist/auth/grok.js +211 -0
- package/dist/auth/grok.js.map +1 -0
- package/dist/auth/index.d.ts +14 -7
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +41 -6
- 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/commands/auth.d.ts +1 -1
- package/dist/cli/commands/auth.d.ts.map +1 -1
- package/dist/cli/commands/auth.js +79 -8
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +15 -4
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +1494 -114
- package/dist/cli/interactive.js.map +1 -1
- package/dist/config/defaults.d.ts +9 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +19 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +19 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +33 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +47 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +29 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/generators/fullstack.d.ts +32 -0
- package/dist/generators/fullstack.d.ts.map +1 -0
- package/dist/generators/fullstack.js +497 -0
- package/dist/generators/fullstack.js.map +1 -0
- package/dist/generators/index.d.ts +4 -3
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +15 -1
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/python.d.ts +17 -1
- package/dist/generators/python.d.ts.map +1 -1
- package/dist/generators/python.js +34 -20
- package/dist/generators/python.js.map +1 -1
- package/dist/generators/templates/fullstack.d.ts +113 -0
- package/dist/generators/templates/fullstack.d.ts.map +1 -0
- package/dist/generators/templates/fullstack.js +1004 -0
- package/dist/generators/templates/fullstack.js.map +1 -0
- package/dist/generators/typescript.d.ts +19 -1
- package/dist/generators/typescript.d.ts.map +1 -1
- package/dist/generators/typescript.js +37 -20
- 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 +8 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/cli.js.map +1 -1
- package/dist/types/consensus.d.ts +186 -4
- package/dist/types/consensus.d.ts.map +1 -1
- package/dist/types/consensus.js +35 -3
- package/dist/types/consensus.js.map +1 -1
- package/dist/types/project.d.ts +76 -0
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/project.js +1 -1
- package/dist/types/project.js.map +1 -1
- package/dist/types/workflow.d.ts +217 -16
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +40 -1
- 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 +70 -2
- package/dist/workflow/consensus.d.ts.map +1 -1
- package/dist/workflow/consensus.js +872 -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 +80 -3
- package/dist/workflow/plan-mode.d.ts.map +1 -1
- package/dist/workflow/plan-mode.js +767 -49
- package/dist/workflow/plan-mode.js.map +1 -1
- package/dist/workflow/plan-storage.d.ts +386 -0
- package/dist/workflow/plan-storage.d.ts.map +1 -0
- package/dist/workflow/plan-storage.js +878 -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 +386 -0
- package/dist/workflow/task-workflow.js.map +1 -0
- package/dist/workflow/test-runner.d.ts +9 -0
- package/dist/workflow/test-runner.d.ts.map +1 -1
- package/dist/workflow/test-runner.js +101 -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/dist/workflow/workspace-manager.d.ts +342 -0
- package/dist/workflow/workspace-manager.d.ts.map +1 -0
- package/dist/workflow/workspace-manager.js +733 -0
- package/dist/workflow/workspace-manager.js.map +1 -0
- package/package.json +2 -2
- package/src/adapters/claude.ts +1067 -47
- package/src/adapters/gemini.ts +373 -0
- package/src/adapters/grok.ts +492 -0
- package/src/adapters/openai.ts +48 -9
- package/src/auth/claude.ts +120 -78
- package/src/auth/gemini.ts +207 -0
- package/src/auth/grok.ts +255 -0
- package/src/auth/index.ts +47 -9
- package/src/auth/keychain.ts +95 -28
- package/src/auth/openai.ts +29 -36
- package/src/cli/commands/auth.ts +89 -10
- package/src/cli/commands/create.ts +13 -4
- package/src/cli/interactive.ts +1774 -142
- package/src/config/defaults.ts +19 -2
- package/src/config/index.ts +36 -1
- package/src/config/schema.ts +30 -1
- package/src/generators/fullstack.ts +551 -0
- package/src/generators/index.ts +25 -1
- package/src/generators/python.ts +65 -20
- package/src/generators/templates/fullstack.ts +1047 -0
- package/src/generators/typescript.ts +69 -20
- package/src/state/index.ts +713 -4
- package/src/state/registry.ts +278 -0
- package/src/types/cli.ts +8 -0
- package/src/types/consensus.ts +197 -6
- package/src/types/project.ts +82 -1
- package/src/types/workflow.ts +90 -1
- package/src/workflow/auto-fix.ts +340 -0
- package/src/workflow/consensus.ts +1180 -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 +924 -50
- package/src/workflow/plan-storage.ts +1282 -0
- package/src/workflow/project-verification.ts +471 -0
- package/src/workflow/task-workflow.ts +528 -0
- package/src/workflow/test-runner.ts +120 -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/src/workflow/workspace-manager.ts +912 -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,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task-level workflow
|
|
3
|
+
* Handles the per-task consensus cycle: Plan → Consensus → Implement → Test
|
|
4
|
+
*/
|
|
5
|
+
import { promises as fs } from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { createPlan as claudeCreatePlan } from '../adapters/claude.js';
|
|
8
|
+
import { loadProject, updateState, } from '../state/index.js';
|
|
9
|
+
import { iterateUntilConsensus, runOptimizedConsensusProcess } from './consensus.js';
|
|
10
|
+
import { executeTask as executeTaskCode } from './execution-mode.js';
|
|
11
|
+
import { runTests, testsExist, getTestSummary } from './test-runner.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create a detailed implementation plan for a specific task
|
|
14
|
+
*
|
|
15
|
+
* @param task - The task to plan
|
|
16
|
+
* @param milestone - The parent milestone
|
|
17
|
+
* @param state - Current project state
|
|
18
|
+
* @param onProgress - Progress callback
|
|
19
|
+
* @returns The task implementation plan
|
|
20
|
+
*/
|
|
21
|
+
async function createTaskPlan(task, milestone, state, onProgress) {
|
|
22
|
+
onProgress?.('Creating detailed task plan...');
|
|
23
|
+
const context = `
|
|
24
|
+
## Project Context
|
|
25
|
+
Project: ${state.name}
|
|
26
|
+
Language: ${state.language}
|
|
27
|
+
|
|
28
|
+
## Milestone: ${milestone.name}
|
|
29
|
+
${milestone.description}
|
|
30
|
+
|
|
31
|
+
## Overall Project Plan
|
|
32
|
+
${state.plan?.slice(0, 2000) || 'No overall plan available'}
|
|
33
|
+
|
|
34
|
+
## Completed Tasks in This Milestone
|
|
35
|
+
${milestone.tasks
|
|
36
|
+
.filter(t => t.status === 'complete')
|
|
37
|
+
.map(t => `- ${t.name}`)
|
|
38
|
+
.join('\n') || 'None yet'}
|
|
39
|
+
`.trim();
|
|
40
|
+
const prompt = `
|
|
41
|
+
Create a detailed implementation plan for the following task:
|
|
42
|
+
|
|
43
|
+
## Task: ${task.name}
|
|
44
|
+
${task.description}
|
|
45
|
+
|
|
46
|
+
${task.testPlan ? `## Test Requirements\n${task.testPlan}` : ''}
|
|
47
|
+
|
|
48
|
+
Please provide:
|
|
49
|
+
1. **Implementation Steps**: Specific code changes needed
|
|
50
|
+
2. **Files to Create/Modify**: List all files that will be touched
|
|
51
|
+
3. **Dependencies**: Any packages or modules needed
|
|
52
|
+
4. **Acceptance Criteria**: How to verify the task is complete
|
|
53
|
+
5. **Test Plan**: Specific tests to write
|
|
54
|
+
|
|
55
|
+
Be specific and actionable. This plan will be reviewed for consensus before implementation.
|
|
56
|
+
`.trim();
|
|
57
|
+
const result = await claudeCreatePlan(prompt, context, state.language, onProgress);
|
|
58
|
+
if (!result.success) {
|
|
59
|
+
throw new Error(`Failed to create task plan: ${result.error}`);
|
|
60
|
+
}
|
|
61
|
+
return result.response;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Document a task plan to the docs folder
|
|
65
|
+
*
|
|
66
|
+
* @param projectDir - Project directory
|
|
67
|
+
* @param milestone - Parent milestone
|
|
68
|
+
* @param task - The task
|
|
69
|
+
* @param plan - The plan content
|
|
70
|
+
* @param consensusResult - The consensus result
|
|
71
|
+
* @returns Path to the document
|
|
72
|
+
*/
|
|
73
|
+
async function documentTaskPlan(projectDir, milestone, task, plan, consensusResult) {
|
|
74
|
+
const docsDir = path.join(projectDir, 'docs', 'tasks');
|
|
75
|
+
await fs.mkdir(docsDir, { recursive: true });
|
|
76
|
+
const milestoneNum = milestone.id.replace('milestone-', '');
|
|
77
|
+
const taskNum = task.id.split('-task-')[1] || '1';
|
|
78
|
+
const filename = `milestone_${milestoneNum}_task_${taskNum}_plan.md`;
|
|
79
|
+
const docPath = path.join(docsDir, filename);
|
|
80
|
+
const content = `# Task Plan: ${task.name}
|
|
81
|
+
|
|
82
|
+
## Metadata
|
|
83
|
+
- **Milestone**: ${milestone.name}
|
|
84
|
+
- **Task ID**: ${task.id}
|
|
85
|
+
- **Consensus Score**: ${consensusResult.finalScore}%
|
|
86
|
+
- **Iterations**: ${consensusResult.totalIterations}
|
|
87
|
+
- **Status**: ${consensusResult.approved ? 'APPROVED' : 'NOT APPROVED'}
|
|
88
|
+
- **Generated**: ${new Date().toISOString()}
|
|
89
|
+
|
|
90
|
+
## Task Description
|
|
91
|
+
${task.description}
|
|
92
|
+
|
|
93
|
+
## Implementation Plan
|
|
94
|
+
${plan}
|
|
95
|
+
|
|
96
|
+
${consensusResult.finalConcerns.length > 0 ? `
|
|
97
|
+
## Notes from Review
|
|
98
|
+
${consensusResult.finalConcerns.map(c => `- ${c}`).join('\n')}
|
|
99
|
+
` : ''}
|
|
100
|
+
`;
|
|
101
|
+
await fs.writeFile(docPath, content, 'utf-8');
|
|
102
|
+
return `docs/tasks/${filename}`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Document task test results
|
|
106
|
+
*
|
|
107
|
+
* @param projectDir - Project directory
|
|
108
|
+
* @param milestone - Parent milestone
|
|
109
|
+
* @param task - The task
|
|
110
|
+
* @param testResult - Test results
|
|
111
|
+
* @returns Path to the document
|
|
112
|
+
*/
|
|
113
|
+
async function documentTestResults(projectDir, milestone, task, testResult) {
|
|
114
|
+
const docsDir = path.join(projectDir, 'docs', 'tests');
|
|
115
|
+
await fs.mkdir(docsDir, { recursive: true });
|
|
116
|
+
const milestoneNum = milestone.id.replace('milestone-', '');
|
|
117
|
+
const taskNum = task.id.split('-task-')[1] || '1';
|
|
118
|
+
const filename = `milestone_${milestoneNum}_task_${taskNum}_tests.md`;
|
|
119
|
+
const docPath = path.join(docsDir, filename);
|
|
120
|
+
const content = `# Test Results: ${task.name}
|
|
121
|
+
|
|
122
|
+
## Summary
|
|
123
|
+
- **Status**: ${testResult.success ? 'PASSED' : 'FAILED'}
|
|
124
|
+
- **Total Tests**: ${testResult.total}
|
|
125
|
+
- **Passed**: ${testResult.passed}
|
|
126
|
+
- **Failed**: ${testResult.failed}
|
|
127
|
+
- **Execution Time**: ${new Date().toISOString()}
|
|
128
|
+
|
|
129
|
+
## Task Details
|
|
130
|
+
- **Milestone**: ${milestone.name}
|
|
131
|
+
- **Task ID**: ${task.id}
|
|
132
|
+
|
|
133
|
+
## Test Output
|
|
134
|
+
\`\`\`
|
|
135
|
+
${testResult.output.slice(0, 5000)}
|
|
136
|
+
\`\`\`
|
|
137
|
+
|
|
138
|
+
${testResult.failedTests && testResult.failedTests.length > 0 ? `
|
|
139
|
+
## Failed Tests
|
|
140
|
+
${testResult.failedTests.map(t => `- ${t}`).join('\n')}
|
|
141
|
+
` : ''}
|
|
142
|
+
`;
|
|
143
|
+
await fs.writeFile(docPath, content, 'utf-8');
|
|
144
|
+
return `docs/tests/${filename}`;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Update task in state with new data
|
|
148
|
+
*/
|
|
149
|
+
async function updateTaskInState(projectDir, taskId, updates) {
|
|
150
|
+
const state = await loadProject(projectDir);
|
|
151
|
+
const updatedMilestones = state.milestones.map(milestone => ({
|
|
152
|
+
...milestone,
|
|
153
|
+
tasks: milestone.tasks.map(task => task.id === taskId ? { ...task, ...updates } : task),
|
|
154
|
+
}));
|
|
155
|
+
return updateState(projectDir, { milestones: updatedMilestones });
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Run the complete task workflow: Plan → Consensus → Implement → Test
|
|
159
|
+
*
|
|
160
|
+
* @param milestone - The parent milestone
|
|
161
|
+
* @param task - The task to execute
|
|
162
|
+
* @param options - Workflow options
|
|
163
|
+
* @returns Task workflow result
|
|
164
|
+
*/
|
|
165
|
+
export async function runTaskWorkflow(milestone, task, options) {
|
|
166
|
+
const { projectDir, consensusConfig, maxRetries = 3, onProgress, } = options;
|
|
167
|
+
try {
|
|
168
|
+
let state = await loadProject(projectDir);
|
|
169
|
+
// Reload task from state to get latest data (for resume scenarios)
|
|
170
|
+
const currentMilestone = state.milestones.find(m => m.id === milestone.id);
|
|
171
|
+
const currentTask = currentMilestone?.tasks.find(t => t.id === task.id);
|
|
172
|
+
if (currentTask) {
|
|
173
|
+
task = currentTask;
|
|
174
|
+
}
|
|
175
|
+
// Check if we're resuming from a previous attempt
|
|
176
|
+
const hasApprovedPlan = task.consensusApproved && task.plan;
|
|
177
|
+
const hasCompletedImplementation = task.implementationComplete;
|
|
178
|
+
// Mark task as in-progress
|
|
179
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
180
|
+
status: 'in-progress',
|
|
181
|
+
error: undefined, // Clear previous error
|
|
182
|
+
});
|
|
183
|
+
let consensusResult;
|
|
184
|
+
// ============================================
|
|
185
|
+
// PHASE 1-2: Plan and Consensus (skip if already approved)
|
|
186
|
+
// ============================================
|
|
187
|
+
if (hasApprovedPlan) {
|
|
188
|
+
onProgress?.('task-plan', `Using existing approved plan for: ${task.name} (Score: ${task.consensusScore}%)`);
|
|
189
|
+
// Create mock consensus result from saved data
|
|
190
|
+
consensusResult = {
|
|
191
|
+
approved: true,
|
|
192
|
+
finalPlan: task.plan,
|
|
193
|
+
finalScore: task.consensusScore || 95,
|
|
194
|
+
bestPlan: task.plan,
|
|
195
|
+
bestScore: task.consensusScore || 95,
|
|
196
|
+
bestIteration: task.consensusIterations || 1,
|
|
197
|
+
totalIterations: task.consensusIterations || 1,
|
|
198
|
+
iterations: [],
|
|
199
|
+
finalConcerns: [],
|
|
200
|
+
finalRecommendations: [],
|
|
201
|
+
arbitrated: false,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
// ============================================
|
|
206
|
+
// PHASE 1: Create Task Plan
|
|
207
|
+
// ============================================
|
|
208
|
+
onProgress?.('task-plan', `Planning task: ${task.name}`);
|
|
209
|
+
const taskPlan = await createTaskPlan(task, milestone, state, (msg) => onProgress?.('task-plan', msg));
|
|
210
|
+
// Store plan in task
|
|
211
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
212
|
+
plan: taskPlan,
|
|
213
|
+
});
|
|
214
|
+
// ============================================
|
|
215
|
+
// PHASE 2: Get Consensus on Task Plan
|
|
216
|
+
// ============================================
|
|
217
|
+
onProgress?.('task-consensus', `Getting consensus for task: ${task.name}`);
|
|
218
|
+
const context = `
|
|
219
|
+
Project: ${state.name}
|
|
220
|
+
Language: ${state.language}
|
|
221
|
+
Milestone: ${milestone.name}
|
|
222
|
+
Task: ${task.name}
|
|
223
|
+
`.trim();
|
|
224
|
+
// Use optimized consensus with batched feedback and plan storage
|
|
225
|
+
const useOptimized = consensusConfig?.useOptimizedConsensus !== false;
|
|
226
|
+
if (useOptimized) {
|
|
227
|
+
onProgress?.('task-consensus', `Using optimized consensus (batched feedback, file-based tracking)`);
|
|
228
|
+
consensusResult = await runOptimizedConsensusProcess(taskPlan, context, {
|
|
229
|
+
projectDir,
|
|
230
|
+
config: consensusConfig,
|
|
231
|
+
milestoneId: milestone.id,
|
|
232
|
+
milestoneName: milestone.name,
|
|
233
|
+
taskId: task.id,
|
|
234
|
+
taskName: task.name,
|
|
235
|
+
parallelReviews: true,
|
|
236
|
+
isFullstack: state.language === 'fullstack',
|
|
237
|
+
onIteration: (iteration, result) => {
|
|
238
|
+
onProgress?.('task-consensus', `Iteration ${iteration}: ${result.score}%`);
|
|
239
|
+
},
|
|
240
|
+
onProgress,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
// Fallback to original consensus
|
|
245
|
+
consensusResult = await iterateUntilConsensus(taskPlan, context, {
|
|
246
|
+
projectDir,
|
|
247
|
+
config: consensusConfig,
|
|
248
|
+
isFullstack: state.language === 'fullstack',
|
|
249
|
+
language: state.language,
|
|
250
|
+
onIteration: (iteration, result) => {
|
|
251
|
+
onProgress?.('task-consensus', `Iteration ${iteration}: ${result.score}%`);
|
|
252
|
+
},
|
|
253
|
+
onProgress,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
// Document the task plan
|
|
257
|
+
const planDocPath = await documentTaskPlan(projectDir, milestone, task, consensusResult.bestPlan, consensusResult);
|
|
258
|
+
// Update task with consensus results
|
|
259
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
260
|
+
plan: consensusResult.bestPlan,
|
|
261
|
+
consensusScore: consensusResult.finalScore,
|
|
262
|
+
consensusIterations: consensusResult.totalIterations,
|
|
263
|
+
consensusApproved: consensusResult.approved,
|
|
264
|
+
planDoc: planDocPath,
|
|
265
|
+
});
|
|
266
|
+
// Check if consensus was achieved
|
|
267
|
+
if (!consensusResult.approved) {
|
|
268
|
+
onProgress?.('task-consensus', `Consensus not reached for task: ${task.name} (${consensusResult.finalScore}%)`);
|
|
269
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
270
|
+
status: 'failed',
|
|
271
|
+
error: `Consensus not reached: ${consensusResult.finalScore}%`,
|
|
272
|
+
});
|
|
273
|
+
return {
|
|
274
|
+
success: false,
|
|
275
|
+
task: { ...task, status: 'failed' },
|
|
276
|
+
consensusResult,
|
|
277
|
+
error: `Task plan not approved. Score: ${consensusResult.finalScore}%`,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
onProgress?.('task-consensus', `Task plan approved with ${consensusResult.finalScore}% consensus`);
|
|
281
|
+
}
|
|
282
|
+
// ============================================
|
|
283
|
+
// PHASE 3: Implement the Task (skip if already complete)
|
|
284
|
+
// ============================================
|
|
285
|
+
if (hasCompletedImplementation) {
|
|
286
|
+
onProgress?.('task-implement', `Implementation already complete for: ${task.name}, skipping to tests...`);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
onProgress?.('task-implement', `Implementing task: ${task.name}`);
|
|
290
|
+
const implementResult = await executeTaskCode(task, consensusResult.bestPlan, // Use the approved plan as context
|
|
291
|
+
projectDir, (msg) => onProgress?.('task-implement', msg));
|
|
292
|
+
if (!implementResult.success) {
|
|
293
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
294
|
+
status: 'failed',
|
|
295
|
+
error: implementResult.error,
|
|
296
|
+
});
|
|
297
|
+
return {
|
|
298
|
+
success: false,
|
|
299
|
+
task: { ...task, status: 'failed' },
|
|
300
|
+
consensusResult,
|
|
301
|
+
error: `Implementation failed: ${implementResult.error}`,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
// Mark implementation as complete (for resume purposes)
|
|
305
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
306
|
+
implementationComplete: true,
|
|
307
|
+
});
|
|
308
|
+
onProgress?.('task-implement', `Implementation complete for: ${task.name}`);
|
|
309
|
+
}
|
|
310
|
+
// ============================================
|
|
311
|
+
// PHASE 4: Run Tests
|
|
312
|
+
// ============================================
|
|
313
|
+
const hasTests = await testsExist(projectDir, state.language);
|
|
314
|
+
if (hasTests) {
|
|
315
|
+
onProgress?.('task-test', `Running tests for: ${task.name}`);
|
|
316
|
+
let retries = 0;
|
|
317
|
+
let testResult;
|
|
318
|
+
while (retries <= maxRetries) {
|
|
319
|
+
testResult = await runTests(projectDir, state.language);
|
|
320
|
+
// Document test results
|
|
321
|
+
const testDocPath = await documentTestResults(projectDir, milestone, task, testResult);
|
|
322
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
323
|
+
testResultsDoc: testDocPath,
|
|
324
|
+
});
|
|
325
|
+
if (testResult.success) {
|
|
326
|
+
onProgress?.('task-test', `Tests passed: ${getTestSummary(testResult)}`);
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
retries++;
|
|
330
|
+
if (retries <= maxRetries) {
|
|
331
|
+
onProgress?.('task-test', `Tests failed, retry ${retries}/${maxRetries}...`);
|
|
332
|
+
// Could add fix attempt here
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (testResult && !testResult.success) {
|
|
336
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
337
|
+
status: 'failed',
|
|
338
|
+
testsPassed: false,
|
|
339
|
+
error: `Tests failed after ${retries} retries`,
|
|
340
|
+
});
|
|
341
|
+
return {
|
|
342
|
+
success: false,
|
|
343
|
+
task: { ...task, status: 'failed', testsPassed: false },
|
|
344
|
+
consensusResult,
|
|
345
|
+
testResult,
|
|
346
|
+
error: `Tests failed: ${getTestSummary(testResult)}`,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// Mark task as complete
|
|
350
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
351
|
+
status: 'complete',
|
|
352
|
+
testsPassed: true,
|
|
353
|
+
});
|
|
354
|
+
return {
|
|
355
|
+
success: true,
|
|
356
|
+
task: { ...task, status: 'complete', testsPassed: true },
|
|
357
|
+
consensusResult,
|
|
358
|
+
testResult,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
// No tests - mark as complete
|
|
362
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
363
|
+
status: 'complete',
|
|
364
|
+
});
|
|
365
|
+
onProgress?.('task-complete', `Task complete: ${task.name}`);
|
|
366
|
+
return {
|
|
367
|
+
success: true,
|
|
368
|
+
task: { ...task, status: 'complete' },
|
|
369
|
+
consensusResult,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
374
|
+
onProgress?.('task-error', errorMessage);
|
|
375
|
+
await updateTaskInState(projectDir, task.id, {
|
|
376
|
+
status: 'failed',
|
|
377
|
+
error: errorMessage,
|
|
378
|
+
});
|
|
379
|
+
return {
|
|
380
|
+
success: false,
|
|
381
|
+
task: { ...task, status: 'failed', error: errorMessage },
|
|
382
|
+
error: errorMessage,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=task-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-workflow.js","sourceRoot":"","sources":["../../src/workflow/task-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ export interface TestResult {
|
|
|
14
14
|
output: string;
|
|
15
15
|
failedTests?: string[];
|
|
16
16
|
error?: string;
|
|
17
|
+
noTestsFound?: boolean;
|
|
17
18
|
}
|
|
18
19
|
/**
|
|
19
20
|
* Test configuration
|
|
@@ -60,6 +61,14 @@ export declare function runPythonTests(cwd: string, config?: Partial<TestConfig>
|
|
|
60
61
|
* @returns Test result
|
|
61
62
|
*/
|
|
62
63
|
export declare function runTypeScriptTests(cwd: string, config?: Partial<TestConfig>): Promise<TestResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Run fullstack tests (both frontend and backend)
|
|
66
|
+
*
|
|
67
|
+
* @param cwd - Working directory
|
|
68
|
+
* @param config - Test configuration
|
|
69
|
+
* @returns Combined test result
|
|
70
|
+
*/
|
|
71
|
+
export declare function runFullstackTests(cwd: string, config?: Partial<TestConfig>): Promise<TestResult>;
|
|
63
72
|
/**
|
|
64
73
|
* Run tests for a project
|
|
65
74
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../src/workflow/test-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../src/workflow/test-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAIhE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAwC3D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,UAAU,CAiGpF;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,UAAU,CAAC,CA8BrB;AAED;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,cAAc,EACxB,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,UAAU,CAAC,CASrB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC,CA6ElB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAiBzD"}
|
|
@@ -9,6 +9,7 @@ import { runTests as claudeRunTests } from '../adapters/claude.js';
|
|
|
9
9
|
export const DEFAULT_TEST_COMMANDS = {
|
|
10
10
|
python: 'python -m pytest tests/ -v',
|
|
11
11
|
typescript: 'npm test',
|
|
12
|
+
fullstack: 'npm run test:all', // Runs both frontend and backend tests via workspace.json
|
|
12
13
|
};
|
|
13
14
|
/**
|
|
14
15
|
* Build the test command for a language
|
|
@@ -42,6 +43,11 @@ export function buildTestCommand(config) {
|
|
|
42
43
|
}
|
|
43
44
|
return parts.join(' ');
|
|
44
45
|
}
|
|
46
|
+
case 'fullstack': {
|
|
47
|
+
// Fullstack projects use workspace.json commands
|
|
48
|
+
// Default to running both frontend and backend tests
|
|
49
|
+
return 'npm run test:all';
|
|
50
|
+
}
|
|
45
51
|
}
|
|
46
52
|
}
|
|
47
53
|
/**
|
|
@@ -92,8 +98,38 @@ export function parseTestOutput(output, language) {
|
|
|
92
98
|
}
|
|
93
99
|
break;
|
|
94
100
|
}
|
|
101
|
+
case 'fullstack': {
|
|
102
|
+
// Fullstack combines pytest and jest output
|
|
103
|
+
// Parse both formats
|
|
104
|
+
const pytestMatch = output.match(/(\d+)\s+passed/);
|
|
105
|
+
const pytestFailedMatch = output.match(/(\d+)\s+failed/);
|
|
106
|
+
const jestMatch = output.match(/Tests:\s*(?:(\d+)\s+failed,\s*)?(\d+)\s+passed,\s*(\d+)\s+total/);
|
|
107
|
+
if (pytestMatch) {
|
|
108
|
+
passed += parseInt(pytestMatch[1], 10);
|
|
109
|
+
}
|
|
110
|
+
if (pytestFailedMatch) {
|
|
111
|
+
failed += parseInt(pytestFailedMatch[1], 10);
|
|
112
|
+
}
|
|
113
|
+
if (jestMatch) {
|
|
114
|
+
failed += jestMatch[1] ? parseInt(jestMatch[1], 10) : 0;
|
|
115
|
+
passed += parseInt(jestMatch[2], 10);
|
|
116
|
+
}
|
|
117
|
+
total = passed + failed;
|
|
118
|
+
// Extract failed test names from both pytest and jest
|
|
119
|
+
const pytestFailedMatches = output.matchAll(/FAILED\s+([^\s]+)/g);
|
|
120
|
+
for (const match of pytestFailedMatches) {
|
|
121
|
+
failedTests.push(match[1]);
|
|
122
|
+
}
|
|
123
|
+
const jestFailedMatches = output.matchAll(/✕\s+(.+)/g);
|
|
124
|
+
for (const match of jestFailedMatches) {
|
|
125
|
+
failedTests.push(match[1].trim());
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
95
129
|
}
|
|
96
|
-
|
|
130
|
+
// Success if no failures - treat "no tests found" as success (not a failure)
|
|
131
|
+
// If total === 0, there are no tests to fail, so it's technically a pass
|
|
132
|
+
const success = failed === 0;
|
|
97
133
|
return {
|
|
98
134
|
success,
|
|
99
135
|
passed,
|
|
@@ -101,6 +137,8 @@ export function parseTestOutput(output, language) {
|
|
|
101
137
|
total,
|
|
102
138
|
output,
|
|
103
139
|
failedTests: failedTests.length > 0 ? failedTests : undefined,
|
|
140
|
+
// Flag to indicate no tests were found (for informational purposes)
|
|
141
|
+
noTestsFound: total === 0,
|
|
104
142
|
};
|
|
105
143
|
}
|
|
106
144
|
/**
|
|
@@ -177,6 +215,40 @@ export async function runTypeScriptTests(cwd, config = {}) {
|
|
|
177
215
|
};
|
|
178
216
|
}
|
|
179
217
|
}
|
|
218
|
+
/**
|
|
219
|
+
* Run fullstack tests (both frontend and backend)
|
|
220
|
+
*
|
|
221
|
+
* @param cwd - Working directory
|
|
222
|
+
* @param config - Test configuration
|
|
223
|
+
* @returns Combined test result
|
|
224
|
+
*/
|
|
225
|
+
export async function runFullstackTests(cwd, config = {}) {
|
|
226
|
+
const path = await import('node:path');
|
|
227
|
+
// Run backend tests first
|
|
228
|
+
const backendCwd = path.join(cwd, 'apps', 'backend');
|
|
229
|
+
const backendResult = await runPythonTests(backendCwd, config);
|
|
230
|
+
// Run frontend tests
|
|
231
|
+
const frontendCwd = path.join(cwd, 'apps', 'frontend');
|
|
232
|
+
const frontendResult = await runTypeScriptTests(frontendCwd, config);
|
|
233
|
+
// Combine results
|
|
234
|
+
const combinedOutput = `=== Backend Tests ===\n${backendResult.output}\n\n=== Frontend Tests ===\n${frontendResult.output}`;
|
|
235
|
+
return {
|
|
236
|
+
success: backendResult.success && frontendResult.success,
|
|
237
|
+
passed: backendResult.passed + frontendResult.passed,
|
|
238
|
+
failed: backendResult.failed + frontendResult.failed,
|
|
239
|
+
total: backendResult.total + frontendResult.total,
|
|
240
|
+
output: combinedOutput,
|
|
241
|
+
failedTests: [
|
|
242
|
+
...(backendResult.failedTests || []).map((t) => `[backend] ${t}`),
|
|
243
|
+
...(frontendResult.failedTests || []).map((t) => `[frontend] ${t}`),
|
|
244
|
+
].length > 0 ? [
|
|
245
|
+
...(backendResult.failedTests || []).map((t) => `[backend] ${t}`),
|
|
246
|
+
...(frontendResult.failedTests || []).map((t) => `[frontend] ${t}`),
|
|
247
|
+
] : undefined,
|
|
248
|
+
error: backendResult.error || frontendResult.error,
|
|
249
|
+
noTestsFound: backendResult.noTestsFound && frontendResult.noTestsFound,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
180
252
|
/**
|
|
181
253
|
* Run tests for a project
|
|
182
254
|
*
|
|
@@ -191,6 +263,8 @@ export async function runTests(cwd, language, config = {}) {
|
|
|
191
263
|
return runPythonTests(cwd, config);
|
|
192
264
|
case 'typescript':
|
|
193
265
|
return runTypeScriptTests(cwd, config);
|
|
266
|
+
case 'fullstack':
|
|
267
|
+
return runFullstackTests(cwd, config);
|
|
194
268
|
}
|
|
195
269
|
}
|
|
196
270
|
/**
|
|
@@ -244,6 +318,28 @@ export async function testsExist(cwd, language) {
|
|
|
244
318
|
}
|
|
245
319
|
}
|
|
246
320
|
}
|
|
321
|
+
case 'fullstack': {
|
|
322
|
+
// Check for tests in both frontend and backend
|
|
323
|
+
const backendTestsDir = path.join(cwd, 'apps', 'backend', 'tests');
|
|
324
|
+
const frontendTestsDir = path.join(cwd, 'apps', 'frontend', 'src');
|
|
325
|
+
let hasBackendTests = false;
|
|
326
|
+
let hasFrontendTests = false;
|
|
327
|
+
try {
|
|
328
|
+
await fs.access(backendTestsDir);
|
|
329
|
+
hasBackendTests = true;
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
// No backend tests directory
|
|
333
|
+
}
|
|
334
|
+
try {
|
|
335
|
+
const files = await fs.readdir(frontendTestsDir, { recursive: true });
|
|
336
|
+
hasFrontendTests = files.some((f) => f.toString().endsWith('.test.ts') || f.toString().endsWith('.spec.ts'));
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
// No frontend test files
|
|
340
|
+
}
|
|
341
|
+
return hasBackendTests || hasFrontendTests;
|
|
342
|
+
}
|
|
247
343
|
}
|
|
248
344
|
}
|
|
249
345
|
catch {
|
|
@@ -260,11 +356,11 @@ export function getTestSummary(result) {
|
|
|
260
356
|
if (result.error) {
|
|
261
357
|
return `Tests failed to run: ${result.error}`;
|
|
262
358
|
}
|
|
263
|
-
if (result.total === 0) {
|
|
264
|
-
return 'No tests found';
|
|
359
|
+
if (result.total === 0 || result.noTestsFound) {
|
|
360
|
+
return 'No tests found (OK)';
|
|
265
361
|
}
|
|
266
|
-
const status = result.success ? '
|
|
267
|
-
let summary = `${status} ${result.passed}/${result.total} tests passed`;
|
|
362
|
+
const status = result.success ? 'PASS' : 'FAIL';
|
|
363
|
+
let summary = `${status}: ${result.passed}/${result.total} tests passed`;
|
|
268
364
|
if (result.failed > 0) {
|
|
269
365
|
summary += ` (${result.failed} failed)`;
|
|
270
366
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../../src/workflow/test-runner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../../src/workflow/test-runner.ts"],"names":[],"mappings":"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"}
|