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.
Files changed (171) hide show
  1. package/README.md +521 -125
  2. package/dist/adapters/claude.d.ts +16 -4
  3. package/dist/adapters/claude.d.ts.map +1 -1
  4. package/dist/adapters/claude.js +679 -33
  5. package/dist/adapters/claude.js.map +1 -1
  6. package/dist/adapters/gemini.d.ts +55 -0
  7. package/dist/adapters/gemini.d.ts.map +1 -0
  8. package/dist/adapters/gemini.js +318 -0
  9. package/dist/adapters/gemini.js.map +1 -0
  10. package/dist/adapters/openai.d.ts.map +1 -1
  11. package/dist/adapters/openai.js +41 -7
  12. package/dist/adapters/openai.js.map +1 -1
  13. package/dist/auth/claude.d.ts +11 -9
  14. package/dist/auth/claude.d.ts.map +1 -1
  15. package/dist/auth/claude.js +107 -71
  16. package/dist/auth/claude.js.map +1 -1
  17. package/dist/auth/gemini.d.ts +58 -0
  18. package/dist/auth/gemini.d.ts.map +1 -0
  19. package/dist/auth/gemini.js +172 -0
  20. package/dist/auth/gemini.js.map +1 -0
  21. package/dist/auth/index.d.ts +11 -7
  22. package/dist/auth/index.d.ts.map +1 -1
  23. package/dist/auth/index.js +23 -5
  24. package/dist/auth/index.js.map +1 -1
  25. package/dist/auth/keychain.d.ts +20 -7
  26. package/dist/auth/keychain.d.ts.map +1 -1
  27. package/dist/auth/keychain.js +85 -29
  28. package/dist/auth/keychain.js.map +1 -1
  29. package/dist/auth/openai.d.ts +2 -2
  30. package/dist/auth/openai.d.ts.map +1 -1
  31. package/dist/auth/openai.js +30 -32
  32. package/dist/auth/openai.js.map +1 -1
  33. package/dist/cli/index.d.ts.map +1 -1
  34. package/dist/cli/index.js +4 -7
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/interactive.d.ts +2 -2
  37. package/dist/cli/interactive.d.ts.map +1 -1
  38. package/dist/cli/interactive.js +1380 -183
  39. package/dist/cli/interactive.js.map +1 -1
  40. package/dist/config/defaults.d.ts +6 -1
  41. package/dist/config/defaults.d.ts.map +1 -1
  42. package/dist/config/defaults.js +10 -2
  43. package/dist/config/defaults.js.map +1 -1
  44. package/dist/config/index.d.ts +10 -0
  45. package/dist/config/index.d.ts.map +1 -1
  46. package/dist/config/index.js +19 -0
  47. package/dist/config/index.js.map +1 -1
  48. package/dist/config/schema.d.ts +20 -0
  49. package/dist/config/schema.d.ts.map +1 -1
  50. package/dist/config/schema.js +7 -0
  51. package/dist/config/schema.js.map +1 -1
  52. package/dist/generators/python.d.ts.map +1 -1
  53. package/dist/generators/python.js +1 -0
  54. package/dist/generators/python.js.map +1 -1
  55. package/dist/generators/typescript.d.ts.map +1 -1
  56. package/dist/generators/typescript.js +1 -0
  57. package/dist/generators/typescript.js.map +1 -1
  58. package/dist/state/index.d.ts +108 -0
  59. package/dist/state/index.d.ts.map +1 -1
  60. package/dist/state/index.js +551 -4
  61. package/dist/state/index.js.map +1 -1
  62. package/dist/state/registry.d.ts +52 -0
  63. package/dist/state/registry.d.ts.map +1 -0
  64. package/dist/state/registry.js +215 -0
  65. package/dist/state/registry.js.map +1 -0
  66. package/dist/types/cli.d.ts +4 -0
  67. package/dist/types/cli.d.ts.map +1 -1
  68. package/dist/types/cli.js.map +1 -1
  69. package/dist/types/consensus.d.ts +69 -4
  70. package/dist/types/consensus.d.ts.map +1 -1
  71. package/dist/types/consensus.js +24 -3
  72. package/dist/types/consensus.js.map +1 -1
  73. package/dist/types/workflow.d.ts +55 -0
  74. package/dist/types/workflow.d.ts.map +1 -1
  75. package/dist/types/workflow.js +16 -0
  76. package/dist/types/workflow.js.map +1 -1
  77. package/dist/workflow/auto-fix.d.ts +45 -0
  78. package/dist/workflow/auto-fix.d.ts.map +1 -0
  79. package/dist/workflow/auto-fix.js +274 -0
  80. package/dist/workflow/auto-fix.js.map +1 -0
  81. package/dist/workflow/consensus.d.ts +44 -2
  82. package/dist/workflow/consensus.d.ts.map +1 -1
  83. package/dist/workflow/consensus.js +565 -17
  84. package/dist/workflow/consensus.js.map +1 -1
  85. package/dist/workflow/execution-mode.d.ts +10 -4
  86. package/dist/workflow/execution-mode.d.ts.map +1 -1
  87. package/dist/workflow/execution-mode.js +547 -58
  88. package/dist/workflow/execution-mode.js.map +1 -1
  89. package/dist/workflow/index.d.ts +14 -2
  90. package/dist/workflow/index.d.ts.map +1 -1
  91. package/dist/workflow/index.js +69 -6
  92. package/dist/workflow/index.js.map +1 -1
  93. package/dist/workflow/milestone-workflow.d.ts +34 -0
  94. package/dist/workflow/milestone-workflow.d.ts.map +1 -0
  95. package/dist/workflow/milestone-workflow.js +414 -0
  96. package/dist/workflow/milestone-workflow.js.map +1 -0
  97. package/dist/workflow/plan-mode.d.ts +14 -1
  98. package/dist/workflow/plan-mode.d.ts.map +1 -1
  99. package/dist/workflow/plan-mode.js +589 -47
  100. package/dist/workflow/plan-mode.js.map +1 -1
  101. package/dist/workflow/plan-storage.d.ts +142 -0
  102. package/dist/workflow/plan-storage.d.ts.map +1 -0
  103. package/dist/workflow/plan-storage.js +331 -0
  104. package/dist/workflow/plan-storage.js.map +1 -0
  105. package/dist/workflow/project-verification.d.ts +37 -0
  106. package/dist/workflow/project-verification.d.ts.map +1 -0
  107. package/dist/workflow/project-verification.js +381 -0
  108. package/dist/workflow/project-verification.js.map +1 -0
  109. package/dist/workflow/task-workflow.d.ts +37 -0
  110. package/dist/workflow/task-workflow.d.ts.map +1 -0
  111. package/dist/workflow/task-workflow.js +383 -0
  112. package/dist/workflow/task-workflow.js.map +1 -0
  113. package/dist/workflow/test-runner.d.ts +1 -0
  114. package/dist/workflow/test-runner.d.ts.map +1 -1
  115. package/dist/workflow/test-runner.js +9 -5
  116. package/dist/workflow/test-runner.js.map +1 -1
  117. package/dist/workflow/ui-designer.d.ts +82 -0
  118. package/dist/workflow/ui-designer.d.ts.map +1 -0
  119. package/dist/workflow/ui-designer.js +234 -0
  120. package/dist/workflow/ui-designer.js.map +1 -0
  121. package/dist/workflow/ui-setup.d.ts +58 -0
  122. package/dist/workflow/ui-setup.d.ts.map +1 -0
  123. package/dist/workflow/ui-setup.js +685 -0
  124. package/dist/workflow/ui-setup.js.map +1 -0
  125. package/dist/workflow/ui-verification.d.ts +114 -0
  126. package/dist/workflow/ui-verification.d.ts.map +1 -0
  127. package/dist/workflow/ui-verification.js +258 -0
  128. package/dist/workflow/ui-verification.js.map +1 -0
  129. package/dist/workflow/workflow-logger.d.ts +110 -0
  130. package/dist/workflow/workflow-logger.d.ts.map +1 -0
  131. package/dist/workflow/workflow-logger.js +267 -0
  132. package/dist/workflow/workflow-logger.js.map +1 -0
  133. package/package.json +2 -2
  134. package/src/adapters/claude.ts +815 -34
  135. package/src/adapters/gemini.ts +373 -0
  136. package/src/adapters/openai.ts +40 -7
  137. package/src/auth/claude.ts +120 -78
  138. package/src/auth/gemini.ts +207 -0
  139. package/src/auth/index.ts +28 -8
  140. package/src/auth/keychain.ts +95 -28
  141. package/src/auth/openai.ts +29 -36
  142. package/src/cli/index.ts +4 -7
  143. package/src/cli/interactive.ts +1641 -216
  144. package/src/config/defaults.ts +10 -2
  145. package/src/config/index.ts +21 -0
  146. package/src/config/schema.ts +7 -0
  147. package/src/generators/python.ts +1 -0
  148. package/src/generators/typescript.ts +1 -0
  149. package/src/state/index.ts +713 -4
  150. package/src/state/registry.ts +278 -0
  151. package/src/types/cli.ts +4 -0
  152. package/src/types/consensus.ts +65 -6
  153. package/src/types/workflow.ts +35 -0
  154. package/src/workflow/auto-fix.ts +340 -0
  155. package/src/workflow/consensus.ts +750 -16
  156. package/src/workflow/execution-mode.ts +673 -74
  157. package/src/workflow/index.ts +95 -6
  158. package/src/workflow/milestone-workflow.ts +576 -0
  159. package/src/workflow/plan-mode.ts +696 -50
  160. package/src/workflow/plan-storage.ts +482 -0
  161. package/src/workflow/project-verification.ts +471 -0
  162. package/src/workflow/task-workflow.ts +525 -0
  163. package/src/workflow/test-runner.ts +10 -5
  164. package/src/workflow/ui-designer.ts +337 -0
  165. package/src/workflow/ui-setup.ts +797 -0
  166. package/src/workflow/ui-verification.ts +357 -0
  167. package/src/workflow/workflow-logger.ts +353 -0
  168. package/tests/config/config.test.ts +1 -1
  169. package/tests/types/consensus.test.ts +3 -3
  170. package/tests/workflow/plan-mode.test.ts +213 -0
  171. 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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"}
@@ -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
@@ -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;CAChB;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,CA6DpF;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"}
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
- const success = failed === 0 && total > 0;
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":"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"}
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"}