ai-sdlc 0.3.0-alpha.1 → 0.3.0-alpha.11

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 (53) hide show
  1. package/README.md +59 -0
  2. package/dist/agents/implementation.d.ts.map +1 -1
  3. package/dist/agents/implementation.js +3 -7
  4. package/dist/agents/implementation.js.map +1 -1
  5. package/dist/agents/review.d.ts +9 -0
  6. package/dist/agents/review.d.ts.map +1 -1
  7. package/dist/agents/review.js +44 -4
  8. package/dist/agents/review.js.map +1 -1
  9. package/dist/cli/commands.d.ts +3 -0
  10. package/dist/cli/commands.d.ts.map +1 -1
  11. package/dist/cli/commands.js +17 -1
  12. package/dist/cli/commands.js.map +1 -1
  13. package/dist/cli/dependency-resolver.d.ts +49 -0
  14. package/dist/cli/dependency-resolver.d.ts.map +1 -0
  15. package/dist/cli/dependency-resolver.js +133 -0
  16. package/dist/cli/dependency-resolver.js.map +1 -0
  17. package/dist/cli/epic-processor.d.ts +16 -0
  18. package/dist/cli/epic-processor.d.ts.map +1 -0
  19. package/dist/cli/epic-processor.js +362 -0
  20. package/dist/cli/epic-processor.js.map +1 -0
  21. package/dist/cli/formatting.d.ts +15 -0
  22. package/dist/cli/formatting.d.ts.map +1 -1
  23. package/dist/cli/formatting.js +19 -0
  24. package/dist/cli/formatting.js.map +1 -1
  25. package/dist/cli/progress-dashboard.d.ts +58 -0
  26. package/dist/cli/progress-dashboard.d.ts.map +1 -0
  27. package/dist/cli/progress-dashboard.js +216 -0
  28. package/dist/cli/progress-dashboard.js.map +1 -0
  29. package/dist/cli/table-renderer.d.ts.map +1 -1
  30. package/dist/cli/table-renderer.js +5 -1
  31. package/dist/cli/table-renderer.js.map +1 -1
  32. package/dist/core/config.d.ts +5 -1
  33. package/dist/core/config.d.ts.map +1 -1
  34. package/dist/core/config.js +70 -0
  35. package/dist/core/config.js.map +1 -1
  36. package/dist/core/git-utils.d.ts +19 -0
  37. package/dist/core/git-utils.d.ts.map +1 -1
  38. package/dist/core/git-utils.js +58 -0
  39. package/dist/core/git-utils.js.map +1 -1
  40. package/dist/core/kanban.d.ts +125 -1
  41. package/dist/core/kanban.d.ts.map +1 -1
  42. package/dist/core/kanban.js +363 -4
  43. package/dist/core/kanban.js.map +1 -1
  44. package/dist/core/story.d.ts.map +1 -1
  45. package/dist/core/story.js +4 -0
  46. package/dist/core/story.js.map +1 -1
  47. package/dist/index.js +27 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/types/index.d.ts +137 -0
  50. package/dist/types/index.d.ts.map +1 -1
  51. package/dist/types/index.js +23 -0
  52. package/dist/types/index.js.map +1 -1
  53. package/package.json +1 -1
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Group stories into parallel execution phases based on dependencies.
3
+ * Uses iterative topological sort to identify stories that can run concurrently.
4
+ *
5
+ * @param stories - Array of stories to group
6
+ * @param preSatisfiedDeps - Optional set of dependency IDs that are already satisfied (e.g., done stories)
7
+ * @returns Array of phases, where each phase contains stories that can run in parallel
8
+ * @throws Error if circular dependencies detected
9
+ *
10
+ * @example
11
+ * // Stories: A -> B, A -> C, B -> D, C -> D
12
+ * // Returns: [[A], [B, C], [D]]
13
+ */
14
+ export function groupStoriesByPhase(stories, preSatisfiedDeps) {
15
+ const phases = [];
16
+ const remaining = new Set(stories);
17
+ const completed = new Set(preSatisfiedDeps || []);
18
+ while (remaining.size > 0) {
19
+ // Find all stories whose dependencies are satisfied
20
+ const currentPhase = Array.from(remaining).filter(story => {
21
+ const deps = story.frontmatter.dependencies || [];
22
+ return deps.every(dep => completed.has(dep));
23
+ });
24
+ // If no stories can be processed, we have a circular dependency
25
+ if (currentPhase.length === 0) {
26
+ const cycle = detectCircularDependencies(Array.from(remaining));
27
+ throw new Error(`Circular dependency detected: ${cycle.join(' → ')}`);
28
+ }
29
+ phases.push(currentPhase);
30
+ // Mark current phase stories as completed
31
+ currentPhase.forEach(story => {
32
+ remaining.delete(story);
33
+ completed.add(story.frontmatter.id);
34
+ });
35
+ }
36
+ return phases;
37
+ }
38
+ /**
39
+ * Detect circular dependencies using depth-first search.
40
+ *
41
+ * @param stories - Array of stories to check
42
+ * @returns Array of story IDs forming the cycle, or empty array if no cycle
43
+ *
44
+ * @example
45
+ * // Stories: A -> B, B -> C, C -> A
46
+ * // Returns: ['S-001', 'S-002', 'S-003', 'S-001']
47
+ */
48
+ export function detectCircularDependencies(stories) {
49
+ const storyMap = new Map();
50
+ stories.forEach(story => storyMap.set(story.frontmatter.id, story));
51
+ const visited = new Set();
52
+ const recursionStack = new Set();
53
+ const path = [];
54
+ function dfs(storyId) {
55
+ if (recursionStack.has(storyId)) {
56
+ // Found a cycle - return the path from cycle start to current
57
+ const cycleStart = path.indexOf(storyId);
58
+ return [...path.slice(cycleStart), storyId];
59
+ }
60
+ if (visited.has(storyId)) {
61
+ return null; // Already processed this branch
62
+ }
63
+ visited.add(storyId);
64
+ recursionStack.add(storyId);
65
+ path.push(storyId);
66
+ const story = storyMap.get(storyId);
67
+ if (story) {
68
+ const deps = story.frontmatter.dependencies || [];
69
+ for (const dep of deps) {
70
+ const cycle = dfs(dep);
71
+ if (cycle) {
72
+ return cycle;
73
+ }
74
+ }
75
+ }
76
+ recursionStack.delete(storyId);
77
+ path.pop();
78
+ return null;
79
+ }
80
+ // Check all stories as starting points
81
+ for (const story of stories) {
82
+ const cycle = dfs(story.frontmatter.id);
83
+ if (cycle) {
84
+ return cycle;
85
+ }
86
+ }
87
+ return [];
88
+ }
89
+ /**
90
+ * Validate that all story dependencies are satisfied.
91
+ * Checks for missing dependencies and circular references.
92
+ *
93
+ * @param stories - Array of stories to validate
94
+ * @param preSatisfiedDeps - Optional set of dependency IDs that are already satisfied (e.g., done stories)
95
+ * @returns Validation result with errors if any
96
+ *
97
+ * @example
98
+ * const result = validateDependencies(stories);
99
+ * if (!result.valid) {
100
+ * console.error(result.errors);
101
+ * }
102
+ */
103
+ export function validateDependencies(stories, preSatisfiedDeps) {
104
+ const errors = [];
105
+ const storyIds = new Set(stories.map(s => s.frontmatter.id));
106
+ const satisfiedDeps = preSatisfiedDeps || new Set();
107
+ // Check for missing dependencies (excluding pre-satisfied ones like done stories)
108
+ for (const story of stories) {
109
+ const deps = story.frontmatter.dependencies || [];
110
+ for (const dep of deps) {
111
+ if (!storyIds.has(dep) && !satisfiedDeps.has(dep)) {
112
+ errors.push(`Story ${story.frontmatter.id} depends on ${dep}, but ${dep} is not in the epic`);
113
+ }
114
+ }
115
+ }
116
+ // Only check for circular dependencies if all dependencies exist
117
+ // (missing dependencies will cause groupStoriesByPhase to fail with misleading error)
118
+ if (errors.length === 0) {
119
+ try {
120
+ groupStoriesByPhase(stories, preSatisfiedDeps);
121
+ }
122
+ catch (error) {
123
+ if (error instanceof Error) {
124
+ errors.push(error.message);
125
+ }
126
+ }
127
+ }
128
+ return {
129
+ valid: errors.length === 0,
130
+ errors,
131
+ };
132
+ }
133
+ //# sourceMappingURL=dependency-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/cli/dependency-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Story, EpicProcessingOptions } from '../types/index.js';
2
+ /**
3
+ * Normalize epic ID by stripping 'epic-' prefix if present
4
+ * Both 'epic-foo' and 'foo' become 'foo'
5
+ */
6
+ export declare function normalizeEpicId(epicId: string): string;
7
+ /**
8
+ * Discover stories for an epic with normalized ID
9
+ * Filters out stories that are already done
10
+ */
11
+ export declare function discoverEpicStories(sdlcRoot: string, epicId: string): Story[];
12
+ /**
13
+ * Main epic processing function
14
+ */
15
+ export declare function processEpic(options: EpicProcessingOptions): Promise<number>;
16
+ //# sourceMappingURL=epic-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epic-processor.d.ts","sourceRoot":"","sources":["../../src/cli/epic-processor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAqC,MAAM,mBAAmB,CAAC;AAkBpG;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAc7E;AAqQD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiKjF"}
@@ -0,0 +1,362 @@
1
+ import { spawn } from 'child_process';
2
+ import { getSdlcRoot, loadConfig, validateWorktreeBasePath } from '../core/config.js';
3
+ import { findStoriesByEpic } from '../core/kanban.js';
4
+ import { GitWorktreeService } from '../core/worktree.js';
5
+ import { getThemedChalk } from '../core/theme.js';
6
+ import { groupStoriesByPhase, validateDependencies } from './dependency-resolver.js';
7
+ import { createDashboard, updateStoryStatus, markStorySkipped, markStoryFailed, advancePhase, startDashboardRenderer, } from './progress-dashboard.js';
8
+ import { StoryLogger } from '../core/story-logger.js';
9
+ import fs from 'fs';
10
+ /**
11
+ * Normalize epic ID by stripping 'epic-' prefix if present
12
+ * Both 'epic-foo' and 'foo' become 'foo'
13
+ */
14
+ export function normalizeEpicId(epicId) {
15
+ return epicId.startsWith('epic-') ? epicId.slice(5) : epicId;
16
+ }
17
+ /**
18
+ * Discover stories for an epic with normalized ID
19
+ * Filters out stories that are already done
20
+ */
21
+ export function discoverEpicStories(sdlcRoot, epicId) {
22
+ const normalized = normalizeEpicId(epicId);
23
+ const stories = findStoriesByEpic(sdlcRoot, normalized);
24
+ // Filter out stories that are already done
25
+ const activeStories = stories.filter(story => story.frontmatter.status !== 'done');
26
+ // Sort by priority (ascending) then created date (ascending)
27
+ return activeStories.sort((a, b) => {
28
+ if (a.frontmatter.priority !== b.frontmatter.priority) {
29
+ return a.frontmatter.priority - b.frontmatter.priority;
30
+ }
31
+ return a.frontmatter.created.localeCompare(b.frontmatter.created);
32
+ });
33
+ }
34
+ /**
35
+ * Format execution plan for display
36
+ */
37
+ function formatExecutionPlan(epicId, phases) {
38
+ const lines = [];
39
+ const totalStories = phases.reduce((sum, phase) => sum + phase.length, 0);
40
+ lines.push(`\nFound ${totalStories} stories for epic: ${epicId}\n`);
41
+ phases.forEach((phase, index) => {
42
+ const phaseNum = index + 1;
43
+ const storyCount = phase.length;
44
+ const parallelNote = storyCount > 1 ? ', parallel' : '';
45
+ lines.push(`Phase ${phaseNum} (${storyCount} ${storyCount === 1 ? 'story' : 'stories'}${parallelNote}):`);
46
+ phase.forEach(story => {
47
+ const deps = story.frontmatter.dependencies || [];
48
+ const depsStr = deps.length > 0 ? ` (depends: ${deps.join(', ')})` : '';
49
+ lines.push(` • ${story.frontmatter.id}: ${story.frontmatter.title}${depsStr}`);
50
+ });
51
+ lines.push('');
52
+ });
53
+ // Estimate time (rough: 15-30 min per story, parallelized)
54
+ const estimatedMinutes = phases.length * 15; // Very rough estimate
55
+ lines.push(`Estimated time: ${estimatedMinutes}-${estimatedMinutes * 2} minutes`);
56
+ return lines.join('\n');
57
+ }
58
+ /**
59
+ * Process a single story in an isolated worktree
60
+ */
61
+ async function processStoryInWorktree(story, dashboard, worktreeService, keepWorktrees) {
62
+ const storyId = story.frontmatter.id;
63
+ const slug = story.frontmatter.slug;
64
+ updateStoryStatus(dashboard, storyId, 'in-progress');
65
+ try {
66
+ // Create worktree
67
+ const worktreePath = worktreeService.create({
68
+ storyId,
69
+ slug,
70
+ });
71
+ // Verify worktree was created
72
+ if (!fs.existsSync(worktreePath)) {
73
+ const error = `Worktree creation failed: ${worktreePath} does not exist`;
74
+ markStoryFailed(dashboard, storyId, error);
75
+ return { success: false, error };
76
+ }
77
+ // Log to story-specific epic run log
78
+ const sdlcRoot = getSdlcRoot();
79
+ const logger = new StoryLogger(storyId, sdlcRoot);
80
+ logger.log('INFO', `Starting story execution in worktree: ${worktreePath}`);
81
+ // Spawn ai-sdlc run process in worktree
82
+ // Use node directly since npx can't find local bin (project isn't a dependency of itself)
83
+ // Use --no-worktree since we're already in an isolated worktree
84
+ const result = await new Promise((resolve) => {
85
+ const proc = spawn('node', ['dist/index.js', 'run', '--story', storyId, '--auto', '--no-worktree'], {
86
+ cwd: worktreePath,
87
+ stdio: ['ignore', 'pipe', 'pipe'],
88
+ shell: false,
89
+ });
90
+ let stdout = '';
91
+ let stderr = '';
92
+ proc.stdout?.on('data', (data) => {
93
+ stdout += data.toString();
94
+ });
95
+ proc.stderr?.on('data', (data) => {
96
+ stderr += data.toString();
97
+ });
98
+ proc.on('close', (code) => {
99
+ // Log subprocess output for debugging
100
+ if (stdout.trim()) {
101
+ logger.log('DEBUG', `Subprocess stdout:\n${stdout}`);
102
+ }
103
+ if (stderr.trim()) {
104
+ logger.log('DEBUG', `Subprocess stderr:\n${stderr}`);
105
+ }
106
+ if (code === 0) {
107
+ logger.log('INFO', 'Story execution completed successfully');
108
+ resolve({ success: true });
109
+ }
110
+ else {
111
+ const error = `Process exited with code ${code}`;
112
+ logger.log('ERROR', `Story execution failed: ${error}\n${stderr}`);
113
+ resolve({ success: false, error });
114
+ }
115
+ });
116
+ proc.on('error', (err) => {
117
+ logger.log('ERROR', `Failed to spawn process: ${err.message}`);
118
+ resolve({ success: false, error: err.message });
119
+ });
120
+ });
121
+ // Cleanup worktree if not keeping
122
+ if (!keepWorktrees) {
123
+ try {
124
+ worktreeService.remove(worktreePath, false);
125
+ }
126
+ catch (cleanupError) {
127
+ // Log but don't fail the story
128
+ logger.log('WARN', `Failed to cleanup worktree: ${cleanupError}`);
129
+ }
130
+ }
131
+ if (result.success) {
132
+ updateStoryStatus(dashboard, storyId, 'completed');
133
+ }
134
+ else {
135
+ markStoryFailed(dashboard, storyId, result.error || 'Unknown error');
136
+ }
137
+ return result;
138
+ }
139
+ catch (error) {
140
+ const errorMsg = error instanceof Error ? error.message : String(error);
141
+ markStoryFailed(dashboard, storyId, errorMsg);
142
+ return { success: false, error: errorMsg };
143
+ }
144
+ }
145
+ /**
146
+ * Execute a single phase with concurrency limit
147
+ */
148
+ async function executePhase(phase, phaseNumber, maxConcurrent, dashboard, worktreeService, keepWorktrees) {
149
+ const result = {
150
+ phase: phaseNumber,
151
+ succeeded: [],
152
+ failed: [],
153
+ skipped: [],
154
+ };
155
+ const queue = [...phase];
156
+ const active = new Set();
157
+ while (queue.length > 0 || active.size > 0) {
158
+ // Fill up to maxConcurrent
159
+ while (active.size < maxConcurrent && queue.length > 0) {
160
+ const story = queue.shift();
161
+ const promise = processStoryInWorktree(story, dashboard, worktreeService, keepWorktrees)
162
+ .then(result => ({
163
+ storyId: story.frontmatter.id,
164
+ ...result,
165
+ }));
166
+ active.add(promise);
167
+ // Remove from active when done
168
+ promise.finally(() => active.delete(promise));
169
+ }
170
+ if (active.size > 0) {
171
+ // Wait for at least one to complete
172
+ const completed = await Promise.race(active);
173
+ if (completed.success) {
174
+ result.succeeded.push(completed.storyId);
175
+ }
176
+ else {
177
+ result.failed.push(completed.storyId);
178
+ }
179
+ }
180
+ }
181
+ return result;
182
+ }
183
+ /**
184
+ * Generate final epic summary
185
+ */
186
+ function generateEpicSummary(epicId, phases, phaseResults, failedStories, skippedStories, startTime) {
187
+ const totalStories = phases.reduce((sum, phase) => sum + phase.length, 0);
188
+ const completed = phaseResults.reduce((sum, r) => sum + r.succeeded.length, 0);
189
+ const failed = Array.from(failedStories.keys()).length;
190
+ const skipped = Array.from(skippedStories.keys()).length;
191
+ return {
192
+ epicId,
193
+ totalStories,
194
+ completed,
195
+ failed,
196
+ skipped,
197
+ duration: Date.now() - startTime,
198
+ failedStories: Array.from(failedStories.entries()).map(([storyId, error]) => ({
199
+ storyId,
200
+ error,
201
+ })),
202
+ skippedStories: Array.from(skippedStories.entries()).map(([storyId, reason]) => ({
203
+ storyId,
204
+ reason,
205
+ })),
206
+ };
207
+ }
208
+ /**
209
+ * Print epic summary to console
210
+ */
211
+ function printEpicSummary(summary, chalk) {
212
+ console.log('\n' + chalk.bold('═══ Epic Summary ═══'));
213
+ console.log(`\nEpic: ${chalk.bold(summary.epicId)}`);
214
+ console.log('');
215
+ if (summary.completed > 0) {
216
+ console.log(chalk.success(`✓ Completed: ${summary.completed} ${summary.completed === 1 ? 'story' : 'stories'}`));
217
+ }
218
+ if (summary.failed > 0) {
219
+ console.log(chalk.error(`✗ Failed: ${summary.failed} ${summary.failed === 1 ? 'story' : 'stories'}`));
220
+ summary.failedStories.forEach(({ storyId, error }) => {
221
+ console.log(chalk.error(` • ${storyId}: ${error}`));
222
+ });
223
+ }
224
+ if (summary.skipped > 0) {
225
+ console.log(chalk.warning(`⊘ Skipped: ${summary.skipped} ${summary.skipped === 1 ? 'story' : 'stories'} (dependencies failed)`));
226
+ summary.skippedStories.forEach(({ storyId, reason }) => {
227
+ console.log(chalk.dim(` • ${storyId}: ${reason}`));
228
+ });
229
+ }
230
+ const durationSeconds = Math.floor(summary.duration / 1000);
231
+ const minutes = Math.floor(durationSeconds / 60);
232
+ const seconds = durationSeconds % 60;
233
+ console.log('');
234
+ console.log(`Duration: ${minutes}m ${seconds}s`);
235
+ console.log('');
236
+ }
237
+ /**
238
+ * Main epic processing function
239
+ */
240
+ export async function processEpic(options) {
241
+ const config = loadConfig();
242
+ const c = getThemedChalk(config);
243
+ const sdlcRoot = getSdlcRoot();
244
+ const projectRoot = process.cwd();
245
+ // Validate worktrees enabled
246
+ if (!config.worktree?.enabled) {
247
+ console.log(c.error('Error: Epic processing requires worktrees to be enabled'));
248
+ console.log(c.dim('Set "worktree.enabled": true in .ai-sdlc.json'));
249
+ return 1;
250
+ }
251
+ // Get effective configuration
252
+ const maxConcurrent = options.maxConcurrent ?? config.epic?.maxConcurrent ?? 3;
253
+ const keepWorktrees = options.keepWorktrees ?? config.epic?.keepWorktrees ?? false;
254
+ const continueOnFailure = config.epic?.continueOnFailure ?? true;
255
+ // Validate maxConcurrent
256
+ if (maxConcurrent < 1) {
257
+ console.log(c.error('Error: --max-concurrent must be >= 1'));
258
+ return 1;
259
+ }
260
+ // Discover stories (active only - done stories are filtered out)
261
+ console.log(c.info(`Discovering stories for epic: ${options.epicId}`));
262
+ const stories = discoverEpicStories(sdlcRoot, options.epicId);
263
+ // Also get done story IDs to treat as pre-satisfied dependencies
264
+ const normalized = normalizeEpicId(options.epicId);
265
+ const allEpicStories = findStoriesByEpic(sdlcRoot, normalized);
266
+ const doneStoryIds = new Set(allEpicStories
267
+ .filter(s => s.frontmatter.status === 'done')
268
+ .map(s => s.frontmatter.id));
269
+ if (stories.length === 0) {
270
+ if (doneStoryIds.size > 0) {
271
+ console.log(c.success(`All ${doneStoryIds.size} stories in epic are already done!`));
272
+ }
273
+ else {
274
+ console.log(c.warning(`No stories found for epic: ${options.epicId}`));
275
+ }
276
+ return 0; // Not an error
277
+ }
278
+ // Validate dependencies (done stories count as satisfied)
279
+ const validation = validateDependencies(stories, doneStoryIds);
280
+ if (!validation.valid) {
281
+ console.log(c.error('Error: Invalid dependencies detected:'));
282
+ validation.errors.forEach(error => console.log(c.error(` • ${error}`)));
283
+ return 1;
284
+ }
285
+ // Group into phases (done stories count as already completed)
286
+ const phases = groupStoriesByPhase(stories, doneStoryIds);
287
+ // Display execution plan
288
+ console.log(formatExecutionPlan(options.epicId, phases));
289
+ // Dry run - stop here
290
+ if (options.dryRun) {
291
+ console.log(c.info('\nDry run complete - no stories executed'));
292
+ return 0;
293
+ }
294
+ // Confirm execution (unless --force)
295
+ if (!options.force) {
296
+ console.log(c.warning('\nContinue? [Y/n] '));
297
+ // For now, assume yes in automated context
298
+ // TODO: Add actual prompt in interactive mode
299
+ }
300
+ // Initialize worktree service with resolved basePath
301
+ let resolvedBasePath;
302
+ try {
303
+ resolvedBasePath = validateWorktreeBasePath(config.worktree.basePath, projectRoot);
304
+ }
305
+ catch (error) {
306
+ console.log(c.error(`Configuration Error: ${error instanceof Error ? error.message : String(error)}`));
307
+ return 1;
308
+ }
309
+ const worktreeService = new GitWorktreeService(projectRoot, resolvedBasePath);
310
+ // Create dashboard
311
+ const dashboard = createDashboard(options.epicId, phases);
312
+ const stopRenderer = startDashboardRenderer(dashboard);
313
+ const startTime = Date.now();
314
+ const failedStories = new Map();
315
+ const skippedStories = new Map();
316
+ const phaseResults = [];
317
+ try {
318
+ // Execute phases sequentially
319
+ for (let i = 0; i < phases.length; i++) {
320
+ const phase = phases[i];
321
+ // Check if any stories in this phase should be skipped due to failed dependencies
322
+ const phaseToExecute = phase.filter(story => {
323
+ const deps = story.frontmatter.dependencies || [];
324
+ const hasFailedDep = deps.some(dep => failedStories.has(dep));
325
+ if (hasFailedDep) {
326
+ const failedDep = deps.find(dep => failedStories.has(dep));
327
+ const reason = `Dependency failed: ${failedDep}`;
328
+ markStorySkipped(dashboard, story.frontmatter.id, reason);
329
+ skippedStories.set(story.frontmatter.id, reason);
330
+ return false;
331
+ }
332
+ return true;
333
+ });
334
+ // Skip phase if all stories are blocked
335
+ if (phaseToExecute.length === 0) {
336
+ continue;
337
+ }
338
+ // Execute phase
339
+ const result = await executePhase(phaseToExecute, i + 1, maxConcurrent, dashboard, worktreeService, keepWorktrees);
340
+ phaseResults.push(result);
341
+ // Track failed stories
342
+ result.failed.forEach(storyId => {
343
+ failedStories.set(storyId, 'Execution failed');
344
+ });
345
+ // Stop on failure if not continuing
346
+ if (!continueOnFailure && result.failed.length > 0) {
347
+ console.log(c.error('\nStopping due to failure (continueOnFailure = false)'));
348
+ break;
349
+ }
350
+ advancePhase(dashboard);
351
+ }
352
+ }
353
+ finally {
354
+ stopRenderer();
355
+ }
356
+ // Generate and print summary
357
+ const summary = generateEpicSummary(options.epicId, phases, phaseResults, failedStories, skippedStories, startTime);
358
+ printEpicSummary(summary, c);
359
+ // Return exit code
360
+ return summary.failed > 0 ? 1 : 0;
361
+ }
362
+ //# sourceMappingURL=epic-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epic-processor.js","sourceRoot":"","sources":["../../src/cli/epic-processor.ts"],"names":[],"mappings":"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"}
@@ -114,4 +114,19 @@ export declare function getKanbanColumnWidth(termWidth: number, numCols: number)
114
114
  * @returns New array padded to maxHeight (or original length if longer)
