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.
Files changed (209) hide show
  1. package/.env.example +25 -0
  2. package/.prettierrc +8 -0
  3. package/README.md +320 -0
  4. package/dist/adapters/claude.d.ts +82 -0
  5. package/dist/adapters/claude.d.ts.map +1 -0
  6. package/dist/adapters/claude.js +230 -0
  7. package/dist/adapters/claude.js.map +1 -0
  8. package/dist/adapters/openai.d.ts +48 -0
  9. package/dist/adapters/openai.d.ts.map +1 -0
  10. package/dist/adapters/openai.js +257 -0
  11. package/dist/adapters/openai.js.map +1 -0
  12. package/dist/auth/claude.d.ts +44 -0
  13. package/dist/auth/claude.d.ts.map +1 -0
  14. package/dist/auth/claude.js +139 -0
  15. package/dist/auth/claude.js.map +1 -0
  16. package/dist/auth/index.d.ts +61 -0
  17. package/dist/auth/index.d.ts.map +1 -0
  18. package/dist/auth/index.js +141 -0
  19. package/dist/auth/index.js.map +1 -0
  20. package/dist/auth/keychain.d.ts +66 -0
  21. package/dist/auth/keychain.d.ts.map +1 -0
  22. package/dist/auth/keychain.js +125 -0
  23. package/dist/auth/keychain.js.map +1 -0
  24. package/dist/auth/openai-entry.d.ts +9 -0
  25. package/dist/auth/openai-entry.d.ts.map +1 -0
  26. package/dist/auth/openai-entry.js +410 -0
  27. package/dist/auth/openai-entry.js.map +1 -0
  28. package/dist/auth/openai.d.ts +71 -0
  29. package/dist/auth/openai.d.ts.map +1 -0
  30. package/dist/auth/openai.js +212 -0
  31. package/dist/auth/openai.js.map +1 -0
  32. package/dist/auth/server.d.ts +32 -0
  33. package/dist/auth/server.d.ts.map +1 -0
  34. package/dist/auth/server.js +213 -0
  35. package/dist/auth/server.js.map +1 -0
  36. package/dist/cli/commands/auth.d.ts +10 -0
  37. package/dist/cli/commands/auth.d.ts.map +1 -0
  38. package/dist/cli/commands/auth.js +162 -0
  39. package/dist/cli/commands/auth.js.map +1 -0
  40. package/dist/cli/commands/config.d.ts +10 -0
  41. package/dist/cli/commands/config.d.ts.map +1 -0
  42. package/dist/cli/commands/config.js +215 -0
  43. package/dist/cli/commands/config.js.map +1 -0
  44. package/dist/cli/commands/create.d.ts +10 -0
  45. package/dist/cli/commands/create.d.ts.map +1 -0
  46. package/dist/cli/commands/create.js +240 -0
  47. package/dist/cli/commands/create.js.map +1 -0
  48. package/dist/cli/commands/index.d.ts +10 -0
  49. package/dist/cli/commands/index.d.ts.map +1 -0
  50. package/dist/cli/commands/index.js +10 -0
  51. package/dist/cli/commands/index.js.map +1 -0
  52. package/dist/cli/commands/resume.d.ts +18 -0
  53. package/dist/cli/commands/resume.d.ts.map +1 -0
  54. package/dist/cli/commands/resume.js +241 -0
  55. package/dist/cli/commands/resume.js.map +1 -0
  56. package/dist/cli/commands/status.d.ts +18 -0
  57. package/dist/cli/commands/status.d.ts.map +1 -0
  58. package/dist/cli/commands/status.js +154 -0
  59. package/dist/cli/commands/status.js.map +1 -0
  60. package/dist/cli/index.d.ts +17 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +71 -0
  63. package/dist/cli/index.js.map +1 -0
  64. package/dist/cli/interactive.d.ts +9 -0
  65. package/dist/cli/interactive.d.ts.map +1 -0
  66. package/dist/cli/interactive.js +330 -0
  67. package/dist/cli/interactive.js.map +1 -0
  68. package/dist/cli/output.d.ts +182 -0
  69. package/dist/cli/output.d.ts.map +1 -0
  70. package/dist/cli/output.js +355 -0
  71. package/dist/cli/output.js.map +1 -0
  72. package/dist/config/defaults.d.ts +57 -0
  73. package/dist/config/defaults.d.ts.map +1 -0
  74. package/dist/config/defaults.js +103 -0
  75. package/dist/config/defaults.js.map +1 -0
  76. package/dist/config/index.d.ts +138 -0
  77. package/dist/config/index.d.ts.map +1 -0
  78. package/dist/config/index.js +244 -0
  79. package/dist/config/index.js.map +1 -0
  80. package/dist/config/schema.d.ts +220 -0
  81. package/dist/config/schema.d.ts.map +1 -0
  82. package/dist/config/schema.js +141 -0
  83. package/dist/config/schema.js.map +1 -0
  84. package/dist/generators/index.d.ts +101 -0
  85. package/dist/generators/index.d.ts.map +1 -0
  86. package/dist/generators/index.js +200 -0
  87. package/dist/generators/index.js.map +1 -0
  88. package/dist/generators/python.d.ts +48 -0
  89. package/dist/generators/python.d.ts.map +1 -0
  90. package/dist/generators/python.js +262 -0
  91. package/dist/generators/python.js.map +1 -0
  92. package/dist/generators/templates/index.d.ts +6 -0
  93. package/dist/generators/templates/index.d.ts.map +1 -0
  94. package/dist/generators/templates/index.js +6 -0
  95. package/dist/generators/templates/index.js.map +1 -0
  96. package/dist/generators/templates/python.d.ts +53 -0
  97. package/dist/generators/templates/python.d.ts.map +1 -0
  98. package/dist/generators/templates/python.js +454 -0
  99. package/dist/generators/templates/python.js.map +1 -0
  100. package/dist/generators/templates/typescript.d.ts +53 -0
  101. package/dist/generators/templates/typescript.d.ts.map +1 -0
  102. package/dist/generators/templates/typescript.js +394 -0
  103. package/dist/generators/templates/typescript.js.map +1 -0
  104. package/dist/generators/typescript.d.ts +64 -0
  105. package/dist/generators/typescript.d.ts.map +1 -0
  106. package/dist/generators/typescript.js +271 -0
  107. package/dist/generators/typescript.js.map +1 -0
  108. package/dist/index.d.ts +7 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +12 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/state/index.d.ts +168 -0
  113. package/dist/state/index.d.ts.map +1 -0
  114. package/dist/state/index.js +338 -0
  115. package/dist/state/index.js.map +1 -0
  116. package/dist/state/persistence.d.ts +91 -0
  117. package/dist/state/persistence.d.ts.map +1 -0
  118. package/dist/state/persistence.js +201 -0
  119. package/dist/state/persistence.js.map +1 -0
  120. package/dist/types/cli.d.ts +132 -0
  121. package/dist/types/cli.d.ts.map +1 -0
  122. package/dist/types/cli.js +17 -0
  123. package/dist/types/cli.js.map +1 -0
  124. package/dist/types/consensus.d.ts +111 -0
  125. package/dist/types/consensus.d.ts.map +1 -0
  126. package/dist/types/consensus.js +29 -0
  127. package/dist/types/consensus.js.map +1 -0
  128. package/dist/types/index.d.ts +9 -0
  129. package/dist/types/index.d.ts.map +1 -0
  130. package/dist/types/index.js +13 -0
  131. package/dist/types/index.js.map +1 -0
  132. package/dist/types/project.d.ts +73 -0
  133. package/dist/types/project.d.ts.map +1 -0
  134. package/dist/types/project.js +55 -0
  135. package/dist/types/project.js.map +1 -0
  136. package/dist/types/workflow.d.ts +236 -0
  137. package/dist/types/workflow.d.ts.map +1 -0
  138. package/dist/types/workflow.js +74 -0
  139. package/dist/types/workflow.js.map +1 -0
  140. package/dist/workflow/consensus.d.ts +89 -0
  141. package/dist/workflow/consensus.d.ts.map +1 -0
  142. package/dist/workflow/consensus.js +220 -0
  143. package/dist/workflow/consensus.js.map +1 -0
  144. package/dist/workflow/execution-mode.d.ts +82 -0
  145. package/dist/workflow/execution-mode.d.ts.map +1 -0
  146. package/dist/workflow/execution-mode.js +346 -0
  147. package/dist/workflow/execution-mode.js.map +1 -0
  148. package/dist/workflow/index.d.ts +110 -0
  149. package/dist/workflow/index.d.ts.map +1 -0
  150. package/dist/workflow/index.js +283 -0
  151. package/dist/workflow/index.js.map +1 -0
  152. package/dist/workflow/plan-mode.d.ts +83 -0
  153. package/dist/workflow/plan-mode.d.ts.map +1 -0
  154. package/dist/workflow/plan-mode.js +241 -0
  155. package/dist/workflow/plan-mode.js.map +1 -0
  156. package/dist/workflow/test-runner.d.ts +87 -0
  157. package/dist/workflow/test-runner.d.ts.map +1 -0
  158. package/dist/workflow/test-runner.js +273 -0
  159. package/dist/workflow/test-runner.js.map +1 -0
  160. package/eslint.config.js +25 -0
  161. package/package.json +66 -0
  162. package/src/adapters/claude.ts +298 -0
  163. package/src/adapters/openai.ts +300 -0
  164. package/src/auth/claude.ts +166 -0
  165. package/src/auth/index.ts +171 -0
  166. package/src/auth/keychain.ts +138 -0
  167. package/src/auth/openai-entry.ts +410 -0
  168. package/src/auth/openai.ts +260 -0
  169. package/src/auth/server.ts +252 -0
  170. package/src/cli/commands/auth.ts +194 -0
  171. package/src/cli/commands/config.ts +241 -0
  172. package/src/cli/commands/create.ts +308 -0
  173. package/src/cli/commands/index.ts +10 -0
  174. package/src/cli/commands/resume.ts +304 -0
  175. package/src/cli/commands/status.ts +189 -0
  176. package/src/cli/index.ts +90 -0
  177. package/src/cli/interactive.ts +418 -0
  178. package/src/cli/output.ts +410 -0
  179. package/src/config/defaults.ts +114 -0
  180. package/src/config/index.ts +315 -0
  181. package/src/config/schema.ts +164 -0
  182. package/src/generators/index.ts +251 -0
  183. package/src/generators/python.ts +318 -0
  184. package/src/generators/templates/index.ts +6 -0
  185. package/src/generators/templates/python.ts +465 -0
  186. package/src/generators/templates/typescript.ts +417 -0
  187. package/src/generators/typescript.ts +340 -0
  188. package/src/index.ts +13 -0
  189. package/src/state/index.ts +454 -0
  190. package/src/state/persistence.ts +230 -0
  191. package/src/types/cli.ts +146 -0
  192. package/src/types/consensus.ts +116 -0
  193. package/src/types/index.ts +64 -0
  194. package/src/types/project.ts +85 -0
  195. package/src/types/workflow.ts +149 -0
  196. package/src/workflow/consensus.ts +299 -0
  197. package/src/workflow/execution-mode.ts +517 -0
  198. package/src/workflow/index.ts +396 -0
  199. package/src/workflow/plan-mode.ts +356 -0
  200. package/src/workflow/test-runner.ts +345 -0
  201. package/tests/adapters/openai.test.ts +145 -0
  202. package/tests/config/config.test.ts +208 -0
  203. package/tests/generators/generators.test.ts +185 -0
  204. package/tests/types/consensus.test.ts +152 -0
  205. package/tests/types/project.test.ts +134 -0
  206. package/tests/workflow/consensus.test.ts +221 -0
  207. package/tests/workflow/test-runner.test.ts +214 -0
  208. package/tsconfig.json +25 -0
  209. 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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"}