@eldrforge/kodrdriv 1.2.23 → 1.2.24

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 (66) hide show
  1. package/PARALLEL-EXECUTION-FIXES.md +132 -0
  2. package/PARALLEL_EXECUTION_FIX.md +146 -0
  3. package/RECOVERY-FIXES.md +72 -0
  4. package/dist/arguments.js +26 -3
  5. package/dist/arguments.js.map +1 -1
  6. package/dist/commands/audio-commit.js +3 -3
  7. package/dist/commands/audio-commit.js.map +1 -1
  8. package/dist/commands/audio-review.js +13 -13
  9. package/dist/commands/audio-review.js.map +1 -1
  10. package/dist/commands/link.js +13 -13
  11. package/dist/commands/link.js.map +1 -1
  12. package/dist/commands/publish.js +200 -146
  13. package/dist/commands/publish.js.map +1 -1
  14. package/dist/commands/review.js +6 -6
  15. package/dist/commands/review.js.map +1 -1
  16. package/dist/commands/select-audio.js +4 -4
  17. package/dist/commands/select-audio.js.map +1 -1
  18. package/dist/commands/tree.js +242 -318
  19. package/dist/commands/tree.js.map +1 -1
  20. package/dist/commands/unlink.js +8 -8
  21. package/dist/commands/unlink.js.map +1 -1
  22. package/dist/commands/versions.js +3 -3
  23. package/dist/commands/versions.js.map +1 -1
  24. package/dist/constants.js +4 -4
  25. package/dist/constants.js.map +1 -1
  26. package/dist/content/diff.js +5 -2
  27. package/dist/content/diff.js.map +1 -1
  28. package/dist/content/files.js +4 -4
  29. package/dist/content/files.js.map +1 -1
  30. package/dist/execution/CommandValidator.js +160 -0
  31. package/dist/execution/CommandValidator.js.map +1 -0
  32. package/dist/execution/DependencyChecker.js +102 -0
  33. package/dist/execution/DependencyChecker.js.map +1 -0
  34. package/dist/execution/DynamicTaskPool.js +455 -0
  35. package/dist/execution/DynamicTaskPool.js.map +1 -0
  36. package/dist/execution/RecoveryManager.js +502 -0
  37. package/dist/execution/RecoveryManager.js.map +1 -0
  38. package/dist/execution/ResourceMonitor.js +125 -0
  39. package/dist/execution/ResourceMonitor.js.map +1 -0
  40. package/dist/execution/Scheduler.js +98 -0
  41. package/dist/execution/Scheduler.js.map +1 -0
  42. package/dist/execution/TreeExecutionAdapter.js +170 -0
  43. package/dist/execution/TreeExecutionAdapter.js.map +1 -0
  44. package/dist/logging.js +3 -3
  45. package/dist/logging.js.map +1 -1
  46. package/dist/ui/ProgressFormatter.js +230 -0
  47. package/dist/ui/ProgressFormatter.js.map +1 -0
  48. package/dist/util/checkpointManager.js +168 -0
  49. package/dist/util/checkpointManager.js.map +1 -0
  50. package/dist/util/dependencyGraph.js +224 -0
  51. package/dist/util/dependencyGraph.js.map +1 -0
  52. package/dist/util/fileLock.js +204 -0
  53. package/dist/util/fileLock.js.map +1 -0
  54. package/dist/util/general.js +5 -5
  55. package/dist/util/general.js.map +1 -1
  56. package/dist/util/gitMutex.js +116 -0
  57. package/dist/util/gitMutex.js.map +1 -0
  58. package/dist/util/mutex.js +96 -0
  59. package/dist/util/mutex.js.map +1 -0
  60. package/dist/util/performance.js +4 -4
  61. package/dist/util/performance.js.map +1 -1
  62. package/dist/util/safety.js +4 -4
  63. package/dist/util/safety.js.map +1 -1
  64. package/dist/util/storage.js +2 -2
  65. package/dist/util/storage.js.map +1 -1
  66. package/package.json +6 -6
