@wundr.io/cli 1.0.12 ā 1.0.13
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/LICENSE +21 -0
- package/dist/ai/ai-service.d.ts +152 -0
- package/dist/ai/ai-service.d.ts.map +1 -0
- package/dist/ai/ai-service.js +430 -0
- package/dist/ai/ai-service.js.map +1 -0
- package/dist/ai/claude-client.d.ts +130 -0
- package/dist/ai/claude-client.d.ts.map +1 -0
- package/dist/ai/claude-client.js +340 -0
- package/dist/ai/claude-client.js.map +1 -0
- package/dist/ai/conversation-manager.d.ts +164 -0
- package/dist/ai/conversation-manager.d.ts.map +1 -0
- package/dist/ai/conversation-manager.js +614 -0
- package/dist/ai/conversation-manager.js.map +1 -0
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +8 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/cli.d.ts +36 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +192 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ai.d.ts +89 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +954 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/alignment.d.ts +78 -0
- package/dist/commands/alignment.d.ts.map +1 -0
- package/dist/commands/alignment.js +817 -0
- package/dist/commands/alignment.js.map +1 -0
- package/dist/commands/analyze-optimized.d.ts +14 -0
- package/dist/commands/analyze-optimized.d.ts.map +1 -0
- package/dist/commands/analyze-optimized.js +609 -0
- package/dist/commands/analyze-optimized.js.map +1 -0
- package/dist/commands/analyze.d.ts +65 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +435 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/batch.d.ts +93 -0
- package/dist/commands/batch.d.ts.map +1 -0
- package/dist/commands/batch.js +854 -0
- package/dist/commands/batch.js.map +1 -0
- package/dist/commands/chat.d.ts +72 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +678 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/claude-init.d.ts +28 -0
- package/dist/commands/claude-init.d.ts.map +1 -0
- package/dist/commands/claude-init.js +591 -0
- package/dist/commands/claude-init.js.map +1 -0
- package/dist/commands/claude-setup.d.ts +119 -0
- package/dist/commands/claude-setup.d.ts.map +1 -0
- package/dist/commands/claude-setup.js +1079 -0
- package/dist/commands/claude-setup.js.map +1 -0
- package/dist/commands/computer-setup.d.ts +8 -0
- package/dist/commands/computer-setup.d.ts.map +1 -0
- package/dist/commands/computer-setup.js +877 -0
- package/dist/commands/computer-setup.js.map +1 -0
- package/dist/commands/create-command.d.ts +7 -0
- package/dist/commands/create-command.d.ts.map +1 -0
- package/dist/commands/create-command.js +158 -0
- package/dist/commands/create-command.js.map +1 -0
- package/dist/commands/create.d.ts +74 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +556 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/dashboard.d.ts +91 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +538 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/govern.d.ts +70 -0
- package/dist/commands/govern.d.ts.map +1 -0
- package/dist/commands/govern.js +481 -0
- package/dist/commands/govern.js.map +1 -0
- package/dist/commands/governance.d.ts +17 -0
- package/dist/commands/governance.d.ts.map +1 -0
- package/dist/commands/governance.js +703 -0
- package/dist/commands/governance.js.map +1 -0
- package/dist/commands/guardian.d.ts +20 -0
- package/dist/commands/guardian.d.ts.map +1 -0
- package/dist/commands/guardian.js +597 -0
- package/dist/commands/guardian.js.map +1 -0
- package/dist/commands/init.d.ts +59 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +650 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/orchestrator.d.ts +7 -0
- package/dist/commands/orchestrator.d.ts.map +1 -0
- package/dist/commands/orchestrator.js +578 -0
- package/dist/commands/orchestrator.js.map +1 -0
- package/dist/commands/performance-optimizer.d.ts +30 -0
- package/dist/commands/performance-optimizer.d.ts.map +1 -0
- package/dist/commands/performance-optimizer.js +650 -0
- package/dist/commands/performance-optimizer.js.map +1 -0
- package/dist/commands/plugins.d.ts +87 -0
- package/dist/commands/plugins.d.ts.map +1 -0
- package/dist/commands/plugins.js +685 -0
- package/dist/commands/plugins.js.map +1 -0
- package/dist/commands/rag.d.ts +7 -0
- package/dist/commands/rag.d.ts.map +1 -0
- package/dist/commands/rag.js +751 -0
- package/dist/commands/rag.js.map +1 -0
- package/dist/commands/session.d.ts +41 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +441 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +24 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +172 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/test-init.d.ts +9 -0
- package/dist/commands/test-init.d.ts.map +1 -0
- package/dist/commands/test-init.js +222 -0
- package/dist/commands/test-init.js.map +1 -0
- package/dist/commands/test.d.ts +25 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +217 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/watch.d.ts +76 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +613 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/worktree.d.ts +63 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +774 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/context/context-manager.d.ts +155 -0
- package/dist/context/context-manager.d.ts.map +1 -0
- package/dist/context/context-manager.js +383 -0
- package/dist/context/context-manager.js.map +1 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +6 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/session-manager.d.ts +207 -0
- package/dist/context/session-manager.d.ts.map +1 -0
- package/dist/context/session-manager.js +686 -0
- package/dist/context/session-manager.js.map +1 -0
- package/dist/framework/command-interface.d.ts +349 -0
- package/dist/framework/command-interface.d.ts.map +1 -0
- package/dist/framework/command-interface.js +101 -0
- package/dist/framework/command-interface.js.map +1 -0
- package/dist/framework/command-registry.d.ts +173 -0
- package/dist/framework/command-registry.d.ts.map +1 -0
- package/dist/framework/command-registry.js +734 -0
- package/dist/framework/command-registry.js.map +1 -0
- package/dist/framework/completion-exporter.d.ts +79 -0
- package/dist/framework/completion-exporter.d.ts.map +1 -0
- package/dist/framework/completion-exporter.js +259 -0
- package/dist/framework/completion-exporter.js.map +1 -0
- package/dist/framework/debug-logger.d.ts +163 -0
- package/dist/framework/debug-logger.d.ts.map +1 -0
- package/dist/framework/debug-logger.js +373 -0
- package/dist/framework/debug-logger.js.map +1 -0
- package/dist/framework/error-handler.d.ts +196 -0
- package/dist/framework/error-handler.d.ts.map +1 -0
- package/dist/framework/error-handler.js +613 -0
- package/dist/framework/error-handler.js.map +1 -0
- package/dist/framework/help-generator.d.ts +78 -0
- package/dist/framework/help-generator.d.ts.map +1 -0
- package/dist/framework/help-generator.js +414 -0
- package/dist/framework/help-generator.js.map +1 -0
- package/dist/framework/index.d.ts +62 -0
- package/dist/framework/index.d.ts.map +1 -0
- package/dist/framework/index.js +95 -0
- package/dist/framework/index.js.map +1 -0
- package/dist/framework/interactive-repl.d.ts +138 -0
- package/dist/framework/interactive-repl.d.ts.map +1 -0
- package/dist/framework/interactive-repl.js +567 -0
- package/dist/framework/interactive-repl.js.map +1 -0
- package/dist/framework/output-formatter.d.ts +274 -0
- package/dist/framework/output-formatter.d.ts.map +1 -0
- package/dist/framework/output-formatter.js +545 -0
- package/dist/framework/output-formatter.js.map +1 -0
- package/dist/framework/progress-manager.d.ts +192 -0
- package/dist/framework/progress-manager.d.ts.map +1 -0
- package/dist/framework/progress-manager.js +408 -0
- package/dist/framework/progress-manager.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive/interactive-mode.d.ts +76 -0
- package/dist/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/interactive/interactive-mode.js +732 -0
- package/dist/interactive/interactive-mode.js.map +1 -0
- package/dist/nlp/command-mapper.d.ts +174 -0
- package/dist/nlp/command-mapper.d.ts.map +1 -0
- package/dist/nlp/command-mapper.js +624 -0
- package/dist/nlp/command-mapper.js.map +1 -0
- package/dist/nlp/command-parser.d.ts +106 -0
- package/dist/nlp/command-parser.d.ts.map +1 -0
- package/dist/nlp/command-parser.js +417 -0
- package/dist/nlp/command-parser.js.map +1 -0
- package/dist/nlp/index.d.ts +5 -0
- package/dist/nlp/index.d.ts.map +1 -0
- package/dist/nlp/index.js +8 -0
- package/dist/nlp/index.js.map +1 -0
- package/dist/nlp/intent-classifier.d.ts +59 -0
- package/dist/nlp/intent-classifier.d.ts.map +1 -0
- package/dist/nlp/intent-classifier.js +384 -0
- package/dist/nlp/intent-classifier.js.map +1 -0
- package/dist/nlp/intent-parser.d.ts +152 -0
- package/dist/nlp/intent-parser.d.ts.map +1 -0
- package/dist/nlp/intent-parser.js +746 -0
- package/dist/nlp/intent-parser.js.map +1 -0
- package/dist/plugins/plugin-manager.d.ts +121 -0
- package/dist/plugins/plugin-manager.d.ts.map +1 -0
- package/dist/plugins/plugin-manager.js +606 -0
- package/dist/plugins/plugin-manager.js.map +1 -0
- package/dist/types/index.d.ts +224 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/backup-rollback-manager.d.ts +72 -0
- package/dist/utils/backup-rollback-manager.d.ts.map +1 -0
- package/dist/utils/backup-rollback-manager.js +288 -0
- package/dist/utils/backup-rollback-manager.js.map +1 -0
- package/dist/utils/claude-config-installer.d.ts +98 -0
- package/dist/utils/claude-config-installer.d.ts.map +1 -0
- package/dist/utils/claude-config-installer.js +678 -0
- package/dist/utils/claude-config-installer.js.map +1 -0
- package/dist/utils/config-manager.d.ts +73 -0
- package/dist/utils/config-manager.d.ts.map +1 -0
- package/dist/utils/config-manager.js +339 -0
- package/dist/utils/config-manager.js.map +1 -0
- package/dist/utils/error-handler.d.ts +46 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +169 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/logger.d.ts +25 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +105 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +23 -23
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Performance Optimizer Command - Memory and Concurrency Optimization
|
|
4
|
+
* Implements intelligent optimization strategies for Wundr platform performance
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PerformanceOptimizerCommands = void 0;
|
|
8
|
+
const tslib_1 = require("tslib");
|
|
9
|
+
const path_1 = tslib_1.__importDefault(require("path"));
|
|
10
|
+
const perf_hooks_1 = require("perf_hooks");
|
|
11
|
+
const process_1 = require("process");
|
|
12
|
+
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
13
|
+
const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
|
|
14
|
+
const error_handler_1 = require("../utils/error-handler");
|
|
15
|
+
const logger_1 = require("../utils/logger");
|
|
16
|
+
/**
|
|
17
|
+
* Memory optimization strategies
|
|
18
|
+
*/
|
|
19
|
+
class MemoryOptimizer {
|
|
20
|
+
baselineMetrics = null;
|
|
21
|
+
optimizations = [];
|
|
22
|
+
async analyzeMemoryUsage() {
|
|
23
|
+
const results = [];
|
|
24
|
+
const currentMemory = (0, process_1.memoryUsage)();
|
|
25
|
+
logger_1.logger.info('Analyzing memory usage patterns...');
|
|
26
|
+
// Check for memory pressure
|
|
27
|
+
if (currentMemory.heapUsed / currentMemory.heapTotal > 0.8) {
|
|
28
|
+
results.push({
|
|
29
|
+
category: 'memory',
|
|
30
|
+
description: 'High heap utilization detected',
|
|
31
|
+
impact: 'high',
|
|
32
|
+
effort: 'medium',
|
|
33
|
+
automated: true,
|
|
34
|
+
applied: false,
|
|
35
|
+
metrics: {
|
|
36
|
+
heapUtilization: currentMemory.heapUsed / currentMemory.heapTotal,
|
|
37
|
+
heapUsed: currentMemory.heapUsed,
|
|
38
|
+
heapTotal: currentMemory.heapTotal,
|
|
39
|
+
},
|
|
40
|
+
recommendations: [
|
|
41
|
+
'Enable garbage collection optimization',
|
|
42
|
+
'Implement object pooling for frequently created objects',
|
|
43
|
+
'Add memory leak detection monitoring',
|
|
44
|
+
'Reduce object retention in caches',
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Check for excessive external memory usage
|
|
49
|
+
if (currentMemory.external > 100 * 1024 * 1024) {
|
|
50
|
+
// 100MB
|
|
51
|
+
results.push({
|
|
52
|
+
category: 'memory',
|
|
53
|
+
description: 'High external memory usage',
|
|
54
|
+
impact: 'medium',
|
|
55
|
+
effort: 'low',
|
|
56
|
+
automated: true,
|
|
57
|
+
applied: false,
|
|
58
|
+
metrics: {
|
|
59
|
+
externalMemory: currentMemory.external,
|
|
60
|
+
externalMemoryMB: currentMemory.external / (1024 * 1024),
|
|
61
|
+
},
|
|
62
|
+
recommendations: [
|
|
63
|
+
'Review buffer usage and cleanup',
|
|
64
|
+
'Optimize file handling operations',
|
|
65
|
+
'Implement streaming for large data processing',
|
|
66
|
+
],
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Check RSS vs heap ratio
|
|
70
|
+
const rssHeapRatio = currentMemory.rss / currentMemory.heapTotal;
|
|
71
|
+
if (rssHeapRatio > 2.5) {
|
|
72
|
+
results.push({
|
|
73
|
+
category: 'memory',
|
|
74
|
+
description: 'High RSS to heap ratio indicates memory fragmentation',
|
|
75
|
+
impact: 'medium',
|
|
76
|
+
effort: 'high',
|
|
77
|
+
automated: false,
|
|
78
|
+
applied: false,
|
|
79
|
+
metrics: {
|
|
80
|
+
rssHeapRatio,
|
|
81
|
+
rss: currentMemory.rss,
|
|
82
|
+
heapTotal: currentMemory.heapTotal,
|
|
83
|
+
},
|
|
84
|
+
recommendations: [
|
|
85
|
+
'Consider memory pool allocation strategies',
|
|
86
|
+
'Review large object allocations',
|
|
87
|
+
'Implement periodic garbage collection hints',
|
|
88
|
+
],
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return results;
|
|
92
|
+
}
|
|
93
|
+
async optimizeMemoryUsage(optimizations) {
|
|
94
|
+
for (const opt of optimizations.filter(o => o.automated && !o.applied)) {
|
|
95
|
+
logger_1.logger.info(`Applying memory optimization: ${opt.description}`);
|
|
96
|
+
try {
|
|
97
|
+
switch (opt.category) {
|
|
98
|
+
case 'memory':
|
|
99
|
+
await this.applyMemoryOptimization(opt);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
opt.applied = true;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
logger_1.logger.error(`Failed to apply optimization: ${opt.description}`, error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async applyMemoryOptimization(opt) {
|
|
110
|
+
// Force garbage collection if available
|
|
111
|
+
if (global.gc &&
|
|
112
|
+
opt.metrics?.['heapUtilization'] &&
|
|
113
|
+
opt.metrics['heapUtilization'] > 0.8) {
|
|
114
|
+
global.gc();
|
|
115
|
+
logger_1.logger.info('Forced garbage collection to reclaim memory');
|
|
116
|
+
}
|
|
117
|
+
// Adjust Node.js memory settings if needed
|
|
118
|
+
if (opt.metrics?.['heapUsed'] &&
|
|
119
|
+
opt.metrics['heapUsed'] > 1024 * 1024 * 1024) {
|
|
120
|
+
// 1GB
|
|
121
|
+
logger_1.logger.warn('Consider increasing Node.js heap size with --max-old-space-size');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Concurrency optimization strategies
|
|
127
|
+
*/
|
|
128
|
+
class ConcurrencyOptimizer {
|
|
129
|
+
workerThreads = require('os').cpus().length;
|
|
130
|
+
taskQueues = new Map();
|
|
131
|
+
activeWorkers = 0;
|
|
132
|
+
async analyzeConcurrency() {
|
|
133
|
+
const results = [];
|
|
134
|
+
logger_1.logger.info('Analyzing concurrency patterns...');
|
|
135
|
+
// Check CPU core utilization
|
|
136
|
+
const cpuInfo = (0, process_1.cpuUsage)();
|
|
137
|
+
const cpuUtilization = (cpuInfo.user + cpuInfo.system) / 1000000; // Convert to seconds
|
|
138
|
+
if (this.activeWorkers < this.workerThreads * 0.7) {
|
|
139
|
+
results.push({
|
|
140
|
+
category: 'concurrency',
|
|
141
|
+
description: 'Underutilized CPU cores detected',
|
|
142
|
+
impact: 'high',
|
|
143
|
+
effort: 'low',
|
|
144
|
+
automated: true,
|
|
145
|
+
applied: false,
|
|
146
|
+
metrics: {
|
|
147
|
+
availableCores: this.workerThreads,
|
|
148
|
+
activeWorkers: this.activeWorkers,
|
|
149
|
+
utilization: this.activeWorkers / this.workerThreads,
|
|
150
|
+
cpuUtilization,
|
|
151
|
+
},
|
|
152
|
+
recommendations: [
|
|
153
|
+
'Increase worker thread pool size',
|
|
154
|
+
'Implement parallel task processing',
|
|
155
|
+
'Use worker threads for CPU-intensive operations',
|
|
156
|
+
'Enable batch processing for multiple tasks',
|
|
157
|
+
],
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// Check for task queue bottlenecks
|
|
161
|
+
for (const [queueName, tasks] of this.taskQueues) {
|
|
162
|
+
if (tasks.length > 100) {
|
|
163
|
+
results.push({
|
|
164
|
+
category: 'concurrency',
|
|
165
|
+
description: `High task queue backlog in ${queueName}`,
|
|
166
|
+
impact: 'medium',
|
|
167
|
+
effort: 'medium',
|
|
168
|
+
automated: true,
|
|
169
|
+
applied: false,
|
|
170
|
+
metrics: {
|
|
171
|
+
queueSize: tasks.length,
|
|
172
|
+
},
|
|
173
|
+
metadata: {
|
|
174
|
+
queueName: queueName,
|
|
175
|
+
},
|
|
176
|
+
recommendations: [
|
|
177
|
+
'Implement backpressure handling',
|
|
178
|
+
'Increase queue processing workers',
|
|
179
|
+
'Add task prioritization',
|
|
180
|
+
'Consider task batching strategies',
|
|
181
|
+
],
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return results;
|
|
186
|
+
}
|
|
187
|
+
async optimizeConcurrency(optimizations) {
|
|
188
|
+
for (const opt of optimizations.filter(o => o.automated && !o.applied)) {
|
|
189
|
+
logger_1.logger.info(`Applying concurrency optimization: ${opt.description}`);
|
|
190
|
+
try {
|
|
191
|
+
await this.applyConcurrencyOptimization(opt);
|
|
192
|
+
opt.applied = true;
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
logger_1.logger.error(`Failed to apply optimization: ${opt.description}`, error);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async applyConcurrencyOptimization(opt) {
|
|
200
|
+
if (opt.metrics?.['utilization'] && opt.metrics['utilization'] < 0.7) {
|
|
201
|
+
// Increase worker thread pool for better CPU utilization
|
|
202
|
+
const newWorkerCount = Math.min(this.workerThreads, Math.floor(this.workerThreads * 1.2));
|
|
203
|
+
logger_1.logger.info(`Increasing worker threads from ${this.activeWorkers} to ${newWorkerCount}`);
|
|
204
|
+
// Implementation would update the actual worker pool
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
updateTaskQueue(queueName, tasks) {
|
|
208
|
+
this.taskQueues.set(queueName, tasks);
|
|
209
|
+
}
|
|
210
|
+
updateActiveWorkers(count) {
|
|
211
|
+
this.activeWorkers = count;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Bundle and asset optimization
|
|
216
|
+
*/
|
|
217
|
+
class AssetOptimizer {
|
|
218
|
+
async analyzeBundleSize(projectPath) {
|
|
219
|
+
const results = [];
|
|
220
|
+
try {
|
|
221
|
+
const packageJsonPath = path_1.default.join(projectPath, 'package.json');
|
|
222
|
+
if (await fs_extra_1.default.pathExists(packageJsonPath)) {
|
|
223
|
+
const packageJson = await fs_extra_1.default.readJson(packageJsonPath);
|
|
224
|
+
// Check for large dependencies
|
|
225
|
+
const dependencies = {
|
|
226
|
+
...packageJson.dependencies,
|
|
227
|
+
...packageJson.devDependencies,
|
|
228
|
+
};
|
|
229
|
+
const largeDeps = Object.keys(dependencies).filter(dep => {
|
|
230
|
+
// This is a simplified check - in reality you'd analyze actual bundle sizes
|
|
231
|
+
return (dep.includes('lodash') ||
|
|
232
|
+
dep.includes('moment') ||
|
|
233
|
+
dep.includes('rxjs'));
|
|
234
|
+
});
|
|
235
|
+
if (largeDeps.length > 0) {
|
|
236
|
+
results.push({
|
|
237
|
+
category: 'memory',
|
|
238
|
+
description: 'Large dependencies detected that could be optimized',
|
|
239
|
+
impact: 'medium',
|
|
240
|
+
effort: 'low',
|
|
241
|
+
automated: false,
|
|
242
|
+
applied: false,
|
|
243
|
+
metrics: {
|
|
244
|
+
largeDependencies: largeDeps.length,
|
|
245
|
+
totalDependencies: largeDeps.length,
|
|
246
|
+
},
|
|
247
|
+
metadata: {
|
|
248
|
+
dependencies: largeDeps,
|
|
249
|
+
},
|
|
250
|
+
recommendations: [
|
|
251
|
+
'Use tree-shaking to reduce bundle size',
|
|
252
|
+
'Replace large libraries with lighter alternatives',
|
|
253
|
+
'Implement dynamic imports for non-critical code',
|
|
254
|
+
'Use bundle analyzer to identify optimization opportunities',
|
|
255
|
+
],
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
logger_1.logger.warn('Could not analyze bundle size:', error.message);
|
|
262
|
+
}
|
|
263
|
+
return results;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Main Performance Optimizer Commands
|
|
268
|
+
*/
|
|
269
|
+
class PerformanceOptimizerCommands {
|
|
270
|
+
program;
|
|
271
|
+
configManager;
|
|
272
|
+
memoryOptimizer = new MemoryOptimizer();
|
|
273
|
+
concurrencyOptimizer = new ConcurrencyOptimizer();
|
|
274
|
+
assetOptimizer = new AssetOptimizer();
|
|
275
|
+
constructor(program, configManager) {
|
|
276
|
+
this.program = program;
|
|
277
|
+
this.configManager = configManager;
|
|
278
|
+
this.registerCommands();
|
|
279
|
+
}
|
|
280
|
+
registerCommands() {
|
|
281
|
+
const optimizeCmd = this.program
|
|
282
|
+
.command('optimize')
|
|
283
|
+
.description('optimize performance, memory usage, and concurrency');
|
|
284
|
+
// Memory optimization
|
|
285
|
+
optimizeCmd
|
|
286
|
+
.command('memory')
|
|
287
|
+
.description('optimize memory usage and detect leaks')
|
|
288
|
+
.option('--analyze-only', 'only analyze without applying optimizations')
|
|
289
|
+
.option('--force-gc', 'force garbage collection')
|
|
290
|
+
.option('--report <path>', 'generate detailed memory report')
|
|
291
|
+
.action(async (options) => {
|
|
292
|
+
await this.optimizeMemory(options);
|
|
293
|
+
});
|
|
294
|
+
// Concurrency optimization
|
|
295
|
+
optimizeCmd
|
|
296
|
+
.command('concurrency')
|
|
297
|
+
.description('optimize concurrent processing and worker utilization')
|
|
298
|
+
.option('--analyze-only', 'only analyze without applying optimizations')
|
|
299
|
+
.option('--workers <count>', 'set number of worker threads')
|
|
300
|
+
.option('--queue-size <size>', 'set maximum queue size')
|
|
301
|
+
.action(async (options) => {
|
|
302
|
+
await this.optimizeConcurrency(options);
|
|
303
|
+
});
|
|
304
|
+
// Bundle optimization
|
|
305
|
+
optimizeCmd
|
|
306
|
+
.command('bundle')
|
|
307
|
+
.description('optimize bundle size and asset loading')
|
|
308
|
+
.option('--analyze', 'analyze bundle composition')
|
|
309
|
+
.option('--compress', 'enable compression optimizations')
|
|
310
|
+
.action(async (options) => {
|
|
311
|
+
await this.optimizeBundle(options);
|
|
312
|
+
});
|
|
313
|
+
// Full optimization suite
|
|
314
|
+
optimizeCmd
|
|
315
|
+
.command('all')
|
|
316
|
+
.description('run all optimization analyses and apply safe optimizations')
|
|
317
|
+
.option('--dry-run', 'show what would be optimized without applying changes')
|
|
318
|
+
.option('--report <path>', 'generate comprehensive optimization report')
|
|
319
|
+
.action(async (options) => {
|
|
320
|
+
await this.optimizeAll(options);
|
|
321
|
+
});
|
|
322
|
+
// Performance monitoring
|
|
323
|
+
optimizeCmd
|
|
324
|
+
.command('monitor')
|
|
325
|
+
.description('start real-time performance monitoring')
|
|
326
|
+
.option('--duration <seconds>', 'monitoring duration', '60')
|
|
327
|
+
.option('--interval <ms>', 'measurement interval', '1000')
|
|
328
|
+
.action(async (options) => {
|
|
329
|
+
await this.startMonitoring(options);
|
|
330
|
+
});
|
|
331
|
+
// Benchmarking
|
|
332
|
+
optimizeCmd
|
|
333
|
+
.command('benchmark')
|
|
334
|
+
.description('run performance benchmarks')
|
|
335
|
+
.option('--scenarios <scenarios>', 'comma-separated list of scenarios')
|
|
336
|
+
.option('--iterations <count>', 'number of benchmark iterations', '10')
|
|
337
|
+
.action(async (options) => {
|
|
338
|
+
await this.runBenchmarks(options);
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
async optimizeMemory(options) {
|
|
342
|
+
try {
|
|
343
|
+
logger_1.logger.info('š Starting memory optimization...');
|
|
344
|
+
const optimizations = await this.memoryOptimizer.analyzeMemoryUsage();
|
|
345
|
+
if (optimizations.length === 0) {
|
|
346
|
+
logger_1.logger.success('ā
Memory usage is already optimized!');
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
logger_1.logger.info(`Found ${optimizations.length} memory optimization opportunities:`);
|
|
350
|
+
optimizations.forEach(opt => {
|
|
351
|
+
const impactColor = opt.impact === 'high'
|
|
352
|
+
? 'red'
|
|
353
|
+
: opt.impact === 'medium'
|
|
354
|
+
? 'yellow'
|
|
355
|
+
: 'green';
|
|
356
|
+
console.log(` ${chalk_1.default[impactColor](`[${opt.impact.toUpperCase()}]`)} ${opt.description}`);
|
|
357
|
+
});
|
|
358
|
+
if (!options.analyzeOnly) {
|
|
359
|
+
await this.memoryOptimizer.optimizeMemoryUsage(optimizations);
|
|
360
|
+
const applied = optimizations.filter(o => o.applied).length;
|
|
361
|
+
logger_1.logger.success(`ā
Applied ${applied} memory optimizations`);
|
|
362
|
+
}
|
|
363
|
+
if (options.report) {
|
|
364
|
+
await this.generateOptimizationReport(optimizations, options.report, 'memory');
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
throw error_handler_1.errorHandler.createError('WUNDR_MEMORY_OPTIMIZATION_FAILED', 'Failed to optimize memory usage', { options }, true);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
async optimizeConcurrency(options) {
|
|
372
|
+
try {
|
|
373
|
+
logger_1.logger.info('š Starting concurrency optimization...');
|
|
374
|
+
if (options.workers) {
|
|
375
|
+
this.concurrencyOptimizer.updateActiveWorkers(parseInt(options.workers));
|
|
376
|
+
}
|
|
377
|
+
const optimizations = await this.concurrencyOptimizer.analyzeConcurrency();
|
|
378
|
+
if (optimizations.length === 0) {
|
|
379
|
+
logger_1.logger.success('ā
Concurrency is already optimized!');
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
logger_1.logger.info(`Found ${optimizations.length} concurrency optimization opportunities:`);
|
|
383
|
+
optimizations.forEach(opt => {
|
|
384
|
+
const impactColor = opt.impact === 'high'
|
|
385
|
+
? 'red'
|
|
386
|
+
: opt.impact === 'medium'
|
|
387
|
+
? 'yellow'
|
|
388
|
+
: 'green';
|
|
389
|
+
console.log(` ${chalk_1.default[impactColor](`[${opt.impact.toUpperCase()}]`)} ${opt.description}`);
|
|
390
|
+
});
|
|
391
|
+
if (!options.analyzeOnly) {
|
|
392
|
+
await this.concurrencyOptimizer.optimizeConcurrency(optimizations);
|
|
393
|
+
const applied = optimizations.filter(o => o.applied).length;
|
|
394
|
+
logger_1.logger.success(`ā
Applied ${applied} concurrency optimizations`);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
catch (error) {
|
|
398
|
+
throw error_handler_1.errorHandler.createError('WUNDR_CONCURRENCY_OPTIMIZATION_FAILED', 'Failed to optimize concurrency', { options }, true);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
async optimizeBundle(options) {
|
|
402
|
+
try {
|
|
403
|
+
logger_1.logger.info('š Starting bundle optimization...');
|
|
404
|
+
const projectPath = process.cwd();
|
|
405
|
+
const optimizations = await this.assetOptimizer.analyzeBundleSize(projectPath);
|
|
406
|
+
if (optimizations.length === 0) {
|
|
407
|
+
logger_1.logger.success('ā
Bundle is already optimized!');
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
logger_1.logger.info(`Found ${optimizations.length} bundle optimization opportunities:`);
|
|
411
|
+
optimizations.forEach(opt => {
|
|
412
|
+
const impactColor = opt.impact === 'high'
|
|
413
|
+
? 'red'
|
|
414
|
+
: opt.impact === 'medium'
|
|
415
|
+
? 'yellow'
|
|
416
|
+
: 'green';
|
|
417
|
+
console.log(` ${chalk_1.default[impactColor](`[${opt.impact.toUpperCase()}]`)} ${opt.description}`);
|
|
418
|
+
opt.recommendations.forEach(rec => console.log(` ⢠${rec}`));
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
throw error_handler_1.errorHandler.createError('WUNDR_BUNDLE_OPTIMIZATION_FAILED', 'Failed to optimize bundle', { options }, true);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
async optimizeAll(options) {
|
|
426
|
+
try {
|
|
427
|
+
logger_1.logger.info('š Starting comprehensive performance optimization...');
|
|
428
|
+
const allOptimizations = [];
|
|
429
|
+
// Run all optimizations
|
|
430
|
+
const memoryOpts = await this.memoryOptimizer.analyzeMemoryUsage();
|
|
431
|
+
const concurrencyOpts = await this.concurrencyOptimizer.analyzeConcurrency();
|
|
432
|
+
const bundleOpts = await this.assetOptimizer.analyzeBundleSize(process.cwd());
|
|
433
|
+
allOptimizations.push(...memoryOpts, ...concurrencyOpts, ...bundleOpts);
|
|
434
|
+
if (allOptimizations.length === 0) {
|
|
435
|
+
logger_1.logger.success('ā
System is already fully optimized!');
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
// Group by category
|
|
439
|
+
const grouped = allOptimizations.reduce((acc, opt) => {
|
|
440
|
+
if (opt && opt.category) {
|
|
441
|
+
if (!acc[opt.category]) {
|
|
442
|
+
acc[opt.category] = [];
|
|
443
|
+
}
|
|
444
|
+
acc[opt.category].push(opt);
|
|
445
|
+
}
|
|
446
|
+
return acc;
|
|
447
|
+
}, {});
|
|
448
|
+
logger_1.logger.info('\nš Optimization Summary:');
|
|
449
|
+
Object.entries(grouped).forEach(([category, opts]) => {
|
|
450
|
+
console.log(` ${chalk_1.default.bold(category.toUpperCase())}: ${opts.length} opportunities`);
|
|
451
|
+
});
|
|
452
|
+
if (!options.dryRun) {
|
|
453
|
+
// Apply automated optimizations
|
|
454
|
+
const automated = allOptimizations.filter(o => o.automated);
|
|
455
|
+
if (automated.length > 0) {
|
|
456
|
+
logger_1.logger.info(`\nš§ Applying ${automated.length} automated optimizations...`);
|
|
457
|
+
for (const opt of automated) {
|
|
458
|
+
try {
|
|
459
|
+
if (opt.category === 'memory') {
|
|
460
|
+
await this.memoryOptimizer.optimizeMemoryUsage([opt]);
|
|
461
|
+
}
|
|
462
|
+
else if (opt.category === 'concurrency') {
|
|
463
|
+
await this.concurrencyOptimizer.optimizeConcurrency([opt]);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
catch (error) {
|
|
467
|
+
logger_1.logger.warn(`Failed to apply optimization: ${opt.description}`);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
const applied = allOptimizations.filter(o => o.applied).length;
|
|
472
|
+
logger_1.logger.success(`ā
Applied ${applied} optimizations automatically`);
|
|
473
|
+
const manual = allOptimizations.filter(o => !o.automated).length;
|
|
474
|
+
if (manual > 0) {
|
|
475
|
+
logger_1.logger.info(`ā¹ļø ${manual} optimizations require manual intervention`);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
if (options.report) {
|
|
479
|
+
await this.generateOptimizationReport(allOptimizations, options.report, 'comprehensive');
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
catch (error) {
|
|
483
|
+
throw error_handler_1.errorHandler.createError('WUNDR_COMPREHENSIVE_OPTIMIZATION_FAILED', 'Failed to run comprehensive optimization', { options }, true);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
async startMonitoring(options) {
|
|
487
|
+
const duration = parseInt(options.duration) * 1000;
|
|
488
|
+
const interval = parseInt(options.interval);
|
|
489
|
+
const startTime = Date.now();
|
|
490
|
+
logger_1.logger.info(`š Starting performance monitoring for ${options.duration} seconds...`);
|
|
491
|
+
const metrics = [];
|
|
492
|
+
const monitor = setInterval(() => {
|
|
493
|
+
const memory = (0, process_1.memoryUsage)();
|
|
494
|
+
const cpu = (0, process_1.cpuUsage)();
|
|
495
|
+
const metric = {
|
|
496
|
+
memory: {
|
|
497
|
+
heapUsed: memory.heapUsed,
|
|
498
|
+
heapTotal: memory.heapTotal,
|
|
499
|
+
external: memory.external,
|
|
500
|
+
rss: memory.rss,
|
|
501
|
+
freeMemory: 0, // Would implement actual system memory check
|
|
502
|
+
totalMemory: 0,
|
|
503
|
+
},
|
|
504
|
+
cpu: {
|
|
505
|
+
user: cpu.user,
|
|
506
|
+
system: cpu.system,
|
|
507
|
+
idle: 0,
|
|
508
|
+
loadAverage: [0, 0, 0], // Would implement actual load average
|
|
509
|
+
},
|
|
510
|
+
performance: {
|
|
511
|
+
uptime: process.uptime(),
|
|
512
|
+
responseTime: 0, // Would measure actual response times
|
|
513
|
+
throughput: 0, // Would measure actual throughput
|
|
514
|
+
},
|
|
515
|
+
};
|
|
516
|
+
metrics.push(metric);
|
|
517
|
+
// Real-time display
|
|
518
|
+
const heapMB = (memory.heapUsed / 1024 / 1024).toFixed(2);
|
|
519
|
+
const rssMB = (memory.rss / 1024 / 1024).toFixed(2);
|
|
520
|
+
process.stdout.write(`\rš¾ Heap: ${heapMB}MB | RSS: ${rssMB}MB | CPU: ${cpu.user}μs`);
|
|
521
|
+
}, interval);
|
|
522
|
+
setTimeout(() => {
|
|
523
|
+
clearInterval(monitor);
|
|
524
|
+
console.log('\n\nš Monitoring completed!');
|
|
525
|
+
// Calculate averages
|
|
526
|
+
const avgHeap = metrics.reduce((sum, m) => sum + m.memory.heapUsed, 0) / metrics.length;
|
|
527
|
+
const avgRSS = metrics.reduce((sum, m) => sum + m.memory.rss, 0) / metrics.length;
|
|
528
|
+
const peakHeap = Math.max(...metrics.map(m => m.memory.heapUsed));
|
|
529
|
+
const peakRSS = Math.max(...metrics.map(m => m.memory.rss));
|
|
530
|
+
console.log('\nMemory Statistics:');
|
|
531
|
+
console.log(` Average Heap: ${(avgHeap / 1024 / 1024).toFixed(2)} MB`);
|
|
532
|
+
console.log(` Average RSS: ${(avgRSS / 1024 / 1024).toFixed(2)} MB`);
|
|
533
|
+
console.log(` Peak Heap: ${(peakHeap / 1024 / 1024).toFixed(2)} MB`);
|
|
534
|
+
console.log(` Peak RSS: ${(peakRSS / 1024 / 1024).toFixed(2)} MB`);
|
|
535
|
+
logger_1.logger.success('Monitoring data collected successfully');
|
|
536
|
+
}, duration);
|
|
537
|
+
}
|
|
538
|
+
async runBenchmarks(options) {
|
|
539
|
+
try {
|
|
540
|
+
logger_1.logger.info('šāāļø Starting performance benchmarks...');
|
|
541
|
+
const scenarios = options.scenarios
|
|
542
|
+
? options.scenarios.split(',')
|
|
543
|
+
: [
|
|
544
|
+
'memory-allocation',
|
|
545
|
+
'file-processing',
|
|
546
|
+
'concurrent-tasks',
|
|
547
|
+
'data-transformation',
|
|
548
|
+
];
|
|
549
|
+
const iterations = parseInt(options.iterations);
|
|
550
|
+
const results = {};
|
|
551
|
+
for (const scenario of scenarios) {
|
|
552
|
+
logger_1.logger.info(`Running ${scenario} benchmark...`);
|
|
553
|
+
results[scenario] = [];
|
|
554
|
+
for (let i = 0; i < iterations; i++) {
|
|
555
|
+
const startTime = perf_hooks_1.performance.now();
|
|
556
|
+
switch (scenario) {
|
|
557
|
+
case 'memory-allocation':
|
|
558
|
+
await this.benchmarkMemoryAllocation();
|
|
559
|
+
break;
|
|
560
|
+
case 'file-processing':
|
|
561
|
+
await this.benchmarkFileProcessing();
|
|
562
|
+
break;
|
|
563
|
+
case 'concurrent-tasks':
|
|
564
|
+
await this.benchmarkConcurrentTasks();
|
|
565
|
+
break;
|
|
566
|
+
case 'data-transformation':
|
|
567
|
+
await this.benchmarkDataTransformation();
|
|
568
|
+
break;
|
|
569
|
+
}
|
|
570
|
+
const duration = perf_hooks_1.performance.now() - startTime;
|
|
571
|
+
results[scenario].push(duration);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
// Display results
|
|
575
|
+
console.log('\nš Benchmark Results:');
|
|
576
|
+
Object.entries(results).forEach(([scenario, times]) => {
|
|
577
|
+
const avg = times.reduce((sum, t) => sum + t, 0) / times.length;
|
|
578
|
+
const min = Math.min(...times);
|
|
579
|
+
const max = Math.max(...times);
|
|
580
|
+
console.log(`\n ${chalk_1.default.bold(scenario)}:`);
|
|
581
|
+
console.log(` Average: ${avg.toFixed(2)}ms`);
|
|
582
|
+
console.log(` Min: ${min.toFixed(2)}ms`);
|
|
583
|
+
console.log(` Max: ${max.toFixed(2)}ms`);
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
catch (error) {
|
|
587
|
+
throw error_handler_1.errorHandler.createError('WUNDR_BENCHMARK_FAILED', 'Failed to run performance benchmarks', { options }, true);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
// Benchmark implementations
|
|
591
|
+
async benchmarkMemoryAllocation() {
|
|
592
|
+
// Simulate memory-intensive operations
|
|
593
|
+
const arrays = [];
|
|
594
|
+
for (let i = 0; i < 1000; i++) {
|
|
595
|
+
arrays.push(new Array(1000).fill(Math.random()));
|
|
596
|
+
}
|
|
597
|
+
arrays.length = 0; // Clear for GC
|
|
598
|
+
}
|
|
599
|
+
async benchmarkFileProcessing() {
|
|
600
|
+
// Simulate file processing operations
|
|
601
|
+
const data = Buffer.alloc(1024 * 1024); // 1MB buffer
|
|
602
|
+
data.fill('A');
|
|
603
|
+
const processed = data.toString('base64');
|
|
604
|
+
Buffer.from(processed, 'base64');
|
|
605
|
+
}
|
|
606
|
+
async benchmarkConcurrentTasks() {
|
|
607
|
+
// Simulate concurrent task processing
|
|
608
|
+
const tasks = Array.from({ length: 100 }, (_, i) => new Promise(resolve => setTimeout(resolve, Math.random() * 10)));
|
|
609
|
+
await Promise.all(tasks);
|
|
610
|
+
}
|
|
611
|
+
async benchmarkDataTransformation() {
|
|
612
|
+
// Simulate data transformation operations
|
|
613
|
+
const data = Array.from({ length: 10000 }, (_, i) => ({
|
|
614
|
+
id: i,
|
|
615
|
+
value: Math.random(),
|
|
616
|
+
}));
|
|
617
|
+
const transformed = data
|
|
618
|
+
.filter(item => item.value > 0.5)
|
|
619
|
+
.map(item => ({ ...item, doubled: item.value * 2 }))
|
|
620
|
+
.reduce((acc, item) => acc + item.doubled, 0);
|
|
621
|
+
}
|
|
622
|
+
async generateOptimizationReport(optimizations, reportPath, type) {
|
|
623
|
+
const report = {
|
|
624
|
+
timestamp: new Date().toISOString(),
|
|
625
|
+
type,
|
|
626
|
+
summary: {
|
|
627
|
+
total: optimizations.length,
|
|
628
|
+
automated: optimizations.filter(o => o.automated).length,
|
|
629
|
+
applied: optimizations.filter(o => o.applied).length,
|
|
630
|
+
highImpact: optimizations.filter(o => o.impact === 'high').length,
|
|
631
|
+
criticalImpact: optimizations.filter(o => o.impact === 'critical')
|
|
632
|
+
.length,
|
|
633
|
+
},
|
|
634
|
+
optimizations: optimizations.map(opt => ({
|
|
635
|
+
category: opt.category,
|
|
636
|
+
description: opt.description,
|
|
637
|
+
impact: opt.impact,
|
|
638
|
+
effort: opt.effort,
|
|
639
|
+
automated: opt.automated,
|
|
640
|
+
applied: opt.applied,
|
|
641
|
+
recommendations: opt.recommendations,
|
|
642
|
+
metrics: opt.metrics,
|
|
643
|
+
})),
|
|
644
|
+
};
|
|
645
|
+
await fs_extra_1.default.writeJson(reportPath, report, { spaces: 2 });
|
|
646
|
+
logger_1.logger.success(`š Optimization report saved to ${reportPath}`);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
exports.PerformanceOptimizerCommands = PerformanceOptimizerCommands;
|
|
650
|
+
//# sourceMappingURL=performance-optimizer.js.map
|