@eldrforge/kodrdriv 1.2.129 → 1.2.131
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/DUPLICATION-CLEANUP.md +104 -0
- package/dist/application.js +1 -2
- package/dist/application.js.map +1 -1
- package/dist/commands/audio-commit.js +1 -2
- package/dist/commands/audio-commit.js.map +1 -1
- package/dist/commands/clean.js +1 -2
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/commit.js +1 -2
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/review.js +1 -2
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/tree.js +5 -5
- package/dist/commands/tree.js.map +1 -1
- package/dist/commands/versions.js.map +1 -1
- package/dist/constants.js +1 -1
- package/dist/content/diff.js +1 -1
- package/dist/content/diff.js.map +1 -1
- package/dist/content/log.js +1 -1
- package/dist/content/log.js.map +1 -1
- package/package.json +9 -7
- package/dist/error/CancellationError.js +0 -9
- package/dist/error/CancellationError.js.map +0 -1
- package/dist/error/CommandErrors.js +0 -63
- package/dist/error/CommandErrors.js.map +0 -1
- package/dist/error/ExitError.js +0 -9
- package/dist/error/ExitError.js.map +0 -1
- package/dist/execution/CommandValidator.js +0 -192
- package/dist/execution/CommandValidator.js.map +0 -1
- package/dist/execution/DependencyChecker.js +0 -102
- package/dist/execution/DependencyChecker.js.map +0 -1
- package/dist/execution/DynamicTaskPool.js +0 -661
- package/dist/execution/DynamicTaskPool.js.map +0 -1
- package/dist/execution/RecoveryManager.js +0 -584
- package/dist/execution/RecoveryManager.js.map +0 -1
- package/dist/execution/ResourceMonitor.js +0 -150
- package/dist/execution/ResourceMonitor.js.map +0 -1
- package/dist/execution/Scheduler.js +0 -98
- package/dist/execution/Scheduler.js.map +0 -1
- package/dist/execution/TreeExecutionAdapter.js +0 -225
- package/dist/execution/TreeExecutionAdapter.js.map +0 -1
- package/dist/ui/ProgressFormatter.js +0 -250
- package/dist/ui/ProgressFormatter.js.map +0 -1
- package/dist/util/checkpointManager.js +0 -166
- package/dist/util/checkpointManager.js.map +0 -1
- package/dist/util/dependencyGraph.js +0 -222
- package/dist/util/dependencyGraph.js.map +0 -1
- package/dist/util/mutex.js +0 -96
- package/dist/util/mutex.js.map +0 -1
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
import { DynamicTaskPool } from './DynamicTaskPool.js';
|
|
2
|
-
import { getLogger } from '../logging.js';
|
|
3
|
-
import { ProgressFormatter } from '../ui/ProgressFormatter.js';
|
|
4
|
-
|
|
5
|
-
function _define_property(obj, key, value) {
|
|
6
|
-
if (key in obj) {
|
|
7
|
-
Object.defineProperty(obj, key, {
|
|
8
|
-
value: value,
|
|
9
|
-
enumerable: true,
|
|
10
|
-
configurable: true,
|
|
11
|
-
writable: true
|
|
12
|
-
});
|
|
13
|
-
} else {
|
|
14
|
-
obj[key] = value;
|
|
15
|
-
}
|
|
16
|
-
return obj;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* TreeExecutionAdapter bridges DynamicTaskPool with tree.ts executePackage
|
|
20
|
-
*/ class TreeExecutionAdapter {
|
|
21
|
-
/**
|
|
22
|
-
* Create wrapper that adapts tree.ts executePackage to DynamicTaskPool format
|
|
23
|
-
*/ createExecutePackageWrapper() {
|
|
24
|
-
return async (packageName, _signal)=>{
|
|
25
|
-
const packageInfo = this.config.graph.packages.get(packageName);
|
|
26
|
-
if (!packageInfo) {
|
|
27
|
-
throw new Error(`Package not found: ${packageName}`);
|
|
28
|
-
}
|
|
29
|
-
const allPackageNames = new Set(this.config.graph.packages.keys());
|
|
30
|
-
const isDryRun = this.config.config.dryRun || false;
|
|
31
|
-
const isBuiltInCommand = !this.config.command.startsWith('npm') && !this.config.command.includes('&&');
|
|
32
|
-
// Increment started count and use it as index for progress display
|
|
33
|
-
const currentIndex = this.startedCount++;
|
|
34
|
-
// Call tree.ts executePackage
|
|
35
|
-
const startTime = Date.now();
|
|
36
|
-
const result = await this.executePackageFn(packageName, packageInfo, this.config.command, this.config.config, isDryRun, currentIndex, this.config.graph.packages.size, allPackageNames, isBuiltInCommand);
|
|
37
|
-
const duration = Date.now() - startTime;
|
|
38
|
-
if (!result.success) {
|
|
39
|
-
// Attach logFile path to error for better error reporting
|
|
40
|
-
const error = result.error || new Error('Package execution failed');
|
|
41
|
-
error.logFilePath = result.logFile;
|
|
42
|
-
throw error;
|
|
43
|
-
}
|
|
44
|
-
// Check if this was a "no changes" skip (result will have skippedNoChanges flag)
|
|
45
|
-
const skippedNoChanges = result.skippedNoChanges || false;
|
|
46
|
-
return {
|
|
47
|
-
success: true,
|
|
48
|
-
duration,
|
|
49
|
-
// Extract published version if available (from output or state)
|
|
50
|
-
publishedVersion: undefined,
|
|
51
|
-
stdout: undefined,
|
|
52
|
-
stderr: undefined,
|
|
53
|
-
skippedNoChanges
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Execute parallel execution
|
|
59
|
-
*/ async execute() {
|
|
60
|
-
return await this.pool.execute();
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Get the underlying task pool for event listeners
|
|
64
|
-
*/ getPool() {
|
|
65
|
-
return this.pool;
|
|
66
|
-
}
|
|
67
|
-
constructor(config, executePackageFn){
|
|
68
|
-
_define_property(this, "pool", void 0);
|
|
69
|
-
_define_property(this, "executePackageFn", void 0);
|
|
70
|
-
_define_property(this, "config", void 0);
|
|
71
|
-
_define_property(this, "startedCount", 0);
|
|
72
|
-
_define_property(this, "completedCount", 0);
|
|
73
|
-
this.config = config;
|
|
74
|
-
this.executePackageFn = executePackageFn;
|
|
75
|
-
// Create custom pool that uses our execute function
|
|
76
|
-
this.pool = new DynamicTaskPool(config);
|
|
77
|
-
// Track completion count for progress display
|
|
78
|
-
this.pool.on('package:completed', ()=>{
|
|
79
|
-
this.completedCount++;
|
|
80
|
-
});
|
|
81
|
-
// Override the executePackage method to use tree.ts function
|
|
82
|
-
this.pool.executePackage = this.createExecutePackageWrapper();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Create progress logger that listens to pool events
|
|
87
|
-
*/ function createParallelProgressLogger(pool, config) {
|
|
88
|
-
const logger = getLogger();
|
|
89
|
-
const startTime = Date.now();
|
|
90
|
-
let completedCount = 0;
|
|
91
|
-
let totalPackages = 0;
|
|
92
|
-
pool.on('execution:started', ({ totalPackages: total })=>{
|
|
93
|
-
totalPackages = total;
|
|
94
|
-
logger.info(`\nPARALLEL_EXECUTION_STARTING: Initiating parallel package execution | Package Count: ${total} | Mode: parallel | Strategy: dependency-aware`);
|
|
95
|
-
});
|
|
96
|
-
pool.on('package:started', ({ packageName })=>{
|
|
97
|
-
if (config.verbose || config.debug) {
|
|
98
|
-
logger.info(`PACKAGE_STARTED: Package execution initiated | Package: ${packageName} | Status: running`);
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
pool.on('package:completed', ({ packageName, result })=>{
|
|
102
|
-
completedCount++;
|
|
103
|
-
const percent = Math.round(completedCount / totalPackages * 100);
|
|
104
|
-
const elapsed = Math.round((Date.now() - startTime) / 1000);
|
|
105
|
-
if (config.debug) {
|
|
106
|
-
logger.info(`PACKAGE_COMPLETED: Package execution finished successfully | Package: ${packageName} | Duration: ${result.duration}ms | Progress: ${completedCount}/${totalPackages} (${percent}%) | Elapsed: ${elapsed}s`);
|
|
107
|
-
} else if (config.verbose) {
|
|
108
|
-
logger.info(`PACKAGE_COMPLETED: Package execution finished | Package: ${packageName} | Progress: ${completedCount}/${totalPackages}`);
|
|
109
|
-
} else {
|
|
110
|
-
// Minimal output
|
|
111
|
-
logger.info(`PROGRESS: [${completedCount}/${totalPackages}] Package completed: ${packageName}`);
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
pool.on('package:failed', ({ packageName, error })=>{
|
|
115
|
-
logger.error(`PACKAGE_FAILED: Package execution failed | Package: ${packageName} | Error: ${error.message} | Status: error`);
|
|
116
|
-
});
|
|
117
|
-
pool.on('package:retrying', ({ packageName, attemptNumber })=>{
|
|
118
|
-
logger.warn(`PACKAGE_RETRYING: Retrying package execution | Package: ${packageName} | Attempt: ${attemptNumber} | Status: retrying`);
|
|
119
|
-
});
|
|
120
|
-
pool.on('package:skipped', ({ packageName, reason })=>{
|
|
121
|
-
logger.warn(`PACKAGE_SKIPPED: Package skipped due to dependency failure | Package: ${packageName} | Reason: ${reason} | Status: skipped`);
|
|
122
|
-
});
|
|
123
|
-
pool.on('package:skipped-no-changes', ({ packageName })=>{
|
|
124
|
-
if (config.verbose || config.debug) {
|
|
125
|
-
logger.info(`PACKAGE_SKIPPED_NO_CHANGES: Package skipped due to no code changes | Package: ${packageName} | Reason: no-code-changes | Status: skipped`);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
pool.on('checkpoint:saved', ()=>{
|
|
129
|
-
if (config.debug) {
|
|
130
|
-
logger.debug('CHECKPOINT_SAVED: Execution checkpoint saved | Purpose: Recovery support | Action: State persisted to disk');
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
pool.on('execution:completed', ({ result })=>{
|
|
134
|
-
const totalTime = Math.round((Date.now() - startTime) / 1000);
|
|
135
|
-
logger.info(`\nPARALLEL_EXECUTION_COMPLETED: Parallel execution finished | Duration: ${totalTime}s | Status: completed`);
|
|
136
|
-
if (config.verbose || config.debug) {
|
|
137
|
-
logger.info(`\nEXECUTION_METRICS: Performance and execution statistics:`);
|
|
138
|
-
logger.info(` METRIC_TOTAL_PACKAGES: ${result.totalPackages}`);
|
|
139
|
-
logger.info(` METRIC_COMPLETED: ${result.completed.length} packages successfully completed`);
|
|
140
|
-
logger.info(` METRIC_SKIPPED_NO_CHANGES: ${result.skippedNoChanges.length} packages skipped (no changes)`);
|
|
141
|
-
logger.info(` METRIC_SKIPPED_DEPENDENCIES: ${result.skipped.length} packages skipped (dependency failures)`);
|
|
142
|
-
logger.info(` METRIC_FAILED: ${result.failed.length} packages failed`);
|
|
143
|
-
logger.info(` METRIC_PEAK_CONCURRENCY: ${result.metrics.peakConcurrency} packages running simultaneously`);
|
|
144
|
-
logger.info(` METRIC_AVG_CONCURRENCY: ${result.metrics.averageConcurrency.toFixed(1)} average concurrent packages`);
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Format parallel execution result for display
|
|
150
|
-
*/ function formatParallelResult(result) {
|
|
151
|
-
var _result_metrics, _result_metrics1;
|
|
152
|
-
const lines = [];
|
|
153
|
-
// Separator line
|
|
154
|
-
lines.push('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
155
|
-
lines.push('📊 Publish Summary');
|
|
156
|
-
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
157
|
-
// Detailed status breakdown by category
|
|
158
|
-
if (result.completed.length > 0) {
|
|
159
|
-
lines.push(`✅ Published (${result.completed.length}):`);
|
|
160
|
-
for (const pkg of result.completed){
|
|
161
|
-
lines.push(` - ${pkg}`);
|
|
162
|
-
}
|
|
163
|
-
lines.push('');
|
|
164
|
-
}
|
|
165
|
-
if (result.skippedNoChanges.length > 0) {
|
|
166
|
-
lines.push(`⏭️ Skipped (${result.skippedNoChanges.length}) - no code changes:`);
|
|
167
|
-
for (const pkg of result.skippedNoChanges){
|
|
168
|
-
lines.push(` - ${pkg}`);
|
|
169
|
-
}
|
|
170
|
-
lines.push('');
|
|
171
|
-
}
|
|
172
|
-
if (result.failed.length > 0) {
|
|
173
|
-
lines.push(`❌ Failed (${result.failed.length}):`);
|
|
174
|
-
for (const pkg of result.failed){
|
|
175
|
-
lines.push(` - ${typeof pkg === 'string' ? pkg : pkg.name}`);
|
|
176
|
-
}
|
|
177
|
-
lines.push('');
|
|
178
|
-
}
|
|
179
|
-
if (result.skipped.length > 0) {
|
|
180
|
-
lines.push(`⊘ Skipped due to dependencies (${result.skipped.length}):`);
|
|
181
|
-
for (const pkg of result.skipped){
|
|
182
|
-
lines.push(` - ${pkg}`);
|
|
183
|
-
}
|
|
184
|
-
lines.push('');
|
|
185
|
-
}
|
|
186
|
-
// Summary line
|
|
187
|
-
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
188
|
-
// Calculate success rate
|
|
189
|
-
const totalProcessed = result.completed.length + result.failed.length + result.skippedNoChanges.length;
|
|
190
|
-
const successRate = totalProcessed > 0 ? Math.round(result.completed.length / totalProcessed * 100) : 0;
|
|
191
|
-
// Format elapsed time
|
|
192
|
-
const totalTimeMs = ((_result_metrics = result.metrics) === null || _result_metrics === void 0 ? void 0 : _result_metrics.totalDuration) || 0;
|
|
193
|
-
const minutes = Math.floor(totalTimeMs / 60000);
|
|
194
|
-
const seconds = Math.floor(totalTimeMs % 60000 / 1000);
|
|
195
|
-
const timeStr = minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
|
|
196
|
-
lines.push(`Total time: ${timeStr}`);
|
|
197
|
-
lines.push(`Success rate: ${successRate}% (${result.completed.length}/${totalProcessed} packages processed)`);
|
|
198
|
-
if ((_result_metrics1 = result.metrics) === null || _result_metrics1 === void 0 ? void 0 : _result_metrics1.peakConcurrency) {
|
|
199
|
-
lines.push(`Peak concurrency: ${result.metrics.peakConcurrency} packages`);
|
|
200
|
-
}
|
|
201
|
-
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
202
|
-
// Failed packages with formatted error summary
|
|
203
|
-
if (result.failed.length > 0) {
|
|
204
|
-
lines.push('');
|
|
205
|
-
const errorLines = ProgressFormatter.createErrorSummary(result.failed);
|
|
206
|
-
lines.push(...errorLines);
|
|
207
|
-
// Next steps for failures
|
|
208
|
-
lines.push('\n📋 Next steps:');
|
|
209
|
-
lines.push('1. Review the errors above for each failed package');
|
|
210
|
-
lines.push('2. Fix the issues in the failed packages');
|
|
211
|
-
lines.push('3. Retry the publish command');
|
|
212
|
-
if (result.skipped.length > 0) {
|
|
213
|
-
lines.push('\nNote: Once failed packages are fixed, their dependent packages will also be published.');
|
|
214
|
-
}
|
|
215
|
-
// Recovery guidance
|
|
216
|
-
const hasRetriable = result.failed.some((f)=>f.isRetriable);
|
|
217
|
-
const hasPermanent = result.failed.some((f)=>!f.isRetriable);
|
|
218
|
-
const recoveryLines = ProgressFormatter.createRecoveryGuidance(hasRetriable, hasPermanent);
|
|
219
|
-
lines.push(...recoveryLines);
|
|
220
|
-
}
|
|
221
|
-
return lines.join('\n');
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
export { TreeExecutionAdapter, createParallelProgressLogger, formatParallelResult };
|
|
225
|
-
//# sourceMappingURL=TreeExecutionAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TreeExecutionAdapter.js","sources":["../../src/execution/TreeExecutionAdapter.ts"],"sourcesContent":["import { DynamicTaskPool, PoolConfig } from './DynamicTaskPool';\nimport { PackageInfo } from '../util/dependencyGraph';\nimport { Config } from '../types';\nimport { PackageResult } from '../types/parallelExecution';\nimport { getLogger } from '../logging';\n\n/**\n * ExecutePackageFunction type matches the signature of tree.ts executePackage\n */\nexport type ExecutePackageFunction = (\n packageName: string,\n packageInfo: PackageInfo,\n commandToRun: string,\n runConfig: Config,\n isDryRun: boolean,\n index: number,\n total: number,\n allPackageNames: Set<string>,\n isBuiltInCommand?: boolean\n) => Promise<{ success: boolean; error?: any; isTimeoutError?: boolean; skippedNoChanges?: boolean; logFile?: string }>;\n\n/**\n * TreeExecutionAdapter bridges DynamicTaskPool with tree.ts executePackage\n */\nexport class TreeExecutionAdapter {\n private pool: DynamicTaskPool;\n private executePackageFn: ExecutePackageFunction;\n private config: PoolConfig;\n private startedCount: number = 0;\n private completedCount: number = 0;\n\n constructor(config: PoolConfig, executePackageFn: ExecutePackageFunction) {\n this.config = config;\n this.executePackageFn = executePackageFn;\n\n // Create custom pool that uses our execute function\n this.pool = new DynamicTaskPool(config);\n\n // Track completion count for progress display\n this.pool.on('package:completed', () => {\n this.completedCount++;\n });\n\n // Override the executePackage method to use tree.ts function\n (this.pool as any).executePackage = this.createExecutePackageWrapper();\n }\n\n /**\n * Create wrapper that adapts tree.ts executePackage to DynamicTaskPool format\n */\n private createExecutePackageWrapper() {\n return async (packageName: string, _signal: AbortSignal): Promise<PackageResult> => {\n const packageInfo = this.config.graph.packages.get(packageName);\n if (!packageInfo) {\n throw new Error(`Package not found: ${packageName}`);\n }\n\n const allPackageNames = new Set(this.config.graph.packages.keys());\n const isDryRun = this.config.config.dryRun || false;\n const isBuiltInCommand = !this.config.command.startsWith('npm') &&\n !this.config.command.includes('&&');\n\n // Increment started count and use it as index for progress display\n const currentIndex = this.startedCount++;\n\n // Call tree.ts executePackage\n const startTime = Date.now();\n const result = await this.executePackageFn(\n packageName,\n packageInfo,\n this.config.command,\n this.config.config,\n isDryRun,\n currentIndex, // Use incremented started count for proper [N/Total] display\n this.config.graph.packages.size,\n allPackageNames,\n isBuiltInCommand\n );\n\n const duration = Date.now() - startTime;\n\n if (!result.success) {\n // Attach logFile path to error for better error reporting\n const error = result.error || new Error('Package execution failed');\n (error as any).logFilePath = result.logFile;\n throw error;\n }\n\n // Check if this was a \"no changes\" skip (result will have skippedNoChanges flag)\n const skippedNoChanges = (result as any).skippedNoChanges || false;\n\n return {\n success: true,\n duration,\n // Extract published version if available (from output or state)\n publishedVersion: undefined,\n stdout: undefined,\n stderr: undefined,\n skippedNoChanges\n };\n };\n }\n\n /**\n * Execute parallel execution\n */\n async execute() {\n return await this.pool.execute();\n }\n\n /**\n * Get the underlying task pool for event listeners\n */\n getPool(): DynamicTaskPool {\n return this.pool;\n }\n}\n\n/**\n * Create progress logger that listens to pool events\n */\nexport function createParallelProgressLogger(pool: DynamicTaskPool, config: Config): void {\n const logger = getLogger();\n const startTime = Date.now();\n let completedCount = 0;\n let totalPackages = 0;\n\n pool.on('execution:started', ({ totalPackages: total }) => {\n totalPackages = total;\n logger.info(`\\nPARALLEL_EXECUTION_STARTING: Initiating parallel package execution | Package Count: ${total} | Mode: parallel | Strategy: dependency-aware`);\n });\n\n pool.on('package:started', ({ packageName }) => {\n if (config.verbose || config.debug) {\n logger.info(`PACKAGE_STARTED: Package execution initiated | Package: ${packageName} | Status: running`);\n }\n });\n\n pool.on('package:completed', ({ packageName, result }) => {\n completedCount++;\n const percent = Math.round((completedCount / totalPackages) * 100);\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n\n if (config.debug) {\n logger.info(`PACKAGE_COMPLETED: Package execution finished successfully | Package: ${packageName} | Duration: ${result.duration}ms | Progress: ${completedCount}/${totalPackages} (${percent}%) | Elapsed: ${elapsed}s`);\n } else if (config.verbose) {\n logger.info(`PACKAGE_COMPLETED: Package execution finished | Package: ${packageName} | Progress: ${completedCount}/${totalPackages}`);\n } else {\n // Minimal output\n logger.info(`PROGRESS: [${completedCount}/${totalPackages}] Package completed: ${packageName}`);\n }\n });\n\n pool.on('package:failed', ({ packageName, error }) => {\n logger.error(`PACKAGE_FAILED: Package execution failed | Package: ${packageName} | Error: ${error.message} | Status: error`);\n });\n\n pool.on('package:retrying', ({ packageName, attemptNumber }) => {\n logger.warn(`PACKAGE_RETRYING: Retrying package execution | Package: ${packageName} | Attempt: ${attemptNumber} | Status: retrying`);\n });\n\n pool.on('package:skipped', ({ packageName, reason }) => {\n logger.warn(`PACKAGE_SKIPPED: Package skipped due to dependency failure | Package: ${packageName} | Reason: ${reason} | Status: skipped`);\n });\n\n pool.on('package:skipped-no-changes', ({ packageName }) => {\n if (config.verbose || config.debug) {\n logger.info(`PACKAGE_SKIPPED_NO_CHANGES: Package skipped due to no code changes | Package: ${packageName} | Reason: no-code-changes | Status: skipped`);\n }\n });\n\n pool.on('checkpoint:saved', () => {\n if (config.debug) {\n logger.debug('CHECKPOINT_SAVED: Execution checkpoint saved | Purpose: Recovery support | Action: State persisted to disk');\n }\n });\n\n pool.on('execution:completed', ({ result }) => {\n const totalTime = Math.round((Date.now() - startTime) / 1000);\n logger.info(`\\nPARALLEL_EXECUTION_COMPLETED: Parallel execution finished | Duration: ${totalTime}s | Status: completed`);\n\n if (config.verbose || config.debug) {\n logger.info(`\\nEXECUTION_METRICS: Performance and execution statistics:`);\n logger.info(` METRIC_TOTAL_PACKAGES: ${result.totalPackages}`);\n logger.info(` METRIC_COMPLETED: ${result.completed.length} packages successfully completed`);\n logger.info(` METRIC_SKIPPED_NO_CHANGES: ${result.skippedNoChanges.length} packages skipped (no changes)`);\n logger.info(` METRIC_SKIPPED_DEPENDENCIES: ${result.skipped.length} packages skipped (dependency failures)`);\n logger.info(` METRIC_FAILED: ${result.failed.length} packages failed`);\n logger.info(` METRIC_PEAK_CONCURRENCY: ${result.metrics.peakConcurrency} packages running simultaneously`);\n logger.info(` METRIC_AVG_CONCURRENCY: ${result.metrics.averageConcurrency.toFixed(1)} average concurrent packages`);\n }\n });\n}\n\nimport { ProgressFormatter } from '../ui/ProgressFormatter';\n\n/**\n * Format parallel execution result for display\n */\nexport function formatParallelResult(result: any): string {\n const lines: string[] = [];\n\n // Separator line\n lines.push('\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');\n lines.push('📊 Publish Summary');\n lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n');\n\n // Detailed status breakdown by category\n if (result.completed.length > 0) {\n lines.push(`✅ Published (${result.completed.length}):`);\n for (const pkg of result.completed) {\n lines.push(` - ${pkg}`);\n }\n lines.push('');\n }\n\n if (result.skippedNoChanges.length > 0) {\n lines.push(`⏭️ Skipped (${result.skippedNoChanges.length}) - no code changes:`);\n for (const pkg of result.skippedNoChanges) {\n lines.push(` - ${pkg}`);\n }\n lines.push('');\n }\n\n if (result.failed.length > 0) {\n lines.push(`❌ Failed (${result.failed.length}):`);\n for (const pkg of result.failed) {\n lines.push(` - ${typeof pkg === 'string' ? pkg : pkg.name}`);\n }\n lines.push('');\n }\n\n if (result.skipped.length > 0) {\n lines.push(`⊘ Skipped due to dependencies (${result.skipped.length}):`);\n for (const pkg of result.skipped) {\n lines.push(` - ${pkg}`);\n }\n lines.push('');\n }\n\n // Summary line\n lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n');\n\n // Calculate success rate\n const totalProcessed = result.completed.length + result.failed.length + result.skippedNoChanges.length;\n const successRate = totalProcessed > 0 ? Math.round((result.completed.length / totalProcessed) * 100) : 0;\n\n // Format elapsed time\n const totalTimeMs = result.metrics?.totalDuration || 0;\n const minutes = Math.floor(totalTimeMs / 60000);\n const seconds = Math.floor((totalTimeMs % 60000) / 1000);\n const timeStr = minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;\n\n lines.push(`Total time: ${timeStr}`);\n lines.push(`Success rate: ${successRate}% (${result.completed.length}/${totalProcessed} packages processed)`);\n\n if (result.metrics?.peakConcurrency) {\n lines.push(`Peak concurrency: ${result.metrics.peakConcurrency} packages`);\n }\n\n lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');\n\n // Failed packages with formatted error summary\n if (result.failed.length > 0) {\n lines.push('');\n const errorLines = ProgressFormatter.createErrorSummary(result.failed);\n lines.push(...errorLines);\n\n // Next steps for failures\n lines.push('\\n📋 Next steps:');\n lines.push('1. Review the errors above for each failed package');\n lines.push('2. Fix the issues in the failed packages');\n lines.push('3. Retry the publish command');\n\n if (result.skipped.length > 0) {\n lines.push('\\nNote: Once failed packages are fixed, their dependent packages will also be published.');\n }\n\n // Recovery guidance\n const hasRetriable = result.failed.some((f: any) => f.isRetriable);\n const hasPermanent = result.failed.some((f: any) => !f.isRetriable);\n const recoveryLines = ProgressFormatter.createRecoveryGuidance(hasRetriable, hasPermanent);\n lines.push(...recoveryLines);\n }\n\n return lines.join('\\n');\n}\n"],"names":["TreeExecutionAdapter","createExecutePackageWrapper","packageName","_signal","packageInfo","config","graph","packages","get","Error","allPackageNames","Set","keys","isDryRun","dryRun","isBuiltInCommand","command","startsWith","includes","currentIndex","startedCount","startTime","Date","now","result","executePackageFn","size","duration","success","error","logFilePath","logFile","skippedNoChanges","publishedVersion","undefined","stdout","stderr","execute","pool","getPool","completedCount","DynamicTaskPool","on","executePackage","createParallelProgressLogger","logger","getLogger","totalPackages","total","info","verbose","debug","percent","Math","round","elapsed","message","attemptNumber","warn","reason","totalTime","completed","length","skipped","failed","metrics","peakConcurrency","averageConcurrency","toFixed","formatParallelResult","lines","push","pkg","name","totalProcessed","successRate","totalTimeMs","totalDuration","minutes","floor","seconds","timeStr","errorLines","ProgressFormatter","createErrorSummary","hasRetriable","some","f","isRetriable","hasPermanent","recoveryLines","createRecoveryGuidance","join"],"mappings":"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"}
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ProgressFormatter creates beautiful formatted output for parallel execution
|
|
3
|
-
*/ class ProgressFormatter {
|
|
4
|
-
/**
|
|
5
|
-
* Create a visual progress bar
|
|
6
|
-
*/ static createProgressBar(current, total, width = 30) {
|
|
7
|
-
const percent = total > 0 ? current / total : 0;
|
|
8
|
-
const filled = Math.round(width * percent);
|
|
9
|
-
const empty = width - filled;
|
|
10
|
-
return '█'.repeat(filled) + '░'.repeat(empty);
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Format duration in human-readable format
|
|
14
|
-
*/ static formatDuration(ms) {
|
|
15
|
-
if (ms < 1000) {
|
|
16
|
-
return `${ms}ms`;
|
|
17
|
-
}
|
|
18
|
-
const seconds = Math.floor(ms / 1000);
|
|
19
|
-
const minutes = Math.floor(seconds / 60);
|
|
20
|
-
const hours = Math.floor(minutes / 60);
|
|
21
|
-
if (hours > 0) {
|
|
22
|
-
return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
|
|
23
|
-
}
|
|
24
|
-
if (minutes > 0) {
|
|
25
|
-
return `${minutes}m ${seconds % 60}s`;
|
|
26
|
-
}
|
|
27
|
-
return `${seconds}s`;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Format bytes in human-readable format
|
|
31
|
-
*/ static formatBytes(bytes) {
|
|
32
|
-
const units = [
|
|
33
|
-
'B',
|
|
34
|
-
'KB',
|
|
35
|
-
'MB',
|
|
36
|
-
'GB'
|
|
37
|
-
];
|
|
38
|
-
let value = bytes;
|
|
39
|
-
let unitIndex = 0;
|
|
40
|
-
while(value >= 1024 && unitIndex < units.length - 1){
|
|
41
|
-
value /= 1024;
|
|
42
|
-
unitIndex++;
|
|
43
|
-
}
|
|
44
|
-
return `${value.toFixed(2)} ${units[unitIndex]}`;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Format percentage
|
|
48
|
-
*/ static formatPercent(value, decimals = 1) {
|
|
49
|
-
return `${value.toFixed(decimals)}%`;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Create execution summary table
|
|
53
|
-
*/ static createSummaryTable(result) {
|
|
54
|
-
const lines = [];
|
|
55
|
-
lines.push('');
|
|
56
|
-
lines.push('═══════════════════════════════════════════════');
|
|
57
|
-
lines.push(' Parallel Execution Summary');
|
|
58
|
-
lines.push('═══════════════════════════════════════════════');
|
|
59
|
-
lines.push('');
|
|
60
|
-
// Status
|
|
61
|
-
const status = result.success ? '✅ SUCCESS' : '⚠️ PARTIAL SUCCESS';
|
|
62
|
-
lines.push(`Status: ${status}`);
|
|
63
|
-
lines.push('');
|
|
64
|
-
// Package summary
|
|
65
|
-
lines.push('📦 Package Summary:');
|
|
66
|
-
lines.push(` Completed: ${result.completed.length}/${result.totalPackages}`);
|
|
67
|
-
if (result.failed.length > 0) {
|
|
68
|
-
lines.push(` Failed: ${result.failed.length}`);
|
|
69
|
-
}
|
|
70
|
-
if (result.skipped.length > 0) {
|
|
71
|
-
lines.push(` Skipped: ${result.skipped.length}`);
|
|
72
|
-
}
|
|
73
|
-
lines.push('');
|
|
74
|
-
// Performance metrics
|
|
75
|
-
lines.push(...this.createMetricsTable(result.metrics));
|
|
76
|
-
// Failed packages details
|
|
77
|
-
if (result.failed.length > 0) {
|
|
78
|
-
lines.push('');
|
|
79
|
-
lines.push('❌ Failed Packages:');
|
|
80
|
-
for (const failure of result.failed){
|
|
81
|
-
lines.push(` • ${failure.name}`);
|
|
82
|
-
lines.push(` Error: ${failure.error}`);
|
|
83
|
-
if (failure.dependents.length > 0) {
|
|
84
|
-
lines.push(` Blocked: ${failure.dependents.length} dependent(s)`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
lines.push('');
|
|
89
|
-
lines.push('═══════════════════════════════════════════════');
|
|
90
|
-
lines.push('');
|
|
91
|
-
return lines;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Create metrics table
|
|
95
|
-
*/ static createMetricsTable(metrics) {
|
|
96
|
-
const lines = [];
|
|
97
|
-
lines.push('⚡ Performance Metrics:');
|
|
98
|
-
lines.push(` Total Time: ${this.formatDuration(metrics.totalDuration)}`);
|
|
99
|
-
lines.push(` Avg Per Package: ${this.formatDuration(metrics.averagePackageDuration)}`);
|
|
100
|
-
lines.push(` Peak Concurrency: ${metrics.peakConcurrency}`);
|
|
101
|
-
lines.push(` Average Concurrency: ${metrics.averageConcurrency.toFixed(1)}`);
|
|
102
|
-
if (metrics.speedupVsSequential) {
|
|
103
|
-
lines.push(` Speedup: ${metrics.speedupVsSequential.toFixed(2)}x 🚀`);
|
|
104
|
-
}
|
|
105
|
-
return lines;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Create compact progress indicator
|
|
109
|
-
*/ static createCompactProgress(completed, total, running) {
|
|
110
|
-
const percent = total > 0 ? Math.round(completed / total * 100) : 0;
|
|
111
|
-
const bar = this.createProgressBar(completed, total, 20);
|
|
112
|
-
return `[${bar}] ${percent}% (${completed}/${total}) ${running > 0 ? `| Running: ${running}` : ''}`;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Create execution timeline visualization
|
|
116
|
-
*/ static createTimeline(packageTimes, maxConcurrency) {
|
|
117
|
-
const lines = [];
|
|
118
|
-
lines.push('');
|
|
119
|
-
lines.push('📊 Execution Timeline:');
|
|
120
|
-
lines.push('');
|
|
121
|
-
// Find time bounds
|
|
122
|
-
let minTime = Infinity;
|
|
123
|
-
let maxTime = 0;
|
|
124
|
-
for (const [, times] of packageTimes){
|
|
125
|
-
minTime = Math.min(minTime, times.start);
|
|
126
|
-
maxTime = Math.max(maxTime, times.end);
|
|
127
|
-
}
|
|
128
|
-
const totalDuration = maxTime - minTime;
|
|
129
|
-
const timelineWidth = 50;
|
|
130
|
-
// Sort by start time
|
|
131
|
-
const sortedPackages = Array.from(packageTimes.entries()).sort(([, a], [, b])=>a.start - b.start);
|
|
132
|
-
for (const [pkg, times] of sortedPackages){
|
|
133
|
-
const start = times.start - minTime;
|
|
134
|
-
const duration = times.end - times.start;
|
|
135
|
-
const startPos = Math.floor(start / totalDuration * timelineWidth);
|
|
136
|
-
const barLength = Math.max(1, Math.floor(duration / totalDuration * timelineWidth));
|
|
137
|
-
const timeline = ' '.repeat(startPos) + '█'.repeat(barLength);
|
|
138
|
-
const durationStr = this.formatDuration(duration);
|
|
139
|
-
lines.push(` ${pkg.padEnd(20)} │${timeline.padEnd(timelineWidth)}│ ${durationStr}`);
|
|
140
|
-
}
|
|
141
|
-
lines.push('');
|
|
142
|
-
lines.push(` Total: ${this.formatDuration(totalDuration)} with max concurrency ${maxConcurrency}`);
|
|
143
|
-
lines.push('');
|
|
144
|
-
return lines;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Create box around text
|
|
148
|
-
*/ static createBox(title, content, width = 60) {
|
|
149
|
-
const lines = [];
|
|
150
|
-
const topBorder = '╔' + '═'.repeat(width - 2) + '╗';
|
|
151
|
-
const bottomBorder = '╚' + '═'.repeat(width - 2) + '╝';
|
|
152
|
-
const titleLine = '║ ' + title.padEnd(width - 4) + ' ║';
|
|
153
|
-
lines.push(topBorder);
|
|
154
|
-
lines.push(titleLine);
|
|
155
|
-
lines.push('╠' + '═'.repeat(width - 2) + '╣');
|
|
156
|
-
for (const line of content){
|
|
157
|
-
const paddedLine = '║ ' + line.padEnd(width - 4) + ' ║';
|
|
158
|
-
lines.push(paddedLine);
|
|
159
|
-
}
|
|
160
|
-
lines.push(bottomBorder);
|
|
161
|
-
return lines;
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Format speedup comparison
|
|
165
|
-
*/ static createSpeedupComparison(parallelTime, sequentialTime, concurrency) {
|
|
166
|
-
const lines = [];
|
|
167
|
-
const speedup = sequentialTime / parallelTime;
|
|
168
|
-
const efficiency = speedup / concurrency * 100;
|
|
169
|
-
const timeSaved = sequentialTime - parallelTime;
|
|
170
|
-
lines.push('');
|
|
171
|
-
lines.push('📈 Speedup Analysis:');
|
|
172
|
-
lines.push(` Sequential Time: ${this.formatDuration(sequentialTime)}`);
|
|
173
|
-
lines.push(` Parallel Time: ${this.formatDuration(parallelTime)}`);
|
|
174
|
-
lines.push(` Speedup: ${speedup.toFixed(2)}x 🚀`);
|
|
175
|
-
lines.push(` Efficiency: ${this.formatPercent(efficiency)}`);
|
|
176
|
-
lines.push(` Time Saved: ${this.formatDuration(timeSaved)} ⏰`);
|
|
177
|
-
lines.push('');
|
|
178
|
-
return lines;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Create error summary
|
|
182
|
-
*/ static createErrorSummary(failures) {
|
|
183
|
-
const lines = [];
|
|
184
|
-
if (failures.length === 0) {
|
|
185
|
-
return lines;
|
|
186
|
-
}
|
|
187
|
-
lines.push('');
|
|
188
|
-
lines.push('❌ Failure Summary:');
|
|
189
|
-
lines.push('');
|
|
190
|
-
for (const failure of failures){
|
|
191
|
-
var _failure_errorDetails, _failure_errorDetails1, _failure_errorDetails2, _failure_errorDetails3;
|
|
192
|
-
lines.push(` ${failure.name}:`);
|
|
193
|
-
// Show error type if available
|
|
194
|
-
if ((_failure_errorDetails = failure.errorDetails) === null || _failure_errorDetails === void 0 ? void 0 : _failure_errorDetails.type) {
|
|
195
|
-
const typeLabel = failure.errorDetails.type.replace(/_/g, ' ').replace(/\b\w/g, (l)=>l.toUpperCase());
|
|
196
|
-
lines.push(` Type: ${typeLabel}`);
|
|
197
|
-
}
|
|
198
|
-
// Show context if available, otherwise show generic error
|
|
199
|
-
if ((_failure_errorDetails1 = failure.errorDetails) === null || _failure_errorDetails1 === void 0 ? void 0 : _failure_errorDetails1.context) {
|
|
200
|
-
lines.push(` Details: ${failure.errorDetails.context}`);
|
|
201
|
-
} else {
|
|
202
|
-
lines.push(` Error: ${failure.error}`);
|
|
203
|
-
}
|
|
204
|
-
// Show log file location
|
|
205
|
-
if ((_failure_errorDetails2 = failure.errorDetails) === null || _failure_errorDetails2 === void 0 ? void 0 : _failure_errorDetails2.logFile) {
|
|
206
|
-
lines.push(` Log: ${failure.errorDetails.logFile}`);
|
|
207
|
-
}
|
|
208
|
-
// Show suggestion
|
|
209
|
-
if ((_failure_errorDetails3 = failure.errorDetails) === null || _failure_errorDetails3 === void 0 ? void 0 : _failure_errorDetails3.suggestion) {
|
|
210
|
-
lines.push(` 💡 Suggestion: ${failure.errorDetails.suggestion}`);
|
|
211
|
-
}
|
|
212
|
-
// Show blocked dependents
|
|
213
|
-
if (failure.dependents.length > 0) {
|
|
214
|
-
const dependentStr = failure.dependents.slice(0, 3).join(', ');
|
|
215
|
-
const more = failure.dependents.length > 3 ? ` +${failure.dependents.length - 3} more` : '';
|
|
216
|
-
lines.push(` Blocked: ${dependentStr}${more}`);
|
|
217
|
-
}
|
|
218
|
-
lines.push('');
|
|
219
|
-
}
|
|
220
|
-
return lines;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Create recovery guidance
|
|
224
|
-
*/ static createRecoveryGuidance(hasRetriable, hasPermanent) {
|
|
225
|
-
const lines = [];
|
|
226
|
-
lines.push('');
|
|
227
|
-
lines.push('🔧 Recovery Options:');
|
|
228
|
-
lines.push('');
|
|
229
|
-
if (hasRetriable) {
|
|
230
|
-
lines.push(' 1. Retry failed packages:');
|
|
231
|
-
lines.push(' kodrdriv tree [command] --continue --retry-failed');
|
|
232
|
-
lines.push('');
|
|
233
|
-
}
|
|
234
|
-
if (hasPermanent) {
|
|
235
|
-
lines.push(' 2. Skip failed packages:');
|
|
236
|
-
lines.push(' kodrdriv tree [command] --continue --skip-failed');
|
|
237
|
-
lines.push('');
|
|
238
|
-
}
|
|
239
|
-
lines.push(' 3. Mark specific package as completed:');
|
|
240
|
-
lines.push(' kodrdriv tree [command] --continue --mark-completed "directory-name"');
|
|
241
|
-
lines.push('');
|
|
242
|
-
lines.push(' 4. Check detailed status:');
|
|
243
|
-
lines.push(' kodrdriv tree --status-parallel');
|
|
244
|
-
lines.push('');
|
|
245
|
-
return lines;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
export { ProgressFormatter };
|
|
250
|
-
//# sourceMappingURL=ProgressFormatter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProgressFormatter.js","sources":["../../src/ui/ProgressFormatter.ts"],"sourcesContent":["import { ExecutionResult, ExecutionMetrics } from '../types/parallelExecution';\n\n/**\n * ProgressFormatter creates beautiful formatted output for parallel execution\n */\nexport class ProgressFormatter {\n /**\n * Create a visual progress bar\n */\n static createProgressBar(current: number, total: number, width: number = 30): string {\n const percent = total > 0 ? current / total : 0;\n const filled = Math.round(width * percent);\n const empty = width - filled;\n\n return '█'.repeat(filled) + '░'.repeat(empty);\n }\n\n /**\n * Format duration in human-readable format\n */\n static formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n\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 ${seconds % 60}s`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n }\n\n /**\n * Format bytes in human-readable format\n */\n static formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let value = bytes;\n let unitIndex = 0;\n\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n\n return `${value.toFixed(2)} ${units[unitIndex]}`;\n }\n\n /**\n * Format percentage\n */\n static formatPercent(value: number, decimals: number = 1): string {\n return `${value.toFixed(decimals)}%`;\n }\n\n /**\n * Create execution summary table\n */\n static createSummaryTable(result: ExecutionResult): string[] {\n const lines: string[] = [];\n\n lines.push('');\n lines.push('═══════════════════════════════════════════════');\n lines.push(' Parallel Execution Summary');\n lines.push('═══════════════════════════════════════════════');\n lines.push('');\n\n // Status\n const status = result.success ? '✅ SUCCESS' : '⚠️ PARTIAL SUCCESS';\n lines.push(`Status: ${status}`);\n lines.push('');\n\n // Package summary\n lines.push('📦 Package Summary:');\n lines.push(` Completed: ${result.completed.length}/${result.totalPackages}`);\n if (result.failed.length > 0) {\n lines.push(` Failed: ${result.failed.length}`);\n }\n if (result.skipped.length > 0) {\n lines.push(` Skipped: ${result.skipped.length}`);\n }\n lines.push('');\n\n // Performance metrics\n lines.push(...this.createMetricsTable(result.metrics));\n\n // Failed packages details\n if (result.failed.length > 0) {\n lines.push('');\n lines.push('❌ Failed Packages:');\n for (const failure of result.failed) {\n lines.push(` • ${failure.name}`);\n lines.push(` Error: ${failure.error}`);\n if (failure.dependents.length > 0) {\n lines.push(` Blocked: ${failure.dependents.length} dependent(s)`);\n }\n }\n }\n\n lines.push('');\n lines.push('═══════════════════════════════════════════════');\n lines.push('');\n\n return lines;\n }\n\n /**\n * Create metrics table\n */\n static createMetricsTable(metrics: ExecutionMetrics): string[] {\n const lines: string[] = [];\n\n lines.push('⚡ Performance Metrics:');\n lines.push(` Total Time: ${this.formatDuration(metrics.totalDuration)}`);\n lines.push(` Avg Per Package: ${this.formatDuration(metrics.averagePackageDuration)}`);\n lines.push(` Peak Concurrency: ${metrics.peakConcurrency}`);\n lines.push(` Average Concurrency: ${metrics.averageConcurrency.toFixed(1)}`);\n\n if (metrics.speedupVsSequential) {\n lines.push(` Speedup: ${metrics.speedupVsSequential.toFixed(2)}x 🚀`);\n }\n\n return lines;\n }\n\n /**\n * Create compact progress indicator\n */\n static createCompactProgress(completed: number, total: number, running: number): string {\n const percent = total > 0 ? Math.round((completed / total) * 100) : 0;\n const bar = this.createProgressBar(completed, total, 20);\n\n return `[${bar}] ${percent}% (${completed}/${total}) ${running > 0 ? `| Running: ${running}` : ''}`;\n }\n\n /**\n * Create execution timeline visualization\n */\n static createTimeline(\n packageTimes: Map<string, { start: number; end: number }>,\n maxConcurrency: number\n ): string[] {\n const lines: string[] = [];\n\n lines.push('');\n lines.push('📊 Execution Timeline:');\n lines.push('');\n\n // Find time bounds\n let minTime = Infinity;\n let maxTime = 0;\n\n for (const [, times] of packageTimes) {\n minTime = Math.min(minTime, times.start);\n maxTime = Math.max(maxTime, times.end);\n }\n\n const totalDuration = maxTime - minTime;\n const timelineWidth = 50;\n\n // Sort by start time\n const sortedPackages = Array.from(packageTimes.entries())\n .sort(([, a], [, b]) => a.start - b.start);\n\n for (const [pkg, times] of sortedPackages) {\n const start = times.start - minTime;\n const duration = times.end - times.start;\n\n const startPos = Math.floor((start / totalDuration) * timelineWidth);\n const barLength = Math.max(1, Math.floor((duration / totalDuration) * timelineWidth));\n\n const timeline = ' '.repeat(startPos) + '█'.repeat(barLength);\n const durationStr = this.formatDuration(duration);\n\n lines.push(` ${pkg.padEnd(20)} │${timeline.padEnd(timelineWidth)}│ ${durationStr}`);\n }\n\n lines.push('');\n lines.push(` Total: ${this.formatDuration(totalDuration)} with max concurrency ${maxConcurrency}`);\n lines.push('');\n\n return lines;\n }\n\n /**\n * Create box around text\n */\n static createBox(title: string, content: string[], width: number = 60): string[] {\n const lines: string[] = [];\n\n const topBorder = '╔' + '═'.repeat(width - 2) + '╗';\n const bottomBorder = '╚' + '═'.repeat(width - 2) + '╝';\n const titleLine = '║ ' + title.padEnd(width - 4) + ' ║';\n\n lines.push(topBorder);\n lines.push(titleLine);\n lines.push('╠' + '═'.repeat(width - 2) + '╣');\n\n for (const line of content) {\n const paddedLine = '║ ' + line.padEnd(width - 4) + ' ║';\n lines.push(paddedLine);\n }\n\n lines.push(bottomBorder);\n\n return lines;\n }\n\n /**\n * Format speedup comparison\n */\n static createSpeedupComparison(\n parallelTime: number,\n sequentialTime: number,\n concurrency: number\n ): string[] {\n const lines: string[] = [];\n\n const speedup = sequentialTime / parallelTime;\n const efficiency = (speedup / concurrency) * 100;\n const timeSaved = sequentialTime - parallelTime;\n\n lines.push('');\n lines.push('📈 Speedup Analysis:');\n lines.push(` Sequential Time: ${this.formatDuration(sequentialTime)}`);\n lines.push(` Parallel Time: ${this.formatDuration(parallelTime)}`);\n lines.push(` Speedup: ${speedup.toFixed(2)}x 🚀`);\n lines.push(` Efficiency: ${this.formatPercent(efficiency)}`);\n lines.push(` Time Saved: ${this.formatDuration(timeSaved)} ⏰`);\n lines.push('');\n\n return lines;\n }\n\n /**\n * Create error summary\n */\n static createErrorSummary(failures: Array<{ name: string; error: string; dependents: string[]; errorDetails?: { type?: string; context?: string; logFile?: string; suggestion?: string } }>): string[] {\n const lines: string[] = [];\n\n if (failures.length === 0) {\n return lines;\n }\n\n lines.push('');\n lines.push('❌ Failure Summary:');\n lines.push('');\n\n for (const failure of failures) {\n lines.push(` ${failure.name}:`);\n\n // Show error type if available\n if (failure.errorDetails?.type) {\n const typeLabel = failure.errorDetails.type.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase());\n lines.push(` Type: ${typeLabel}`);\n }\n\n // Show context if available, otherwise show generic error\n if (failure.errorDetails?.context) {\n lines.push(` Details: ${failure.errorDetails.context}`);\n } else {\n lines.push(` Error: ${failure.error}`);\n }\n\n // Show log file location\n if (failure.errorDetails?.logFile) {\n lines.push(` Log: ${failure.errorDetails.logFile}`);\n }\n\n // Show suggestion\n if (failure.errorDetails?.suggestion) {\n lines.push(` 💡 Suggestion: ${failure.errorDetails.suggestion}`);\n }\n\n // Show blocked dependents\n if (failure.dependents.length > 0) {\n const dependentStr = failure.dependents.slice(0, 3).join(', ');\n const more = failure.dependents.length > 3 ? ` +${failure.dependents.length - 3} more` : '';\n lines.push(` Blocked: ${dependentStr}${more}`);\n }\n\n lines.push('');\n }\n\n return lines;\n }\n\n /**\n * Create recovery guidance\n */\n static createRecoveryGuidance(hasRetriable: boolean, hasPermanent: boolean): string[] {\n const lines: string[] = [];\n\n lines.push('');\n lines.push('🔧 Recovery Options:');\n lines.push('');\n\n if (hasRetriable) {\n lines.push(' 1. Retry failed packages:');\n lines.push(' kodrdriv tree [command] --continue --retry-failed');\n lines.push('');\n }\n\n if (hasPermanent) {\n lines.push(' 2. Skip failed packages:');\n lines.push(' kodrdriv tree [command] --continue --skip-failed');\n lines.push('');\n }\n\n lines.push(' 3. Mark specific package as completed:');\n lines.push(' kodrdriv tree [command] --continue --mark-completed \"directory-name\"');\n lines.push('');\n\n lines.push(' 4. Check detailed status:');\n lines.push(' kodrdriv tree --status-parallel');\n lines.push('');\n\n return lines;\n }\n}\n"],"names":["ProgressFormatter","createProgressBar","current","total","width","percent","filled","Math","round","empty","repeat","formatDuration","ms","seconds","floor","minutes","hours","formatBytes","bytes","units","value","unitIndex","length","toFixed","formatPercent","decimals","createSummaryTable","result","lines","push","status","success","completed","totalPackages","failed","skipped","createMetricsTable","metrics","failure","name","error","dependents","totalDuration","averagePackageDuration","peakConcurrency","averageConcurrency","speedupVsSequential","createCompactProgress","running","bar","createTimeline","packageTimes","maxConcurrency","minTime","Infinity","maxTime","times","min","start","max","end","timelineWidth","sortedPackages","Array","from","entries","sort","a","b","pkg","duration","startPos","barLength","timeline","durationStr","padEnd","createBox","title","content","topBorder","bottomBorder","titleLine","line","paddedLine","createSpeedupComparison","parallelTime","sequentialTime","concurrency","speedup","efficiency","timeSaved","createErrorSummary","failures","errorDetails","type","typeLabel","replace","l","toUpperCase","context","logFile","suggestion","dependentStr","slice","join","more","createRecoveryGuidance","hasRetriable","hasPermanent"],"mappings":"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"}
|