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.
Files changed (37) hide show
  1. package/README.md +58 -0
  2. package/dist/cli/commands.d.ts +3 -0
  3. package/dist/cli/commands.d.ts.map +1 -1
  4. package/dist/cli/commands.js +13 -0
  5. package/dist/cli/commands.js.map +1 -1
  6. package/dist/cli/dependency-resolver.d.ts +47 -0
  7. package/dist/cli/dependency-resolver.d.ts.map +1 -0
  8. package/dist/cli/dependency-resolver.js +130 -0
  9. package/dist/cli/dependency-resolver.js.map +1 -0
  10. package/dist/cli/epic-processor.d.ts +15 -0
  11. package/dist/cli/epic-processor.d.ts.map +1 -0
  12. package/dist/cli/epic-processor.js +324 -0
  13. package/dist/cli/epic-processor.js.map +1 -0
  14. package/dist/cli/formatting.d.ts +15 -0
  15. package/dist/cli/formatting.d.ts.map +1 -1
  16. package/dist/cli/formatting.js +19 -0
  17. package/dist/cli/formatting.js.map +1 -1
  18. package/dist/cli/progress-dashboard.d.ts +58 -0
  19. package/dist/cli/progress-dashboard.d.ts.map +1 -0
  20. package/dist/cli/progress-dashboard.js +216 -0
  21. package/dist/cli/progress-dashboard.js.map +1 -0
  22. package/dist/cli/table-renderer.d.ts.map +1 -1
  23. package/dist/cli/table-renderer.js +5 -1
  24. package/dist/cli/table-renderer.js.map +1 -1
  25. package/dist/core/config.d.ts +5 -1
  26. package/dist/core/config.d.ts.map +1 -1
  27. package/dist/core/config.js +14 -0
  28. package/dist/core/config.js.map +1 -1
  29. package/dist/core/kanban.d.ts.map +1 -1
  30. package/dist/core/kanban.js +86 -3
  31. package/dist/core/kanban.js.map +1 -1
  32. package/dist/index.js +27 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/types/index.d.ts +63 -0
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/dist/types/index.js.map +1 -1
  37. 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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"}
@@ -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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"}
@@ -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"}