ai-sdlc 0.3.0-alpha.3 → 0.3.0-alpha.5
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 +58 -0
- package/dist/cli/commands.d.ts +3 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +13 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/dependency-resolver.d.ts +47 -0
- package/dist/cli/dependency-resolver.d.ts.map +1 -0
- package/dist/cli/dependency-resolver.js +130 -0
- package/dist/cli/dependency-resolver.js.map +1 -0
- package/dist/cli/epic-processor.d.ts +15 -0
- package/dist/cli/epic-processor.d.ts.map +1 -0
- package/dist/cli/epic-processor.js +324 -0
- package/dist/cli/epic-processor.js.map +1 -0
- package/dist/cli/formatting.d.ts +15 -0
- package/dist/cli/formatting.d.ts.map +1 -1
- package/dist/cli/formatting.js +19 -0
- package/dist/cli/formatting.js.map +1 -1
- package/dist/cli/progress-dashboard.d.ts +58 -0
- package/dist/cli/progress-dashboard.d.ts.map +1 -0
- package/dist/cli/progress-dashboard.js +216 -0
- package/dist/cli/progress-dashboard.js.map +1 -0
- package/dist/cli/table-renderer.d.ts.map +1 -1
- package/dist/cli/table-renderer.js +5 -1
- package/dist/cli/table-renderer.js.map +1 -1
- package/dist/core/config.d.ts +5 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +14 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/kanban.d.ts.map +1 -1
- package/dist/core/kanban.js +86 -3
- package/dist/core/kanban.js.map +1 -1
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +63 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,130 @@
|
|
|
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
|
+
* @returns Array of phases, where each phase contains stories that can run in parallel
|
|
7
|
+
* @throws Error if circular dependencies detected
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Stories: A -> B, A -> C, B -> D, C -> D
|
|
11
|
+
* // Returns: [[A], [B, C], [D]]
|
|
12
|
+
*/
|
|
13
|
+
export function groupStoriesByPhase(stories) {
|
|
14
|
+
const phases = [];
|
|
15
|
+
const remaining = new Set(stories);
|
|
16
|
+
const completed = new Set();
|
|
17
|
+
while (remaining.size > 0) {
|
|
18
|
+
// Find all stories whose dependencies are satisfied
|
|
19
|
+
const currentPhase = Array.from(remaining).filter(story => {
|
|
20
|
+
const deps = story.frontmatter.dependencies || [];
|
|
21
|
+
return deps.every(dep => completed.has(dep));
|
|
22
|
+
});
|
|
23
|
+
// If no stories can be processed, we have a circular dependency
|
|
24
|
+
if (currentPhase.length === 0) {
|
|
25
|
+
const cycle = detectCircularDependencies(Array.from(remaining));
|
|
26
|
+
throw new Error(`Circular dependency detected: ${cycle.join(' → ')}`);
|
|
27
|
+
}
|
|
28
|
+
phases.push(currentPhase);
|
|
29
|
+
// Mark current phase stories as completed
|
|
30
|
+
currentPhase.forEach(story => {
|
|
31
|
+
remaining.delete(story);
|
|
32
|
+
completed.add(story.frontmatter.id);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return phases;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Detect circular dependencies using depth-first search.
|
|
39
|
+
*
|
|
40
|
+
* @param stories - Array of stories to check
|
|
41
|
+
* @returns Array of story IDs forming the cycle, or empty array if no cycle
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* // Stories: A -> B, B -> C, C -> A
|
|
45
|
+
* // Returns: ['S-001', 'S-002', 'S-003', 'S-001']
|
|
46
|
+
*/
|
|
47
|
+
export function detectCircularDependencies(stories) {
|
|
48
|
+
const storyMap = new Map();
|
|
49
|
+
stories.forEach(story => storyMap.set(story.frontmatter.id, story));
|
|
50
|
+
const visited = new Set();
|
|
51
|
+
const recursionStack = new Set();
|
|
52
|
+
const path = [];
|
|
53
|
+
function dfs(storyId) {
|
|
54
|
+
if (recursionStack.has(storyId)) {
|
|
55
|
+
// Found a cycle - return the path from cycle start to current
|
|
56
|
+
const cycleStart = path.indexOf(storyId);
|
|
57
|
+
return [...path.slice(cycleStart), storyId];
|
|
58
|
+
}
|
|
59
|
+
if (visited.has(storyId)) {
|
|
60
|
+
return null; // Already processed this branch
|
|
61
|
+
}
|
|
62
|
+
visited.add(storyId);
|
|
63
|
+
recursionStack.add(storyId);
|
|
64
|
+
path.push(storyId);
|
|
65
|
+
const story = storyMap.get(storyId);
|
|
66
|
+
if (story) {
|
|
67
|
+
const deps = story.frontmatter.dependencies || [];
|
|
68
|
+
for (const dep of deps) {
|
|
69
|
+
const cycle = dfs(dep);
|
|
70
|
+
if (cycle) {
|
|
71
|
+
return cycle;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
recursionStack.delete(storyId);
|
|
76
|
+
path.pop();
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
// Check all stories as starting points
|
|
80
|
+
for (const story of stories) {
|
|
81
|
+
const cycle = dfs(story.frontmatter.id);
|
|
82
|
+
if (cycle) {
|
|
83
|
+
return cycle;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Validate that all story dependencies are satisfied.
|
|
90
|
+
* Checks for missing dependencies and circular references.
|
|
91
|
+
*
|
|
92
|
+
* @param stories - Array of stories to validate
|
|
93
|
+
* @returns Validation result with errors if any
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* const result = validateDependencies(stories);
|
|
97
|
+
* if (!result.valid) {
|
|
98
|
+
* console.error(result.errors);
|
|
99
|
+
* }
|
|
100
|
+
*/
|
|
101
|
+
export function validateDependencies(stories) {
|
|
102
|
+
const errors = [];
|
|
103
|
+
const storyIds = new Set(stories.map(s => s.frontmatter.id));
|
|
104
|
+
// Check for missing dependencies
|
|
105
|
+
for (const story of stories) {
|
|
106
|
+
const deps = story.frontmatter.dependencies || [];
|
|
107
|
+
for (const dep of deps) {
|
|
108
|
+
if (!storyIds.has(dep)) {
|
|
109
|
+
errors.push(`Story ${story.frontmatter.id} depends on ${dep}, but ${dep} is not in the epic`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Only check for circular dependencies if all dependencies exist
|
|
114
|
+
// (missing dependencies will cause groupStoriesByPhase to fail with misleading error)
|
|
115
|
+
if (errors.length === 0) {
|
|
116
|
+
try {
|
|
117
|
+
groupStoriesByPhase(stories);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error instanceof Error) {
|
|
121
|
+
errors.push(error.message);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
valid: errors.length === 0,
|
|
127
|
+
errors,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# 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,15 @@
|
|
|
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
|
+
*/
|
|
10
|
+
export declare function discoverEpicStories(sdlcRoot: string, epicId: string): Story[];
|
|
11
|
+
/**
|
|
12
|
+
* Main epic processing function
|
|
13
|
+
*/
|
|
14
|
+
export declare function processEpic(options: EpicProcessingOptions): Promise<number>;
|
|
15
|
+
//# 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;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAW7E;AAoPD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgJjF"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { getSdlcRoot, loadConfig } 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
|
+
/**
|
|
10
|
+
* Normalize epic ID by stripping 'epic-' prefix if present
|
|
11
|
+
* Both 'epic-foo' and 'foo' become 'foo'
|
|
12
|
+
*/
|
|
13
|
+
export function normalizeEpicId(epicId) {
|
|
14
|
+
return epicId.startsWith('epic-') ? epicId.slice(5) : epicId;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Discover stories for an epic with normalized ID
|
|
18
|
+
*/
|
|
19
|
+
export function discoverEpicStories(sdlcRoot, epicId) {
|
|
20
|
+
const normalized = normalizeEpicId(epicId);
|
|
21
|
+
const stories = findStoriesByEpic(sdlcRoot, normalized);
|
|
22
|
+
// Sort by priority (ascending) then created date (ascending)
|
|
23
|
+
return stories.sort((a, b) => {
|
|
24
|
+
if (a.frontmatter.priority !== b.frontmatter.priority) {
|
|
25
|
+
return a.frontmatter.priority - b.frontmatter.priority;
|
|
26
|
+
}
|
|
27
|
+
return a.frontmatter.created.localeCompare(b.frontmatter.created);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Format execution plan for display
|
|
32
|
+
*/
|
|
33
|
+
function formatExecutionPlan(epicId, phases) {
|
|
34
|
+
const lines = [];
|
|
35
|
+
const totalStories = phases.reduce((sum, phase) => sum + phase.length, 0);
|
|
36
|
+
lines.push(`\nFound ${totalStories} stories for epic: ${epicId}\n`);
|
|
37
|
+
phases.forEach((phase, index) => {
|
|
38
|
+
const phaseNum = index + 1;
|
|
39
|
+
const storyCount = phase.length;
|
|
40
|
+
const parallelNote = storyCount > 1 ? ', parallel' : '';
|
|
41
|
+
lines.push(`Phase ${phaseNum} (${storyCount} ${storyCount === 1 ? 'story' : 'stories'}${parallelNote}):`);
|
|
42
|
+
phase.forEach(story => {
|
|
43
|
+
const deps = story.frontmatter.dependencies || [];
|
|
44
|
+
const depsStr = deps.length > 0 ? ` (depends: ${deps.join(', ')})` : '';
|
|
45
|
+
lines.push(` • ${story.frontmatter.id}: ${story.frontmatter.title}${depsStr}`);
|
|
46
|
+
});
|
|
47
|
+
lines.push('');
|
|
48
|
+
});
|
|
49
|
+
// Estimate time (rough: 15-30 min per story, parallelized)
|
|
50
|
+
const estimatedMinutes = phases.length * 15; // Very rough estimate
|
|
51
|
+
lines.push(`Estimated time: ${estimatedMinutes}-${estimatedMinutes * 2} minutes`);
|
|
52
|
+
return lines.join('\n');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Process a single story in an isolated worktree
|
|
56
|
+
*/
|
|
57
|
+
async function processStoryInWorktree(story, dashboard, worktreeService, keepWorktrees) {
|
|
58
|
+
const storyId = story.frontmatter.id;
|
|
59
|
+
const slug = story.frontmatter.slug;
|
|
60
|
+
updateStoryStatus(dashboard, storyId, 'in-progress');
|
|
61
|
+
try {
|
|
62
|
+
// Create worktree
|
|
63
|
+
const worktreePath = worktreeService.create({
|
|
64
|
+
storyId,
|
|
65
|
+
slug,
|
|
66
|
+
});
|
|
67
|
+
// Log to story-specific epic run log
|
|
68
|
+
const sdlcRoot = getSdlcRoot();
|
|
69
|
+
const logger = new StoryLogger(storyId, sdlcRoot);
|
|
70
|
+
logger.log('INFO', `Starting story execution in worktree: ${worktreePath}`);
|
|
71
|
+
// Spawn ai-sdlc run process in worktree
|
|
72
|
+
const result = await new Promise((resolve) => {
|
|
73
|
+
const proc = spawn('npx', ['ai-sdlc', 'run', '--story', storyId, '--auto'], {
|
|
74
|
+
cwd: worktreePath,
|
|
75
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
76
|
+
shell: false,
|
|
77
|
+
});
|
|
78
|
+
let stdout = '';
|
|
79
|
+
let stderr = '';
|
|
80
|
+
proc.stdout?.on('data', (data) => {
|
|
81
|
+
stdout += data.toString();
|
|
82
|
+
});
|
|
83
|
+
proc.stderr?.on('data', (data) => {
|
|
84
|
+
stderr += data.toString();
|
|
85
|
+
});
|
|
86
|
+
proc.on('close', (code) => {
|
|
87
|
+
if (code === 0) {
|
|
88
|
+
logger.log('INFO', 'Story execution completed successfully');
|
|
89
|
+
resolve({ success: true });
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const error = `Process exited with code ${code}`;
|
|
93
|
+
logger.log('ERROR', `Story execution failed: ${error}\n${stderr}`);
|
|
94
|
+
resolve({ success: false, error });
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
proc.on('error', (err) => {
|
|
98
|
+
logger.log('ERROR', `Failed to spawn process: ${err.message}`);
|
|
99
|
+
resolve({ success: false, error: err.message });
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
// Cleanup worktree if not keeping
|
|
103
|
+
if (!keepWorktrees) {
|
|
104
|
+
try {
|
|
105
|
+
worktreeService.remove(worktreePath, false);
|
|
106
|
+
}
|
|
107
|
+
catch (cleanupError) {
|
|
108
|
+
// Log but don't fail the story
|
|
109
|
+
logger.log('WARN', `Failed to cleanup worktree: ${cleanupError}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (result.success) {
|
|
113
|
+
updateStoryStatus(dashboard, storyId, 'completed');
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
markStoryFailed(dashboard, storyId, result.error || 'Unknown error');
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
122
|
+
markStoryFailed(dashboard, storyId, errorMsg);
|
|
123
|
+
return { success: false, error: errorMsg };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Execute a single phase with concurrency limit
|
|
128
|
+
*/
|
|
129
|
+
async function executePhase(phase, phaseNumber, maxConcurrent, dashboard, worktreeService, keepWorktrees) {
|
|
130
|
+
const result = {
|
|
131
|
+
phase: phaseNumber,
|
|
132
|
+
succeeded: [],
|
|
133
|
+
failed: [],
|
|
134
|
+
skipped: [],
|
|
135
|
+
};
|
|
136
|
+
const queue = [...phase];
|
|
137
|
+
const active = new Set();
|
|
138
|
+
while (queue.length > 0 || active.size > 0) {
|
|
139
|
+
// Fill up to maxConcurrent
|
|
140
|
+
while (active.size < maxConcurrent && queue.length > 0) {
|
|
141
|
+
const story = queue.shift();
|
|
142
|
+
const promise = processStoryInWorktree(story, dashboard, worktreeService, keepWorktrees)
|
|
143
|
+
.then(result => ({
|
|
144
|
+
storyId: story.frontmatter.id,
|
|
145
|
+
...result,
|
|
146
|
+
}));
|
|
147
|
+
active.add(promise);
|
|
148
|
+
// Remove from active when done
|
|
149
|
+
promise.finally(() => active.delete(promise));
|
|
150
|
+
}
|
|
151
|
+
if (active.size > 0) {
|
|
152
|
+
// Wait for at least one to complete
|
|
153
|
+
const completed = await Promise.race(active);
|
|
154
|
+
if (completed.success) {
|
|
155
|
+
result.succeeded.push(completed.storyId);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
result.failed.push(completed.storyId);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Generate final epic summary
|
|
166
|
+
*/
|
|
167
|
+
function generateEpicSummary(epicId, phases, phaseResults, failedStories, skippedStories, startTime) {
|
|
168
|
+
const totalStories = phases.reduce((sum, phase) => sum + phase.length, 0);
|
|
169
|
+
const completed = phaseResults.reduce((sum, r) => sum + r.succeeded.length, 0);
|
|
170
|
+
const failed = Array.from(failedStories.keys()).length;
|
|
171
|
+
const skipped = Array.from(skippedStories.keys()).length;
|
|
172
|
+
return {
|
|
173
|
+
epicId,
|
|
174
|
+
totalStories,
|
|
175
|
+
completed,
|
|
176
|
+
failed,
|
|
177
|
+
skipped,
|
|
178
|
+
duration: Date.now() - startTime,
|
|
179
|
+
failedStories: Array.from(failedStories.entries()).map(([storyId, error]) => ({
|
|
180
|
+
storyId,
|
|
181
|
+
error,
|
|
182
|
+
})),
|
|
183
|
+
skippedStories: Array.from(skippedStories.entries()).map(([storyId, reason]) => ({
|
|
184
|
+
storyId,
|
|
185
|
+
reason,
|
|
186
|
+
})),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Print epic summary to console
|
|
191
|
+
*/
|
|
192
|
+
function printEpicSummary(summary, chalk) {
|
|
193
|
+
console.log('\n' + chalk.bold('═══ Epic Summary ═══'));
|
|
194
|
+
console.log(`\nEpic: ${chalk.bold(summary.epicId)}`);
|
|
195
|
+
console.log('');
|
|
196
|
+
if (summary.completed > 0) {
|
|
197
|
+
console.log(chalk.success(`✓ Completed: ${summary.completed} ${summary.completed === 1 ? 'story' : 'stories'}`));
|
|
198
|
+
}
|
|
199
|
+
if (summary.failed > 0) {
|
|
200
|
+
console.log(chalk.error(`✗ Failed: ${summary.failed} ${summary.failed === 1 ? 'story' : 'stories'}`));
|
|
201
|
+
summary.failedStories.forEach(({ storyId, error }) => {
|
|
202
|
+
console.log(chalk.error(` • ${storyId}: ${error}`));
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
if (summary.skipped > 0) {
|
|
206
|
+
console.log(chalk.warning(`⊘ Skipped: ${summary.skipped} ${summary.skipped === 1 ? 'story' : 'stories'} (dependencies failed)`));
|
|
207
|
+
summary.skippedStories.forEach(({ storyId, reason }) => {
|
|
208
|
+
console.log(chalk.dim(` • ${storyId}: ${reason}`));
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
const durationSeconds = Math.floor(summary.duration / 1000);
|
|
212
|
+
const minutes = Math.floor(durationSeconds / 60);
|
|
213
|
+
const seconds = durationSeconds % 60;
|
|
214
|
+
console.log('');
|
|
215
|
+
console.log(`Duration: ${minutes}m ${seconds}s`);
|
|
216
|
+
console.log('');
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Main epic processing function
|
|
220
|
+
*/
|
|
221
|
+
export async function processEpic(options) {
|
|
222
|
+
const config = loadConfig();
|
|
223
|
+
const c = getThemedChalk(config);
|
|
224
|
+
const sdlcRoot = getSdlcRoot();
|
|
225
|
+
const projectRoot = process.cwd();
|
|
226
|
+
// Validate worktrees enabled
|
|
227
|
+
if (!config.worktree?.enabled) {
|
|
228
|
+
console.log(c.error('Error: Epic processing requires worktrees to be enabled'));
|
|
229
|
+
console.log(c.dim('Set "worktree.enabled": true in .ai-sdlc.json'));
|
|
230
|
+
return 1;
|
|
231
|
+
}
|
|
232
|
+
// Get effective configuration
|
|
233
|
+
const maxConcurrent = options.maxConcurrent ?? config.epic?.maxConcurrent ?? 3;
|
|
234
|
+
const keepWorktrees = options.keepWorktrees ?? config.epic?.keepWorktrees ?? false;
|
|
235
|
+
const continueOnFailure = config.epic?.continueOnFailure ?? true;
|
|
236
|
+
// Validate maxConcurrent
|
|
237
|
+
if (maxConcurrent < 1) {
|
|
238
|
+
console.log(c.error('Error: --max-concurrent must be >= 1'));
|
|
239
|
+
return 1;
|
|
240
|
+
}
|
|
241
|
+
// Discover stories
|
|
242
|
+
console.log(c.info(`Discovering stories for epic: ${options.epicId}`));
|
|
243
|
+
const stories = discoverEpicStories(sdlcRoot, options.epicId);
|
|
244
|
+
if (stories.length === 0) {
|
|
245
|
+
console.log(c.warning(`No stories found for epic: ${options.epicId}`));
|
|
246
|
+
return 0; // Not an error
|
|
247
|
+
}
|
|
248
|
+
// Validate dependencies
|
|
249
|
+
const validation = validateDependencies(stories);
|
|
250
|
+
if (!validation.valid) {
|
|
251
|
+
console.log(c.error('Error: Invalid dependencies detected:'));
|
|
252
|
+
validation.errors.forEach(error => console.log(c.error(` • ${error}`)));
|
|
253
|
+
return 1;
|
|
254
|
+
}
|
|
255
|
+
// Group into phases
|
|
256
|
+
const phases = groupStoriesByPhase(stories);
|
|
257
|
+
// Display execution plan
|
|
258
|
+
console.log(formatExecutionPlan(options.epicId, phases));
|
|
259
|
+
// Dry run - stop here
|
|
260
|
+
if (options.dryRun) {
|
|
261
|
+
console.log(c.info('\nDry run complete - no stories executed'));
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
// Confirm execution (unless --force)
|
|
265
|
+
if (!options.force) {
|
|
266
|
+
console.log(c.warning('\nContinue? [Y/n] '));
|
|
267
|
+
// For now, assume yes in automated context
|
|
268
|
+
// TODO: Add actual prompt in interactive mode
|
|
269
|
+
}
|
|
270
|
+
// Initialize worktree service
|
|
271
|
+
const worktreeService = new GitWorktreeService(projectRoot, config.worktree.basePath);
|
|
272
|
+
// Create dashboard
|
|
273
|
+
const dashboard = createDashboard(options.epicId, phases);
|
|
274
|
+
const stopRenderer = startDashboardRenderer(dashboard);
|
|
275
|
+
const startTime = Date.now();
|
|
276
|
+
const failedStories = new Map();
|
|
277
|
+
const skippedStories = new Map();
|
|
278
|
+
const phaseResults = [];
|
|
279
|
+
try {
|
|
280
|
+
// Execute phases sequentially
|
|
281
|
+
for (let i = 0; i < phases.length; i++) {
|
|
282
|
+
const phase = phases[i];
|
|
283
|
+
// Check if any stories in this phase should be skipped due to failed dependencies
|
|
284
|
+
const phaseToExecute = phase.filter(story => {
|
|
285
|
+
const deps = story.frontmatter.dependencies || [];
|
|
286
|
+
const hasFailedDep = deps.some(dep => failedStories.has(dep));
|
|
287
|
+
if (hasFailedDep) {
|
|
288
|
+
const failedDep = deps.find(dep => failedStories.has(dep));
|
|
289
|
+
const reason = `Dependency failed: ${failedDep}`;
|
|
290
|
+
markStorySkipped(dashboard, story.frontmatter.id, reason);
|
|
291
|
+
skippedStories.set(story.frontmatter.id, reason);
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
return true;
|
|
295
|
+
});
|
|
296
|
+
// Skip phase if all stories are blocked
|
|
297
|
+
if (phaseToExecute.length === 0) {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
// Execute phase
|
|
301
|
+
const result = await executePhase(phaseToExecute, i + 1, maxConcurrent, dashboard, worktreeService, keepWorktrees);
|
|
302
|
+
phaseResults.push(result);
|
|
303
|
+
// Track failed stories
|
|
304
|
+
result.failed.forEach(storyId => {
|
|
305
|
+
failedStories.set(storyId, 'Execution failed');
|
|
306
|
+
});
|
|
307
|
+
// Stop on failure if not continuing
|
|
308
|
+
if (!continueOnFailure && result.failed.length > 0) {
|
|
309
|
+
console.log(c.error('\nStopping due to failure (continueOnFailure = false)'));
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
advancePhase(dashboard);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
stopRenderer();
|
|
317
|
+
}
|
|
318
|
+
// Generate and print summary
|
|
319
|
+
const summary = generateEpicSummary(options.epicId, phases, phaseResults, failedStories, skippedStories, startTime);
|
|
320
|
+
printEpicSummary(summary, c);
|
|
321
|
+
// Return exit code
|
|
322
|
+
return summary.failed > 0 ? 1 : 0;
|
|
323
|
+
}
|
|
324
|
+
//# 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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"}
|
package/dist/cli/formatting.d.ts
CHANGED
|
@@ -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"}
|
package/dist/cli/formatting.js
CHANGED
|
@@ -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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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Story, StoryExecutionStatus } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Progress information for a single story
|
|
4
|
+
*/
|
|
5
|
+
export interface StoryProgress {
|
|
6
|
+
storyId: string;
|
|
7
|
+
title: string;
|
|
8
|
+
status: StoryExecutionStatus;
|
|
9
|
+
percentage: number;
|
|
10
|
+
currentTask?: string;
|
|
11
|
+
blockingDeps?: string[];
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* State of the epic execution dashboard
|
|
16
|
+
*/
|
|
17
|
+
export interface DashboardState {
|
|
18
|
+
epicId: string;
|
|
19
|
+
currentPhase: number;
|
|
20
|
+
totalPhases: number;
|
|
21
|
+
stories: Map<string, StoryProgress>;
|
|
22
|
+
startTime: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create a new dashboard state for epic execution
|
|
26
|
+
*/
|
|
27
|
+
export declare function createDashboard(epicId: string, phases: Story[][]): DashboardState;
|
|
28
|
+
/**
|
|
29
|
+
* Update story status in the dashboard
|
|
30
|
+
*/
|
|
31
|
+
export declare function updateStoryStatus(state: DashboardState, storyId: string, status: StoryExecutionStatus): void;
|
|
32
|
+
/**
|
|
33
|
+
* Update story progress percentage and current task
|
|
34
|
+
*/
|
|
35
|
+
export declare function updateStoryProgress(state: DashboardState, storyId: string, percentage: number, currentTask?: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Mark a story as skipped due to dependency failure
|
|
38
|
+
*/
|
|
39
|
+
export declare function markStorySkipped(state: DashboardState, storyId: string, reason: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Mark a story as failed with error message
|
|
42
|
+
*/
|
|
43
|
+
export declare function markStoryFailed(state: DashboardState, storyId: string, error: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Advance to the next phase
|
|
46
|
+
*/
|
|
47
|
+
export declare function advancePhase(state: DashboardState): void;
|
|
48
|
+
/**
|
|
49
|
+
* Render the dashboard to the console
|
|
50
|
+
* Clears screen and draws updated state
|
|
51
|
+
*/
|
|
52
|
+
export declare function renderDashboard(state: DashboardState): void;
|
|
53
|
+
/**
|
|
54
|
+
* Create a dashboard renderer that updates periodically
|
|
55
|
+
* Returns a function to stop rendering
|
|
56
|
+
*/
|
|
57
|
+
export declare function startDashboardRenderer(state: DashboardState, intervalMs?: number): () => void;
|
|
58
|
+
//# sourceMappingURL=progress-dashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-dashboard.d.ts","sourceRoot":"","sources":["../../src/cli/progress-dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,oBAAoB,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,cAAc,CAuBjF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CAsBN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAExD;AA2ED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAkD3D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,UAAU,GAAE,MAAa,GAAG,MAAM,IAAI,CAanG"}
|