popeye-cli 1.0.0 → 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/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/interactive.d.ts +2 -2
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +1380 -183
- 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/index.ts +4 -7
- package/src/cli/interactive.ts +1641 -216
- 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,383 @@
|
|
|
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, 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
|
+
onIteration: (iteration, result) => {
|
|
237
|
+
onProgress?.('task-consensus', `Iteration ${iteration}: ${result.score}%`);
|
|
238
|
+
},
|
|
239
|
+
onProgress,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
// Fallback to original consensus
|
|
244
|
+
consensusResult = await iterateUntilConsensus(taskPlan, context, {
|
|
245
|
+
projectDir,
|
|
246
|
+
config: consensusConfig,
|
|
247
|
+
onIteration: (iteration, result) => {
|
|
248
|
+
onProgress?.('task-consensus', `Iteration ${iteration}: ${result.score}%`);
|
|
249
|
+
},
|
|
250
|
+
onProgress,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
// Document the task plan
|
|
254
|
+
const planDocPath = await documentTaskPlan(projectDir, milestone, task, consensusResult.bestPlan, consensusResult);
|
|
255
|
+
// Update task with consensus results
|
|
256
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
257
|
+
plan: consensusResult.bestPlan,
|
|
258
|
+
consensusScore: consensusResult.finalScore,
|
|
259
|
+
consensusIterations: consensusResult.totalIterations,
|
|
260
|
+
consensusApproved: consensusResult.approved,
|
|
261
|
+
planDoc: planDocPath,
|
|
262
|
+
});
|
|
263
|
+
// Check if consensus was achieved
|
|
264
|
+
if (!consensusResult.approved) {
|
|
265
|
+
onProgress?.('task-consensus', `Consensus not reached for task: ${task.name} (${consensusResult.finalScore}%)`);
|
|
266
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
267
|
+
status: 'failed',
|
|
268
|
+
error: `Consensus not reached: ${consensusResult.finalScore}%`,
|
|
269
|
+
});
|
|
270
|
+
return {
|
|
271
|
+
success: false,
|
|
272
|
+
task: { ...task, status: 'failed' },
|
|
273
|
+
consensusResult,
|
|
274
|
+
error: `Task plan not approved. Score: ${consensusResult.finalScore}%`,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
onProgress?.('task-consensus', `Task plan approved with ${consensusResult.finalScore}% consensus`);
|
|
278
|
+
}
|
|
279
|
+
// ============================================
|
|
280
|
+
// PHASE 3: Implement the Task (skip if already complete)
|
|
281
|
+
// ============================================
|
|
282
|
+
if (hasCompletedImplementation) {
|
|
283
|
+
onProgress?.('task-implement', `Implementation already complete for: ${task.name}, skipping to tests...`);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
onProgress?.('task-implement', `Implementing task: ${task.name}`);
|
|
287
|
+
const implementResult = await executeTaskCode(task, consensusResult.bestPlan, // Use the approved plan as context
|
|
288
|
+
projectDir, (msg) => onProgress?.('task-implement', msg));
|
|
289
|
+
if (!implementResult.success) {
|
|
290
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
291
|
+
status: 'failed',
|
|
292
|
+
error: implementResult.error,
|
|
293
|
+
});
|
|
294
|
+
return {
|
|
295
|
+
success: false,
|
|
296
|
+
task: { ...task, status: 'failed' },
|
|
297
|
+
consensusResult,
|
|
298
|
+
error: `Implementation failed: ${implementResult.error}`,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
// Mark implementation as complete (for resume purposes)
|
|
302
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
303
|
+
implementationComplete: true,
|
|
304
|
+
});
|
|
305
|
+
onProgress?.('task-implement', `Implementation complete for: ${task.name}`);
|
|
306
|
+
}
|
|
307
|
+
// ============================================
|
|
308
|
+
// PHASE 4: Run Tests
|
|
309
|
+
// ============================================
|
|
310
|
+
const hasTests = await testsExist(projectDir, state.language);
|
|
311
|
+
if (hasTests) {
|
|
312
|
+
onProgress?.('task-test', `Running tests for: ${task.name}`);
|
|
313
|
+
let retries = 0;
|
|
314
|
+
let testResult;
|
|
315
|
+
while (retries <= maxRetries) {
|
|
316
|
+
testResult = await runTests(projectDir, state.language);
|
|
317
|
+
// Document test results
|
|
318
|
+
const testDocPath = await documentTestResults(projectDir, milestone, task, testResult);
|
|
319
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
320
|
+
testResultsDoc: testDocPath,
|
|
321
|
+
});
|
|
322
|
+
if (testResult.success) {
|
|
323
|
+
onProgress?.('task-test', `Tests passed: ${getTestSummary(testResult)}`);
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
retries++;
|
|
327
|
+
if (retries <= maxRetries) {
|
|
328
|
+
onProgress?.('task-test', `Tests failed, retry ${retries}/${maxRetries}...`);
|
|
329
|
+
// Could add fix attempt here
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (testResult && !testResult.success) {
|
|
333
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
334
|
+
status: 'failed',
|
|
335
|
+
testsPassed: false,
|
|
336
|
+
error: `Tests failed after ${retries} retries`,
|
|
337
|
+
});
|
|
338
|
+
return {
|
|
339
|
+
success: false,
|
|
340
|
+
task: { ...task, status: 'failed', testsPassed: false },
|
|
341
|
+
consensusResult,
|
|
342
|
+
testResult,
|
|
343
|
+
error: `Tests failed: ${getTestSummary(testResult)}`,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
// Mark task as complete
|
|
347
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
348
|
+
status: 'complete',
|
|
349
|
+
testsPassed: true,
|
|
350
|
+
});
|
|
351
|
+
return {
|
|
352
|
+
success: true,
|
|
353
|
+
task: { ...task, status: 'complete', testsPassed: true },
|
|
354
|
+
consensusResult,
|
|
355
|
+
testResult,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
// No tests - mark as complete
|
|
359
|
+
state = await updateTaskInState(projectDir, task.id, {
|
|
360
|
+
status: 'complete',
|
|
361
|
+
});
|
|
362
|
+
onProgress?.('task-complete', `Task complete: ${task.name}`);
|
|
363
|
+
return {
|
|
364
|
+
success: true,
|
|
365
|
+
task: { ...task, status: 'complete' },
|
|
366
|
+
consensusResult,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
371
|
+
onProgress?.('task-error', errorMessage);
|
|
372
|
+
await updateTaskInState(projectDir, task.id, {
|
|
373
|
+
status: 'failed',
|
|
374
|
+
error: errorMessage,
|
|
375
|
+
});
|
|
376
|
+
return {
|
|
377
|
+
success: false,
|
|
378
|
+
task: { ...task, status: 'failed', error: errorMessage },
|
|
379
|
+
error: errorMessage,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# 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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"}
|
|
@@ -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,CAGhE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAkC3D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,UAAU,CAiEpF;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;;;;;;;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,CAOrB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC,CAkDlB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAiBzD"}
|
|
@@ -93,7 +93,9 @@ export function parseTestOutput(output, language) {
|
|
|
93
93
|
break;
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
|
-
|
|
96
|
+
// Success if no failures - treat "no tests found" as success (not a failure)
|
|
97
|
+
// If total === 0, there are no tests to fail, so it's technically a pass
|
|
98
|
+
const success = failed === 0;
|
|
97
99
|
return {
|
|
98
100
|
success,
|
|
99
101
|
passed,
|
|
@@ -101,6 +103,8 @@ export function parseTestOutput(output, language) {
|
|
|
101
103
|
total,
|
|
102
104
|
output,
|
|
103
105
|
failedTests: failedTests.length > 0 ? failedTests : undefined,
|
|
106
|
+
// Flag to indicate no tests were found (for informational purposes)
|
|
107
|
+
noTestsFound: total === 0,
|
|
104
108
|
};
|
|
105
109
|
}
|
|
106
110
|
/**
|
|
@@ -260,11 +264,11 @@ export function getTestSummary(result) {
|
|
|
260
264
|
if (result.error) {
|
|
261
265
|
return `Tests failed to run: ${result.error}`;
|
|
262
266
|
}
|
|
263
|
-
if (result.total === 0) {
|
|
264
|
-
return 'No tests found';
|
|
267
|
+
if (result.total === 0 || result.noTestsFound) {
|
|
268
|
+
return 'No tests found (OK)';
|
|
265
269
|
}
|
|
266
|
-
const status = result.success ? '
|
|
267
|
-
let summary = `${status} ${result.passed}/${result.total} tests passed`;
|
|
270
|
+
const status = result.success ? 'PASS' : 'FAIL';
|
|
271
|
+
let summary = `${status}: ${result.passed}/${result.total} tests passed`;
|
|
268
272
|
if (result.failed > 0) {
|
|
269
273
|
summary += ` (${result.failed} failed)`;
|
|
270
274
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../../src/workflow/test-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../../src/workflow/test-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Designer Module
|
|
3
|
+
* Generates UI design specifications from natural language project ideas
|
|
4
|
+
* Ensures Popeye handles all UI/UX automatically without user intervention
|
|
5
|
+
*/
|
|
6
|
+
import { type DesignTheme } from './ui-setup.js';
|
|
7
|
+
/**
|
|
8
|
+
* UI Design Intent - what the user wants their app to look like
|
|
9
|
+
*/
|
|
10
|
+
export interface UIDesignIntent {
|
|
11
|
+
/** Overall style preference */
|
|
12
|
+
style: 'modern' | 'elegant' | 'minimal' | 'vibrant' | 'professional' | 'playful';
|
|
13
|
+
/** Target audience */
|
|
14
|
+
audience: 'business' | 'consumer' | 'developer' | 'creative' | 'general';
|
|
15
|
+
/** Industry/domain */
|
|
16
|
+
industry?: string;
|
|
17
|
+
/** Color preferences */
|
|
18
|
+
colorPreference?: 'warm' | 'cool' | 'neutral' | 'colorful' | 'monochrome';
|
|
19
|
+
/** Key UI features needed */
|
|
20
|
+
features: string[];
|
|
21
|
+
/** Accessibility requirements */
|
|
22
|
+
accessibilityLevel: 'A' | 'AA' | 'AAA';
|
|
23
|
+
/** Dark mode support */
|
|
24
|
+
darkMode: boolean;
|
|
25
|
+
/** Mobile-first design */
|
|
26
|
+
mobileFirst: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Complete UI specification generated by the designer
|
|
30
|
+
*/
|
|
31
|
+
export interface UISpecification {
|
|
32
|
+
/** The design intent derived from the idea */
|
|
33
|
+
intent: UIDesignIntent;
|
|
34
|
+
/** Selected theme */
|
|
35
|
+
theme: DesignTheme;
|
|
36
|
+
/** Theme name for reference */
|
|
37
|
+
themeName: string;
|
|
38
|
+
/** Project type detection */
|
|
39
|
+
projectType: string;
|
|
40
|
+
/** Components recommended for this project */
|
|
41
|
+
recommendedComponents: string[];
|
|
42
|
+
/** Layout patterns to use */
|
|
43
|
+
layoutPatterns: string[];
|
|
44
|
+
/** Navigation style */
|
|
45
|
+
navigationStyle: 'sidebar' | 'topbar' | 'bottom-tabs' | 'hybrid';
|
|
46
|
+
/** Key pages to create */
|
|
47
|
+
keyPages: Array<{
|
|
48
|
+
name: string;
|
|
49
|
+
route: string;
|
|
50
|
+
description: string;
|
|
51
|
+
layout: string;
|
|
52
|
+
}>;
|
|
53
|
+
/** Design system notes for code generation */
|
|
54
|
+
designNotes: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Analyze the project idea and generate UI design intent
|
|
58
|
+
*/
|
|
59
|
+
export declare function analyzeUIIntent(idea: string, onProgress?: (message: string) => void): Promise<UIDesignIntent>;
|
|
60
|
+
/**
|
|
61
|
+
* Generate complete UI specification from intent
|
|
62
|
+
*/
|
|
63
|
+
export declare function generateUISpecification(idea: string, intent: UIDesignIntent, onProgress?: (message: string) => void): Promise<UISpecification>;
|
|
64
|
+
/**
|
|
65
|
+
* Generate design system prompt for code generation
|
|
66
|
+
* This is injected into Claude's context when generating UI code
|
|
67
|
+
*/
|
|
68
|
+
export declare function generateDesignSystemPrompt(spec: UISpecification): string;
|
|
69
|
+
/**
|
|
70
|
+
* Main function: Design UI from idea
|
|
71
|
+
* Call this early in the Popeye workflow to establish UI direction
|
|
72
|
+
*/
|
|
73
|
+
export declare function designUI(idea: string, onProgress?: (message: string) => void): Promise<UISpecification>;
|
|
74
|
+
/**
|
|
75
|
+
* Save UI specification to project
|
|
76
|
+
*/
|
|
77
|
+
export declare function saveUISpecification(projectDir: string, spec: UISpecification): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Load UI specification from project
|
|
80
|
+
*/
|
|
81
|
+
export declare function loadUISpecification(projectDir: string): Promise<UISpecification | null>;
|
|
82
|
+
//# sourceMappingURL=ui-designer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-designer.d.ts","sourceRoot":"","sources":["../../src/workflow/ui-designer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;IAEjF,sBAAsB;IACtB,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IAEzE,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,wBAAwB;IACxB,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;IAE1E,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,iCAAiC;IACjC,kBAAkB,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;IAEvC,wBAAwB;IACxB,QAAQ,EAAE,OAAO,CAAC;IAElB,0BAA0B;IAC1B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,MAAM,EAAE,cAAc,CAAC;IAEvB,qBAAqB;IACrB,KAAK,EAAE,WAAW,CAAC;IAEnB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAElB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IAEpB,8CAA8C;IAC9C,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAEhC,6BAA6B;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB,uBAAuB;IACvB,eAAe,EAAE,SAAS,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,CAAC;IAEjE,0BAA0B;IAC1B,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IAEH,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,cAAc,CAAC,CAmDzB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,cAAc,EACtB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,eAAe,CAAC,CAgG1B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAuCxE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,eAAe,CAAC,CAY1B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAWjC"}
|