vibecodingmachine-core 2026.2.20-438 → 2026.2.26-1642
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,441 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Windows Installer Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for Windows installers.
|
|
5
|
+
* Follows constitutional requirements: <555 lines, test-first approach.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { InstallationType } = require('../InstallationType');
|
|
9
|
+
const { OperationType, OperationStatus } = require('../OperationTypes');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Abstract base class for Windows installers
|
|
13
|
+
*/
|
|
14
|
+
class BaseWindowsInstaller {
|
|
15
|
+
/**
|
|
16
|
+
* Create installer instance
|
|
17
|
+
* @param {Object} config - Installer configuration
|
|
18
|
+
* @param {string} config.type - Installation type
|
|
19
|
+
* @param {string} config.command - Installation command
|
|
20
|
+
* @param {string} config.packageId - Package identifier
|
|
21
|
+
* @param {number} config.priority - Priority order
|
|
22
|
+
* @param {string[]} config.requirements - System requirements
|
|
23
|
+
* @param {string} config.verificationCommand - Verification command
|
|
24
|
+
* @param {AgentLogger} config.logger - Logger instance
|
|
25
|
+
*/
|
|
26
|
+
constructor(config = {}) {
|
|
27
|
+
this.type = config.type || '';
|
|
28
|
+
this.command = config.command || '';
|
|
29
|
+
this.packageId = config.packageId || '';
|
|
30
|
+
this.priority = config.priority || 999;
|
|
31
|
+
this.requirements = config.requirements || [];
|
|
32
|
+
this.verificationCommand = config.verificationCommand || '';
|
|
33
|
+
this.logger = config.logger;
|
|
34
|
+
|
|
35
|
+
this.validate();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Validate installer configuration
|
|
40
|
+
* @throws {Error} If configuration is invalid
|
|
41
|
+
*/
|
|
42
|
+
validate() {
|
|
43
|
+
if (!this.type || typeof this.type !== 'string') {
|
|
44
|
+
throw new Error('Installer must have a valid type');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!Object.values(InstallationType).includes(this.type)) {
|
|
48
|
+
throw new Error(`Invalid installation type: ${this.type}`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!this.command || typeof this.command !== 'string') {
|
|
52
|
+
throw new Error('Installer must have a valid command');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!this.verificationCommand || typeof this.verificationCommand !== 'string') {
|
|
56
|
+
throw new Error('Installer must have a verification command');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (!Array.isArray(this.requirements)) {
|
|
60
|
+
throw new Error('Requirements must be an array');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Check if installer is available on current system
|
|
66
|
+
* @returns {Promise<boolean>} - True if available
|
|
67
|
+
*/
|
|
68
|
+
async isAvailable() {
|
|
69
|
+
throw new Error('isAvailable() must be implemented by subclass');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Check system requirements
|
|
74
|
+
* @returns {Promise<Object>} - Requirements check result
|
|
75
|
+
*/
|
|
76
|
+
async checkRequirements() {
|
|
77
|
+
const results = {
|
|
78
|
+
allMet: true,
|
|
79
|
+
requirements: []
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
for (const requirement of this.requirements) {
|
|
83
|
+
const met = await this.checkSingleRequirement(requirement);
|
|
84
|
+
results.requirements.push({
|
|
85
|
+
requirement,
|
|
86
|
+
met
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (!met) {
|
|
90
|
+
results.allMet = false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return results;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Check a single system requirement
|
|
99
|
+
* @param {string} requirement - Requirement to check
|
|
100
|
+
* @returns {Promise<boolean>} - True if requirement is met
|
|
101
|
+
*/
|
|
102
|
+
async checkSingleRequirement(requirement) {
|
|
103
|
+
if (this.logger) {
|
|
104
|
+
await this.logger.debug(`Checking requirement: ${requirement}`);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
switch (requirement.toLowerCase()) {
|
|
109
|
+
case 'windows':
|
|
110
|
+
return process.platform === 'win32';
|
|
111
|
+
case 'node.js':
|
|
112
|
+
case 'nodejs':
|
|
113
|
+
return await this.checkNodeJS();
|
|
114
|
+
case 'git':
|
|
115
|
+
return await this.checkGit();
|
|
116
|
+
case 'powershell':
|
|
117
|
+
return await this.checkPowerShell();
|
|
118
|
+
case 'winget':
|
|
119
|
+
return await this.checkWinget();
|
|
120
|
+
case 'npm':
|
|
121
|
+
return await this.checkNpm();
|
|
122
|
+
case 'chocolatey':
|
|
123
|
+
case 'choco':
|
|
124
|
+
return await this.checkChocolatey();
|
|
125
|
+
default:
|
|
126
|
+
if (this.logger) {
|
|
127
|
+
await this.logger.warn(`Unknown requirement: ${requirement}`);
|
|
128
|
+
}
|
|
129
|
+
return true; // Assume unknown requirements are met
|
|
130
|
+
}
|
|
131
|
+
} catch (error) {
|
|
132
|
+
if (this.logger) {
|
|
133
|
+
await this.logger.error(`Error checking requirement ${requirement}: ${error.message}`);
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Check if Node.js is available
|
|
141
|
+
* @returns {Promise<boolean>}
|
|
142
|
+
*/
|
|
143
|
+
async checkNodeJS() {
|
|
144
|
+
try {
|
|
145
|
+
const { execSync } = require('child_process');
|
|
146
|
+
execSync('node --version', { stdio: 'ignore' });
|
|
147
|
+
return true;
|
|
148
|
+
} catch {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Check if Git is available
|
|
155
|
+
* @returns {Promise<boolean>}
|
|
156
|
+
*/
|
|
157
|
+
async checkGit() {
|
|
158
|
+
try {
|
|
159
|
+
const { execSync } = require('child_process');
|
|
160
|
+
execSync('git --version', { stdio: 'ignore' });
|
|
161
|
+
return true;
|
|
162
|
+
} catch {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Check if PowerShell is available
|
|
169
|
+
* @returns {Promise<boolean>}
|
|
170
|
+
*/
|
|
171
|
+
async checkPowerShell() {
|
|
172
|
+
try {
|
|
173
|
+
const { execSync } = require('child_process');
|
|
174
|
+
execSync('powershell -Command "Get-Host"', { stdio: 'ignore' });
|
|
175
|
+
return true;
|
|
176
|
+
} catch {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Check if WinGet is available
|
|
183
|
+
* @returns {Promise<boolean>}
|
|
184
|
+
*/
|
|
185
|
+
async checkWinget() {
|
|
186
|
+
try {
|
|
187
|
+
const { execSync } = require('child_process');
|
|
188
|
+
execSync('winget --version', { stdio: 'ignore' });
|
|
189
|
+
return true;
|
|
190
|
+
} catch {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Check if npm is available
|
|
197
|
+
* @returns {Promise<boolean>}
|
|
198
|
+
*/
|
|
199
|
+
async checkNpm() {
|
|
200
|
+
try {
|
|
201
|
+
const { execSync } = require('child_process');
|
|
202
|
+
execSync('npm --version', { stdio: 'ignore' });
|
|
203
|
+
return true;
|
|
204
|
+
} catch {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Check if Chocolatey is available
|
|
211
|
+
* @returns {Promise<boolean>}
|
|
212
|
+
*/
|
|
213
|
+
async checkChocolatey() {
|
|
214
|
+
try {
|
|
215
|
+
const { execSync } = require('child_process');
|
|
216
|
+
execSync('choco --version', { stdio: 'ignore' });
|
|
217
|
+
return true;
|
|
218
|
+
} catch {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Install agent
|
|
225
|
+
* @param {Object} options - Installation options
|
|
226
|
+
* @param {boolean} options.force - Force reinstall
|
|
227
|
+
* @param {number} options.timeout - Timeout in milliseconds
|
|
228
|
+
* @returns {Promise<Object>} - Installation result
|
|
229
|
+
*/
|
|
230
|
+
async install(options = {}) {
|
|
231
|
+
const { force = false, timeout = 300000 } = options; // 5 minute default
|
|
232
|
+
|
|
233
|
+
if (this.logger) {
|
|
234
|
+
await this.logger.info(`Starting installation using ${this.type}`, {
|
|
235
|
+
type: this.type,
|
|
236
|
+
packageId: this.packageId,
|
|
237
|
+
force
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
try {
|
|
242
|
+
// Check availability
|
|
243
|
+
if (!await this.isAvailable()) {
|
|
244
|
+
throw new Error(`Installation method ${this.type} is not available on this system`);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Check requirements
|
|
248
|
+
const requirementsResult = await this.checkRequirements();
|
|
249
|
+
if (!requirementsResult.allMet) {
|
|
250
|
+
const unmet = requirementsResult.requirements
|
|
251
|
+
.filter(req => !req.met)
|
|
252
|
+
.map(req => req.requirement);
|
|
253
|
+
|
|
254
|
+
throw new Error(`Unmet requirements: ${unmet.join(', ')}`);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Perform installation
|
|
258
|
+
const result = await this.performInstallation(force, timeout);
|
|
259
|
+
|
|
260
|
+
if (this.logger) {
|
|
261
|
+
await this.logger.info(`Installation completed using ${this.type}`, {
|
|
262
|
+
type: this.type,
|
|
263
|
+
packageId: this.packageId,
|
|
264
|
+
success: result.success,
|
|
265
|
+
duration: result.duration
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return result;
|
|
270
|
+
} catch (error) {
|
|
271
|
+
if (this.logger) {
|
|
272
|
+
await this.logger.error(`Installation failed using ${this.type}`, {
|
|
273
|
+
type: this.type,
|
|
274
|
+
packageId: this.packageId,
|
|
275
|
+
error: error.message
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Perform the actual installation
|
|
284
|
+
* @param {boolean} force - Force reinstall
|
|
285
|
+
* @param {number} timeout - Timeout in milliseconds
|
|
286
|
+
* @returns {Promise<Object>} - Installation result
|
|
287
|
+
*/
|
|
288
|
+
async performInstallation(force, timeout) {
|
|
289
|
+
throw new Error('performInstallation() must be implemented by subclass');
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Verify installation
|
|
294
|
+
* @returns {Promise<Object>} - Verification result
|
|
295
|
+
*/
|
|
296
|
+
async verify() {
|
|
297
|
+
if (this.logger) {
|
|
298
|
+
await this.logger.info(`Verifying installation using ${this.type}`, {
|
|
299
|
+
type: this.type,
|
|
300
|
+
packageId: this.packageId
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
try {
|
|
305
|
+
const result = await this.performVerification();
|
|
306
|
+
|
|
307
|
+
if (this.logger) {
|
|
308
|
+
await this.logger.info(`Verification completed using ${this.type}`, {
|
|
309
|
+
type: this.type,
|
|
310
|
+
packageId: this.packageId,
|
|
311
|
+
success: result.success,
|
|
312
|
+
duration: result.duration
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return result;
|
|
317
|
+
} catch (error) {
|
|
318
|
+
if (this.logger) {
|
|
319
|
+
await this.logger.error(`Verification failed using ${this.type}`, {
|
|
320
|
+
type: this.type,
|
|
321
|
+
packageId: this.packageId,
|
|
322
|
+
error: error.message
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
throw error;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Perform the actual verification
|
|
331
|
+
* @returns {Promise<Object>} - Verification result
|
|
332
|
+
*/
|
|
333
|
+
async performVerification() {
|
|
334
|
+
return await this.executeCommand(this.verificationCommand, 30000); // 30 second timeout
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Execute command with timeout
|
|
339
|
+
* @param {string} command - Command to execute
|
|
340
|
+
* @param {number} timeout - Timeout in milliseconds
|
|
341
|
+
* @returns {Promise<Object>} - Execution result
|
|
342
|
+
*/
|
|
343
|
+
async executeCommand(command, timeout) {
|
|
344
|
+
return new Promise((resolve, reject) => {
|
|
345
|
+
const { spawn } = require('child_process');
|
|
346
|
+
|
|
347
|
+
const startTime = Date.now();
|
|
348
|
+
const child = spawn(command, [], {
|
|
349
|
+
shell: true,
|
|
350
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
let stdout = '';
|
|
354
|
+
let stderr = '';
|
|
355
|
+
|
|
356
|
+
child.stdout.on('data', (data) => {
|
|
357
|
+
stdout += data.toString();
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
child.stderr.on('data', (data) => {
|
|
361
|
+
stderr += data.toString();
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
const timeoutId = setTimeout(() => {
|
|
365
|
+
child.kill('SIGTERM');
|
|
366
|
+
reject(new Error(`Command timed out after ${timeout}ms`));
|
|
367
|
+
}, timeout);
|
|
368
|
+
|
|
369
|
+
child.on('close', (code) => {
|
|
370
|
+
clearTimeout(timeoutId);
|
|
371
|
+
|
|
372
|
+
const duration = Date.now() - startTime;
|
|
373
|
+
|
|
374
|
+
resolve({
|
|
375
|
+
success: code === 0,
|
|
376
|
+
exitCode: code,
|
|
377
|
+
stdout: stdout.trim(),
|
|
378
|
+
stderr: stderr.trim(),
|
|
379
|
+
duration,
|
|
380
|
+
command
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
child.on('error', (error) => {
|
|
385
|
+
clearTimeout(timeoutId);
|
|
386
|
+
reject(error);
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Get installer information
|
|
393
|
+
* @returns {Object} - Installer information
|
|
394
|
+
*/
|
|
395
|
+
getInfo() {
|
|
396
|
+
return {
|
|
397
|
+
type: this.type,
|
|
398
|
+
packageId: this.packageId,
|
|
399
|
+
priority: this.priority,
|
|
400
|
+
requirements: this.requirements,
|
|
401
|
+
verificationCommand: this.verificationCommand,
|
|
402
|
+
command: this.command
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Create installer instance from configuration
|
|
408
|
+
* @param {Object} config - Configuration object
|
|
409
|
+
* @param {AgentLogger} logger - Logger instance
|
|
410
|
+
* @returns {BaseWindowsInstaller} - Installer instance
|
|
411
|
+
*/
|
|
412
|
+
static fromConfig(config, logger = null) {
|
|
413
|
+
const installerConfig = {
|
|
414
|
+
...config,
|
|
415
|
+
logger
|
|
416
|
+
};
|
|
417
|
+
|
|
418
|
+
// Return appropriate installer subclass based on type
|
|
419
|
+
switch (config.type) {
|
|
420
|
+
case InstallationType.WINGET:
|
|
421
|
+
const WinGetInstaller = require('./WinGetInstaller');
|
|
422
|
+
return new WinGetInstaller(installerConfig);
|
|
423
|
+
case InstallationType.POWERSHELL:
|
|
424
|
+
const PowerShellInstaller = require('./PowerShellInstaller');
|
|
425
|
+
return new PowerShellInstaller(installerConfig);
|
|
426
|
+
case InstallationType.NPM:
|
|
427
|
+
const NpmInstaller = require('./NpmInstaller');
|
|
428
|
+
return new NpmInstaller(installerConfig);
|
|
429
|
+
case InstallationType.CHOCOLATEY:
|
|
430
|
+
const ChocolateyInstaller = require('./ChocolateyInstaller');
|
|
431
|
+
return new ChocolateyInstaller(installerConfig);
|
|
432
|
+
case InstallationType.DIRECT:
|
|
433
|
+
const DirectInstaller = require('./DirectInstaller');
|
|
434
|
+
return new DirectInstaller(installerConfig);
|
|
435
|
+
default:
|
|
436
|
+
throw new Error(`Unknown installer type: ${config.type}`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
module.exports = BaseWindowsInstaller;
|