@@ -0,0 +1,502 @@
1
+ import { getLogger } from '../logging.js';
2
+ import { findAllDependents } from '../util/dependencyGraph.js';
3
+ import { CheckpointManager } from '../util/checkpointManager.js';
4
+ import * as path from 'path';
5
+
6
+ function _define_property(obj, key, value) {
7
+ if (key in obj) {
8
+ Object.defineProperty(obj, key, {
9
+ value: value,
10
+ enumerable: true,
11
+ configurable: true,
12
+ writable: true
13
+ });
14
+ } else {
15
+ obj[key] = value;
16
+ }
17
+ return obj;
18
+ }
19
+ /**
20
+ * RecoveryManager provides granular control over execution state recovery
21
+ */ class RecoveryManager {
22
+ /**
23
+ * Resolve a package identifier (directory name or package name) to a package name
24
+ */ resolvePackageName(identifier) {
25
+ // Try exact package name match first
26
+ if (this.graph.packages.has(identifier)) {
27
+ return identifier;
28
+ }
29
+ // Try directory name match
30
+ for (const [pkgName, pkgInfo] of this.graph.packages){
31
+ const dirName = path.basename(pkgInfo.path);
32
+ if (dirName === identifier) {
33
+ return pkgName;
34
+ }
35
+ }
36
+ return null;
37
+ }
38
+ /**
39
+ * Mark packages as completed
40
+ * Accepts either package names (e.g., "@eldrforge/git-tools") or directory names (e.g., "git-tools")
41
+ */ async markCompleted(packages) {
42
+ this.logger.info(`Marking ${packages.length} package(s) as completed...`);
43
+ for (const pkgIdentifier of packages){
44
+ // Resolve identifier to package name
45
+ const pkg = this.resolvePackageName(pkgIdentifier);
46
+ if (!pkg) {
47
+ // List available packages for better error message
48
+ const available = Array.from(this.graph.packages.entries()).map(([name, info])=>`${path.basename(info.path)} (${name})`).join(', ');
49
+ throw new Error(`Package not found: ${pkgIdentifier}. Available packages: ${available}`);
50
+ }
51
+ // Validate not already completed
52
+ if (this.checkpoint.state.completed.includes(pkg)) {
53
+ this.logger.warn(`Package ${pkg} already completed`);
54
+ continue;
55
+ }
56
+ // Remove from other states
57
+ this.removeFromAllStates(pkg);
58
+ // Add to completed
59
+ this.checkpoint.state.completed.push(pkg);
60
+ this.logger.info(`✓ Marked ${pkg} as completed`);
61
+ }
62
+ // Update ready queue
63
+ this.updateReadyState();
64
+ // Save checkpoint
65
+ await this.saveCheckpoint();
66
+ this.logger.info('State updated successfully');
67
+ }
68
+ /**
69
+ * Mark packages as failed
70
+ */ async markFailed(packages, reason = 'Manually marked as failed') {
71
+ this.logger.info(`Marking ${packages.length} package(s) as failed...`);
72
+ for (const pkg of packages){
73
+ // Validate package exists
74
+ if (!this.graph.packages.has(pkg)) {
75
+ throw new Error(`Package not found: ${pkg}`);
76
+ }
77
+ // Remove from other states
78
+ this.removeFromAllStates(pkg);
79
+ // Add to failed
80
+ const failureInfo = {
81
+ name: pkg,
82
+ error: reason,
83
+ isRetriable: false,
84
+ attemptNumber: 1,
85
+ failedAt: new Date().toISOString(),
86
+ dependencies: Array.from(this.graph.edges.get(pkg) || []),
87
+ dependents: Array.from(findAllDependents(pkg, this.graph))
88
+ };
89
+ this.checkpoint.state.failed.push(failureInfo);
90
+ this.logger.info(`✗ Marked ${pkg} as failed`);
91
+ // Cascade to dependents
92
+ const dependents = findAllDependents(pkg, this.graph);
93
+ for (const dep of dependents){
94
+ this.removeFromAllStates(dep);
95
+ this.checkpoint.state.skipped.push(dep);
96
+ this.logger.warn(`⊘ Skipped ${dep} (depends on failed ${pkg})`);
97
+ }
98
+ }
99
+ await this.saveCheckpoint();
100
+ }
101
+ /**
102
+ * Skip packages and their dependents
103
+ */ async skipPackages(packages) {
104
+ this.logger.info(`Skipping ${packages.length} package(s)...`);
105
+ const toSkip = new Set(packages);
106
+ // Find all dependents
107
+ for (const pkg of packages){
108
+ const dependents = findAllDependents(pkg, this.graph);
109
+ for (const dep of dependents){
110
+ toSkip.add(dep);
111
+ }
112
+ }
113
+ this.logger.info(`Total packages to skip (including dependents): ${toSkip.size}`);
114
+ for (const pkg of toSkip){
115
+ this.removeFromAllStates(pkg);
116
+ if (!this.checkpoint.state.skipped.includes(pkg)) {
117
+ this.checkpoint.state.skipped.push(pkg);
118
+ }
119
+ this.logger.info(`⊘ Skipped ${pkg}`);
120
+ }
121
+ await this.saveCheckpoint();
122
+ }
123
+ /**
124
+ * Retry failed packages
125
+ */ async retryFailed(options) {
126
+ const failed = this.checkpoint.state.failed;
127
+ if (failed.length === 0) {
128
+ this.logger.info('No failed packages to retry');
129
+ return;
130
+ }
131
+ this.logger.info(`Retrying ${failed.length} failed package(s)...`);
132
+ const retriable = [];
133
+ const nonRetriable = [];
134
+ for (const failedPkg of failed){
135
+ if (failedPkg.isRetriable || (options === null || options === void 0 ? void 0 : options.maxRetries)) {
136
+ retriable.push(failedPkg);
137
+ } else {
138
+ nonRetriable.push(failedPkg);
139
+ }
140
+ }
141
+ if (nonRetriable.length > 0) {
142
+ this.logger.warn(`${nonRetriable.length} package(s) are not retriable: ${nonRetriable.map((p)=>p.name).join(', ')}`);
143
+ if (!(options === null || options === void 0 ? void 0 : options.maxRetries)) {
144
+ this.logger.warn('Use --max-retries to force retry of non-retriable packages');
145
+ }
146
+ }
147
+ for (const failedPkg of retriable){
148
+ // Reset retry count if max retries overridden
149
+ if (options === null || options === void 0 ? void 0 : options.maxRetries) {
150
+ this.checkpoint.retryAttempts[failedPkg.name] = 0;
151
+ }
152
+ // Move back to pending
153
+ this.removeFromAllStates(failedPkg.name);
154
+ this.checkpoint.state.pending.push(failedPkg.name);
155
+ // Un-skip dependents if they were skipped
156
+ for (const dependent of failedPkg.dependents){
157
+ if (this.checkpoint.state.skipped.includes(dependent)) {
158
+ this.checkpoint.state.skipped = this.checkpoint.state.skipped.filter((p)=>p !== dependent);
159
+ this.checkpoint.state.pending.push(dependent);
160
+ this.logger.info(`↻ ${dependent} moved back to pending (was skipped)`);
161
+ }
162
+ }
163
+ this.logger.info(`↻ ${failedPkg.name} moved to pending for retry`);
164
+ }
165
+ // Keep only non-retriable failures in failed state
166
+ this.checkpoint.state.failed = nonRetriable;
167
+ // Update ready queue
168
+ this.updateReadyState();
169
+ await this.saveCheckpoint();
170
+ this.logger.info(`${retriable.length} package(s) reset for retry`);
171
+ }
172
+ /**
173
+ * Skip failed packages and continue with remaining
174
+ */ async skipFailed() {
175
+ const failed = this.checkpoint.state.failed.map((f)=>f.name);
176
+ if (failed.length === 0) {
177
+ this.logger.info('No failed packages to skip');
178
+ return;
179
+ }
180
+ this.logger.info(`Skipping ${failed.length} failed package(s) and their dependents...`);
181
+ await this.skipPackages(failed);
182
+ // Clear failed state
183
+ this.checkpoint.state.failed = [];
184
+ this.logger.info('Failed packages skipped, execution can continue');
185
+ }
186
+ /**
187
+ * Reset specific package to initial state
188
+ */ async resetPackage(packageName) {
189
+ this.logger.info(`Resetting package: ${packageName}`);
190
+ if (!this.graph.packages.has(packageName)) {
191
+ throw new Error(`Package not found: ${packageName}`);
192
+ }
193
+ // Remove from all states
194
+ this.removeFromAllStates(packageName);
195
+ // Add back to pending
196
+ this.checkpoint.state.pending.push(packageName);
197
+ // Clear retry attempts
198
+ delete this.checkpoint.retryAttempts[packageName];
199
+ delete this.checkpoint.packageStartTimes[packageName];
200
+ delete this.checkpoint.packageEndTimes[packageName];
201
+ delete this.checkpoint.packageDurations[packageName];
202
+ await this.saveCheckpoint();
203
+ this.logger.info(`✓ ${packageName} reset to initial state`);
204
+ }
205
+ /**
206
+ * Validate checkpoint state integrity
207
+ */ validateState() {
208
+ const issues = [];
209
+ const warnings = [];
210
+ // Check for duplicates across states
211
+ const allPackages = [
212
+ ...this.checkpoint.state.pending,
213
+ ...this.checkpoint.state.ready,
214
+ ...this.checkpoint.state.running.map((r)=>r.name),
215
+ ...this.checkpoint.state.completed,
216
+ ...this.checkpoint.state.failed.map((f)=>f.name),
217
+ ...this.checkpoint.state.skipped
218
+ ];
219
+ const duplicates = this.findDuplicates(allPackages);
220
+ if (duplicates.length > 0) {
221
+ issues.push(`Packages in multiple states: ${duplicates.join(', ')}`);
222
+ }
223
+ // Check for missing packages
224
+ const missing = this.checkpoint.buildOrder.filter((pkg)=>!allPackages.includes(pkg));
225
+ if (missing.length > 0) {
226
+ issues.push(`Missing packages: ${missing.join(', ')}`);
227
+ }
228
+ // Check dependency consistency
229
+ for (const pkg of this.checkpoint.state.completed){
230
+ const deps = this.graph.edges.get(pkg) || new Set();
231
+ for (const dep of deps){
232
+ if (!this.checkpoint.state.completed.includes(dep)) {
233
+ warnings.push(`${pkg} completed but dependency ${dep} not completed`);
234
+ }
235
+ }
236
+ }
237
+ // Check for stale running packages
238
+ const now = Date.now();
239
+ for (const running of this.checkpoint.state.running){
240
+ const elapsed = now - new Date(running.startTime).getTime();
241
+ if (elapsed > 3600000) {
242
+ warnings.push(`${running.name} has been running for ${this.formatDuration(elapsed)}`);
243
+ }
244
+ }
245
+ return {
246
+ valid: issues.length === 0,
247
+ issues,
248
+ warnings
249
+ };
250
+ }
251
+ /**
252
+ * Generate recovery hints based on current state
253
+ */ generateRecoveryHints() {
254
+ const hints = [];
255
+ // Check for retriable failures
256
+ const retriableFailed = this.checkpoint.state.failed.filter((f)=>f.isRetriable);
257
+ if (retriableFailed.length > 0) {
258
+ hints.push({
259
+ type: 'info',
260
+ message: `${retriableFailed.length} package(s) failed with retriable errors`,
261
+ actionable: true,
262
+ suggestedCommand: 'kodrdriv tree [command] --continue --retry-failed'
263
+ });
264
+ }
265
+ // Check for non-retriable failures
266
+ const permanentFailed = this.checkpoint.state.failed.filter((f)=>!f.isRetriable);
267
+ if (permanentFailed.length > 0) {
268
+ hints.push({
269
+ type: 'warning',
270
+ message: `${permanentFailed.length} package(s) failed permanently`,
271
+ actionable: true,
272
+ suggestedCommand: 'kodrdriv tree [command] --continue --skip-failed'
273
+ });
274
+ for (const pkg of permanentFailed.slice(0, 3)){
275
+ var _this_graph_packages_get;
276
+ hints.push({
277
+ type: 'error',
278
+ message: `${pkg.name}: ${pkg.error}`,
279
+ actionable: true,
280
+ suggestedCommand: `# Fix the issue, then:\nkodrdriv tree [command] --continue --mark-completed "${path.basename(((_this_graph_packages_get = this.graph.packages.get(pkg.name)) === null || _this_graph_packages_get === void 0 ? void 0 : _this_graph_packages_get.path) || pkg.name)}"`
281
+ });
282
+ }
283
+ }
284
+ // Check for long-running packages
285
+ const now = Date.now();
286
+ for (const running of this.checkpoint.state.running){
287
+ const elapsed = now - new Date(running.startTime).getTime();
288
+ if (elapsed > 1800000) {
289
+ hints.push({
290
+ type: 'warning',
291
+ message: `${running.name} has been running for ${this.formatDuration(elapsed)} - may be stuck`,
292
+ actionable: false
293
+ });
294
+ }
295
+ }
296
+ // Check for state inconsistencies
297
+ const validation = this.validateState();
298
+ if (!validation.valid) {
299
+ hints.push({
300
+ type: 'error',
301
+ message: 'State inconsistencies detected - checkpoint may be corrupted',
302
+ actionable: true,
303
+ suggestedCommand: 'kodrdriv tree --validate-state'
304
+ });
305
+ }
306
+ return hints;
307
+ }
308
+ /**
309
+ * Show detailed status
310
+ */ async showStatus() {
311
+ const lines = [];
312
+ lines.push('═══════════════════════════════════════');
313
+ lines.push(' Parallel Execution Status');
314
+ lines.push('═══════════════════════════════════════');
315
+ lines.push('');
316
+ lines.push(`Execution ID: ${this.checkpoint.executionId}`);
317
+ lines.push(`Started: ${new Date(this.checkpoint.totalStartTime).toLocaleString()}`);
318
+ lines.push(`Last Updated: ${new Date(this.checkpoint.lastUpdated).toLocaleString()}`);
319
+ lines.push('');
320
+ // Progress summary
321
+ const total = this.checkpoint.buildOrder.length;
322
+ const completed = this.checkpoint.state.completed.length;
323
+ const failed = this.checkpoint.state.failed.length;
324
+ const skipped = this.checkpoint.state.skipped.length;
325
+ const running = this.checkpoint.state.running.length;
326
+ const pending = this.checkpoint.state.pending.length + this.checkpoint.state.ready.length;
327
+ lines.push('📊 Progress:');
328
+ lines.push(` Completed: ${completed}/${total} (${Math.round(completed / total * 100)}%)`);
329
+ lines.push(` Running: ${running}`);
330
+ lines.push(` Pending: ${pending}`);
331
+ lines.push(` Failed: ${failed}`);
332
+ lines.push(` Skipped: ${skipped}`);
333
+ lines.push('');
334
+ // Progress bar
335
+ const progressBar = this.createProgressBar(completed, total);
336
+ lines.push(`Progress: [${progressBar}] ${Math.round(completed / total * 100)}%`);
337
+ lines.push('');
338
+ // Running packages
339
+ if (running > 0) {
340
+ lines.push('🔄 Currently Running:');
341
+ for (const pkg of this.checkpoint.state.running){
342
+ const elapsed = Date.now() - new Date(pkg.startTime).getTime();
343
+ lines.push(` • ${pkg.name} (${this.formatDuration(elapsed)})`);
344
+ }
345
+ lines.push('');
346
+ }
347
+ // Failed packages
348
+ if (failed > 0) {
349
+ lines.push('❌ Failed Packages:');
350
+ for (const pkg of this.checkpoint.state.failed){
351
+ lines.push(` ✗ ${pkg.name}`);
352
+ lines.push(` Error: ${pkg.error}`);
353
+ lines.push(` Retriable: ${pkg.isRetriable ? 'Yes' : 'No'}`);
354
+ lines.push(` Attempts: ${pkg.attemptNumber}`);
355
+ if (pkg.dependents.length > 0) {
356
+ lines.push(` Blocked: ${pkg.dependents.length} dependent(s)`);
357
+ }
358
+ }
359
+ lines.push('');
360
+ }
361
+ // Recovery hints
362
+ const hints = this.generateRecoveryHints();
363
+ if (hints.length > 0) {
364
+ lines.push('💡 Recovery Suggestions:');
365
+ for (const hint of hints){
366
+ const icon = hint.type === 'error' ? '❌' : hint.type === 'warning' ? '⚠️' : 'ℹ️';
367
+ lines.push(` ${icon} ${hint.message}`);
368
+ if (hint.suggestedCommand) {
369
+ lines.push(` ${hint.suggestedCommand}`);
370
+ }
371
+ }
372
+ lines.push('');
373
+ }
374
+ // State validation
375
+ const validation = this.validateState();
376
+ if (!validation.valid) {
377
+ lines.push('⚠️ State Issues Detected:');
378
+ for (const issue of validation.issues){
379
+ lines.push(` • ${issue}`);
380
+ }
381
+ lines.push('');
382
+ }
383
+ if (validation.warnings.length > 0) {
384
+ lines.push('⚠️ Warnings:');
385
+ for (const warning of validation.warnings){
386
+ lines.push(` • ${warning}`);
387
+ }
388
+ lines.push('');
389
+ }
390
+ return lines.join('\n');
391
+ }
392
+ /**
393
+ * Apply multiple recovery options at once
394
+ */ async applyRecoveryOptions(options) {
395
+ this.logger.info('Applying recovery options...');
396
+ if (options.markCompleted && options.markCompleted.length > 0) {
397
+ await this.markCompleted(options.markCompleted);
398
+ }
399
+ if (options.markFailed && options.markFailed.length > 0) {
400
+ await this.markFailed(options.markFailed);
401
+ }
402
+ if (options.skipPackages && options.skipPackages.length > 0) {
403
+ await this.skipPackages(options.skipPackages);
404
+ }
405
+ if (options.retryFailed) {
406
+ await this.retryFailed({
407
+ maxRetries: options.maxRetries
408
+ });
409
+ }
410
+ if (options.skipFailed) {
411
+ await this.skipFailed();
412
+ }
413
+ if (options.resetPackage) {
414
+ await this.resetPackage(options.resetPackage);
415
+ }
416
+ this.logger.info('Recovery options applied successfully');
417
+ }
418
+ /**
419
+ * Get checkpoint for external access
420
+ */ getCheckpoint() {
421
+ return this.checkpoint;
422
+ }
423
+ // Private helper methods
424
+ removeFromAllStates(packageName) {
425
+ this.checkpoint.state.pending = this.checkpoint.state.pending.filter((p)=>p !== packageName);
426
+ this.checkpoint.state.ready = this.checkpoint.state.ready.filter((p)=>p !== packageName);
427
+ this.checkpoint.state.running = this.checkpoint.state.running.filter((r)=>r.name !== packageName);
428
+ this.checkpoint.state.completed = this.checkpoint.state.completed.filter((p)=>p !== packageName);
429
+ this.checkpoint.state.failed = this.checkpoint.state.failed.filter((f)=>f.name !== packageName);
430
+ this.checkpoint.state.skipped = this.checkpoint.state.skipped.filter((p)=>p !== packageName);
431
+ }
432
+ updateReadyState() {
433
+ // Move packages from pending to ready if dependencies met
434
+ const nowReady = [];
435
+ for (const pkg of this.checkpoint.state.pending){
436
+ const deps = this.graph.edges.get(pkg) || new Set();
437
+ const allDepsCompleted = Array.from(deps).every((dep)=>this.checkpoint.state.completed.includes(dep));
438
+ if (allDepsCompleted) {
439
+ nowReady.push(pkg);
440
+ }
441
+ }
442
+ for (const pkg of nowReady){
443
+ this.checkpoint.state.pending = this.checkpoint.state.pending.filter((p)=>p !== pkg);
444
+ this.checkpoint.state.ready.push(pkg);
445
+ }
446
+ }
447
+ findDuplicates(arr) {
448
+ const seen = new Set();
449
+ const duplicates = new Set();
450
+ for (const item of arr){
451
+ if (seen.has(item)) {
452
+ duplicates.add(item);
453
+ }
454
+ seen.add(item);
455
+ }
456
+ return Array.from(duplicates);
457
+ }
458
+ async saveCheckpoint() {
459
+ this.checkpoint.lastUpdated = new Date().toISOString();
460
+ await this.checkpointManager.save(this.checkpoint);
461
+ }
462
+ formatDuration(ms) {
463
+ const seconds = Math.floor(ms / 1000);
464
+ const minutes = Math.floor(seconds / 60);
465
+ const hours = Math.floor(minutes / 60);
466
+ if (hours > 0) {
467
+ return `${hours}h ${minutes % 60}m`;
468
+ }
469
+ if (minutes > 0) {
470
+ return `${minutes}m ${seconds % 60}s`;
471
+ }
472
+ return `${seconds}s`;
473
+ }
474
+ createProgressBar(current, total, width = 30) {
475
+ const percent = current / total;
476
+ const filled = Math.round(width * percent);
477
+ const empty = width - filled;
478
+ return '█'.repeat(filled) + '░'.repeat(empty);
479
+ }
480
+ constructor(checkpoint, graph, checkpointManager){
481
+ _define_property(this, "checkpoint", void 0);
482
+ _define_property(this, "graph", void 0);
483
+ _define_property(this, "checkpointManager", void 0);
484
+ _define_property(this, "logger", getLogger());
485
+ this.checkpoint = checkpoint;
486
+ this.graph = graph;
487
+ this.checkpointManager = checkpointManager;
488
+ }
489
+ }
490
+ /**
491
+ * Load checkpoint and create recovery manager
492
+ */ async function loadRecoveryManager(graph, outputDirectory) {
493
+ const checkpointManager = new CheckpointManager(outputDirectory);
494
+ const checkpoint = await checkpointManager.load();
495
+ if (!checkpoint) {
496
+ return null;
497
+ }
498
+ return new RecoveryManager(checkpoint, graph, checkpointManager);
499
+ }
500
+
501
+ export { RecoveryManager, loadRecoveryManager };
502
+ //# sourceMappingURL=RecoveryManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecoveryManager.js","sources":["../../src/execution/RecoveryManager.ts"],"sourcesContent":["import { getLogger } from '../logging';\nimport { DependencyGraph, findAllDependents } from '../util/dependencyGraph';\nimport { ParallelExecutionCheckpoint, FailedPackageSnapshot, RecoveryHint } from '../types/parallelExecution';\nimport { CheckpointManager } from '../util/checkpointManager';\nimport * as path from 'path';\n\nexport interface ValidationResult {\n valid: boolean;\n issues: string[];\n warnings: string[];\n}\n\nexport interface RecoveryOptions {\n markCompleted?: string[];\n markFailed?: string[];\n skipPackages?: string[];\n retryFailed?: boolean;\n skipFailed?: boolean;\n resetPackage?: string;\n maxRetries?: number;\n}\n\n/**\n * RecoveryManager provides granular control over execution state recovery\n */\nexport class RecoveryManager {\n private checkpoint: ParallelExecutionCheckpoint;\n private graph: DependencyGraph;\n private checkpointManager: CheckpointManager;\n private logger = getLogger();\n\n constructor(\n checkpoint: ParallelExecutionCheckpoint,\n graph: DependencyGraph,\n checkpointManager: CheckpointManager\n ) {\n this.checkpoint = checkpoint;\n this.graph = graph;\n this.checkpointManager = checkpointManager;\n }\n\n /**\n * Resolve a package identifier (directory name or package name) to a package name\n */\n private resolvePackageName(identifier: string): string | null {\n // Try exact package name match first\n if (this.graph.packages.has(identifier)) {\n return identifier;\n }\n\n // Try directory name match\n for (const [pkgName, pkgInfo] of this.graph.packages) {\n const dirName = path.basename(pkgInfo.path);\n if (dirName === identifier) {\n return pkgName;\n }\n }\n\n return null;\n }\n\n /**\n * Mark packages as completed\n * Accepts either package names (e.g., \"@eldrforge/git-tools\") or directory names (e.g., \"git-tools\")\n */\n async markCompleted(packages: string[]): Promise<void> {\n this.logger.info(`Marking ${packages.length} package(s) as completed...`);\n\n for (const pkgIdentifier of packages) {\n // Resolve identifier to package name\n const pkg = this.resolvePackageName(pkgIdentifier);\n\n if (!pkg) {\n // List available packages for better error message\n const available = Array.from(this.graph.packages.entries())\n .map(([name, info]) => `${path.basename(info.path)} (${name})`)\n .join(', ');\n throw new Error(`Package not found: ${pkgIdentifier}. Available packages: ${available}`);\n }\n\n // Validate not already completed\n if (this.checkpoint.state.completed.includes(pkg)) {\n this.logger.warn(`Package ${pkg} already completed`);\n continue;\n }\n\n // Remove from other states\n this.removeFromAllStates(pkg);\n\n // Add to completed\n this.checkpoint.state.completed.push(pkg);\n\n this.logger.info(`✓ Marked ${pkg} as completed`);\n }\n\n // Update ready queue\n this.updateReadyState();\n\n // Save checkpoint\n await this.saveCheckpoint();\n\n this.logger.info('State updated successfully');\n }\n\n /**\n * Mark packages as failed\n */\n async markFailed(packages: string[], reason: string = 'Manually marked as failed'): Promise<void> {\n this.logger.info(`Marking ${packages.length} package(s) as failed...`);\n\n for (const pkg of packages) {\n // Validate package exists\n if (!this.graph.packages.has(pkg)) {\n throw new Error(`Package not found: ${pkg}`);\n }\n\n // Remove from other states\n this.removeFromAllStates(pkg);\n\n // Add to failed\n const failureInfo: FailedPackageSnapshot = {\n name: pkg,\n error: reason,\n isRetriable: false,\n attemptNumber: 1,\n failedAt: new Date().toISOString(),\n dependencies: Array.from(this.graph.edges.get(pkg) || []),\n dependents: Array.from(findAllDependents(pkg, this.graph))\n };\n\n this.checkpoint.state.failed.push(failureInfo);\n\n this.logger.info(`✗ Marked ${pkg} as failed`);\n\n // Cascade to dependents\n const dependents = findAllDependents(pkg, this.graph);\n for (const dep of dependents) {\n this.removeFromAllStates(dep);\n this.checkpoint.state.skipped.push(dep);\n this.logger.warn(`⊘ Skipped ${dep} (depends on failed ${pkg})`);\n }\n }\n\n await this.saveCheckpoint();\n }\n\n /**\n * Skip packages and their dependents\n */\n async skipPackages(packages: string[]): Promise<void> {\n this.logger.info(`Skipping ${packages.length} package(s)...`);\n\n const toSkip = new Set<string>(packages);\n\n // Find all dependents\n for (const pkg of packages) {\n const dependents = findAllDependents(pkg, this.graph);\n for (const dep of dependents) {\n toSkip.add(dep);\n }\n }\n\n this.logger.info(`Total packages to skip (including dependents): ${toSkip.size}`);\n\n for (const pkg of toSkip) {\n this.removeFromAllStates(pkg);\n if (!this.checkpoint.state.skipped.includes(pkg)) {\n this.checkpoint.state.skipped.push(pkg);\n }\n this.logger.info(`⊘ Skipped ${pkg}`);\n }\n\n await this.saveCheckpoint();\n }\n\n /**\n * Retry failed packages\n */\n async retryFailed(options?: { maxRetries?: number }): Promise<void> {\n const failed = this.checkpoint.state.failed;\n\n if (failed.length === 0) {\n this.logger.info('No failed packages to retry');\n return;\n }\n\n this.logger.info(`Retrying ${failed.length} failed package(s)...`);\n\n const retriable: FailedPackageSnapshot[] = [];\n const nonRetriable: FailedPackageSnapshot[] = [];\n\n for (const failedPkg of failed) {\n if (failedPkg.isRetriable || options?.maxRetries) {\n retriable.push(failedPkg);\n } else {\n nonRetriable.push(failedPkg);\n }\n }\n\n if (nonRetriable.length > 0) {\n this.logger.warn(`${nonRetriable.length} package(s) are not retriable: ${nonRetriable.map(p => p.name).join(', ')}`);\n if (!options?.maxRetries) {\n this.logger.warn('Use --max-retries to force retry of non-retriable packages');\n }\n }\n\n for (const failedPkg of retriable) {\n // Reset retry count if max retries overridden\n if (options?.maxRetries) {\n this.checkpoint.retryAttempts[failedPkg.name] = 0;\n }\n\n // Move back to pending\n this.removeFromAllStates(failedPkg.name);\n this.checkpoint.state.pending.push(failedPkg.name);\n\n // Un-skip dependents if they were skipped\n for (const dependent of failedPkg.dependents) {\n if (this.checkpoint.state.skipped.includes(dependent)) {\n this.checkpoint.state.skipped = this.checkpoint.state.skipped.filter(p => p !== dependent);\n this.checkpoint.state.pending.push(dependent);\n this.logger.info(`↻ ${dependent} moved back to pending (was skipped)`);\n }\n }\n\n this.logger.info(`↻ ${failedPkg.name} moved to pending for retry`);\n }\n\n // Keep only non-retriable failures in failed state\n this.checkpoint.state.failed = nonRetriable;\n\n // Update ready queue\n this.updateReadyState();\n\n await this.saveCheckpoint();\n\n this.logger.info(`${retriable.length} package(s) reset for retry`);\n }\n\n /**\n * Skip failed packages and continue with remaining\n */\n async skipFailed(): Promise<void> {\n const failed = this.checkpoint.state.failed.map(f => f.name);\n\n if (failed.length === 0) {\n this.logger.info('No failed packages to skip');\n return;\n }\n\n this.logger.info(`Skipping ${failed.length} failed package(s) and their dependents...`);\n\n await this.skipPackages(failed);\n\n // Clear failed state\n this.checkpoint.state.failed = [];\n\n this.logger.info('Failed packages skipped, execution can continue');\n }\n\n /**\n * Reset specific package to initial state\n */\n async resetPackage(packageName: string): Promise<void> {\n this.logger.info(`Resetting package: ${packageName}`);\n\n if (!this.graph.packages.has(packageName)) {\n throw new Error(`Package not found: ${packageName}`);\n }\n\n // Remove from all states\n this.removeFromAllStates(packageName);\n\n // Add back to pending\n this.checkpoint.state.pending.push(packageName);\n\n // Clear retry attempts\n delete this.checkpoint.retryAttempts[packageName];\n delete this.checkpoint.packageStartTimes[packageName];\n delete this.checkpoint.packageEndTimes[packageName];\n delete this.checkpoint.packageDurations[packageName];\n\n await this.saveCheckpoint();\n\n this.logger.info(`✓ ${packageName} reset to initial state`);\n }\n\n /**\n * Validate checkpoint state integrity\n */\n validateState(): ValidationResult {\n const issues: string[] = [];\n const warnings: string[] = [];\n\n // Check for duplicates across states\n const allPackages: string[] = [\n ...this.checkpoint.state.pending,\n ...this.checkpoint.state.ready,\n ...this.checkpoint.state.running.map(r => r.name),\n ...this.checkpoint.state.completed,\n ...this.checkpoint.state.failed.map(f => f.name),\n ...this.checkpoint.state.skipped\n ];\n\n const duplicates = this.findDuplicates(allPackages);\n if (duplicates.length > 0) {\n issues.push(`Packages in multiple states: ${duplicates.join(', ')}`);\n }\n\n // Check for missing packages\n const missing = this.checkpoint.buildOrder.filter(\n pkg => !allPackages.includes(pkg)\n );\n if (missing.length > 0) {\n issues.push(`Missing packages: ${missing.join(', ')}`);\n }\n\n // Check dependency consistency\n for (const pkg of this.checkpoint.state.completed) {\n const deps = this.graph.edges.get(pkg) || new Set();\n for (const dep of deps) {\n if (!this.checkpoint.state.completed.includes(dep)) {\n warnings.push(`${pkg} completed but dependency ${dep} not completed`);\n }\n }\n }\n\n // Check for stale running packages\n const now = Date.now();\n for (const running of this.checkpoint.state.running) {\n const elapsed = now - new Date(running.startTime).getTime();\n if (elapsed > 3600000) { // 1 hour\n warnings.push(`${running.name} has been running for ${this.formatDuration(elapsed)}`);\n }\n }\n\n return {\n valid: issues.length === 0,\n issues,\n warnings\n };\n }\n\n /**\n * Generate recovery hints based on current state\n */\n generateRecoveryHints(): RecoveryHint[] {\n const hints: RecoveryHint[] = [];\n\n // Check for retriable failures\n const retriableFailed = this.checkpoint.state.failed.filter(f => f.isRetriable);\n if (retriableFailed.length > 0) {\n hints.push({\n type: 'info',\n message: `${retriableFailed.length} package(s) failed with retriable errors`,\n actionable: true,\n suggestedCommand: 'kodrdriv tree [command] --continue --retry-failed'\n });\n }\n\n // Check for non-retriable failures\n const permanentFailed = this.checkpoint.state.failed.filter(f => !f.isRetriable);\n if (permanentFailed.length > 0) {\n hints.push({\n type: 'warning',\n message: `${permanentFailed.length} package(s) failed permanently`,\n actionable: true,\n suggestedCommand: 'kodrdriv tree [command] --continue --skip-failed'\n });\n\n for (const pkg of permanentFailed.slice(0, 3)) { // Limit to first 3\n hints.push({\n type: 'error',\n message: `${pkg.name}: ${pkg.error}`,\n actionable: true,\n suggestedCommand: `# Fix the issue, then:\\nkodrdriv tree [command] --continue --mark-completed \"${path.basename(this.graph.packages.get(pkg.name)?.path || pkg.name)}\"`\n });\n }\n }\n\n // Check for long-running packages\n const now = Date.now();\n for (const running of this.checkpoint.state.running) {\n const elapsed = now - new Date(running.startTime).getTime();\n if (elapsed > 1800000) { // 30 minutes\n hints.push({\n type: 'warning',\n message: `${running.name} has been running for ${this.formatDuration(elapsed)} - may be stuck`,\n actionable: false\n });\n }\n }\n\n // Check for state inconsistencies\n const validation = this.validateState();\n if (!validation.valid) {\n hints.push({\n type: 'error',\n message: 'State inconsistencies detected - checkpoint may be corrupted',\n actionable: true,\n suggestedCommand: 'kodrdriv tree --validate-state'\n });\n }\n\n return hints;\n }\n\n /**\n * Show detailed status\n */\n async showStatus(): Promise<string> {\n const lines: string[] = [];\n\n lines.push('═══════════════════════════════════════');\n lines.push(' Parallel Execution Status');\n lines.push('═══════════════════════════════════════');\n lines.push('');\n lines.push(`Execution ID: ${this.checkpoint.executionId}`);\n lines.push(`Started: ${new Date(this.checkpoint.totalStartTime).toLocaleString()}`);\n lines.push(`Last Updated: ${new Date(this.checkpoint.lastUpdated).toLocaleString()}`);\n lines.push('');\n\n // Progress summary\n const total = this.checkpoint.buildOrder.length;\n const completed = this.checkpoint.state.completed.length;\n const failed = this.checkpoint.state.failed.length;\n const skipped = this.checkpoint.state.skipped.length;\n const running = this.checkpoint.state.running.length;\n const pending = this.checkpoint.state.pending.length + this.checkpoint.state.ready.length;\n\n lines.push('📊 Progress:');\n lines.push(` Completed: ${completed}/${total} (${Math.round(completed/total*100)}%)`);\n lines.push(` Running: ${running}`);\n lines.push(` Pending: ${pending}`);\n lines.push(` Failed: ${failed}`);\n lines.push(` Skipped: ${skipped}`);\n lines.push('');\n\n // Progress bar\n const progressBar = this.createProgressBar(completed, total);\n lines.push(`Progress: [${progressBar}] ${Math.round(completed/total*100)}%`);\n lines.push('');\n\n // Running packages\n if (running > 0) {\n lines.push('🔄 Currently Running:');\n for (const pkg of this.checkpoint.state.running) {\n const elapsed = Date.now() - new Date(pkg.startTime).getTime();\n lines.push(` • ${pkg.name} (${this.formatDuration(elapsed)})`);\n }\n lines.push('');\n }\n\n // Failed packages\n if (failed > 0) {\n lines.push('❌ Failed Packages:');\n for (const pkg of this.checkpoint.state.failed) {\n lines.push(` ✗ ${pkg.name}`);\n lines.push(` Error: ${pkg.error}`);\n lines.push(` Retriable: ${pkg.isRetriable ? 'Yes' : 'No'}`);\n lines.push(` Attempts: ${pkg.attemptNumber}`);\n if (pkg.dependents.length > 0) {\n lines.push(` Blocked: ${pkg.dependents.length} dependent(s)`);\n }\n }\n lines.push('');\n }\n\n // Recovery hints\n const hints = this.generateRecoveryHints();\n if (hints.length > 0) {\n lines.push('💡 Recovery Suggestions:');\n for (const hint of hints) {\n const icon = hint.type === 'error' ? '❌' : hint.type === 'warning' ? '⚠️' : 'ℹ️';\n lines.push(` ${icon} ${hint.message}`);\n if (hint.suggestedCommand) {\n lines.push(` ${hint.suggestedCommand}`);\n }\n }\n lines.push('');\n }\n\n // State validation\n const validation = this.validateState();\n if (!validation.valid) {\n lines.push('⚠️ State Issues Detected:');\n for (const issue of validation.issues) {\n lines.push(` • ${issue}`);\n }\n lines.push('');\n }\n\n if (validation.warnings.length > 0) {\n lines.push('⚠️ Warnings:');\n for (const warning of validation.warnings) {\n lines.push(` • ${warning}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Apply multiple recovery options at once\n */\n async applyRecoveryOptions(options: RecoveryOptions): Promise<void> {\n this.logger.info('Applying recovery options...');\n\n if (options.markCompleted && options.markCompleted.length > 0) {\n await this.markCompleted(options.markCompleted);\n }\n\n if (options.markFailed && options.markFailed.length > 0) {\n await this.markFailed(options.markFailed);\n }\n\n if (options.skipPackages && options.skipPackages.length > 0) {\n await this.skipPackages(options.skipPackages);\n }\n\n if (options.retryFailed) {\n await this.retryFailed({ maxRetries: options.maxRetries });\n }\n\n if (options.skipFailed) {\n await this.skipFailed();\n }\n\n if (options.resetPackage) {\n await this.resetPackage(options.resetPackage);\n }\n\n this.logger.info('Recovery options applied successfully');\n }\n\n /**\n * Get checkpoint for external access\n */\n getCheckpoint(): ParallelExecutionCheckpoint {\n return this.checkpoint;\n }\n\n // Private helper methods\n\n private removeFromAllStates(packageName: string): void {\n this.checkpoint.state.pending = this.checkpoint.state.pending.filter(p => p !== packageName);\n this.checkpoint.state.ready = this.checkpoint.state.ready.filter(p => p !== packageName);\n this.checkpoint.state.running = this.checkpoint.state.running.filter(r => r.name !== packageName);\n this.checkpoint.state.completed = this.checkpoint.state.completed.filter(p => p !== packageName);\n this.checkpoint.state.failed = this.checkpoint.state.failed.filter(f => f.name !== packageName);\n this.checkpoint.state.skipped = this.checkpoint.state.skipped.filter(p => p !== packageName);\n }\n\n private updateReadyState(): void {\n // Move packages from pending to ready if dependencies met\n const nowReady: string[] = [];\n\n for (const pkg of this.checkpoint.state.pending) {\n const deps = this.graph.edges.get(pkg) || new Set();\n const allDepsCompleted = Array.from(deps).every(dep =>\n this.checkpoint.state.completed.includes(dep)\n );\n\n if (allDepsCompleted) {\n nowReady.push(pkg);\n }\n }\n\n for (const pkg of nowReady) {\n this.checkpoint.state.pending = this.checkpoint.state.pending.filter(p => p !== pkg);\n this.checkpoint.state.ready.push(pkg);\n }\n }\n\n private findDuplicates(arr: string[]): string[] {\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const item of arr) {\n if (seen.has(item)) {\n duplicates.add(item);\n }\n seen.add(item);\n }\n\n return Array.from(duplicates);\n }\n\n private async saveCheckpoint(): Promise<void> {\n this.checkpoint.lastUpdated = new Date().toISOString();\n await this.checkpointManager.save(this.checkpoint);\n }\n\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n }\n\n private createProgressBar(current: number, total: number, width: number = 30): string {\n const percent = current / total;\n const filled = Math.round(width * percent);\n const empty = width - filled;\n\n return '█'.repeat(filled) + '░'.repeat(empty);\n }\n}\n\n/**\n * Load checkpoint and create recovery manager\n */\nexport async function loadRecoveryManager(\n graph: DependencyGraph,\n outputDirectory?: string\n): Promise<RecoveryManager | null> {\n const checkpointManager = new CheckpointManager(outputDirectory);\n const checkpoint = await checkpointManager.load();\n\n if (!checkpoint) {\n return null;\n }\n\n return new RecoveryManager(checkpoint, graph, checkpointManager);\n}\n"],"names":["RecoveryManager","resolvePackageName","identifier","graph","packages","has","pkgName","pkgInfo","dirName","path","basename","markCompleted","logger","info","length","pkgIdentifier","pkg","available","Array","from","entries","map","name","join","Error","checkpoint","state","completed","includes","warn","removeFromAllStates","push","updateReadyState","saveCheckpoint","markFailed","reason","failureInfo","error","isRetriable","attemptNumber","failedAt","Date","toISOString","dependencies","edges","get","dependents","findAllDependents","failed","dep","skipped","skipPackages","toSkip","Set","add","size","retryFailed","options","retriable","nonRetriable","failedPkg","maxRetries","p","retryAttempts","pending","dependent","filter","skipFailed","f","resetPackage","packageName","packageStartTimes","packageEndTimes","packageDurations","validateState","issues","warnings","allPackages","ready","running","r","duplicates","findDuplicates","missing","buildOrder","deps","now","elapsed","startTime","getTime","formatDuration","valid","generateRecoveryHints","hints","retriableFailed","type","message","actionable","suggestedCommand","permanentFailed","slice","validation","showStatus","lines","executionId","totalStartTime","toLocaleString","lastUpdated","total","Math","round","progressBar","createProgressBar","hint","icon","issue","warning","applyRecoveryOptions","getCheckpoint","nowReady","allDepsCompleted","every","arr","seen","item","checkpointManager","save","ms","seconds","floor","minutes","hours","current","width","percent","filled","empty","repeat","getLogger","loadRecoveryManager","outputDirectory","CheckpointManager","load"],"mappings":"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"}