115
115
  */
116
116
  export declare function padColumnToHeight(items: string[], maxHeight: number): string[];
117
+ /**
118
+ * Check if a story is from a worktree based on its file path.
119
+ * Stories in worktrees have paths containing '/worktrees/'.
120
+ *
121
+ * @param storyPath - Absolute path to the story file
122
+ * @returns true if story is in a worktree, false otherwise
123
+ */
124
+ export declare function isWorktreeStory(storyPath: string): boolean;
125
+ /**
126
+ * Get worktree indicator emoji for display.
127
+ * Returns 🌿 (seedling) emoji to indicate story is from active worktree.
128
+ *
129
+ * @returns Worktree indicator emoji
130
+ */
131
+ export declare function getWorktreeIndicator(): string;
117
132
  //# sourceMappingURL=formatting.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/cli/formatting.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAqCpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAuDxE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAGnE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,CAyBnE;AAcD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAenD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAalD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAOpH;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG7G;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAS/E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAW9E"}
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/cli/formatting.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAqCpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAuDxE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAGnE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,CAyBnE;AAcD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAenD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAalD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAOpH;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG7G;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAS/E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAW9E;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
@@ -272,4 +272,23 @@ export function padColumnToHeight(items, maxHeight) {
272
272
  }
273
273
  return padded;
274
274
  }
275
+ /**
276
+ * Check if a story is from a worktree based on its file path.
277
+ * Stories in worktrees have paths containing '/worktrees/'.
278
+ *
279
+ * @param storyPath - Absolute path to the story file
280
+ * @returns true if story is in a worktree, false otherwise
281
+ */
282
+ export function isWorktreeStory(storyPath) {
283
+ return storyPath.includes('/worktrees/');
284
+ }
285
+ /**
286
+ * Get worktree indicator emoji for display.
287
+ * Returns 🌿 (seedling) emoji to indicate story is from active worktree.
288
+ *
289
+ * @returns Worktree indicator emoji
290
+ */
291
+ export function getWorktreeIndicator() {
292
+ return '🌿';
293
+ }
275
294
  //# sourceMappingURL=formatting.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/cli/formatting.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/cli/formatting.ts"],"names":[],"mappings":"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"}