popeye-cli 1.0.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 +25 -0
- package/.prettierrc +8 -0
- package/README.md +320 -0
- package/dist/adapters/claude.d.ts +82 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +230 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/openai.d.ts +48 -0
- package/dist/adapters/openai.d.ts.map +1 -0
- package/dist/adapters/openai.js +257 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/auth/claude.d.ts +44 -0
- package/dist/auth/claude.d.ts.map +1 -0
- package/dist/auth/claude.js +139 -0
- package/dist/auth/claude.js.map +1 -0
- package/dist/auth/index.d.ts +61 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +141 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/keychain.d.ts +66 -0
- package/dist/auth/keychain.d.ts.map +1 -0
- package/dist/auth/keychain.js +125 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/auth/openai-entry.d.ts +9 -0
- package/dist/auth/openai-entry.d.ts.map +1 -0
- package/dist/auth/openai-entry.js +410 -0
- package/dist/auth/openai-entry.js.map +1 -0
- package/dist/auth/openai.d.ts +71 -0
- package/dist/auth/openai.d.ts.map +1 -0
- package/dist/auth/openai.js +212 -0
- package/dist/auth/openai.js.map +1 -0
- package/dist/auth/server.d.ts +32 -0
- package/dist/auth/server.d.ts.map +1 -0
- package/dist/auth/server.js +213 -0
- package/dist/auth/server.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +10 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +162 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/config.d.ts +10 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +215 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/create.d.ts +10 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +240 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/index.d.ts +10 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +10 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +18 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +241 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/status.d.ts +18 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +154 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +71 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +9 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +330 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/output.d.ts +182 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +355 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/config/defaults.d.ts +57 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +103 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +138 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +244 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +220 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +141 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/generators/index.d.ts +101 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +200 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/python.d.ts +48 -0
- package/dist/generators/python.d.ts.map +1 -0
- package/dist/generators/python.js +262 -0
- package/dist/generators/python.js.map +1 -0
- package/dist/generators/templates/index.d.ts +6 -0
- package/dist/generators/templates/index.d.ts.map +1 -0
- package/dist/generators/templates/index.js +6 -0
- package/dist/generators/templates/index.js.map +1 -0
- package/dist/generators/templates/python.d.ts +53 -0
- package/dist/generators/templates/python.d.ts.map +1 -0
- package/dist/generators/templates/python.js +454 -0
- package/dist/generators/templates/python.js.map +1 -0
- package/dist/generators/templates/typescript.d.ts +53 -0
- package/dist/generators/templates/typescript.d.ts.map +1 -0
- package/dist/generators/templates/typescript.js +394 -0
- package/dist/generators/templates/typescript.js.map +1 -0
- package/dist/generators/typescript.d.ts +64 -0
- package/dist/generators/typescript.d.ts.map +1 -0
- package/dist/generators/typescript.js +271 -0
- package/dist/generators/typescript.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/state/index.d.ts +168 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +338 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/persistence.d.ts +91 -0
- package/dist/state/persistence.d.ts.map +1 -0
- package/dist/state/persistence.js +201 -0
- package/dist/state/persistence.js.map +1 -0
- package/dist/types/cli.d.ts +132 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +17 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/consensus.d.ts +111 -0
- package/dist/types/consensus.d.ts.map +1 -0
- package/dist/types/consensus.js +29 -0
- package/dist/types/consensus.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project.d.ts +73 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +55 -0
- package/dist/types/project.js.map +1 -0
- package/dist/types/workflow.d.ts +236 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +74 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/workflow/consensus.d.ts +89 -0
- package/dist/workflow/consensus.d.ts.map +1 -0
- package/dist/workflow/consensus.js +220 -0
- package/dist/workflow/consensus.js.map +1 -0
- package/dist/workflow/execution-mode.d.ts +82 -0
- package/dist/workflow/execution-mode.d.ts.map +1 -0
- package/dist/workflow/execution-mode.js +346 -0
- package/dist/workflow/execution-mode.js.map +1 -0
- package/dist/workflow/index.d.ts +110 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +283 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/plan-mode.d.ts +83 -0
- package/dist/workflow/plan-mode.d.ts.map +1 -0
- package/dist/workflow/plan-mode.js +241 -0
- package/dist/workflow/plan-mode.js.map +1 -0
- package/dist/workflow/test-runner.d.ts +87 -0
- package/dist/workflow/test-runner.d.ts.map +1 -0
- package/dist/workflow/test-runner.js +273 -0
- package/dist/workflow/test-runner.js.map +1 -0
- package/eslint.config.js +25 -0
- package/package.json +66 -0
- package/src/adapters/claude.ts +298 -0
- package/src/adapters/openai.ts +300 -0
- package/src/auth/claude.ts +166 -0
- package/src/auth/index.ts +171 -0
- package/src/auth/keychain.ts +138 -0
- package/src/auth/openai-entry.ts +410 -0
- package/src/auth/openai.ts +260 -0
- package/src/auth/server.ts +252 -0
- package/src/cli/commands/auth.ts +194 -0
- package/src/cli/commands/config.ts +241 -0
- package/src/cli/commands/create.ts +308 -0
- package/src/cli/commands/index.ts +10 -0
- package/src/cli/commands/resume.ts +304 -0
- package/src/cli/commands/status.ts +189 -0
- package/src/cli/index.ts +90 -0
- package/src/cli/interactive.ts +418 -0
- package/src/cli/output.ts +410 -0
- package/src/config/defaults.ts +114 -0
- package/src/config/index.ts +315 -0
- package/src/config/schema.ts +164 -0
- package/src/generators/index.ts +251 -0
- package/src/generators/python.ts +318 -0
- package/src/generators/templates/index.ts +6 -0
- package/src/generators/templates/python.ts +465 -0
- package/src/generators/templates/typescript.ts +417 -0
- package/src/generators/typescript.ts +340 -0
- package/src/index.ts +13 -0
- package/src/state/index.ts +454 -0
- package/src/state/persistence.ts +230 -0
- package/src/types/cli.ts +146 -0
- package/src/types/consensus.ts +116 -0
- package/src/types/index.ts +64 -0
- package/src/types/project.ts +85 -0
- package/src/types/workflow.ts +149 -0
- package/src/workflow/consensus.ts +299 -0
- package/src/workflow/execution-mode.ts +517 -0
- package/src/workflow/index.ts +396 -0
- package/src/workflow/plan-mode.ts +356 -0
- package/src/workflow/test-runner.ts +345 -0
- package/tests/adapters/openai.test.ts +145 -0
- package/tests/config/config.test.ts +208 -0
- package/tests/generators/generators.test.ts +185 -0
- package/tests/types/consensus.test.ts +152 -0
- package/tests/types/project.test.ts +134 -0
- package/tests/workflow/consensus.test.ts +221 -0
- package/tests/workflow/test-runner.test.ts +214 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +22 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow orchestration module
|
|
3
|
+
* Main entry point for managing the complete project workflow
|
|
4
|
+
*/
|
|
5
|
+
import { loadProject, projectExists, getProgress, resetToPhase, deleteProject, } from '../state/index.js';
|
|
6
|
+
import { runPlanMode, resumePlanMode, } from './plan-mode.js';
|
|
7
|
+
import { runExecutionMode, resumeExecutionMode, executeSingleTask, } from './execution-mode.js';
|
|
8
|
+
// Types are re-exported via export * from statements below
|
|
9
|
+
// Re-export submodules
|
|
10
|
+
export * from './consensus.js';
|
|
11
|
+
export * from './plan-mode.js';
|
|
12
|
+
export * from './execution-mode.js';
|
|
13
|
+
export * from './test-runner.js';
|
|
14
|
+
/**
|
|
15
|
+
* Run the complete workflow from idea to deployed code
|
|
16
|
+
*
|
|
17
|
+
* @param spec - Project specification
|
|
18
|
+
* @param options - Workflow options
|
|
19
|
+
* @returns Workflow result
|
|
20
|
+
*/
|
|
21
|
+
export async function runWorkflow(spec, options) {
|
|
22
|
+
const { projectDir, consensusConfig, maxRetries, onProgress } = options;
|
|
23
|
+
try {
|
|
24
|
+
// Phase 1: Plan Mode
|
|
25
|
+
onProgress?.('workflow', 'Starting Plan Mode...');
|
|
26
|
+
const planResult = await runPlanMode(spec, {
|
|
27
|
+
projectDir,
|
|
28
|
+
consensusConfig,
|
|
29
|
+
onProgress,
|
|
30
|
+
});
|
|
31
|
+
if (!planResult.success) {
|
|
32
|
+
return {
|
|
33
|
+
success: false,
|
|
34
|
+
state: planResult.state,
|
|
35
|
+
planResult,
|
|
36
|
+
error: planResult.error || 'Plan mode failed to reach consensus',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Phase 2: Execution Mode
|
|
40
|
+
onProgress?.('workflow', 'Starting Execution Mode...');
|
|
41
|
+
const executionResult = await runExecutionMode({
|
|
42
|
+
projectDir,
|
|
43
|
+
maxRetries,
|
|
44
|
+
onProgress,
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
success: executionResult.success,
|
|
48
|
+
state: executionResult.state,
|
|
49
|
+
planResult,
|
|
50
|
+
executionResult,
|
|
51
|
+
error: executionResult.error,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
56
|
+
return {
|
|
57
|
+
success: false,
|
|
58
|
+
state: await loadProject(projectDir).catch(() => ({})),
|
|
59
|
+
error: errorMessage,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resume an existing workflow from where it left off
|
|
65
|
+
*
|
|
66
|
+
* @param projectDir - Project directory
|
|
67
|
+
* @param options - Workflow options
|
|
68
|
+
* @returns Workflow result
|
|
69
|
+
*/
|
|
70
|
+
export async function resumeWorkflow(projectDir, options) {
|
|
71
|
+
const { consensusConfig, maxRetries, onProgress } = options;
|
|
72
|
+
try {
|
|
73
|
+
// Check if project exists
|
|
74
|
+
if (!(await projectExists(projectDir))) {
|
|
75
|
+
throw new Error(`No project found at ${projectDir}`);
|
|
76
|
+
}
|
|
77
|
+
const state = await loadProject(projectDir);
|
|
78
|
+
// Determine which phase to resume
|
|
79
|
+
switch (state.phase) {
|
|
80
|
+
case 'plan': {
|
|
81
|
+
onProgress?.('workflow', 'Resuming Plan Mode...');
|
|
82
|
+
const planResult = await resumePlanMode(projectDir, {
|
|
83
|
+
consensusConfig,
|
|
84
|
+
onProgress,
|
|
85
|
+
});
|
|
86
|
+
if (!planResult.success) {
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
state: planResult.state,
|
|
90
|
+
planResult,
|
|
91
|
+
error: planResult.error || 'Plan mode failed to reach consensus',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Continue to execution
|
|
95
|
+
onProgress?.('workflow', 'Starting Execution Mode...');
|
|
96
|
+
const executionResult = await runExecutionMode({
|
|
97
|
+
projectDir,
|
|
98
|
+
maxRetries,
|
|
99
|
+
onProgress,
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
success: executionResult.success,
|
|
103
|
+
state: executionResult.state,
|
|
104
|
+
planResult,
|
|
105
|
+
executionResult,
|
|
106
|
+
error: executionResult.error,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
case 'execution': {
|
|
110
|
+
onProgress?.('workflow', 'Resuming Execution Mode...');
|
|
111
|
+
const executionResult = await resumeExecutionMode({
|
|
112
|
+
projectDir,
|
|
113
|
+
maxRetries,
|
|
114
|
+
onProgress,
|
|
115
|
+
});
|
|
116
|
+
return {
|
|
117
|
+
success: executionResult.success,
|
|
118
|
+
state: executionResult.state,
|
|
119
|
+
executionResult,
|
|
120
|
+
error: executionResult.error,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
case 'complete': {
|
|
124
|
+
onProgress?.('workflow', 'Project already complete');
|
|
125
|
+
return {
|
|
126
|
+
success: true,
|
|
127
|
+
state,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
default:
|
|
131
|
+
throw new Error(`Unknown phase: ${state.phase}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
136
|
+
return {
|
|
137
|
+
success: false,
|
|
138
|
+
state: await loadProject(projectDir).catch(() => ({})),
|
|
139
|
+
error: errorMessage,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get workflow status and progress
|
|
145
|
+
*
|
|
146
|
+
* @param projectDir - Project directory
|
|
147
|
+
* @returns Status information
|
|
148
|
+
*/
|
|
149
|
+
export async function getWorkflowStatus(projectDir) {
|
|
150
|
+
if (!(await projectExists(projectDir))) {
|
|
151
|
+
return { exists: false };
|
|
152
|
+
}
|
|
153
|
+
const state = await loadProject(projectDir);
|
|
154
|
+
const progress = await getProgress(projectDir);
|
|
155
|
+
return {
|
|
156
|
+
exists: true,
|
|
157
|
+
state,
|
|
158
|
+
progress,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Reset workflow to a specific phase
|
|
163
|
+
*
|
|
164
|
+
* @param projectDir - Project directory
|
|
165
|
+
* @param phase - Phase to reset to
|
|
166
|
+
* @returns Updated state
|
|
167
|
+
*/
|
|
168
|
+
export async function resetWorkflow(projectDir, phase) {
|
|
169
|
+
return resetToPhase(projectDir, phase);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Cancel and delete a workflow
|
|
173
|
+
*
|
|
174
|
+
* @param projectDir - Project directory
|
|
175
|
+
* @returns True if deleted
|
|
176
|
+
*/
|
|
177
|
+
export async function cancelWorkflow(projectDir) {
|
|
178
|
+
return deleteProject(projectDir);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get a human-readable summary of the workflow status
|
|
182
|
+
*
|
|
183
|
+
* @param projectDir - Project directory
|
|
184
|
+
* @returns Summary string
|
|
185
|
+
*/
|
|
186
|
+
export async function getWorkflowSummary(projectDir) {
|
|
187
|
+
const status = await getWorkflowStatus(projectDir);
|
|
188
|
+
if (!status.exists || !status.state) {
|
|
189
|
+
return 'No project found';
|
|
190
|
+
}
|
|
191
|
+
const { state, progress } = status;
|
|
192
|
+
const lines = [];
|
|
193
|
+
lines.push(`# Project: ${state.name}`);
|
|
194
|
+
lines.push('');
|
|
195
|
+
lines.push(`**Phase:** ${state.phase}`);
|
|
196
|
+
lines.push(`**Status:** ${state.status}`);
|
|
197
|
+
lines.push(`**Language:** ${state.language}`);
|
|
198
|
+
lines.push('');
|
|
199
|
+
if (progress) {
|
|
200
|
+
lines.push(`## Progress`);
|
|
201
|
+
lines.push(`- Milestones: ${progress.completedMilestones}/${progress.totalMilestones}`);
|
|
202
|
+
lines.push(`- Tasks: ${progress.completedTasks}/${progress.totalTasks}`);
|
|
203
|
+
lines.push(`- Complete: ${progress.percentComplete}%`);
|
|
204
|
+
lines.push('');
|
|
205
|
+
}
|
|
206
|
+
if (state.consensusHistory && state.consensusHistory.length > 0) {
|
|
207
|
+
const lastConsensus = state.consensusHistory[state.consensusHistory.length - 1];
|
|
208
|
+
lines.push(`## Last Consensus`);
|
|
209
|
+
lines.push(`- Score: ${lastConsensus.result.score}%`);
|
|
210
|
+
lines.push(`- Iteration: ${lastConsensus.iteration}`);
|
|
211
|
+
lines.push('');
|
|
212
|
+
}
|
|
213
|
+
if (state.error) {
|
|
214
|
+
lines.push(`## Error`);
|
|
215
|
+
lines.push(state.error);
|
|
216
|
+
lines.push('');
|
|
217
|
+
}
|
|
218
|
+
if (state.currentMilestone) {
|
|
219
|
+
const milestone = state.milestones.find((m) => m.id === state.currentMilestone);
|
|
220
|
+
if (milestone) {
|
|
221
|
+
lines.push(`## Current Milestone`);
|
|
222
|
+
lines.push(`**${milestone.name}**`);
|
|
223
|
+
if (state.currentTask) {
|
|
224
|
+
const task = milestone.tasks.find((t) => t.id === state.currentTask);
|
|
225
|
+
if (task) {
|
|
226
|
+
lines.push(`- Current Task: ${task.name}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
lines.push('');
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return lines.join('\n');
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Execute a single task manually
|
|
236
|
+
*
|
|
237
|
+
* @param projectDir - Project directory
|
|
238
|
+
* @param taskId - Task ID
|
|
239
|
+
* @param options - Execution options
|
|
240
|
+
* @returns Task result
|
|
241
|
+
*/
|
|
242
|
+
export async function executeTask(projectDir, taskId, options) {
|
|
243
|
+
return executeSingleTask(projectDir, taskId, {
|
|
244
|
+
projectDir,
|
|
245
|
+
maxRetries: options?.maxRetries,
|
|
246
|
+
onProgress: options?.onProgress ? (_, msg) => options.onProgress(msg) : undefined,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Validate that a project is ready for execution
|
|
251
|
+
*
|
|
252
|
+
* @param projectDir - Project directory
|
|
253
|
+
* @returns Validation result
|
|
254
|
+
*/
|
|
255
|
+
export async function validateReadyForExecution(projectDir) {
|
|
256
|
+
const issues = [];
|
|
257
|
+
if (!(await projectExists(projectDir))) {
|
|
258
|
+
return { ready: false, issues: ['No project found'] };
|
|
259
|
+
}
|
|
260
|
+
const state = await loadProject(projectDir);
|
|
261
|
+
if (!state.plan) {
|
|
262
|
+
issues.push('No approved plan');
|
|
263
|
+
}
|
|
264
|
+
if (state.milestones.length === 0) {
|
|
265
|
+
issues.push('No milestones defined');
|
|
266
|
+
}
|
|
267
|
+
const allTasks = state.milestones.flatMap((m) => m.tasks);
|
|
268
|
+
if (allTasks.length === 0) {
|
|
269
|
+
issues.push('No tasks defined');
|
|
270
|
+
}
|
|
271
|
+
if (state.phase === 'plan' && state.consensusHistory.length === 0) {
|
|
272
|
+
issues.push('Plan has not been through consensus review');
|
|
273
|
+
}
|
|
274
|
+
const lastConsensus = state.consensusHistory[state.consensusHistory.length - 1];
|
|
275
|
+
if (lastConsensus && lastConsensus.result.score < 95) {
|
|
276
|
+
issues.push(`Consensus score (${lastConsensus.result.score}%) below 95% threshold`);
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
ready: issues.length === 0,
|
|
280
|
+
issues,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Mode workflow
|
|
3
|
+
* Handles idea expansion, plan creation, and consensus building
|
|
4
|
+
*/
|
|
5
|
+
import type { ProjectSpec } from '../types/project.js';
|
|
6
|
+
import type { ProjectState, Milestone } from '../types/workflow.js';
|
|
7
|
+
import type { ConsensusConfig } from '../types/consensus.js';
|
|
8
|
+
import { type ConsensusProcessResult } from './consensus.js';
|
|
9
|
+
/**
|
|
10
|
+
* Options for plan mode
|
|
11
|
+
*/
|
|
12
|
+
export interface PlanModeOptions {
|
|
13
|
+
projectDir: string;
|
|
14
|
+
consensusConfig?: Partial<ConsensusConfig>;
|
|
15
|
+
onProgress?: (phase: string, message: string) => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Result of plan mode
|
|
19
|
+
*/
|
|
20
|
+
export interface PlanModeResult {
|
|
21
|
+
success: boolean;
|
|
22
|
+
state: ProjectState;
|
|
23
|
+
consensusResult?: ConsensusProcessResult;
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Expand a brief idea into a detailed specification
|
|
28
|
+
*
|
|
29
|
+
* @param idea - The brief project idea
|
|
30
|
+
* @param language - Target programming language
|
|
31
|
+
* @param onProgress - Progress callback
|
|
32
|
+
* @returns Expanded specification
|
|
33
|
+
*/
|
|
34
|
+
export declare function expandIdea(idea: string, language: 'python' | 'typescript', onProgress?: (message: string) => void): Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Create a development plan from a specification
|
|
37
|
+
*
|
|
38
|
+
* @param specification - The project specification
|
|
39
|
+
* @param context - Additional context
|
|
40
|
+
* @param onProgress - Progress callback
|
|
41
|
+
* @returns Development plan
|
|
42
|
+
*/
|
|
43
|
+
export declare function createPlan(specification: string, context?: string, onProgress?: (message: string) => void): Promise<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Get existing project context by analyzing the codebase
|
|
46
|
+
*
|
|
47
|
+
* @param projectDir - The project directory
|
|
48
|
+
* @param onProgress - Progress callback
|
|
49
|
+
* @returns Context string
|
|
50
|
+
*/
|
|
51
|
+
export declare function getProjectContext(projectDir: string, onProgress?: (message: string) => void): Promise<string>;
|
|
52
|
+
/**
|
|
53
|
+
* Save the plan to a markdown file
|
|
54
|
+
*
|
|
55
|
+
* @param projectDir - The project directory
|
|
56
|
+
* @param plan - The plan content
|
|
57
|
+
* @param filename - The filename (default: PLAN.md)
|
|
58
|
+
*/
|
|
59
|
+
export declare function documentPlan(projectDir: string, plan: string, filename?: string): Promise<string>;
|
|
60
|
+
/**
|
|
61
|
+
* Parse milestones and tasks from a plan
|
|
62
|
+
*
|
|
63
|
+
* @param plan - The plan content
|
|
64
|
+
* @returns Parsed milestones with tasks
|
|
65
|
+
*/
|
|
66
|
+
export declare function parsePlanMilestones(plan: string): Omit<Milestone, 'id'>[];
|
|
67
|
+
/**
|
|
68
|
+
* Run the complete plan mode workflow
|
|
69
|
+
*
|
|
70
|
+
* @param spec - The project specification
|
|
71
|
+
* @param options - Plan mode options
|
|
72
|
+
* @returns Plan mode result
|
|
73
|
+
*/
|
|
74
|
+
export declare function runPlanMode(spec: ProjectSpec, options: PlanModeOptions): Promise<PlanModeResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Resume plan mode from where it left off
|
|
77
|
+
*
|
|
78
|
+
* @param projectDir - The project directory
|
|
79
|
+
* @param options - Plan mode options
|
|
80
|
+
* @returns Plan mode result
|
|
81
|
+
*/
|
|
82
|
+
export declare function resumePlanMode(projectDir: string, options: Omit<PlanModeOptions, 'projectDir'>): Promise<PlanModeResult>;
|
|
83
|
+
//# sourceMappingURL=plan-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-mode.d.ts","sourceRoot":"","sources":["../../src/workflow/plan-mode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAQ,MAAM,sBAAsB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAW7D,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEpF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,GAAG,YAAY,EACjC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,MAAW,EACpB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAsDzE;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CA0GzB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,GAC3C,OAAO,CAAC,cAAc,CAAC,CAezB"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Mode workflow
|
|
3
|
+
* Handles idea expansion, plan creation, and consensus building
|
|
4
|
+
*/
|
|
5
|
+
import { promises as fs } from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { expandIdea as openaiExpandIdea } from '../adapters/openai.js';
|
|
8
|
+
import { createPlan as claudeCreatePlan, analyzeCodebase } from '../adapters/claude.js';
|
|
9
|
+
import { createProject, loadProject, setPhase, storePlan, storeSpecification, addMilestones, } from '../state/index.js';
|
|
10
|
+
import { iterateUntilConsensus } from './consensus.js';
|
|
11
|
+
/**
|
|
12
|
+
* Expand a brief idea into a detailed specification
|
|
13
|
+
*
|
|
14
|
+
* @param idea - The brief project idea
|
|
15
|
+
* @param language - Target programming language
|
|
16
|
+
* @param onProgress - Progress callback
|
|
17
|
+
* @returns Expanded specification
|
|
18
|
+
*/
|
|
19
|
+
export async function expandIdea(idea, language, onProgress) {
|
|
20
|
+
onProgress?.('Expanding idea into specification...');
|
|
21
|
+
const specification = await openaiExpandIdea(idea, language);
|
|
22
|
+
onProgress?.('Specification created');
|
|
23
|
+
return specification;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create a development plan from a specification
|
|
27
|
+
*
|
|
28
|
+
* @param specification - The project specification
|
|
29
|
+
* @param context - Additional context
|
|
30
|
+
* @param onProgress - Progress callback
|
|
31
|
+
* @returns Development plan
|
|
32
|
+
*/
|
|
33
|
+
export async function createPlan(specification, context = '', onProgress) {
|
|
34
|
+
onProgress?.('Creating development plan...');
|
|
35
|
+
const result = await claudeCreatePlan(specification, context);
|
|
36
|
+
if (!result.success) {
|
|
37
|
+
throw new Error(`Failed to create plan: ${result.error}`);
|
|
38
|
+
}
|
|
39
|
+
onProgress?.('Development plan created');
|
|
40
|
+
return result.response;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get existing project context by analyzing the codebase
|
|
44
|
+
*
|
|
45
|
+
* @param projectDir - The project directory
|
|
46
|
+
* @param onProgress - Progress callback
|
|
47
|
+
* @returns Context string
|
|
48
|
+
*/
|
|
49
|
+
export async function getProjectContext(projectDir, onProgress) {
|
|
50
|
+
onProgress?.('Analyzing existing codebase...');
|
|
51
|
+
// Check if directory has any code
|
|
52
|
+
try {
|
|
53
|
+
const files = await fs.readdir(projectDir);
|
|
54
|
+
const hasCode = files.some((f) => ['.py', '.ts', '.js', '.tsx', '.jsx'].some((ext) => f.endsWith(ext)));
|
|
55
|
+
if (!hasCode) {
|
|
56
|
+
onProgress?.('No existing code found');
|
|
57
|
+
return 'New project - no existing codebase';
|
|
58
|
+
}
|
|
59
|
+
const result = await analyzeCodebase(projectDir);
|
|
60
|
+
if (result.success) {
|
|
61
|
+
onProgress?.('Codebase analysis complete');
|
|
62
|
+
return result.response;
|
|
63
|
+
}
|
|
64
|
+
return 'Unable to analyze codebase';
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return 'New project - no existing codebase';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Save the plan to a markdown file
|
|
72
|
+
*
|
|
73
|
+
* @param projectDir - The project directory
|
|
74
|
+
* @param plan - The plan content
|
|
75
|
+
* @param filename - The filename (default: PLAN.md)
|
|
76
|
+
*/
|
|
77
|
+
export async function documentPlan(projectDir, plan, filename = 'PLAN.md') {
|
|
78
|
+
const planPath = path.join(projectDir, filename);
|
|
79
|
+
const content = `# Development Plan
|
|
80
|
+
|
|
81
|
+
Generated: ${new Date().toISOString()}
|
|
82
|
+
|
|
83
|
+
${plan}
|
|
84
|
+
`;
|
|
85
|
+
await fs.writeFile(planPath, content, 'utf-8');
|
|
86
|
+
return planPath;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse milestones and tasks from a plan
|
|
90
|
+
*
|
|
91
|
+
* @param plan - The plan content
|
|
92
|
+
* @returns Parsed milestones with tasks
|
|
93
|
+
*/
|
|
94
|
+
export function parsePlanMilestones(plan) {
|
|
95
|
+
const milestones = [];
|
|
96
|
+
// Look for milestone sections
|
|
97
|
+
const milestonePattern = /#+\s*(?:Milestone\s*\d+[:\s]*)?([^\n]+)\n([\s\S]*?)(?=#+\s*(?:Milestone|$)|$)/gi;
|
|
98
|
+
const taskPattern = /[-*]\s*(?:\[[ x]\]\s*)?(?:Task[:\s]*)?(.+)/gi;
|
|
99
|
+
let match;
|
|
100
|
+
while ((match = milestonePattern.exec(plan)) !== null) {
|
|
101
|
+
const name = match[1].trim();
|
|
102
|
+
const content = match[2];
|
|
103
|
+
// Skip non-milestone sections
|
|
104
|
+
if (name.toLowerCase().includes('background') ||
|
|
105
|
+
name.toLowerCase().includes('goal') ||
|
|
106
|
+
name.toLowerCase().includes('risk') ||
|
|
107
|
+
name.toLowerCase().includes('summary')) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const tasks = [];
|
|
111
|
+
let taskMatch;
|
|
112
|
+
while ((taskMatch = taskPattern.exec(content)) !== null) {
|
|
113
|
+
const taskName = taskMatch[1].trim();
|
|
114
|
+
if (taskName && !taskName.toLowerCase().startsWith('test')) {
|
|
115
|
+
tasks.push({
|
|
116
|
+
name: taskName,
|
|
117
|
+
description: taskName,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (tasks.length > 0 || name.toLowerCase().includes('milestone')) {
|
|
122
|
+
milestones.push({
|
|
123
|
+
name,
|
|
124
|
+
description: content.slice(0, 200).trim(),
|
|
125
|
+
tasks: tasks,
|
|
126
|
+
status: 'pending',
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// If no milestones found, create a default one
|
|
131
|
+
if (milestones.length === 0) {
|
|
132
|
+
milestones.push({
|
|
133
|
+
name: 'Implementation',
|
|
134
|
+
description: 'Main implementation milestone',
|
|
135
|
+
tasks: [],
|
|
136
|
+
status: 'pending',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return milestones;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Run the complete plan mode workflow
|
|
143
|
+
*
|
|
144
|
+
* @param spec - The project specification
|
|
145
|
+
* @param options - Plan mode options
|
|
146
|
+
* @returns Plan mode result
|
|
147
|
+
*/
|
|
148
|
+
export async function runPlanMode(spec, options) {
|
|
149
|
+
const { projectDir, consensusConfig, onProgress } = options;
|
|
150
|
+
try {
|
|
151
|
+
// Create or load project
|
|
152
|
+
onProgress?.('plan-init', 'Initializing project...');
|
|
153
|
+
let state;
|
|
154
|
+
try {
|
|
155
|
+
state = await loadProject(projectDir);
|
|
156
|
+
onProgress?.('plan-init', 'Loaded existing project');
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
state = await createProject(spec, projectDir);
|
|
160
|
+
onProgress?.('plan-init', 'Created new project');
|
|
161
|
+
}
|
|
162
|
+
// Expand idea if we don't have a specification
|
|
163
|
+
if (!state.specification) {
|
|
164
|
+
onProgress?.('expand-idea', 'Expanding idea into specification...');
|
|
165
|
+
const specification = await expandIdea(spec.idea, spec.language, (msg) => onProgress?.('expand-idea', msg));
|
|
166
|
+
state = await storeSpecification(projectDir, specification);
|
|
167
|
+
onProgress?.('expand-idea', 'Specification complete');
|
|
168
|
+
}
|
|
169
|
+
// Get project context
|
|
170
|
+
onProgress?.('get-context', 'Gathering project context...');
|
|
171
|
+
const context = await getProjectContext(projectDir, (msg) => onProgress?.('get-context', msg));
|
|
172
|
+
// Create initial plan if we don't have one
|
|
173
|
+
if (!state.plan) {
|
|
174
|
+
onProgress?.('create-plan', 'Creating development plan...');
|
|
175
|
+
const plan = await createPlan(state.specification, context, (msg) => onProgress?.('create-plan', msg));
|
|
176
|
+
state = await storePlan(projectDir, plan);
|
|
177
|
+
onProgress?.('create-plan', 'Initial plan created');
|
|
178
|
+
}
|
|
179
|
+
// Run consensus loop
|
|
180
|
+
onProgress?.('consensus', 'Starting consensus review...');
|
|
181
|
+
const consensusResult = await iterateUntilConsensus(state.plan, context, {
|
|
182
|
+
projectDir,
|
|
183
|
+
config: consensusConfig,
|
|
184
|
+
onIteration: (iteration, result) => {
|
|
185
|
+
onProgress?.('consensus', `Iteration ${iteration}: Score ${result.score}%`);
|
|
186
|
+
},
|
|
187
|
+
onRevision: (iteration, _plan) => {
|
|
188
|
+
onProgress?.('consensus', `Revising plan (iteration ${iteration})...`);
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
// Store final plan
|
|
192
|
+
if (consensusResult.approved) {
|
|
193
|
+
state = await storePlan(projectDir, consensusResult.finalPlan);
|
|
194
|
+
// Parse and add milestones
|
|
195
|
+
const milestones = parsePlanMilestones(consensusResult.finalPlan);
|
|
196
|
+
state = await addMilestones(projectDir, milestones);
|
|
197
|
+
// Document the plan
|
|
198
|
+
await documentPlan(projectDir, consensusResult.finalPlan);
|
|
199
|
+
// Transition to execution phase
|
|
200
|
+
state = await setPhase(projectDir, 'execution');
|
|
201
|
+
onProgress?.('complete', `Plan approved with ${consensusResult.finalScore}% consensus`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
onProgress?.('failed', `Consensus not reached after ${consensusResult.totalIterations} iterations (${consensusResult.finalScore}%)`);
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
success: consensusResult.approved,
|
|
208
|
+
state,
|
|
209
|
+
consensusResult,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
214
|
+
onProgress?.('error', errorMessage);
|
|
215
|
+
return {
|
|
216
|
+
success: false,
|
|
217
|
+
state: await loadProject(projectDir).catch(() => ({})),
|
|
218
|
+
error: errorMessage,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Resume plan mode from where it left off
|
|
224
|
+
*
|
|
225
|
+
* @param projectDir - The project directory
|
|
226
|
+
* @param options - Plan mode options
|
|
227
|
+
* @returns Plan mode result
|
|
228
|
+
*/
|
|
229
|
+
export async function resumePlanMode(projectDir, options) {
|
|
230
|
+
const state = await loadProject(projectDir);
|
|
231
|
+
return runPlanMode({
|
|
232
|
+
idea: state.idea,
|
|
233
|
+
name: state.name,
|
|
234
|
+
language: state.language,
|
|
235
|
+
openaiModel: state.openaiModel,
|
|
236
|
+
}, {
|
|
237
|
+
...options,
|
|
238
|
+
projectDir,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=plan-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-mode.js","sourceRoot":"","sources":["../../src/workflow/plan-mode.ts"],"names":[],"mappings":"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"}
|