vibecodingmachine-core 2026.2.20-438 → 2026.2.26-1739
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +240 -0
- package/package.json +10 -2
- package/src/agents/Agent.js +300 -0
- package/src/agents/AgentAdditionService.js +311 -0
- package/src/agents/AgentCheckService.js +690 -0
- package/src/agents/AgentInstallationService.js +140 -0
- package/src/agents/AgentSetupService.js +467 -0
- package/src/agents/AgentStatus.js +183 -0
- package/src/agents/AgentVerificationService.js +634 -0
- package/src/agents/ConfigurationSchemaValidator.js +543 -0
- package/src/agents/EnvironmentConfigurationManager.js +602 -0
- package/src/agents/InstallationErrorHandler.js +372 -0
- package/src/agents/InstallationLog.js +363 -0
- package/src/agents/InstallationMethod.js +510 -0
- package/src/agents/InstallationOrchestrator.js +352 -0
- package/src/agents/InstallationProgressReporter.js +372 -0
- package/src/agents/InstallationRetryManager.js +322 -0
- package/src/agents/InstallationType.js +254 -0
- package/src/agents/OperationTypes.js +310 -0
- package/src/agents/PerformanceMetricsCollector.js +493 -0
- package/src/agents/SecurityValidationService.js +534 -0
- package/src/agents/VerificationTest.js +354 -0
- package/src/agents/VerificationType.js +226 -0
- package/src/agents/WindowsPermissionHandler.js +518 -0
- package/src/agents/config/AgentConfigManager.js +393 -0
- package/src/agents/config/AgentDefaultsRegistry.js +373 -0
- package/src/agents/config/ConfigValidator.js +281 -0
- package/src/agents/discovery/AgentDiscoveryService.js +707 -0
- package/src/agents/logging/AgentLogger.js +511 -0
- package/src/agents/status/AgentStatusManager.js +481 -0
- package/src/agents/storage/FileManager.js +454 -0
- package/src/agents/verification/AgentCommunicationTester.js +474 -0
- package/src/agents/verification/BaseVerifier.js +430 -0
- package/src/agents/verification/CommandVerifier.js +480 -0
- package/src/agents/verification/FileOperationVerifier.js +453 -0
- package/src/agents/verification/ResultAnalyzer.js +707 -0
- package/src/agents/verification/TestRequirementManager.js +495 -0
- package/src/agents/verification/VerificationRunner.js +433 -0
- package/src/agents/windows/BaseWindowsInstaller.js +441 -0
- package/src/agents/windows/ChocolateyInstaller.js +509 -0
- package/src/agents/windows/DirectInstaller.js +443 -0
- package/src/agents/windows/InstallerFactory.js +391 -0
- package/src/agents/windows/NpmInstaller.js +505 -0
- package/src/agents/windows/PowerShellInstaller.js +458 -0
- package/src/agents/windows/WinGetInstaller.js +390 -0
- package/src/analysis/analysis-reporter.js +132 -0
- package/src/analysis/boundary-detector.js +712 -0
- package/src/analysis/categorizer.js +340 -0
- package/src/analysis/codebase-scanner.js +384 -0
- package/src/analysis/line-counter.js +513 -0
- package/src/analysis/priority-calculator.js +679 -0
- package/src/analysis/report/analysis-report.js +250 -0
- package/src/analysis/report/package-analyzer.js +278 -0
- package/src/analysis/report/recommendation-generator.js +382 -0
- package/src/analysis/report/statistics-generator.js +515 -0
- package/src/analysis/reports/analysis-report-model.js +101 -0
- package/src/analysis/reports/recommendation-generator.js +283 -0
- package/src/analysis/reports/report-generators.js +191 -0
- package/src/analysis/reports/statistics-calculator.js +231 -0
- package/src/analysis/reports/trend-analyzer.js +219 -0
- package/src/analysis/strategy-generator.js +814 -0
- package/src/auto-mode/AutoModeBusinessLogic.js +836 -0
- package/src/config/refactoring-config.js +307 -0
- package/src/health-tracking/json-storage.js +38 -2
- package/src/ide-integration/applescript-manager-core.js +233 -0
- package/src/ide-integration/applescript-manager.cjs +357 -28
- package/src/ide-integration/applescript-manager.js +89 -3599
- package/src/ide-integration/cdp-manager.js +306 -0
- package/src/ide-integration/claude-code-cli-manager.cjs +1 -1
- package/src/ide-integration/continuation-handler.js +337 -0
- package/src/ide-integration/ide-status-checker.js +292 -0
- package/src/ide-integration/macos-ide-manager.js +627 -0
- package/src/ide-integration/macos-text-sender.js +528 -0
- package/src/ide-integration/response-reader.js +548 -0
- package/src/ide-integration/windows-automation-manager.js +121 -0
- package/src/ide-integration/windows-ide-manager.js +373 -0
- package/src/index.cjs +25 -3
- package/src/index.js +15 -1
- package/src/llm/direct-llm-manager.cjs +90 -2
- package/src/models/compliance-report.js +538 -0
- package/src/models/file-analysis.js +681 -0
- package/src/models/refactoring-plan.js +770 -0
- package/src/monitoring/alert-system.js +834 -0
- package/src/monitoring/compliance-progress-tracker.js +437 -0
- package/src/monitoring/continuous-scan-notifications.js +661 -0
- package/src/monitoring/continuous-scanner.js +279 -0
- package/src/monitoring/file-monitor/file-analyzer.js +262 -0
- package/src/monitoring/file-monitor/file-monitor.js +237 -0
- package/src/monitoring/file-monitor/watcher.js +194 -0
- package/src/monitoring/file-monitor.js +17 -0
- package/src/monitoring/notification-manager.js +437 -0
- package/src/monitoring/scanner-core.js +368 -0
- package/src/monitoring/scanner-events.js +214 -0
- package/src/monitoring/violation-notification-system.js +515 -0
- package/src/refactoring/boundaries/cohesion-analyzer.js +316 -0
- package/src/refactoring/boundaries/extraction-result.js +285 -0
- package/src/refactoring/boundaries/extraction-strategies.js +392 -0
- package/src/refactoring/boundaries/module-boundary.js +209 -0
- package/src/refactoring/boundary/boundary-detector.js +741 -0
- package/src/refactoring/boundary/boundary-types.js +405 -0
- package/src/refactoring/boundary/extraction-strategies.js +554 -0
- package/src/refactoring/boundary-extraction-result.js +77 -0
- package/src/refactoring/boundary-extraction-strategies.js +330 -0
- package/src/refactoring/boundary-extractor.js +384 -0
- package/src/refactoring/boundary-types.js +46 -0
- package/src/refactoring/circular/circular-dependency.js +88 -0
- package/src/refactoring/circular/cycle-detection.js +147 -0
- package/src/refactoring/circular/dependency-node.js +82 -0
- package/src/refactoring/circular/dependency-result.js +107 -0
- package/src/refactoring/circular/dependency-types.js +58 -0
- package/src/refactoring/circular/graph-builder.js +213 -0
- package/src/refactoring/circular/resolution-strategy.js +72 -0
- package/src/refactoring/circular/strategy-generator.js +229 -0
- package/src/refactoring/circular-dependency-resolver-original.js +809 -0
- package/src/refactoring/circular-dependency-resolver.js +200 -0
- package/src/refactoring/code-mover.js +761 -0
- package/src/refactoring/file-splitter.js +696 -0
- package/src/refactoring/functionality-validator.js +816 -0
- package/src/refactoring/import-manager.js +774 -0
- package/src/refactoring/module-boundary.js +107 -0
- package/src/refactoring/refactoring-executor.js +672 -0
- package/src/refactoring/refactoring-rollback.js +614 -0
- package/src/refactoring/test-validator.js +631 -0
- package/src/requirement-management/default-requirement-manager.js +321 -0
- package/src/requirement-management/requirement-file-parser.js +159 -0
- package/src/requirement-management/requirement-sequencer.js +221 -0
- package/src/rui/commands/AgentCommandParser.js +600 -0
- package/src/rui/commands/AgentCommands.js +487 -0
- package/src/rui/commands/AgentResponseFormatter.js +832 -0
- package/src/scripts/verify-full-compliance.js +269 -0
- package/src/sync/sync-engine-core.js +1 -0
- package/src/sync/sync-engine-remote-handlers.js +135 -0
- package/src/task-generation/automated-task-generator.js +351 -0
- package/src/task-generation/prioritizer.js +287 -0
- package/src/task-generation/task-list-updater.js +215 -0
- package/src/task-generation/task-management-integration.js +480 -0
- package/src/task-generation/task-manager-integration.js +270 -0
- package/src/task-generation/violation-task-generator.js +474 -0
- package/src/task-management/continuous-scan-integration.js +342 -0
- package/src/timeout-management/index.js +12 -3
- package/src/timeout-management/response-time-tracker.js +167 -0
- package/src/timeout-management/timeout-calculator.js +159 -0
- package/src/timeout-management/timeout-config-manager.js +172 -0
- package/src/utils/ast-analyzer.js +417 -0
- package/src/utils/current-requirement-manager.js +276 -0
- package/src/utils/current-requirement-operations.js +472 -0
- package/src/utils/dependency-mapper.js +456 -0
- package/src/utils/download-with-progress.js +4 -2
- package/src/utils/electron-update-checker.js +4 -1
- package/src/utils/file-size-analyzer.js +272 -0
- package/src/utils/import-updater.js +280 -0
- package/src/utils/refactoring-tools.js +512 -0
- package/src/utils/report-generator.js +569 -0
- package/src/utils/reports/report-analysis.js +218 -0
- package/src/utils/reports/report-types.js +55 -0
- package/src/utils/reports/summary-generators.js +102 -0
- package/src/utils/requirement-file-management.js +157 -0
- package/src/utils/requirement-helpers/requirement-file-ops.js +392 -0
- package/src/utils/requirement-helpers/requirement-mover.js +414 -0
- package/src/utils/requirement-helpers/requirement-parser.js +326 -0
- package/src/utils/requirement-helpers/requirement-status.js +320 -0
- package/src/utils/requirement-helpers-new.js +55 -0
- package/src/utils/requirement-helpers-refactored.js +367 -0
- package/src/utils/requirement-helpers.js +291 -1191
- package/src/utils/requirement-movement-operations.js +450 -0
- package/src/utils/requirement-movement.js +312 -0
- package/src/utils/requirement-parsing-helpers.js +56 -0
- package/src/utils/requirement-statistics.js +200 -0
- package/src/utils/requirement-text-utils.js +58 -0
- package/src/utils/rollback/rollback-handlers.js +125 -0
- package/src/utils/rollback/rollback-operation.js +63 -0
- package/src/utils/rollback/rollback-recorder.js +166 -0
- package/src/utils/rollback/rollback-state-manager.js +175 -0
- package/src/utils/rollback/rollback-types.js +33 -0
- package/src/utils/rollback/rollback-utils.js +110 -0
- package/src/utils/rollback-manager-original.js +569 -0
- package/src/utils/rollback-manager.js +202 -0
- package/src/utils/smoke-test-cli.js +362 -0
- package/src/utils/smoke-test-gui.js +351 -0
- package/src/utils/smoke-test-orchestrator.js +321 -0
- package/src/utils/smoke-test-runner.js +60 -0
- package/src/utils/smoke-test-web.js +347 -0
- package/src/utils/specification-helpers.js +39 -13
- package/src/utils/specification-migration.js +97 -0
- package/src/utils/test-runner.js +579 -0
- package/src/utils/validation-framework.js +518 -0
- package/src/validation/compliance-analyzer.js +197 -0
- package/src/validation/compliance-report-generator.js +343 -0
- package/src/validation/compliance-reporter.js +711 -0
- package/src/validation/compliance-rules.js +127 -0
- package/src/validation/constitution-validator-new.js +196 -0
- package/src/validation/constitution-validator.js +17 -0
- package/src/validation/file-validators.js +170 -0
- package/src/validation/line-limit/file-analyzer.js +201 -0
- package/src/validation/line-limit/line-limit-validator.js +208 -0
- package/src/validation/line-limit/validation-result.js +144 -0
- package/src/validation/line-limit-core.js +225 -0
- package/src/validation/line-limit-reporter.js +134 -0
- package/src/validation/line-limit-result.js +125 -0
- package/src/validation/line-limit-validator.js +41 -0
- package/src/validation/metrics-calculator.js +660 -0
- package/src/sync/sync-engine-backup.js +0 -559
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NPM Installer
|
|
3
|
+
*
|
|
4
|
+
* Node Package Manager (npm) installer implementation.
|
|
5
|
+
* Follows constitutional requirements: <555 lines, test-first approach.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const BaseWindowsInstaller = require('./BaseWindowsInstaller');
|
|
9
|
+
const { InstallationType } = require('../InstallationType');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* NPM installer class for Windows agents
|
|
13
|
+
*/
|
|
14
|
+
class NpmInstaller extends BaseWindowsInstaller {
|
|
15
|
+
/**
|
|
16
|
+
* Create NPM installer instance
|
|
17
|
+
* @param {Object} config - Installer configuration
|
|
18
|
+
*/
|
|
19
|
+
constructor(config = {}) {
|
|
20
|
+
super({
|
|
21
|
+
type: InstallationType.NPM,
|
|
22
|
+
...config
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
this.global = config.global !== false; // Default to global installation
|
|
26
|
+
this.registry = config.registry || '';
|
|
27
|
+
this.scope = config.scope || '';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Check if npm is available on current system
|
|
32
|
+
* @returns {Promise<boolean>} - True if npm is available
|
|
33
|
+
*/
|
|
34
|
+
async isAvailable() {
|
|
35
|
+
try {
|
|
36
|
+
const { execSync } = require('child_process');
|
|
37
|
+
execSync('npm --version', { stdio: 'ignore' });
|
|
38
|
+
return true;
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (this.logger) {
|
|
41
|
+
await this.logger.debug('npm not available', { error: error.message });
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Check system requirements for npm
|
|
49
|
+
* @returns {Promise<Object>} - Requirements check result
|
|
50
|
+
*/
|
|
51
|
+
async checkRequirements() {
|
|
52
|
+
const requirements = await super.checkRequirements();
|
|
53
|
+
|
|
54
|
+
// npm-specific requirements
|
|
55
|
+
const npmRequirements = [
|
|
56
|
+
{ requirement: 'node.js', met: await this.checkNodeJS() },
|
|
57
|
+
{ requirement: 'npm', met: await this.isAvailable() },
|
|
58
|
+
{ requirement: 'internet', met: await this.checkInternetConnection() }
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
npmRequirements.forEach(req => {
|
|
62
|
+
requirements.requirements.push(req);
|
|
63
|
+
if (!req.met) {
|
|
64
|
+
requirements.allMet = false;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
return requirements;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Check if Node.js is available
|
|
73
|
+
* @returns {Promise<boolean>} - True if Node.js is available
|
|
74
|
+
*/
|
|
75
|
+
async checkNodeJS() {
|
|
76
|
+
try {
|
|
77
|
+
const { execSync } = require('child_process');
|
|
78
|
+
execSync('node --version', { stdio: 'ignore' });
|
|
79
|
+
return true;
|
|
80
|
+
} catch (error) {
|
|
81
|
+
if (this.logger) {
|
|
82
|
+
await this.logger.debug('Node.js not available', { error: error.message });
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Check internet connection
|
|
90
|
+
* @returns {Promise<boolean>} - True if internet is available
|
|
91
|
+
*/
|
|
92
|
+
async checkInternetConnection() {
|
|
93
|
+
try {
|
|
94
|
+
const { execSync } = require('child_process');
|
|
95
|
+
execSync('ping -n 1 registry.npmjs.org', { stdio: 'ignore' });
|
|
96
|
+
return true;
|
|
97
|
+
} catch (error) {
|
|
98
|
+
if (this.logger) {
|
|
99
|
+
await this.logger.debug('Internet connection check failed', { error: error.message });
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Perform actual installation using npm
|
|
107
|
+
* @param {boolean} force - Force reinstall
|
|
108
|
+
* @param {number} timeout - Timeout in milliseconds
|
|
109
|
+
* @returns {Promise<Object>} - Installation result
|
|
110
|
+
*/
|
|
111
|
+
async performInstallation(force, timeout) {
|
|
112
|
+
const command = this.buildInstallCommand(force);
|
|
113
|
+
|
|
114
|
+
if (this.logger) {
|
|
115
|
+
await this.logger.info('Installing with npm', {
|
|
116
|
+
packageId: this.packageId,
|
|
117
|
+
command,
|
|
118
|
+
global: this.global,
|
|
119
|
+
force
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
try {
|
|
124
|
+
const result = await this.executeCommand(command, timeout);
|
|
125
|
+
|
|
126
|
+
if (this.logger) {
|
|
127
|
+
await this.logger.info('npm installation completed', {
|
|
128
|
+
packageId: this.packageId,
|
|
129
|
+
success: result.success,
|
|
130
|
+
exitCode: result.exitCode,
|
|
131
|
+
duration: result.duration
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return {
|
|
136
|
+
success: result.success,
|
|
137
|
+
exitCode: result.exitCode,
|
|
138
|
+
stdout: result.stdout,
|
|
139
|
+
stderr: result.stderr,
|
|
140
|
+
duration: result.duration,
|
|
141
|
+
command,
|
|
142
|
+
installer: 'npm'
|
|
143
|
+
};
|
|
144
|
+
} catch (error) {
|
|
145
|
+
if (this.logger) {
|
|
146
|
+
await this.logger.error('npm installation failed', {
|
|
147
|
+
packageId: this.packageId,
|
|
148
|
+
error: error.message,
|
|
149
|
+
command
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Build npm install command
|
|
158
|
+
* @param {boolean} force - Force reinstall
|
|
159
|
+
* @returns {string} - npm command
|
|
160
|
+
*/
|
|
161
|
+
buildInstallCommand(force) {
|
|
162
|
+
let command = 'npm install';
|
|
163
|
+
|
|
164
|
+
// Add global flag if specified
|
|
165
|
+
if (this.global) {
|
|
166
|
+
command += ' --global';
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Add package name or path
|
|
170
|
+
if (this.packageId) {
|
|
171
|
+
command += ` ${this.packageId}`;
|
|
172
|
+
} else if (this.command) {
|
|
173
|
+
command += ` ${this.command}`;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Add force flag if requested
|
|
177
|
+
if (force) {
|
|
178
|
+
command += ' --force';
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Add registry if specified
|
|
182
|
+
if (this.registry) {
|
|
183
|
+
command += ` --registry ${this.registry}`;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Add scope if specified
|
|
187
|
+
if (this.scope) {
|
|
188
|
+
command += ` --scope ${this.scope}`;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Add other useful flags
|
|
192
|
+
command += ' --no-audit --no-fund';
|
|
193
|
+
|
|
194
|
+
return command;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Perform verification using npm
|
|
199
|
+
* @returns {Promise<Object>} - Verification result
|
|
200
|
+
*/
|
|
201
|
+
async performVerification() {
|
|
202
|
+
try {
|
|
203
|
+
// First check if package is installed using npm list
|
|
204
|
+
const listCommand = this.global ?
|
|
205
|
+
`npm list --global --depth=0 ${this.packageId}` :
|
|
206
|
+
`npm list --depth=0 ${this.packageId}`;
|
|
207
|
+
|
|
208
|
+
const listResult = await this.executeCommand(listCommand, 30000);
|
|
209
|
+
|
|
210
|
+
if (!listResult.success) {
|
|
211
|
+
return {
|
|
212
|
+
success: false,
|
|
213
|
+
error: 'Package not found in npm list',
|
|
214
|
+
exitCode: listResult.exitCode,
|
|
215
|
+
stdout: listResult.stdout,
|
|
216
|
+
stderr: listResult.stderr,
|
|
217
|
+
installer: 'npm'
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Check if package is actually installed
|
|
222
|
+
const isInstalled = listResult.stdout.includes(this.packageId) ||
|
|
223
|
+
listResult.stdout.includes('empty') === false;
|
|
224
|
+
|
|
225
|
+
if (!isInstalled) {
|
|
226
|
+
return {
|
|
227
|
+
success: false,
|
|
228
|
+
error: 'Package not properly installed',
|
|
229
|
+
exitCode: 1,
|
|
230
|
+
stdout: listResult.stdout,
|
|
231
|
+
stderr: listResult.stderr,
|
|
232
|
+
installer: 'npm'
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Run verification command if provided
|
|
237
|
+
if (this.verificationCommand) {
|
|
238
|
+
const verifyResult = await this.executeCommand(this.verificationCommand, 30000);
|
|
239
|
+
|
|
240
|
+
return {
|
|
241
|
+
success: verifyResult.success,
|
|
242
|
+
exitCode: verifyResult.exitCode,
|
|
243
|
+
stdout: verifyResult.stdout,
|
|
244
|
+
stderr: verifyResult.stderr,
|
|
245
|
+
installer: 'npm',
|
|
246
|
+
verified: verifyResult.success
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return {
|
|
251
|
+
success: true,
|
|
252
|
+
exitCode: 0,
|
|
253
|
+
stdout: listResult.stdout,
|
|
254
|
+
stderr: '',
|
|
255
|
+
installer: 'npm',
|
|
256
|
+
verified: true
|
|
257
|
+
};
|
|
258
|
+
} catch (error) {
|
|
259
|
+
if (this.logger) {
|
|
260
|
+
await this.logger.error('npm verification failed', {
|
|
261
|
+
packageId: this.packageId,
|
|
262
|
+
error: error.message
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Get installed version using npm
|
|
271
|
+
* @returns {Promise<string|null>} - Version string or null
|
|
272
|
+
*/
|
|
273
|
+
async getInstalledVersion() {
|
|
274
|
+
try {
|
|
275
|
+
const command = this.global ?
|
|
276
|
+
`npm list --global --depth=0 --json ${this.packageId}` :
|
|
277
|
+
`npm list --depth=0 --json ${this.packageId}`;
|
|
278
|
+
|
|
279
|
+
const result = await this.executeCommand(command, 30000);
|
|
280
|
+
|
|
281
|
+
if (result.success) {
|
|
282
|
+
try {
|
|
283
|
+
const packageInfo = JSON.parse(result.stdout);
|
|
284
|
+
|
|
285
|
+
// Navigate npm list JSON structure
|
|
286
|
+
let version = null;
|
|
287
|
+
if (packageInfo.dependencies && packageInfo.dependencies[this.packageId]) {
|
|
288
|
+
version = packageInfo.dependencies[this.packageId].version;
|
|
289
|
+
} else if (packageInfo[this.packageId]) {
|
|
290
|
+
version = packageInfo[this.packageId].version;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return version;
|
|
294
|
+
} catch (parseError) {
|
|
295
|
+
// Fallback to text parsing
|
|
296
|
+
const lines = result.stdout.split('\n');
|
|
297
|
+
const versionLine = lines.find(line =>
|
|
298
|
+
line.includes(this.packageId) &&
|
|
299
|
+
line.includes('@')
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
if (versionLine) {
|
|
303
|
+
const match = versionLine.match(/@(\d+\.\d+\.\d+)/);
|
|
304
|
+
return match ? match[1] : null;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return null;
|
|
310
|
+
} catch (error) {
|
|
311
|
+
if (this.logger) {
|
|
312
|
+
await this.logger.debug('Failed to get installed version', {
|
|
313
|
+
packageId: this.packageId,
|
|
314
|
+
error: error.message
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Uninstall package using npm
|
|
323
|
+
* @returns {Promise<Object>} - Uninstallation result
|
|
324
|
+
*/
|
|
325
|
+
async uninstall() {
|
|
326
|
+
try {
|
|
327
|
+
let command = 'npm uninstall';
|
|
328
|
+
|
|
329
|
+
if (this.global) {
|
|
330
|
+
command += ' --global';
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
command += ` ${this.packageId}`;
|
|
334
|
+
|
|
335
|
+
if (this.logger) {
|
|
336
|
+
await this.logger.info('Uninstalling with npm', {
|
|
337
|
+
packageId: this.packageId,
|
|
338
|
+
command,
|
|
339
|
+
global: this.global
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
const result = await this.executeCommand(command, 300000); // 5 minute timeout
|
|
344
|
+
|
|
345
|
+
if (this.logger) {
|
|
346
|
+
await this.logger.info('npm uninstallation completed', {
|
|
347
|
+
packageId: this.packageId,
|
|
348
|
+
success: result.success,
|
|
349
|
+
exitCode: result.exitCode,
|
|
350
|
+
duration: result.duration
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return {
|
|
355
|
+
success: result.success,
|
|
356
|
+
exitCode: result.exitCode,
|
|
357
|
+
stdout: result.stdout,
|
|
358
|
+
stderr: result.stderr,
|
|
359
|
+
duration: result.duration,
|
|
360
|
+
installer: 'npm'
|
|
361
|
+
};
|
|
362
|
+
} catch (error) {
|
|
363
|
+
if (this.logger) {
|
|
364
|
+
await this.logger.error('npm uninstallation failed', {
|
|
365
|
+
packageId: this.packageId,
|
|
366
|
+
error: error.message
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
throw error;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Update package using npm
|
|
375
|
+
* @returns {Promise<Object>} - Update result
|
|
376
|
+
*/
|
|
377
|
+
async update() {
|
|
378
|
+
try {
|
|
379
|
+
let command = 'npm update';
|
|
380
|
+
|
|
381
|
+
if (this.global) {
|
|
382
|
+
command += ' --global';
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
command += ` ${this.packageId}`;
|
|
386
|
+
command += ' --no-audit --no-fund';
|
|
387
|
+
|
|
388
|
+
if (this.logger) {
|
|
389
|
+
await this.logger.info('Updating with npm', {
|
|
390
|
+
packageId: this.packageId,
|
|
391
|
+
command,
|
|
392
|
+
global: this.global
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const result = await this.executeCommand(command, 300000); // 5 minute timeout
|
|
397
|
+
|
|
398
|
+
if (this.logger) {
|
|
399
|
+
await this.logger.info('npm update completed', {
|
|
400
|
+
packageId: this.packageId,
|
|
401
|
+
success: result.success,
|
|
402
|
+
exitCode: result.exitCode,
|
|
403
|
+
duration: result.duration
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
return {
|
|
408
|
+
success: result.success,
|
|
409
|
+
exitCode: result.exitCode,
|
|
410
|
+
stdout: result.stdout,
|
|
411
|
+
stderr: result.stderr,
|
|
412
|
+
duration: result.duration,
|
|
413
|
+
installer: 'npm'
|
|
414
|
+
};
|
|
415
|
+
} catch (error) {
|
|
416
|
+
if (this.logger) {
|
|
417
|
+
await this.logger.error('npm update failed', {
|
|
418
|
+
packageId: this.packageId,
|
|
419
|
+
error: error.message
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
throw error;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Check for package updates
|
|
428
|
+
* @returns {Promise<Object>} - Update check result
|
|
429
|
+
*/
|
|
430
|
+
async checkUpdates() {
|
|
431
|
+
try {
|
|
432
|
+
const command = this.global ?
|
|
433
|
+
`npm outdated --global --json ${this.packageId}` :
|
|
434
|
+
`npm outdated --json ${this.packageId}`;
|
|
435
|
+
|
|
436
|
+
const result = await this.executeCommand(command, 60000); // 1 minute timeout
|
|
437
|
+
|
|
438
|
+
if (result.success && result.stdout.trim()) {
|
|
439
|
+
try {
|
|
440
|
+
const outdatedInfo = JSON.parse(result.stdout);
|
|
441
|
+
const packageInfo = outdatedInfo[this.packageId];
|
|
442
|
+
|
|
443
|
+
if (packageInfo) {
|
|
444
|
+
return {
|
|
445
|
+
updateAvailable: true,
|
|
446
|
+
current: packageInfo.current,
|
|
447
|
+
wanted: packageInfo.wanted,
|
|
448
|
+
latest: packageInfo.latest,
|
|
449
|
+
installer: 'npm'
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
} catch (parseError) {
|
|
453
|
+
// Ignore JSON parsing errors
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
return {
|
|
458
|
+
updateAvailable: false,
|
|
459
|
+
current: await this.getInstalledVersion(),
|
|
460
|
+
installer: 'npm'
|
|
461
|
+
};
|
|
462
|
+
} catch (error) {
|
|
463
|
+
if (this.logger) {
|
|
464
|
+
await this.logger.debug('Failed to check for updates', {
|
|
465
|
+
packageId: this.packageId,
|
|
466
|
+
error: error.message
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
return {
|
|
470
|
+
updateAvailable: false,
|
|
471
|
+
error: error.message,
|
|
472
|
+
installer: 'npm'
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Get npm-specific information
|
|
479
|
+
* @returns {Object} - npm installer info
|
|
480
|
+
*/
|
|
481
|
+
getInstallerInfo() {
|
|
482
|
+
return {
|
|
483
|
+
...this.getInfo(),
|
|
484
|
+
installer: 'npm',
|
|
485
|
+
supportedPlatforms: ['win32', 'darwin', 'linux'],
|
|
486
|
+
minimumNodeVersion: '14.0.0',
|
|
487
|
+
supportedArchitectures: ['x64', 'arm64'],
|
|
488
|
+
features: [
|
|
489
|
+
'global installation',
|
|
490
|
+
'version management',
|
|
491
|
+
'dependency resolution',
|
|
492
|
+
'registry support',
|
|
493
|
+
'update checking'
|
|
494
|
+
],
|
|
495
|
+
limitations: [
|
|
496
|
+
'requires Node.js',
|
|
497
|
+
'internet connection required',
|
|
498
|
+
'registry dependencies',
|
|
499
|
+
'package availability varies'
|
|
500
|
+
]
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
module.exports = NpmInstaller;
|