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,509 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chocolatey Installer
|
|
3
|
+
*
|
|
4
|
+
* Chocolatey package manager 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
|
+
* Chocolatey installer class for Windows agents
|
|
13
|
+
*/
|
|
14
|
+
class ChocolateyInstaller extends BaseWindowsInstaller {
|
|
15
|
+
/**
|
|
16
|
+
* Create Chocolatey installer instance
|
|
17
|
+
* @param {Object} config - Installer configuration
|
|
18
|
+
*/
|
|
19
|
+
constructor(config = {}) {
|
|
20
|
+
super({
|
|
21
|
+
type: InstallationType.CHOCOLATEY,
|
|
22
|
+
...config
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
this.source = config.source || '';
|
|
26
|
+
this.version = config.version || '';
|
|
27
|
+
this.preRelease = config.preRelease || false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Check if Chocolatey is available on current system
|
|
32
|
+
* @returns {Promise<boolean>} - True if Chocolatey is available
|
|
33
|
+
*/
|
|
34
|
+
async isAvailable() {
|
|
35
|
+
try {
|
|
36
|
+
const { execSync } = require('child_process');
|
|
37
|
+
execSync('choco --version', { stdio: 'ignore' });
|
|
38
|
+
return true;
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (this.logger) {
|
|
41
|
+
await this.logger.debug('Chocolatey not available', { error: error.message });
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Check system requirements for Chocolatey
|
|
49
|
+
* @returns {Promise<Object>} - Requirements check result
|
|
50
|
+
*/
|
|
51
|
+
async checkRequirements() {
|
|
52
|
+
const requirements = await super.checkRequirements();
|
|
53
|
+
|
|
54
|
+
// Chocolatey-specific requirements
|
|
55
|
+
const chocoRequirements = [
|
|
56
|
+
{ requirement: 'windows', met: process.platform === 'win32' },
|
|
57
|
+
{ requirement: 'chocolatey', met: await this.isAvailable() },
|
|
58
|
+
{ requirement: 'internet', met: await this.checkInternetConnection() },
|
|
59
|
+
{ requirement: 'powershell', met: await this.checkPowerShell() }
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
chocoRequirements.forEach(req => {
|
|
63
|
+
requirements.requirements.push(req);
|
|
64
|
+
if (!req.met) {
|
|
65
|
+
requirements.allMet = false;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
return requirements;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Check if PowerShell is available (required by Chocolatey)
|
|
74
|
+
* @returns {Promise<boolean>} - True if PowerShell is available
|
|
75
|
+
*/
|
|
76
|
+
async checkPowerShell() {
|
|
77
|
+
try {
|
|
78
|
+
const { execSync } = require('child_process');
|
|
79
|
+
execSync('powershell -Command "Get-Host"', { stdio: 'ignore' });
|
|
80
|
+
return true;
|
|
81
|
+
} catch (error) {
|
|
82
|
+
if (this.logger) {
|
|
83
|
+
await this.logger.debug('PowerShell not available', { error: error.message });
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Check internet connection
|
|
91
|
+
* @returns {Promise<boolean>} - True if internet is available
|
|
92
|
+
*/
|
|
93
|
+
async checkInternetConnection() {
|
|
94
|
+
try {
|
|
95
|
+
const { execSync } = require('child_process');
|
|
96
|
+
execSync('ping -n 1 chocolatey.org', { stdio: 'ignore' });
|
|
97
|
+
return true;
|
|
98
|
+
} catch (error) {
|
|
99
|
+
if (this.logger) {
|
|
100
|
+
await this.logger.debug('Internet connection check failed', { error: error.message });
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Perform actual installation using Chocolatey
|
|
108
|
+
* @param {boolean} force - Force reinstall
|
|
109
|
+
* @param {number} timeout - Timeout in milliseconds
|
|
110
|
+
* @returns {Promise<Object>} - Installation result
|
|
111
|
+
*/
|
|
112
|
+
async performInstallation(force, timeout) {
|
|
113
|
+
const command = this.buildInstallCommand(force);
|
|
114
|
+
|
|
115
|
+
if (this.logger) {
|
|
116
|
+
await this.logger.info('Installing with Chocolatey', {
|
|
117
|
+
packageId: this.packageId,
|
|
118
|
+
command,
|
|
119
|
+
force,
|
|
120
|
+
version: this.version,
|
|
121
|
+
preRelease: this.preRelease
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
const result = await this.executeCommand(command, timeout);
|
|
127
|
+
|
|
128
|
+
if (this.logger) {
|
|
129
|
+
await this.logger.info('Chocolatey installation completed', {
|
|
130
|
+
packageId: this.packageId,
|
|
131
|
+
success: result.success,
|
|
132
|
+
exitCode: result.exitCode,
|
|
133
|
+
duration: result.duration
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
success: result.success,
|
|
139
|
+
exitCode: result.exitCode,
|
|
140
|
+
stdout: result.stdout,
|
|
141
|
+
stderr: result.stderr,
|
|
142
|
+
duration: result.duration,
|
|
143
|
+
command,
|
|
144
|
+
installer: 'chocolatey'
|
|
145
|
+
};
|
|
146
|
+
} catch (error) {
|
|
147
|
+
if (this.logger) {
|
|
148
|
+
await this.logger.error('Chocolatey installation failed', {
|
|
149
|
+
packageId: this.packageId,
|
|
150
|
+
error: error.message,
|
|
151
|
+
command
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Build Chocolatey install command
|
|
160
|
+
* @param {boolean} force - Force reinstall
|
|
161
|
+
* @returns {string} - Chocolatey command
|
|
162
|
+
*/
|
|
163
|
+
buildInstallCommand(force) {
|
|
164
|
+
let command = 'choco install';
|
|
165
|
+
|
|
166
|
+
// Add package name
|
|
167
|
+
command += ` ${this.packageId}`;
|
|
168
|
+
|
|
169
|
+
// Add version if specified
|
|
170
|
+
if (this.version) {
|
|
171
|
+
command += ` --version=${this.version}`;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Add source if specified
|
|
175
|
+
if (this.source) {
|
|
176
|
+
command += ` --source="${this.source}"`;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Add pre-release flag if specified
|
|
180
|
+
if (this.preRelease) {
|
|
181
|
+
command += ' --pre';
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Add force flag if requested
|
|
185
|
+
if (force) {
|
|
186
|
+
command += ' --force';
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Add other useful flags
|
|
190
|
+
command += ' --yes --accept-license';
|
|
191
|
+
|
|
192
|
+
return command;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Perform verification using Chocolatey
|
|
197
|
+
* @returns {Promise<Object>} - Verification result
|
|
198
|
+
*/
|
|
199
|
+
async performVerification() {
|
|
200
|
+
try {
|
|
201
|
+
// First check if package is installed using Chocolatey list
|
|
202
|
+
const listCommand = `choco list --local --exact ${this.packageId}`;
|
|
203
|
+
const listResult = await this.executeCommand(listCommand, 30000);
|
|
204
|
+
|
|
205
|
+
if (!listResult.success) {
|
|
206
|
+
return {
|
|
207
|
+
success: false,
|
|
208
|
+
error: 'Package not found in Chocolatey list',
|
|
209
|
+
exitCode: listResult.exitCode,
|
|
210
|
+
stdout: listResult.stdout,
|
|
211
|
+
stderr: listResult.stderr,
|
|
212
|
+
installer: 'chocolatey'
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Check if package is actually installed
|
|
217
|
+
const isInstalled = listResult.stdout.includes(this.packageId) ||
|
|
218
|
+
listResult.stdout.toLowerCase().includes(this.packageId.toLowerCase());
|
|
219
|
+
|
|
220
|
+
if (!isInstalled) {
|
|
221
|
+
return {
|
|
222
|
+
success: false,
|
|
223
|
+
error: 'Package not properly installed',
|
|
224
|
+
exitCode: 1,
|
|
225
|
+
stdout: listResult.stdout,
|
|
226
|
+
stderr: listResult.stderr,
|
|
227
|
+
installer: 'chocolatey'
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Run verification command if provided
|
|
232
|
+
if (this.verificationCommand) {
|
|
233
|
+
const verifyResult = await this.executeCommand(this.verificationCommand, 30000);
|
|
234
|
+
|
|
235
|
+
return {
|
|
236
|
+
success: verifyResult.success,
|
|
237
|
+
exitCode: verifyResult.exitCode,
|
|
238
|
+
stdout: verifyResult.stdout,
|
|
239
|
+
stderr: verifyResult.stderr,
|
|
240
|
+
installer: 'chocolatey',
|
|
241
|
+
verified: verifyResult.success
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return {
|
|
246
|
+
success: true,
|
|
247
|
+
exitCode: 0,
|
|
248
|
+
stdout: listResult.stdout,
|
|
249
|
+
stderr: '',
|
|
250
|
+
installer: 'chocolatey',
|
|
251
|
+
verified: true
|
|
252
|
+
};
|
|
253
|
+
} catch (error) {
|
|
254
|
+
if (this.logger) {
|
|
255
|
+
await this.logger.error('Chocolatey verification failed', {
|
|
256
|
+
packageId: this.packageId,
|
|
257
|
+
error: error.message
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
throw error;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Get installed version using Chocolatey
|
|
266
|
+
* @returns {Promise<string|null>} - Version string or null
|
|
267
|
+
*/
|
|
268
|
+
async getInstalledVersion() {
|
|
269
|
+
try {
|
|
270
|
+
const command = `choco list --local --exact ${this.packageId}`;
|
|
271
|
+
const result = await this.executeCommand(command, 30000);
|
|
272
|
+
|
|
273
|
+
if (result.success) {
|
|
274
|
+
// Parse version from output
|
|
275
|
+
const lines = result.stdout.split('\n');
|
|
276
|
+
const packageLine = lines.find(line =>
|
|
277
|
+
line.toLowerCase().includes(this.packageId.toLowerCase())
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
if (packageLine) {
|
|
281
|
+
// Chocolatey output format: "packageName version [installed]"
|
|
282
|
+
const match = packageLine.match(/\s+(\d+\.\d+\.\d+)\s+\[/);
|
|
283
|
+
return match ? match[1] : null;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return null;
|
|
288
|
+
} catch (error) {
|
|
289
|
+
if (this.logger) {
|
|
290
|
+
await this.logger.debug('Failed to get installed version', {
|
|
291
|
+
packageId: this.packageId,
|
|
292
|
+
error: error.message
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Uninstall package using Chocolatey
|
|
301
|
+
* @returns {Promise<Object>} - Uninstallation result
|
|
302
|
+
*/
|
|
303
|
+
async uninstall() {
|
|
304
|
+
try {
|
|
305
|
+
const command = `choco uninstall ${this.packageId} --yes`;
|
|
306
|
+
|
|
307
|
+
if (this.logger) {
|
|
308
|
+
await this.logger.info('Uninstalling with Chocolatey', {
|
|
309
|
+
packageId: this.packageId,
|
|
310
|
+
command
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const result = await this.executeCommand(command, 300000); // 5 minute timeout
|
|
315
|
+
|
|
316
|
+
if (this.logger) {
|
|
317
|
+
await this.logger.info('Chocolatey uninstallation completed', {
|
|
318
|
+
packageId: this.packageId,
|
|
319
|
+
success: result.success,
|
|
320
|
+
exitCode: result.exitCode,
|
|
321
|
+
duration: result.duration
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return {
|
|
326
|
+
success: result.success,
|
|
327
|
+
exitCode: result.exitCode,
|
|
328
|
+
stdout: result.stdout,
|
|
329
|
+
stderr: result.stderr,
|
|
330
|
+
duration: result.duration,
|
|
331
|
+
installer: 'chocolatey'
|
|
332
|
+
};
|
|
333
|
+
} catch (error) {
|
|
334
|
+
if (this.logger) {
|
|
335
|
+
await this.logger.error('Chocolatey uninstallation failed', {
|
|
336
|
+
packageId: this.packageId,
|
|
337
|
+
error: error.message
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
throw error;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Update package using Chocolatey
|
|
346
|
+
* @returns {Promise<Object>} - Update result
|
|
347
|
+
*/
|
|
348
|
+
async update() {
|
|
349
|
+
try {
|
|
350
|
+
const command = `choco upgrade ${this.packageId} --yes`;
|
|
351
|
+
|
|
352
|
+
if (this.logger) {
|
|
353
|
+
await this.logger.info('Updating with Chocolatey', {
|
|
354
|
+
packageId: this.packageId,
|
|
355
|
+
command
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const result = await this.executeCommand(command, 300000); // 5 minute timeout
|
|
360
|
+
|
|
361
|
+
if (this.logger) {
|
|
362
|
+
await this.logger.info('Chocolatey update completed', {
|
|
363
|
+
packageId: this.packageId,
|
|
364
|
+
success: result.success,
|
|
365
|
+
exitCode: result.exitCode,
|
|
366
|
+
duration: result.duration
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return {
|
|
371
|
+
success: result.success,
|
|
372
|
+
exitCode: result.exitCode,
|
|
373
|
+
stdout: result.stdout,
|
|
374
|
+
stderr: result.stderr,
|
|
375
|
+
duration: result.duration,
|
|
376
|
+
installer: 'chocolatey'
|
|
377
|
+
};
|
|
378
|
+
} catch (error) {
|
|
379
|
+
if (this.logger) {
|
|
380
|
+
await this.logger.error('Chocolatey update failed', {
|
|
381
|
+
packageId: this.packageId,
|
|
382
|
+
error: error.message
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
throw error;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Check for package updates
|
|
391
|
+
* @returns {Promise<Object>} - Update check result
|
|
392
|
+
*/
|
|
393
|
+
async checkUpdates() {
|
|
394
|
+
try {
|
|
395
|
+
const command = `choco outdated ${this.packageId}`;
|
|
396
|
+
const result = await this.executeCommand(command, 60000); // 1 minute timeout
|
|
397
|
+
|
|
398
|
+
if (result.success && result.stdout.trim()) {
|
|
399
|
+
const lines = result.stdout.split('\n');
|
|
400
|
+
const packageLine = lines.find(line =>
|
|
401
|
+
line.toLowerCase().includes(this.packageId.toLowerCase())
|
|
402
|
+
);
|
|
403
|
+
|
|
404
|
+
if (packageLine) {
|
|
405
|
+
// Parse Chocolatey outdated format
|
|
406
|
+
const parts = packageLine.split('|').map(part => part.trim());
|
|
407
|
+
if (parts.length >= 3) {
|
|
408
|
+
return {
|
|
409
|
+
updateAvailable: true,
|
|
410
|
+
current: parts[1],
|
|
411
|
+
latest: parts[2],
|
|
412
|
+
installer: 'chocolatey'
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return {
|
|
419
|
+
updateAvailable: false,
|
|
420
|
+
current: await this.getInstalledVersion(),
|
|
421
|
+
installer: 'chocolatey'
|
|
422
|
+
};
|
|
423
|
+
} catch (error) {
|
|
424
|
+
if (this.logger) {
|
|
425
|
+
await this.logger.debug('Failed to check for updates', {
|
|
426
|
+
packageId: this.packageId,
|
|
427
|
+
error: error.message
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
return {
|
|
431
|
+
updateAvailable: false,
|
|
432
|
+
error: error.message,
|
|
433
|
+
installer: 'chocolatey'
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Search for packages in Chocolatey repository
|
|
440
|
+
* @param {string} searchTerm - Search term
|
|
441
|
+
* @returns {Promise<Array>} - Array of package results
|
|
442
|
+
*/
|
|
443
|
+
async searchPackages(searchTerm) {
|
|
444
|
+
try {
|
|
445
|
+
const command = `choco search ${searchTerm} --exact`;
|
|
446
|
+
const result = await this.executeCommand(command, 60000);
|
|
447
|
+
|
|
448
|
+
if (result.success) {
|
|
449
|
+
const lines = result.stdout.split('\n');
|
|
450
|
+
const packages = [];
|
|
451
|
+
|
|
452
|
+
for (const line of lines) {
|
|
453
|
+
if (line.trim() && !line.startsWith('Chocolatey')) {
|
|
454
|
+
const parts = line.split(' ').filter(part => part.trim());
|
|
455
|
+
if (parts.length > 0) {
|
|
456
|
+
packages.push({
|
|
457
|
+
name: parts[0],
|
|
458
|
+
description: parts.slice(1).join(' '),
|
|
459
|
+
installer: 'chocolatey'
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
return packages;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
return [];
|
|
469
|
+
} catch (error) {
|
|
470
|
+
if (this.logger) {
|
|
471
|
+
await this.logger.error('Package search failed', {
|
|
472
|
+
searchTerm,
|
|
473
|
+
error: error.message
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
return [];
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Get Chocolatey-specific information
|
|
482
|
+
* @returns {Object} - Chocolatey installer info
|
|
483
|
+
*/
|
|
484
|
+
getInstallerInfo() {
|
|
485
|
+
return {
|
|
486
|
+
...this.getInfo(),
|
|
487
|
+
installer: 'chocolatey',
|
|
488
|
+
supportedPlatforms: ['win32'],
|
|
489
|
+
minimumWindowsVersion: '7.0',
|
|
490
|
+
supportedArchitectures: ['x64'],
|
|
491
|
+
features: [
|
|
492
|
+
'package repository',
|
|
493
|
+
'version management',
|
|
494
|
+
'dependency resolution',
|
|
495
|
+
'update checking',
|
|
496
|
+
'package search'
|
|
497
|
+
],
|
|
498
|
+
limitations: [
|
|
499
|
+
'Windows only',
|
|
500
|
+
'requires PowerShell',
|
|
501
|
+
'internet connection required',
|
|
502
|
+
'repository limitations',
|
|
503
|
+
'admin privileges often required'
|
|
504
|
+
]
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
module.exports = ChocolateyInstaller;
|