ai-sdlc 0.2.0-alpha.6 → 0.2.0-alpha.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -1057
- package/dist/agents/implementation.d.ts +36 -1
- package/dist/agents/implementation.d.ts.map +1 -1
- package/dist/agents/implementation.js +259 -30
- package/dist/agents/implementation.js.map +1 -1
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/orchestrator.d.ts +61 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +443 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/planning.d.ts +1 -1
- package/dist/agents/planning.d.ts.map +1 -1
- package/dist/agents/planning.js +55 -4
- package/dist/agents/planning.js.map +1 -1
- package/dist/agents/refinement.d.ts.map +1 -1
- package/dist/agents/refinement.js +22 -3
- package/dist/agents/refinement.js.map +1 -1
- package/dist/agents/research.d.ts +85 -1
- package/dist/agents/research.d.ts.map +1 -1
- package/dist/agents/research.js +506 -16
- package/dist/agents/research.js.map +1 -1
- package/dist/agents/review.d.ts +116 -2
- package/dist/agents/review.d.ts.map +1 -1
- package/dist/agents/review.js +847 -93
- package/dist/agents/review.js.map +1 -1
- package/dist/agents/rework.d.ts.map +1 -1
- package/dist/agents/rework.js +25 -4
- package/dist/agents/rework.js.map +1 -1
- package/dist/agents/single-task.d.ts +41 -0
- package/dist/agents/single-task.d.ts.map +1 -0
- package/dist/agents/single-task.js +357 -0
- package/dist/agents/single-task.js.map +1 -0
- package/dist/agents/state-assessor.d.ts +3 -3
- package/dist/agents/state-assessor.d.ts.map +1 -1
- package/dist/agents/state-assessor.js +6 -6
- package/dist/agents/state-assessor.js.map +1 -1
- package/dist/agents/test-pattern-detector.d.ts +49 -0
- package/dist/agents/test-pattern-detector.d.ts.map +1 -0
- package/dist/agents/test-pattern-detector.js +273 -0
- package/dist/agents/test-pattern-detector.js.map +1 -0
- package/dist/agents/verification.d.ts +11 -0
- package/dist/agents/verification.d.ts.map +1 -1
- package/dist/agents/verification.js +99 -12
- package/dist/agents/verification.js.map +1 -1
- package/dist/cli/batch-processor.d.ts +64 -0
- package/dist/cli/batch-processor.d.ts.map +1 -0
- package/dist/cli/batch-processor.js +85 -0
- package/dist/cli/batch-processor.js.map +1 -0
- package/dist/cli/batch-validator.d.ts +80 -0
- package/dist/cli/batch-validator.d.ts.map +1 -0
- package/dist/cli/batch-validator.js +121 -0
- package/dist/cli/batch-validator.js.map +1 -0
- package/dist/cli/commands/migrate.js +1 -1
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands.d.ts +67 -3
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +1765 -198
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +25 -3
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +35 -12
- package/dist/cli/runner.js.map +1 -1
- package/dist/core/auth.d.ts +43 -0
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js +105 -1
- package/dist/core/auth.js.map +1 -1
- package/dist/core/client.d.ts +25 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +247 -7
- package/dist/core/client.js.map +1 -1
- package/dist/core/config.d.ts +32 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +146 -3
- package/dist/core/config.js.map +1 -1
- package/dist/core/conflict-detector.d.ts +108 -0
- package/dist/core/conflict-detector.d.ts.map +1 -0
- package/dist/core/conflict-detector.js +413 -0
- package/dist/core/conflict-detector.js.map +1 -0
- package/dist/core/git-utils.d.ts +28 -0
- package/dist/core/git-utils.d.ts.map +1 -0
- package/dist/core/git-utils.js +146 -0
- package/dist/core/git-utils.js.map +1 -0
- package/dist/core/index.d.ts +19 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +19 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/kanban.d.ts +1 -1
- package/dist/core/kanban.d.ts.map +1 -1
- package/dist/core/kanban.js +3 -3
- package/dist/core/kanban.js.map +1 -1
- package/dist/core/llm-utils.d.ts +103 -0
- package/dist/core/llm-utils.d.ts.map +1 -0
- package/dist/core/llm-utils.js +368 -0
- package/dist/core/llm-utils.js.map +1 -0
- package/dist/core/logger.d.ts +92 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +221 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/process-manager.d.ts +15 -0
- package/dist/core/process-manager.d.ts.map +1 -0
- package/dist/core/process-manager.js +132 -0
- package/dist/core/process-manager.js.map +1 -0
- package/dist/core/story-logger.d.ts +102 -0
- package/dist/core/story-logger.d.ts.map +1 -0
- package/dist/core/story-logger.js +265 -0
- package/dist/core/story-logger.js.map +1 -0
- package/dist/core/story.d.ts +113 -20
- package/dist/core/story.d.ts.map +1 -1
- package/dist/core/story.js +328 -40
- package/dist/core/story.js.map +1 -1
- package/dist/core/task-parser.d.ts +59 -0
- package/dist/core/task-parser.d.ts.map +1 -0
- package/dist/core/task-parser.js +235 -0
- package/dist/core/task-parser.js.map +1 -0
- package/dist/core/task-progress.d.ts +92 -0
- package/dist/core/task-progress.d.ts.map +1 -0
- package/dist/core/task-progress.js +280 -0
- package/dist/core/task-progress.js.map +1 -0
- package/dist/core/workflow-state.d.ts +45 -6
- package/dist/core/workflow-state.d.ts.map +1 -1
- package/dist/core/workflow-state.js +201 -12
- package/dist/core/workflow-state.js.map +1 -1
- package/dist/core/worktree.d.ts +186 -0
- package/dist/core/worktree.d.ts.map +1 -0
- package/dist/core/worktree.js +554 -0
- package/dist/core/worktree.js.map +1 -0
- package/dist/index.js +146 -5
- package/dist/index.js.map +1 -1
- package/dist/services/error-classifier.d.ts +119 -0
- package/dist/services/error-classifier.d.ts.map +1 -0
- package/dist/services/error-classifier.js +182 -0
- package/dist/services/error-classifier.js.map +1 -0
- package/dist/types/index.d.ts +381 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +5 -2
- package/templates/story.md +5 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sequential Task Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates implementation by running each task as an isolated agent,
|
|
5
|
+
* preventing context window exhaustion and enabling intelligent retry/recovery.
|
|
6
|
+
*/
|
|
7
|
+
import { spawnSync } from 'child_process';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { parseImplementationTasks } from '../core/task-parser.js';
|
|
11
|
+
import { getTaskProgress, updateTaskProgress, initializeTaskProgress, readStoryFile, } from '../core/task-progress.js';
|
|
12
|
+
import { runSingleTaskAgent } from './single-task.js';
|
|
13
|
+
import { getLogger } from '../core/logger.js';
|
|
14
|
+
const logger = getLogger();
|
|
15
|
+
/**
|
|
16
|
+
* Default orchestrator options
|
|
17
|
+
*/
|
|
18
|
+
const DEFAULT_OPTIONS = {
|
|
19
|
+
maxRetriesPerTask: 2,
|
|
20
|
+
commitAfterEachTask: true,
|
|
21
|
+
stopOnFirstFailure: true,
|
|
22
|
+
dryRun: false,
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Build minimal context for a single task
|
|
26
|
+
*
|
|
27
|
+
* Extracts relevant acceptance criteria, existing file contents, and project conventions.
|
|
28
|
+
* Truncates if context exceeds reasonable size (~2000 chars for projectPatterns).
|
|
29
|
+
*
|
|
30
|
+
* @param task - Task to build context for
|
|
31
|
+
* @param storyContent - Full story content
|
|
32
|
+
* @param workingDirectory - Working directory for task execution
|
|
33
|
+
* @returns Minimal task context
|
|
34
|
+
*/
|
|
35
|
+
export function buildTaskContext(task, storyContent, workingDirectory) {
|
|
36
|
+
// Extract acceptance criteria section
|
|
37
|
+
const acceptanceCriteria = [];
|
|
38
|
+
const acMatch = storyContent.match(/##\s+Acceptance\s+Criteria\s*\n([\s\S]*?)(?=\n##|$)/i);
|
|
39
|
+
if (acMatch) {
|
|
40
|
+
const acSection = acMatch[1];
|
|
41
|
+
const lines = acSection.split('\n');
|
|
42
|
+
for (const line of lines) {
|
|
43
|
+
const trimmed = line.trim();
|
|
44
|
+
if (trimmed.startsWith('-') || trimmed.startsWith('*')) {
|
|
45
|
+
// Remove checkbox and bullet
|
|
46
|
+
const criterion = trimmed.replace(/^[-*]\s+\[[ x]\]\s*/, '').replace(/^[-*]\s+/, '');
|
|
47
|
+
if (criterion) {
|
|
48
|
+
acceptanceCriteria.push(criterion);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Filter acceptance criteria to only those relevant to task files
|
|
54
|
+
const taskFiles = task.files || [];
|
|
55
|
+
const relevantCriteria = acceptanceCriteria.filter((criterion) => {
|
|
56
|
+
// Include if criterion mentions any task file
|
|
57
|
+
return taskFiles.some((file) => {
|
|
58
|
+
const fileName = path.basename(file);
|
|
59
|
+
const fileBaseName = fileName.replace(/\.(ts|tsx|js|jsx)$/, '');
|
|
60
|
+
return (criterion.includes(file) ||
|
|
61
|
+
criterion.includes(fileName) ||
|
|
62
|
+
criterion.includes(fileBaseName));
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
// If no specific matches, include first 3 criteria as general context
|
|
66
|
+
const finalCriteria = relevantCriteria.length > 0 ? relevantCriteria : acceptanceCriteria.slice(0, 3);
|
|
67
|
+
// Read existing files
|
|
68
|
+
const existingFiles = [];
|
|
69
|
+
for (const file of taskFiles) {
|
|
70
|
+
const filePath = path.join(workingDirectory, file);
|
|
71
|
+
if (fs.existsSync(filePath)) {
|
|
72
|
+
try {
|
|
73
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
74
|
+
existingFiles.push({ path: file, content });
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
logger.warn('orchestrator', `Failed to read file ${file}: ${error.message}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Extract project conventions (brief summary)
|
|
82
|
+
let projectPatterns = '';
|
|
83
|
+
const conventionsMatch = storyContent.match(/##\s+(Technical\s+Specification|Project\s+Conventions)\s*\n([\s\S]*?)(?=\n##|$)/i);
|
|
84
|
+
if (conventionsMatch) {
|
|
85
|
+
projectPatterns = conventionsMatch[2].trim();
|
|
86
|
+
}
|
|
87
|
+
// Truncate if too long
|
|
88
|
+
const MAX_PATTERN_LENGTH = 2000;
|
|
89
|
+
if (projectPatterns.length > MAX_PATTERN_LENGTH) {
|
|
90
|
+
projectPatterns =
|
|
91
|
+
projectPatterns.substring(0, MAX_PATTERN_LENGTH) + '\n\n[... truncated for length]';
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
task,
|
|
95
|
+
acceptanceCriteria: finalCriteria,
|
|
96
|
+
existingFiles,
|
|
97
|
+
projectPatterns,
|
|
98
|
+
workingDirectory,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Evaluate task result and categorize failure type
|
|
103
|
+
*
|
|
104
|
+
* Returns:
|
|
105
|
+
* - 'success': Task completed successfully
|
|
106
|
+
* - 'recoverable': Failure that can be retried (timeout, transient error, verification failed)
|
|
107
|
+
* - 'unrecoverable': Failure that should stop orchestration (deps not met, impossible task, max retries)
|
|
108
|
+
*
|
|
109
|
+
* @param result - Result from single-task agent execution
|
|
110
|
+
* @param attemptCount - Number of attempts made so far (including this one)
|
|
111
|
+
* @param maxRetries - Maximum retry attempts allowed
|
|
112
|
+
* @returns Failure category
|
|
113
|
+
*/
|
|
114
|
+
export function evaluateTaskResult(result, attemptCount, maxRetries) {
|
|
115
|
+
if (result.success) {
|
|
116
|
+
return 'success';
|
|
117
|
+
}
|
|
118
|
+
const error = result.error || '';
|
|
119
|
+
const lowerError = error.toLowerCase();
|
|
120
|
+
// Check if max retries exceeded (becomes unrecoverable)
|
|
121
|
+
if (attemptCount > maxRetries) {
|
|
122
|
+
logger.warn('orchestrator', `Task ${result.task.id} exceeded max retries (${maxRetries})`);
|
|
123
|
+
return 'unrecoverable';
|
|
124
|
+
}
|
|
125
|
+
// Unrecoverable: Dependencies not met
|
|
126
|
+
if (lowerError.includes('dependency') ||
|
|
127
|
+
lowerError.includes('depends on') ||
|
|
128
|
+
lowerError.includes('prerequisite')) {
|
|
129
|
+
return 'unrecoverable';
|
|
130
|
+
}
|
|
131
|
+
// Unrecoverable: Impossible task or design flaw
|
|
132
|
+
if (lowerError.includes('impossible') ||
|
|
133
|
+
lowerError.includes('cannot be done') ||
|
|
134
|
+
lowerError.includes('design flaw')) {
|
|
135
|
+
return 'unrecoverable';
|
|
136
|
+
}
|
|
137
|
+
// Unrecoverable: Files outside scope modified
|
|
138
|
+
if (result.scopeViolation && result.scopeViolation.length > 0) {
|
|
139
|
+
logger.warn('orchestrator', `Task ${result.task.id} modified files outside scope: ${result.scopeViolation.join(', ')}`);
|
|
140
|
+
return 'unrecoverable';
|
|
141
|
+
}
|
|
142
|
+
// Recoverable: Timeout
|
|
143
|
+
if (lowerError.includes('timeout') || lowerError.includes('timed out')) {
|
|
144
|
+
return 'recoverable';
|
|
145
|
+
}
|
|
146
|
+
// Recoverable: Transient API error
|
|
147
|
+
if (lowerError.includes('rate limit') ||
|
|
148
|
+
lowerError.includes('network') ||
|
|
149
|
+
lowerError.includes('connection') ||
|
|
150
|
+
lowerError.includes('api error')) {
|
|
151
|
+
return 'recoverable';
|
|
152
|
+
}
|
|
153
|
+
// Recoverable: Verification failed (tests/lint/build)
|
|
154
|
+
if (!result.verificationPassed ||
|
|
155
|
+
lowerError.includes('test') ||
|
|
156
|
+
lowerError.includes('lint') ||
|
|
157
|
+
lowerError.includes('build')) {
|
|
158
|
+
return 'recoverable';
|
|
159
|
+
}
|
|
160
|
+
// Recoverable: Unclear requirements (agent needs clarification)
|
|
161
|
+
if (lowerError.includes('unclear') ||
|
|
162
|
+
lowerError.includes('need') ||
|
|
163
|
+
lowerError.includes('missing file') ||
|
|
164
|
+
result.missingDependencies) {
|
|
165
|
+
return 'recoverable';
|
|
166
|
+
}
|
|
167
|
+
// Default to recoverable for unknown errors (give it a chance to retry)
|
|
168
|
+
return 'recoverable';
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get next task to execute based on dependencies and progress
|
|
172
|
+
*
|
|
173
|
+
* Returns task with status 'pending' or 'in_progress' whose dependencies are all completed.
|
|
174
|
+
* Detects circular dependencies and throws error.
|
|
175
|
+
*
|
|
176
|
+
* @param tasks - All tasks from implementation plan
|
|
177
|
+
* @param progress - Current task progress
|
|
178
|
+
* @returns Next eligible task or null if none available
|
|
179
|
+
* @throws Error if circular dependency detected
|
|
180
|
+
*/
|
|
181
|
+
export function getNextTask(tasks, progress) {
|
|
182
|
+
// Build progress map for quick lookup
|
|
183
|
+
const progressMap = new Map();
|
|
184
|
+
for (const p of progress) {
|
|
185
|
+
progressMap.set(p.taskId, p.status);
|
|
186
|
+
}
|
|
187
|
+
// Find tasks eligible for execution
|
|
188
|
+
const eligibleTasks = tasks.filter((task) => {
|
|
189
|
+
const status = progressMap.get(task.id);
|
|
190
|
+
// Only consider pending or in_progress tasks
|
|
191
|
+
if (status !== 'pending' && status !== 'in_progress') {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
// Check if all dependencies are completed
|
|
195
|
+
const deps = task.dependencies || [];
|
|
196
|
+
const allDepsCompleted = deps.every((depId) => progressMap.get(depId) === 'completed');
|
|
197
|
+
return allDepsCompleted;
|
|
198
|
+
});
|
|
199
|
+
// Prioritize in_progress tasks (resume interrupted work)
|
|
200
|
+
const inProgressTask = eligibleTasks.find((task) => progressMap.get(task.id) === 'in_progress');
|
|
201
|
+
if (inProgressTask) {
|
|
202
|
+
return inProgressTask;
|
|
203
|
+
}
|
|
204
|
+
// Return first pending task
|
|
205
|
+
const pendingTask = eligibleTasks.find((task) => progressMap.get(task.id) === 'pending');
|
|
206
|
+
if (pendingTask) {
|
|
207
|
+
return pendingTask;
|
|
208
|
+
}
|
|
209
|
+
// No eligible tasks - check for circular dependencies
|
|
210
|
+
const incompleteTasks = tasks.filter((task) => {
|
|
211
|
+
const status = progressMap.get(task.id);
|
|
212
|
+
return status !== 'completed' && status !== 'failed';
|
|
213
|
+
});
|
|
214
|
+
if (incompleteTasks.length > 0) {
|
|
215
|
+
// We have incomplete tasks but none are eligible - likely circular dependency
|
|
216
|
+
const taskIds = incompleteTasks.map((t) => t.id).join(', ');
|
|
217
|
+
throw new Error(`Circular dependency detected: tasks [${taskIds}] cannot be executed due to unmet dependencies`);
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Commit task completion to git
|
|
223
|
+
*
|
|
224
|
+
* Stages modified files, creates commit with standard message format.
|
|
225
|
+
* Verifies no files outside task scope were modified.
|
|
226
|
+
*
|
|
227
|
+
* @param task - Task that was completed
|
|
228
|
+
* @param filesChanged - Files modified by task
|
|
229
|
+
* @param storyId - Story ID for commit message
|
|
230
|
+
* @param workingDir - Working directory
|
|
231
|
+
* @throws Error if git operations fail
|
|
232
|
+
*/
|
|
233
|
+
async function commitTaskCompletion(task, filesChanged, storyId, workingDir) {
|
|
234
|
+
if (filesChanged.length === 0) {
|
|
235
|
+
logger.warn('orchestrator', `Task ${task.id} completed but no files changed, skipping commit`);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
// Validate file paths
|
|
239
|
+
const declaredFiles = task.files || [];
|
|
240
|
+
const violations = filesChanged.filter((f) => !declaredFiles.includes(f));
|
|
241
|
+
if (violations.length > 0) {
|
|
242
|
+
throw new Error(`Task ${task.id} modified files outside declared scope: ${violations.join(', ')}`);
|
|
243
|
+
}
|
|
244
|
+
// Stage files using safe git invocation
|
|
245
|
+
const addResult = spawnSync('git', ['add', ...filesChanged], {
|
|
246
|
+
cwd: workingDir,
|
|
247
|
+
encoding: 'utf8',
|
|
248
|
+
});
|
|
249
|
+
if (addResult.error) {
|
|
250
|
+
throw new Error(`Failed to stage files: ${addResult.error.message}`);
|
|
251
|
+
}
|
|
252
|
+
if (addResult.status !== 0) {
|
|
253
|
+
const stderr = addResult.stderr || addResult.stdout || '';
|
|
254
|
+
throw new Error(`Failed to stage files: ${stderr}`);
|
|
255
|
+
}
|
|
256
|
+
// Create commit
|
|
257
|
+
const commitMessage = `feat(${storyId}): Complete task ${task.id} - ${task.description}`;
|
|
258
|
+
const commitResult = spawnSync('git', ['commit', '-m', commitMessage], {
|
|
259
|
+
cwd: workingDir,
|
|
260
|
+
encoding: 'utf8',
|
|
261
|
+
});
|
|
262
|
+
if (commitResult.error) {
|
|
263
|
+
throw new Error(`Failed to commit: ${commitResult.error.message}`);
|
|
264
|
+
}
|
|
265
|
+
if (commitResult.status !== 0) {
|
|
266
|
+
const stderr = commitResult.stderr || commitResult.stdout || '';
|
|
267
|
+
throw new Error(`Failed to commit: ${stderr}`);
|
|
268
|
+
}
|
|
269
|
+
logger.info('orchestrator', `Committed task ${task.id}: ${commitMessage}`);
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Run implementation orchestrator
|
|
273
|
+
*
|
|
274
|
+
* Main orchestration loop:
|
|
275
|
+
* 1. Parse tasks from plan
|
|
276
|
+
* 2. Load/initialize progress
|
|
277
|
+
* 3. Loop: get next task → run agent → evaluate → commit → repeat
|
|
278
|
+
* 4. Return summary result
|
|
279
|
+
*
|
|
280
|
+
* @param storyPath - Absolute path to story.md file
|
|
281
|
+
* @param sdlcRoot - SDLC root directory
|
|
282
|
+
* @param options - Orchestrator options
|
|
283
|
+
* @returns Orchestration result summary
|
|
284
|
+
*/
|
|
285
|
+
export async function runImplementationOrchestrator(storyPath, sdlcRoot, options) {
|
|
286
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
287
|
+
const workingDir = path.dirname(storyPath);
|
|
288
|
+
logger.info('orchestrator', 'Starting implementation orchestration', {
|
|
289
|
+
storyPath,
|
|
290
|
+
options: opts,
|
|
291
|
+
});
|
|
292
|
+
// Parse tasks from plan
|
|
293
|
+
const storyContent = await readStoryFile(storyPath);
|
|
294
|
+
const tasks = parseImplementationTasks(storyContent);
|
|
295
|
+
if (tasks.length === 0) {
|
|
296
|
+
logger.warn('orchestrator', 'No tasks found in implementation plan');
|
|
297
|
+
return {
|
|
298
|
+
success: true,
|
|
299
|
+
tasksCompleted: 0,
|
|
300
|
+
tasksFailed: 0,
|
|
301
|
+
tasksRemaining: 0,
|
|
302
|
+
failedTasks: [],
|
|
303
|
+
totalAgentInvocations: 0,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
logger.info('orchestrator', `Found ${tasks.length} tasks in plan`);
|
|
307
|
+
// Load or initialize progress
|
|
308
|
+
let progress = await getTaskProgress(storyPath);
|
|
309
|
+
if (progress.length === 0) {
|
|
310
|
+
logger.info('orchestrator', 'Initializing task progress tracking');
|
|
311
|
+
await initializeTaskProgress(storyPath, tasks.map((t) => t.id));
|
|
312
|
+
progress = await getTaskProgress(storyPath);
|
|
313
|
+
}
|
|
314
|
+
// Extract story ID from path
|
|
315
|
+
const storyId = path.basename(path.dirname(storyPath));
|
|
316
|
+
// Track statistics
|
|
317
|
+
// Count already-completed tasks from previous runs
|
|
318
|
+
const alreadyCompleted = progress.filter((p) => p.status === 'completed').length;
|
|
319
|
+
const alreadyFailed = progress.filter((p) => p.status === 'failed').length;
|
|
320
|
+
let tasksCompleted = alreadyCompleted;
|
|
321
|
+
let tasksFailed = alreadyFailed;
|
|
322
|
+
let totalAgentInvocations = 0;
|
|
323
|
+
const failedTasks = [];
|
|
324
|
+
const retryCount = new Map();
|
|
325
|
+
// Main orchestration loop
|
|
326
|
+
while (true) {
|
|
327
|
+
// Get next eligible task
|
|
328
|
+
let nextTask;
|
|
329
|
+
try {
|
|
330
|
+
nextTask = getNextTask(tasks, progress);
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
// Circular dependency or other fatal error
|
|
334
|
+
logger.error('orchestrator', 'Failed to get next task', { error: error.message });
|
|
335
|
+
return {
|
|
336
|
+
success: false,
|
|
337
|
+
tasksCompleted,
|
|
338
|
+
tasksFailed: tasks.length - tasksCompleted,
|
|
339
|
+
tasksRemaining: tasks.length - tasksCompleted - tasksFailed,
|
|
340
|
+
failedTasks,
|
|
341
|
+
totalAgentInvocations,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
if (!nextTask) {
|
|
345
|
+
// No more eligible tasks
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
logger.info('orchestrator', `Executing task ${nextTask.id}: ${nextTask.description}`);
|
|
349
|
+
// Mark task in progress
|
|
350
|
+
await updateTaskProgress(storyPath, nextTask.id, 'in_progress');
|
|
351
|
+
// Build task context
|
|
352
|
+
const taskContext = buildTaskContext(nextTask, storyContent, workingDir);
|
|
353
|
+
// Execute task agent (or simulate in dry run)
|
|
354
|
+
let result;
|
|
355
|
+
if (opts.dryRun) {
|
|
356
|
+
logger.info('orchestrator', `[DRY RUN] Would execute task ${nextTask.id}`);
|
|
357
|
+
result = {
|
|
358
|
+
success: true,
|
|
359
|
+
task: nextTask,
|
|
360
|
+
filesChanged: nextTask.files || [],
|
|
361
|
+
verificationPassed: true,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
result = await runSingleTaskAgent(taskContext);
|
|
366
|
+
}
|
|
367
|
+
totalAgentInvocations++;
|
|
368
|
+
const attempts = (retryCount.get(nextTask.id) || 0) + 1;
|
|
369
|
+
retryCount.set(nextTask.id, attempts);
|
|
370
|
+
// Evaluate result
|
|
371
|
+
const evaluation = evaluateTaskResult(result, attempts, opts.maxRetriesPerTask);
|
|
372
|
+
if (evaluation === 'success') {
|
|
373
|
+
// Task succeeded
|
|
374
|
+
await updateTaskProgress(storyPath, nextTask.id, 'completed');
|
|
375
|
+
tasksCompleted++;
|
|
376
|
+
// Commit if enabled
|
|
377
|
+
if (opts.commitAfterEachTask && !opts.dryRun) {
|
|
378
|
+
try {
|
|
379
|
+
await commitTaskCompletion(nextTask, result.filesChanged, storyId, workingDir);
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
logger.error('orchestrator', `Failed to commit task ${nextTask.id}`, {
|
|
383
|
+
error: error.message,
|
|
384
|
+
});
|
|
385
|
+
// Continue despite commit failure
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
logger.info('orchestrator', `Task ${nextTask.id} completed successfully`);
|
|
389
|
+
}
|
|
390
|
+
else if (evaluation === 'recoverable') {
|
|
391
|
+
// Recoverable failure - retry if under max attempts
|
|
392
|
+
if (attempts <= opts.maxRetriesPerTask) {
|
|
393
|
+
logger.warn('orchestrator', `Task ${nextTask.id} failed (recoverable), will retry (attempt ${attempts}/${opts.maxRetriesPerTask})`);
|
|
394
|
+
// Keep status as 'in_progress' to retry
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
// Max retries exceeded
|
|
398
|
+
await updateTaskProgress(storyPath, nextTask.id, 'failed', result.error || 'Max retries exceeded');
|
|
399
|
+
tasksFailed++;
|
|
400
|
+
failedTasks.push({
|
|
401
|
+
taskId: nextTask.id,
|
|
402
|
+
error: result.error || 'Max retries exceeded',
|
|
403
|
+
attempts,
|
|
404
|
+
});
|
|
405
|
+
logger.error('orchestrator', `Task ${nextTask.id} failed after ${attempts} attempts`);
|
|
406
|
+
if (opts.stopOnFirstFailure) {
|
|
407
|
+
logger.error('orchestrator', 'Stopping orchestration due to unrecoverable failure');
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
// Unrecoverable failure
|
|
414
|
+
await updateTaskProgress(storyPath, nextTask.id, 'failed', result.error || 'Unrecoverable failure');
|
|
415
|
+
tasksFailed++;
|
|
416
|
+
failedTasks.push({
|
|
417
|
+
taskId: nextTask.id,
|
|
418
|
+
error: result.error || 'Unrecoverable failure',
|
|
419
|
+
attempts,
|
|
420
|
+
});
|
|
421
|
+
logger.error('orchestrator', `Task ${nextTask.id} failed (unrecoverable)`);
|
|
422
|
+
if (opts.stopOnFirstFailure) {
|
|
423
|
+
logger.error('orchestrator', 'Stopping orchestration due to unrecoverable failure');
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
// Reload progress for next iteration
|
|
428
|
+
progress = await getTaskProgress(storyPath);
|
|
429
|
+
}
|
|
430
|
+
// Calculate remaining tasks
|
|
431
|
+
const tasksRemaining = tasks.length - tasksCompleted - tasksFailed;
|
|
432
|
+
const result = {
|
|
433
|
+
success: tasksFailed === 0 && tasksRemaining === 0,
|
|
434
|
+
tasksCompleted,
|
|
435
|
+
tasksFailed,
|
|
436
|
+
tasksRemaining,
|
|
437
|
+
failedTasks,
|
|
438
|
+
totalAgentInvocations,
|
|
439
|
+
};
|
|
440
|
+
logger.info('orchestrator', 'Orchestration complete', result);
|
|
441
|
+
return result;
|
|
442
|
+
}
|
|
443
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/agents/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAYxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAE3B;;GAEG;AACH,MAAM,eAAe,GAAkC;IACrD,iBAAiB,EAAE,CAAC;IACpB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,MAAM,EAAE,KAAK;CACd,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAwB,EACxB,YAAoB,EACpB,gBAAwB;IAExB,sCAAsC;IACtC,MAAM,kBAAkB,GAAa,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC3F,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,6BAA6B;gBAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACrF,IAAI,SAAS,EAAE,CAAC;oBACd,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IACnC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;QAC/D,8CAA8C;QAC9C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;YAChE,OAAO,CACL,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxB,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC5B,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,sEAAsE;IACtE,MAAM,aAAa,GACjB,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAElF,sBAAsB;IACtB,MAAM,aAAa,GAAkB,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,uBAAuB,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,MAAM,gBAAgB,GAAG,YAAY,CAAC,KAAK,CACzC,kFAAkF,CACnF,CAAC;IACF,IAAI,gBAAgB,EAAE,CAAC;QACrB,eAAe,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,uBAAuB;IACvB,MAAM,kBAAkB,GAAG,IAAI,CAAC;IAChC,IAAI,eAAe,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAChD,eAAe;YACb,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,kBAAkB,CAAC,GAAG,gCAAgC,CAAC;IACxF,CAAC;IAED,OAAO;QACL,IAAI;QACJ,kBAAkB,EAAE,aAAa;QACjC,aAAa;QACb,eAAe;QACf,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAuB,EACvB,YAAoB,EACpB,UAAkB;IAElB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAEvC,wDAAwD;IACxD,IAAI,YAAY,GAAG,UAAU,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,MAAM,CAAC,IAAI,CAAC,EAAE,0BAA0B,UAAU,GAAG,CAAC,CAAC;QAC3F,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,sCAAsC;IACtC,IACE,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EACnC,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,gDAAgD;IAChD,IACE,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACrC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,EAClC,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,IAAI,CACT,cAAc,EACd,QAAQ,MAAM,CAAC,IAAI,CAAC,EAAE,kCAAkC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3F,CAAC;QACF,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,uBAAuB;IACvB,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACvE,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,mCAAmC;IACnC,IACE,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC9B,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAChC,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,sDAAsD;IACtD,IACE,CAAC,MAAM,CAAC,kBAAkB;QAC1B,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC3B,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC3B,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC5B,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,gEAAgE;IAChE,IACE,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC9B,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC3B,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC;QACnC,MAAM,CAAC,mBAAmB,EAC1B,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,wEAAwE;IACxE,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CACzB,KAA2B,EAC3B,QAAwB;IAExB,sCAAsC;IACtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,oCAAoC;IACpC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExC,6CAA6C;QAC7C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0CAA0C;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QACrC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,CAAC;QAEvF,OAAO,gBAAgB,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,yDAAyD;IACzD,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,aAAa,CAAC,CAAC;IAChG,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,4BAA4B;IAC5B,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC;IACzF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,sDAAsD;IACtD,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,8EAA8E;QAC9E,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,IAAI,KAAK,CACb,wCAAwC,OAAO,gDAAgD,CAChG,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,oBAAoB,CACjC,IAAwB,EACxB,YAAsB,EACtB,OAAe,EACf,UAAkB;IAElB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,IAAI,CAAC,EAAE,kDAAkD,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,QAAQ,IAAI,CAAC,EAAE,2CAA2C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClF,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,YAAY,CAAC,EAAE;QAC3D,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,gBAAgB;IAChB,MAAM,aAAa,GAAG,QAAQ,OAAO,oBAAoB,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAEzF,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE;QACrE,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,kBAAkB,IAAI,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,SAAiB,EACjB,QAAgB,EAChB,OAA6B;IAE7B,MAAM,IAAI,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3C,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,uCAAuC,EAAE;QACnE,SAAS;QACT,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;IAErD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,uCAAuC,CAAC,CAAC;QACrE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,EAAE;YACf,qBAAqB,EAAE,CAAC;SACzB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,KAAK,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAEnE,8BAA8B;IAC9B,IAAI,QAAQ,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,qCAAqC,CAAC,CAAC;QACnE,MAAM,sBAAsB,CAC1B,SAAS,EACT,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACvB,CAAC;QACF,QAAQ,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,6BAA6B;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAEvD,mBAAmB;IACnB,mDAAmD;IACnD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC3E,IAAI,cAAc,GAAG,gBAAgB,CAAC;IACtC,IAAI,WAAW,GAAG,aAAa,CAAC;IAChC,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7C,0BAA0B;IAC1B,OAAO,IAAI,EAAE,CAAC;QACZ,yBAAyB;QACzB,IAAI,QAAmC,CAAC;QACxC,IAAI,CAAC;YACH,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,2CAA2C;YAC3C,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,yBAAyB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAClF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,cAAc;gBACd,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,cAAc;gBAC1C,cAAc,EAAE,KAAK,CAAC,MAAM,GAAG,cAAc,GAAG,WAAW;gBAC3D,WAAW;gBACX,qBAAqB;aACtB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,yBAAyB;YACzB,MAAM;QACR,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,kBAAkB,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAEtF,wBAAwB;QACxB,MAAM,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QAEhE,qBAAqB;QACrB,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QAEzE,8CAA8C;QAC9C,IAAI,MAAuB,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,gCAAgC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3E,MAAM,GAAG;gBACP,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,QAAQ;gBACd,YAAY,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE;gBAClC,kBAAkB,EAAE,IAAI;aACzB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACjD,CAAC;QAED,qBAAqB,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAEtC,kBAAkB;QAClB,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEhF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,iBAAiB;YACjB,MAAM,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAC9D,cAAc,EAAE,CAAC;YAEjB,oBAAoB;YACpB,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACH,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;gBACjF,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,yBAAyB,QAAQ,CAAC,EAAE,EAAE,EAAE;wBACnE,KAAK,EAAE,KAAK,CAAC,OAAO;qBACrB,CAAC,CAAC;oBACH,kCAAkC;gBACpC,CAAC;YACH,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,QAAQ,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;YACxC,oDAAoD;YACpD,IAAI,QAAQ,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CACT,cAAc,EACd,QAAQ,QAAQ,CAAC,EAAE,8CAA8C,QAAQ,IAAI,IAAI,CAAC,iBAAiB,GAAG,CACvG,CAAC;gBACF,wCAAwC;YAC1C,CAAC;iBAAM,CAAC;gBACN,uBAAuB;gBACvB,MAAM,kBAAkB,CACtB,SAAS,EACT,QAAQ,CAAC,EAAE,EACX,QAAQ,EACR,MAAM,CAAC,KAAK,IAAI,sBAAsB,CACvC,CAAC;gBACF,WAAW,EAAE,CAAC;gBACd,WAAW,CAAC,IAAI,CAAC;oBACf,MAAM,EAAE,QAAQ,CAAC,EAAE;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,sBAAsB;oBAC7C,QAAQ;iBACT,CAAC,CAAC;gBAEH,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,QAAQ,CAAC,EAAE,iBAAiB,QAAQ,WAAW,CAAC,CAAC;gBAEtF,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC5B,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,qDAAqD,CAAC,CAAC;oBACpF,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,MAAM,kBAAkB,CACtB,SAAS,EACT,QAAQ,CAAC,EAAE,EACX,QAAQ,EACR,MAAM,CAAC,KAAK,IAAI,uBAAuB,CACxC,CAAC;YACF,WAAW,EAAE,CAAC;YACd,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM,EAAE,QAAQ,CAAC,EAAE;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,uBAAuB;gBAC9C,QAAQ;aACT,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,QAAQ,CAAC,EAAE,yBAAyB,CAAC,CAAC;YAE3E,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,qDAAqD,CAAC,CAAC;gBACpF,MAAM;YACR,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,QAAQ,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,4BAA4B;IAC5B,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,cAAc,GAAG,WAAW,CAAC;IAEnE,MAAM,MAAM,GAAuB;QACjC,OAAO,EAAE,WAAW,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC;QAClD,cAAc;QACd,WAAW;QACX,cAAc;QACd,WAAW;QACX,qBAAqB;KACtB,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,wBAAwB,EAAE,MAAM,CAAC,CAAC;IAE9D,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { AgentOptions } from './research.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* System prompt for the planning agent
|
|
5
5
|
*/
|
|
6
|
-
export declare const PLANNING_SYSTEM_PROMPT = "You are a technical planning specialist. Your job is to create detailed, step-by-step implementation plans for user stories.\n\nWhen creating a plan, you should:\n1. Break the work into phases (setup, implementation, testing, etc.)\n2. Create specific, actionable tasks within each phase\n3. Use checkbox format for tracking progress\n4. Consider test-driven development (write tests first)\n5. Include verification steps\n\nOutput your plan in markdown format with checkboxes. Each task should be small enough to complete in one focused session.";
|
|
6
|
+
export declare const PLANNING_SYSTEM_PROMPT = "You are a technical planning specialist. Your job is to create detailed, step-by-step implementation plans for user stories.\n\nWhen creating a plan, you should:\n1. Break the work into phases (setup, implementation, testing, etc.)\n2. Create specific, actionable tasks within each phase\n3. Use checkbox format for tracking progress\n4. Consider test-driven development (write tests first)\n5. Include verification steps\n\nOutput your plan in markdown format with checkboxes. Each task should be small enough to complete in one focused session.\n\n## Task Format\n\nWhen creating implementation plans, output tasks using this structured format:\n\n## Implementation Tasks\n\n- [ ] **T1**: {clear, actionable task description}\n - Files: {comma-separated file paths in backticks}\n - Dependencies: {comma-separated task IDs or \"none\"}\n\nExample:\n- [ ] **T1**: Create authentication service\n - Files: `src/services/auth.ts`, `src/types/auth.ts`\n - Dependencies: none\n\n- [ ] **T2**: Add authentication middleware\n - Files: `src/middleware/auth.ts`\n - Dependencies: T1\n\n- [ ] **T3**: Implement login endpoint\n - Files: `src/routes/auth.ts`\n - Dependencies: T1, T2\n\nRules:\n- Use sequential task IDs: T1, T2, T3, etc.\n- Keep descriptions concise and actionable (start with a verb)\n- List all files that will be created or modified\n- Specify dependencies by task ID, or \"none\" if no dependencies\n- Files and Dependencies lines are optional but recommended for clarity\n- Tasks can have multiple dependencies (comma-separated)\n- Ensure no circular dependencies exist in the task graph";
|
|
7
7
|
/**
|
|
8
8
|
* TDD-specific planning instructions
|
|
9
9
|
* When TDD is enabled, this is appended to the planning prompt to ensure
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/agents/planning.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/agents/planning.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,sBAAsB,+kDAyCuB,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,+xCAyBuB,CAAC;AAE9D;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,EACZ,kBAAkB,EAAE,OAAO,EAC3B,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CA+CR;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAmEtB"}
|
package/dist/agents/planning.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { parseStory, appendToSection, updateStoryField } from '../core/story.js';
|
|
2
2
|
import { runAgentQuery } from '../core/client.js';
|
|
3
|
+
import { getLogger } from '../core/logger.js';
|
|
3
4
|
import path from 'path';
|
|
4
5
|
/**
|
|
5
6
|
* System prompt for the planning agent
|
|
@@ -13,7 +14,39 @@ When creating a plan, you should:
|
|
|
13
14
|
4. Consider test-driven development (write tests first)
|
|
14
15
|
5. Include verification steps
|
|
15
16
|
|
|
16
|
-
Output your plan in markdown format with checkboxes. Each task should be small enough to complete in one focused session
|
|
17
|
+
Output your plan in markdown format with checkboxes. Each task should be small enough to complete in one focused session.
|
|
18
|
+
|
|
19
|
+
## Task Format
|
|
20
|
+
|
|
21
|
+
When creating implementation plans, output tasks using this structured format:
|
|
22
|
+
|
|
23
|
+
## Implementation Tasks
|
|
24
|
+
|
|
25
|
+
- [ ] **T1**: {clear, actionable task description}
|
|
26
|
+
- Files: {comma-separated file paths in backticks}
|
|
27
|
+
- Dependencies: {comma-separated task IDs or "none"}
|
|
28
|
+
|
|
29
|
+
Example:
|
|
30
|
+
- [ ] **T1**: Create authentication service
|
|
31
|
+
- Files: \`src/services/auth.ts\`, \`src/types/auth.ts\`
|
|
32
|
+
- Dependencies: none
|
|
33
|
+
|
|
34
|
+
- [ ] **T2**: Add authentication middleware
|
|
35
|
+
- Files: \`src/middleware/auth.ts\`
|
|
36
|
+
- Dependencies: T1
|
|
37
|
+
|
|
38
|
+
- [ ] **T3**: Implement login endpoint
|
|
39
|
+
- Files: \`src/routes/auth.ts\`
|
|
40
|
+
- Dependencies: T1, T2
|
|
41
|
+
|
|
42
|
+
Rules:
|
|
43
|
+
- Use sequential task IDs: T1, T2, T3, etc.
|
|
44
|
+
- Keep descriptions concise and actionable (start with a verb)
|
|
45
|
+
- List all files that will be created or modified
|
|
46
|
+
- Specify dependencies by task ID, or "none" if no dependencies
|
|
47
|
+
- Files and Dependencies lines are optional but recommended for clarity
|
|
48
|
+
- Tasks can have multiple dependencies (comma-separated)
|
|
49
|
+
- Ensure no circular dependencies exist in the task graph`;
|
|
17
50
|
/**
|
|
18
51
|
* TDD-specific planning instructions
|
|
19
52
|
* When TDD is enabled, this is appended to the planning prompt to ensure
|
|
@@ -102,9 +135,15 @@ Format the plan with markdown checkboxes like:
|
|
|
102
135
|
* Creates a step-by-step implementation plan from the research findings.
|
|
103
136
|
*/
|
|
104
137
|
export async function runPlanningAgent(storyPath, sdlcRoot, options = {}) {
|
|
138
|
+
const logger = getLogger();
|
|
139
|
+
const startTime = Date.now();
|
|
105
140
|
const story = parseStory(storyPath);
|
|
106
141
|
const changesMade = [];
|
|
107
142
|
const workingDir = path.dirname(sdlcRoot);
|
|
143
|
+
logger.info('planning', 'Starting planning phase', {
|
|
144
|
+
storyId: story.frontmatter.id,
|
|
145
|
+
hasReworkContext: !!options.reworkContext,
|
|
146
|
+
});
|
|
108
147
|
try {
|
|
109
148
|
// Load config to check if TDD is enabled globally
|
|
110
149
|
const { loadConfig } = await import('../core/config.js');
|
|
@@ -114,6 +153,7 @@ export async function runPlanningAgent(storyPath, sdlcRoot, options = {}) {
|
|
|
114
153
|
const prompt = buildPlanningPrompt(story, tddEnabledInConfig, options.reworkContext);
|
|
115
154
|
if (story.frontmatter.tdd_enabled ?? tddEnabledInConfig) {
|
|
116
155
|
changesMade.push('TDD mode enabled - plan will use Red-Green-Refactor structure');
|
|
156
|
+
logger.debug('planning', 'TDD mode enabled for planning');
|
|
117
157
|
}
|
|
118
158
|
const planContent = await runAgentQuery({
|
|
119
159
|
prompt,
|
|
@@ -122,11 +162,16 @@ export async function runPlanningAgent(storyPath, sdlcRoot, options = {}) {
|
|
|
122
162
|
onProgress: options.onProgress,
|
|
123
163
|
});
|
|
124
164
|
// Append plan to the story
|
|
125
|
-
appendToSection(story, 'Implementation Plan', planContent);
|
|
165
|
+
await appendToSection(story, 'Implementation Plan', planContent);
|
|
126
166
|
changesMade.push('Added implementation plan');
|
|
127
167
|
// Mark plan as complete
|
|
128
|
-
updateStoryField(story, 'plan_complete', true);
|
|
168
|
+
await updateStoryField(story, 'plan_complete', true);
|
|
129
169
|
changesMade.push('Marked plan_complete: true');
|
|
170
|
+
logger.info('planning', 'Planning phase complete', {
|
|
171
|
+
storyId: story.frontmatter.id,
|
|
172
|
+
durationMs: Date.now() - startTime,
|
|
173
|
+
planLength: planContent.length,
|
|
174
|
+
});
|
|
130
175
|
return {
|
|
131
176
|
success: true,
|
|
132
177
|
story: parseStory(storyPath), // Re-read to get updated content
|
|
@@ -134,11 +179,17 @@ export async function runPlanningAgent(storyPath, sdlcRoot, options = {}) {
|
|
|
134
179
|
};
|
|
135
180
|
}
|
|
136
181
|
catch (error) {
|
|
182
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
183
|
+
logger.error('planning', 'Planning phase failed', {
|
|
184
|
+
storyId: story.frontmatter.id,
|
|
185
|
+
durationMs: Date.now() - startTime,
|
|
186
|
+
error: errorMessage,
|
|
187
|
+
});
|
|
137
188
|
return {
|
|
138
189
|
success: false,
|
|
139
190
|
story,
|
|
140
191
|
changesMade,
|
|
141
|
-
error:
|
|
192
|
+
error: errorMessage,
|
|
142
193
|
};
|
|
143
194
|
}
|
|
144
195
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planning.js","sourceRoot":"","sources":["../../src/agents/planning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAc,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"planning.js","sourceRoot":"","sources":["../../src/agents/planning.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refinement.d.ts","sourceRoot":"","sources":["../../src/agents/refinement.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"refinement.d.ts","sourceRoot":"","sources":["../../src/agents/refinement.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAiB7C;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CA2FtB"}
|