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,458 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PowerShell Installer
|
|
3
|
+
*
|
|
4
|
+
* PowerShell script-based installer implementation.
|
|
5
|
+
* Follows constitutional requirements: <555 lines, test-first approach.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const BaseWindowsInstaller = require('./BaseWindowsInstaller');
|
|
9
|
+
const { InstallationType } = require('../InstallationType');
|
|
10
|
+
const fs = require('fs').promises;
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const os = require('os');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* PowerShell installer class for Windows agents
|
|
16
|
+
*/
|
|
17
|
+
class PowerShellInstaller extends BaseWindowsInstaller {
|
|
18
|
+
/**
|
|
19
|
+
* Create PowerShell installer instance
|
|
20
|
+
* @param {Object} config - Installer configuration
|
|
21
|
+
*/
|
|
22
|
+
constructor(config = {}) {
|
|
23
|
+
super({
|
|
24
|
+
type: InstallationType.POWERSHELL,
|
|
25
|
+
...config
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
this.scriptPath = config.scriptPath || '';
|
|
29
|
+
this.executionPolicy = config.executionPolicy || 'RemoteSigned';
|
|
30
|
+
this.tempDir = path.join(os.tmpdir(), 'vibe-coding-machine');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Check if PowerShell is available on current system
|
|
35
|
+
* @returns {Promise<boolean>} - True if PowerShell is available
|
|
36
|
+
*/
|
|
37
|
+
async isAvailable() {
|
|
38
|
+
try {
|
|
39
|
+
const { execSync } = require('child_process');
|
|
40
|
+
execSync('powershell -Command "Get-Host"', { stdio: 'ignore' });
|
|
41
|
+
return true;
|
|
42
|
+
} catch (error) {
|
|
43
|
+
if (this.logger) {
|
|
44
|
+
await this.logger.debug('PowerShell not available', { error: error.message });
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Check system requirements for PowerShell
|
|
52
|
+
* @returns {Promise<Object>} - Requirements check result
|
|
53
|
+
*/
|
|
54
|
+
async checkRequirements() {
|
|
55
|
+
const requirements = await super.checkRequirements();
|
|
56
|
+
|
|
57
|
+
// PowerShell-specific requirements
|
|
58
|
+
const psRequirements = [
|
|
59
|
+
{ requirement: 'windows', met: process.platform === 'win32' },
|
|
60
|
+
{ requirement: 'powershell', met: await this.isAvailable() },
|
|
61
|
+
{ requirement: 'execution-policy', met: await this.checkExecutionPolicy() }
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
psRequirements.forEach(req => {
|
|
65
|
+
requirements.requirements.push(req);
|
|
66
|
+
if (!req.met) {
|
|
67
|
+
requirements.allMet = false;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
return requirements;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Check PowerShell execution policy
|
|
76
|
+
* @returns {Promise<boolean>} - True if execution policy allows scripts
|
|
77
|
+
*/
|
|
78
|
+
async checkExecutionPolicy() {
|
|
79
|
+
try {
|
|
80
|
+
const { execSync } = require('child_process');
|
|
81
|
+
const output = execSync('powershell -Command "Get-ExecutionPolicy"', { encoding: 'utf8' });
|
|
82
|
+
|
|
83
|
+
// Check if execution policy allows script execution
|
|
84
|
+
const allowedPolicies = ['RemoteSigned', 'Unrestricted', 'Bypass', 'AllSigned'];
|
|
85
|
+
const currentPolicy = output.trim();
|
|
86
|
+
|
|
87
|
+
return allowedPolicies.includes(currentPolicy);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
if (this.logger) {
|
|
90
|
+
await this.logger.debug('Failed to check execution policy', { error: error.message });
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Perform actual installation using PowerShell
|
|
98
|
+
* @param {boolean} force - Force reinstall
|
|
99
|
+
* @param {number} timeout - Timeout in milliseconds
|
|
100
|
+
* @returns {Promise<Object>} - Installation result
|
|
101
|
+
*/
|
|
102
|
+
async performInstallation(force, timeout) {
|
|
103
|
+
const command = await this.buildInstallCommand(force);
|
|
104
|
+
|
|
105
|
+
if (this.logger) {
|
|
106
|
+
await this.logger.info('Installing with PowerShell', {
|
|
107
|
+
scriptPath: this.scriptPath,
|
|
108
|
+
command,
|
|
109
|
+
force
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
try {
|
|
114
|
+
// Ensure temp directory exists
|
|
115
|
+
await fs.mkdir(this.tempDir, { recursive: true });
|
|
116
|
+
|
|
117
|
+
const result = await this.executeCommand(command, timeout);
|
|
118
|
+
|
|
119
|
+
if (this.logger) {
|
|
120
|
+
await this.logger.info('PowerShell installation completed', {
|
|
121
|
+
scriptPath: this.scriptPath,
|
|
122
|
+
success: result.success,
|
|
123
|
+
exitCode: result.exitCode,
|
|
124
|
+
duration: result.duration
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
success: result.success,
|
|
130
|
+
exitCode: result.exitCode,
|
|
131
|
+
stdout: result.stdout,
|
|
132
|
+
stderr: result.stderr,
|
|
133
|
+
duration: result.duration,
|
|
134
|
+
command,
|
|
135
|
+
installer: 'powershell'
|
|
136
|
+
};
|
|
137
|
+
} catch (error) {
|
|
138
|
+
if (this.logger) {
|
|
139
|
+
await this.logger.error('PowerShell installation failed', {
|
|
140
|
+
scriptPath: this.scriptPath,
|
|
141
|
+
error: error.message,
|
|
142
|
+
command
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
throw error;
|
|
146
|
+
} finally {
|
|
147
|
+
// Cleanup temp directory
|
|
148
|
+
try {
|
|
149
|
+
await fs.rmdir(this.tempDir, { recursive: true });
|
|
150
|
+
} catch {
|
|
151
|
+
// Ignore cleanup errors
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Build PowerShell install command
|
|
158
|
+
* @param {boolean} force - Force reinstall
|
|
159
|
+
* @returns {Promise<string>} - PowerShell command
|
|
160
|
+
*/
|
|
161
|
+
async buildInstallCommand(force) {
|
|
162
|
+
let command = 'powershell -ExecutionPolicy Bypass';
|
|
163
|
+
|
|
164
|
+
if (this.scriptPath) {
|
|
165
|
+
// Use provided script file
|
|
166
|
+
if (this.scriptPath.startsWith('http')) {
|
|
167
|
+
// Download and execute remote script
|
|
168
|
+
command += ` -Command "Invoke-WebRequest -Uri '${this.scriptPath}' -OutFile '$env:TEMP\\install.ps1'; & '$env:TEMP\\install.ps1'"`;
|
|
169
|
+
} else {
|
|
170
|
+
// Execute local script
|
|
171
|
+
command += ` -File "${this.scriptPath}"`;
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
// Use command directly
|
|
175
|
+
command += ` -Command "${this.command}"`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Add force parameter if requested
|
|
179
|
+
if (force) {
|
|
180
|
+
command += ' -Force';
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return command;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Perform verification using PowerShell
|
|
188
|
+
* @returns {Promise<Object>} - Verification result
|
|
189
|
+
*/
|
|
190
|
+
async performVerification() {
|
|
191
|
+
try {
|
|
192
|
+
if (!this.verificationCommand) {
|
|
193
|
+
return {
|
|
194
|
+
success: false,
|
|
195
|
+
error: 'No verification command specified',
|
|
196
|
+
installer: 'powershell'
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const command = `powershell -ExecutionPolicy Bypass -Command "${this.verificationCommand}"`;
|
|
201
|
+
|
|
202
|
+
if (this.logger) {
|
|
203
|
+
await this.logger.debug('Verifying with PowerShell', {
|
|
204
|
+
verificationCommand: this.verificationCommand,
|
|
205
|
+
command
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const result = await this.executeCommand(command, 30000);
|
|
210
|
+
|
|
211
|
+
return {
|
|
212
|
+
success: result.success,
|
|
213
|
+
exitCode: result.exitCode,
|
|
214
|
+
stdout: result.stdout,
|
|
215
|
+
stderr: result.stderr,
|
|
216
|
+
installer: 'powershell',
|
|
217
|
+
verified: result.success
|
|
218
|
+
};
|
|
219
|
+
} catch (error) {
|
|
220
|
+
if (this.logger) {
|
|
221
|
+
await this.logger.error('PowerShell verification failed', {
|
|
222
|
+
verificationCommand: this.verificationCommand,
|
|
223
|
+
error: error.message
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
throw error;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Download and execute remote PowerShell script
|
|
232
|
+
* @param {string} scriptUrl - URL of the script
|
|
233
|
+
* @param {boolean} force - Force reinstall
|
|
234
|
+
* @param {number} timeout - Timeout in milliseconds
|
|
235
|
+
* @returns {Promise<Object>} - Installation result
|
|
236
|
+
*/
|
|
237
|
+
async downloadAndExecute(scriptUrl, force, timeout) {
|
|
238
|
+
try {
|
|
239
|
+
if (this.logger) {
|
|
240
|
+
await this.logger.info('Downloading PowerShell script', { scriptUrl });
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Download script to temp location
|
|
244
|
+
const scriptContent = await this.downloadScript(scriptUrl);
|
|
245
|
+
const tempScriptPath = path.join(this.tempDir, 'install.ps1');
|
|
246
|
+
|
|
247
|
+
await fs.writeFile(tempScriptPath, scriptContent, 'utf8');
|
|
248
|
+
|
|
249
|
+
// Execute downloaded script
|
|
250
|
+
const command = `powershell -ExecutionPolicy Bypass -File "${tempScriptPath}"`;
|
|
251
|
+
if (force) {
|
|
252
|
+
command += ' -Force';
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const result = await this.executeCommand(command, timeout);
|
|
256
|
+
|
|
257
|
+
return {
|
|
258
|
+
success: result.success,
|
|
259
|
+
exitCode: result.exitCode,
|
|
260
|
+
stdout: result.stdout,
|
|
261
|
+
stderr: result.stderr,
|
|
262
|
+
duration: result.duration,
|
|
263
|
+
command,
|
|
264
|
+
installer: 'powershell'
|
|
265
|
+
};
|
|
266
|
+
} catch (error) {
|
|
267
|
+
if (this.logger) {
|
|
268
|
+
await this.logger.error('Failed to download and execute script', {
|
|
269
|
+
scriptUrl,
|
|
270
|
+
error: error.message
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Download PowerShell script from URL
|
|
279
|
+
* @param {string} url - Script URL
|
|
280
|
+
* @returns {Promise<string>} - Script content
|
|
281
|
+
*/
|
|
282
|
+
async downloadScript(url) {
|
|
283
|
+
const https = require('https');
|
|
284
|
+
const http = require('http');
|
|
285
|
+
const client = url.startsWith('https') ? https : http;
|
|
286
|
+
|
|
287
|
+
return new Promise((resolve, reject) => {
|
|
288
|
+
client.get(url, (response) => {
|
|
289
|
+
let data = '';
|
|
290
|
+
|
|
291
|
+
response.on('data', (chunk) => {
|
|
292
|
+
data += chunk;
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
response.on('end', () => {
|
|
296
|
+
if (response.statusCode === 200) {
|
|
297
|
+
resolve(data);
|
|
298
|
+
} else {
|
|
299
|
+
reject(new Error(`HTTP ${response.statusCode}: ${response.statusMessage}`));
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
}).on('error', (error) => {
|
|
303
|
+
reject(error);
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Check if PowerShell script exists and is accessible
|
|
310
|
+
* @returns {Promise<boolean>} - True if script is accessible
|
|
311
|
+
*/
|
|
312
|
+
async checkScriptAccess() {
|
|
313
|
+
try {
|
|
314
|
+
if (!this.scriptPath) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (this.scriptPath.startsWith('http')) {
|
|
319
|
+
// Check remote script accessibility
|
|
320
|
+
await this.downloadScript(this.scriptPath);
|
|
321
|
+
return true;
|
|
322
|
+
} else {
|
|
323
|
+
// Check local script accessibility
|
|
324
|
+
await fs.access(this.scriptPath);
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
} catch (error) {
|
|
328
|
+
if (this.logger) {
|
|
329
|
+
await this.logger.debug('Script not accessible', {
|
|
330
|
+
scriptPath: this.scriptPath,
|
|
331
|
+
error: error.message
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Get installed version using PowerShell
|
|
340
|
+
* @returns {Promise<string|null>} - Version string or null
|
|
341
|
+
*/
|
|
342
|
+
async getInstalledVersion() {
|
|
343
|
+
try {
|
|
344
|
+
if (!this.verificationCommand) {
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
const command = `powershell -ExecutionPolicy Bypass -Command "${this.verificationCommand}"`;
|
|
349
|
+
const result = await this.executeCommand(command, 30000);
|
|
350
|
+
|
|
351
|
+
if (result.success) {
|
|
352
|
+
// Parse version from output
|
|
353
|
+
const lines = result.stdout.split('\n');
|
|
354
|
+
const versionLine = lines.find(line =>
|
|
355
|
+
line.toLowerCase().includes('version') ||
|
|
356
|
+
/\d+\.\d+\.\d+/.test(line)
|
|
357
|
+
);
|
|
358
|
+
|
|
359
|
+
if (versionLine) {
|
|
360
|
+
const match = versionLine.match(/(\d+\.\d+\.\d+)/);
|
|
361
|
+
return match ? match[1] : null;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return null;
|
|
366
|
+
} catch (error) {
|
|
367
|
+
if (this.logger) {
|
|
368
|
+
await this.logger.debug('Failed to get installed version', {
|
|
369
|
+
verificationCommand: this.verificationCommand,
|
|
370
|
+
error: error.message
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Uninstall using PowerShell
|
|
379
|
+
* @returns {Promise<Object>} - Uninstallation result
|
|
380
|
+
*/
|
|
381
|
+
async uninstall() {
|
|
382
|
+
try {
|
|
383
|
+
// For PowerShell, we typically need a specific uninstall script
|
|
384
|
+
if (!this.uninstallCommand) {
|
|
385
|
+
return {
|
|
386
|
+
success: false,
|
|
387
|
+
error: 'No uninstall command specified for PowerShell installer',
|
|
388
|
+
installer: 'powershell'
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const command = `powershell -ExecutionPolicy Bypass -Command "${this.uninstallCommand}"`;
|
|
393
|
+
|
|
394
|
+
if (this.logger) {
|
|
395
|
+
await this.logger.info('Uninstalling with PowerShell', {
|
|
396
|
+
uninstallCommand: this.uninstallCommand,
|
|
397
|
+
command
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
const result = await this.executeCommand(command, 300000); // 5 minute timeout
|
|
402
|
+
|
|
403
|
+
if (this.logger) {
|
|
404
|
+
await this.logger.info('PowerShell uninstallation completed', {
|
|
405
|
+
uninstallCommand: this.uninstallCommand,
|
|
406
|
+
success: result.success,
|
|
407
|
+
exitCode: result.exitCode,
|
|
408
|
+
duration: result.duration
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
return {
|
|
413
|
+
success: result.success,
|
|
414
|
+
exitCode: result.exitCode,
|
|
415
|
+
stdout: result.stdout,
|
|
416
|
+
stderr: result.stderr,
|
|
417
|
+
duration: result.duration,
|
|
418
|
+
installer: 'powershell'
|
|
419
|
+
};
|
|
420
|
+
} catch (error) {
|
|
421
|
+
if (this.logger) {
|
|
422
|
+
await this.logger.error('PowerShell uninstallation failed', {
|
|
423
|
+
uninstallCommand: this.uninstallCommand,
|
|
424
|
+
error: error.message
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
throw error;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Get PowerShell-specific information
|
|
433
|
+
* @returns {Object} - PowerShell installer info
|
|
434
|
+
*/
|
|
435
|
+
getInstallerInfo() {
|
|
436
|
+
return {
|
|
437
|
+
...this.getInfo(),
|
|
438
|
+
installer: 'powershell',
|
|
439
|
+
supportedPlatforms: ['win32'],
|
|
440
|
+
minimumWindowsVersion: '7.0',
|
|
441
|
+
supportedArchitectures: ['x64', 'arm64'],
|
|
442
|
+
features: [
|
|
443
|
+
'script execution',
|
|
444
|
+
'remote script support',
|
|
445
|
+
'execution policy control',
|
|
446
|
+
'temp directory management'
|
|
447
|
+
],
|
|
448
|
+
limitations: [
|
|
449
|
+
'Windows only',
|
|
450
|
+
'execution policy restrictions',
|
|
451
|
+
'requires script availability',
|
|
452
|
+
'security restrictions'
|
|
453
|
+
]
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
module.exports = PowerShellInstaller;
|