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.
Files changed (202) hide show
  1. package/README.md +240 -0
  2. package/package.json +10 -2
  3. package/src/agents/Agent.js +300 -0
  4. package/src/agents/AgentAdditionService.js +311 -0
  5. package/src/agents/AgentCheckService.js +690 -0
  6. package/src/agents/AgentInstallationService.js +140 -0
  7. package/src/agents/AgentSetupService.js +467 -0
  8. package/src/agents/AgentStatus.js +183 -0
  9. package/src/agents/AgentVerificationService.js +634 -0
  10. package/src/agents/ConfigurationSchemaValidator.js +543 -0
  11. package/src/agents/EnvironmentConfigurationManager.js +602 -0
  12. package/src/agents/InstallationErrorHandler.js +372 -0
  13. package/src/agents/InstallationLog.js +363 -0
  14. package/src/agents/InstallationMethod.js +510 -0
  15. package/src/agents/InstallationOrchestrator.js +352 -0
  16. package/src/agents/InstallationProgressReporter.js +372 -0
  17. package/src/agents/InstallationRetryManager.js +322 -0
  18. package/src/agents/InstallationType.js +254 -0
  19. package/src/agents/OperationTypes.js +310 -0
  20. package/src/agents/PerformanceMetricsCollector.js +493 -0
  21. package/src/agents/SecurityValidationService.js +534 -0
  22. package/src/agents/VerificationTest.js +354 -0
  23. package/src/agents/VerificationType.js +226 -0
  24. package/src/agents/WindowsPermissionHandler.js +518 -0
  25. package/src/agents/config/AgentConfigManager.js +393 -0
  26. package/src/agents/config/AgentDefaultsRegistry.js +373 -0
  27. package/src/agents/config/ConfigValidator.js +281 -0
  28. package/src/agents/discovery/AgentDiscoveryService.js +707 -0
  29. package/src/agents/logging/AgentLogger.js +511 -0
  30. package/src/agents/status/AgentStatusManager.js +481 -0
  31. package/src/agents/storage/FileManager.js +454 -0
  32. package/src/agents/verification/AgentCommunicationTester.js +474 -0
  33. package/src/agents/verification/BaseVerifier.js +430 -0
  34. package/src/agents/verification/CommandVerifier.js +480 -0
  35. package/src/agents/verification/FileOperationVerifier.js +453 -0
  36. package/src/agents/verification/ResultAnalyzer.js +707 -0
  37. package/src/agents/verification/TestRequirementManager.js +495 -0
  38. package/src/agents/verification/VerificationRunner.js +433 -0
  39. package/src/agents/windows/BaseWindowsInstaller.js +441 -0
  40. package/src/agents/windows/ChocolateyInstaller.js +509 -0
  41. package/src/agents/windows/DirectInstaller.js +443 -0
  42. package/src/agents/windows/InstallerFactory.js +391 -0
  43. package/src/agents/windows/NpmInstaller.js +505 -0
  44. package/src/agents/windows/PowerShellInstaller.js +458 -0
  45. package/src/agents/windows/WinGetInstaller.js +390 -0
  46. package/src/analysis/analysis-reporter.js +132 -0
  47. package/src/analysis/boundary-detector.js +712 -0
  48. package/src/analysis/categorizer.js +340 -0
  49. package/src/analysis/codebase-scanner.js +384 -0
  50. package/src/analysis/line-counter.js +513 -0
  51. package/src/analysis/priority-calculator.js +679 -0
  52. package/src/analysis/report/analysis-report.js +250 -0
  53. package/src/analysis/report/package-analyzer.js +278 -0
  54. package/src/analysis/report/recommendation-generator.js +382 -0
  55. package/src/analysis/report/statistics-generator.js +515 -0
  56. package/src/analysis/reports/analysis-report-model.js +101 -0
  57. package/src/analysis/reports/recommendation-generator.js +283 -0
  58. package/src/analysis/reports/report-generators.js +191 -0
  59. package/src/analysis/reports/statistics-calculator.js +231 -0
  60. package/src/analysis/reports/trend-analyzer.js +219 -0
  61. package/src/analysis/strategy-generator.js +814 -0
  62. package/src/auto-mode/AutoModeBusinessLogic.js +836 -0
  63. package/src/config/refactoring-config.js +307 -0
  64. package/src/health-tracking/json-storage.js +38 -2
  65. package/src/ide-integration/applescript-manager-core.js +233 -0
  66. package/src/ide-integration/applescript-manager.cjs +357 -28
  67. package/src/ide-integration/applescript-manager.js +89 -3599
  68. package/src/ide-integration/cdp-manager.js +306 -0
  69. package/src/ide-integration/claude-code-cli-manager.cjs +1 -1
  70. package/src/ide-integration/continuation-handler.js +337 -0
  71. package/src/ide-integration/ide-status-checker.js +292 -0
  72. package/src/ide-integration/macos-ide-manager.js +627 -0
  73. package/src/ide-integration/macos-text-sender.js +528 -0
  74. package/src/ide-integration/response-reader.js +548 -0
  75. package/src/ide-integration/windows-automation-manager.js +121 -0
  76. package/src/ide-integration/windows-ide-manager.js +373 -0
  77. package/src/index.cjs +25 -3
  78. package/src/index.js +15 -1
  79. package/src/llm/direct-llm-manager.cjs +90 -2
  80. package/src/models/compliance-report.js +538 -0
  81. package/src/models/file-analysis.js +681 -0
  82. package/src/models/refactoring-plan.js +770 -0
  83. package/src/monitoring/alert-system.js +834 -0
  84. package/src/monitoring/compliance-progress-tracker.js +437 -0
  85. package/src/monitoring/continuous-scan-notifications.js +661 -0
  86. package/src/monitoring/continuous-scanner.js +279 -0
  87. package/src/monitoring/file-monitor/file-analyzer.js +262 -0
  88. package/src/monitoring/file-monitor/file-monitor.js +237 -0
  89. package/src/monitoring/file-monitor/watcher.js +194 -0
  90. package/src/monitoring/file-monitor.js +17 -0
  91. package/src/monitoring/notification-manager.js +437 -0
  92. package/src/monitoring/scanner-core.js +368 -0
  93. package/src/monitoring/scanner-events.js +214 -0
  94. package/src/monitoring/violation-notification-system.js +515 -0
  95. package/src/refactoring/boundaries/cohesion-analyzer.js +316 -0
  96. package/src/refactoring/boundaries/extraction-result.js +285 -0
  97. package/src/refactoring/boundaries/extraction-strategies.js +392 -0
  98. package/src/refactoring/boundaries/module-boundary.js +209 -0
  99. package/src/refactoring/boundary/boundary-detector.js +741 -0
  100. package/src/refactoring/boundary/boundary-types.js +405 -0
  101. package/src/refactoring/boundary/extraction-strategies.js +554 -0
  102. package/src/refactoring/boundary-extraction-result.js +77 -0
  103. package/src/refactoring/boundary-extraction-strategies.js +330 -0
  104. package/src/refactoring/boundary-extractor.js +384 -0
  105. package/src/refactoring/boundary-types.js +46 -0
  106. package/src/refactoring/circular/circular-dependency.js +88 -0
  107. package/src/refactoring/circular/cycle-detection.js +147 -0
  108. package/src/refactoring/circular/dependency-node.js +82 -0
  109. package/src/refactoring/circular/dependency-result.js +107 -0
  110. package/src/refactoring/circular/dependency-types.js +58 -0
  111. package/src/refactoring/circular/graph-builder.js +213 -0
  112. package/src/refactoring/circular/resolution-strategy.js +72 -0
  113. package/src/refactoring/circular/strategy-generator.js +229 -0
  114. package/src/refactoring/circular-dependency-resolver-original.js +809 -0
  115. package/src/refactoring/circular-dependency-resolver.js +200 -0
  116. package/src/refactoring/code-mover.js +761 -0
  117. package/src/refactoring/file-splitter.js +696 -0
  118. package/src/refactoring/functionality-validator.js +816 -0
  119. package/src/refactoring/import-manager.js +774 -0
  120. package/src/refactoring/module-boundary.js +107 -0
  121. package/src/refactoring/refactoring-executor.js +672 -0
  122. package/src/refactoring/refactoring-rollback.js +614 -0
  123. package/src/refactoring/test-validator.js +631 -0
  124. package/src/requirement-management/default-requirement-manager.js +321 -0
  125. package/src/requirement-management/requirement-file-parser.js +159 -0
  126. package/src/requirement-management/requirement-sequencer.js +221 -0
  127. package/src/rui/commands/AgentCommandParser.js +600 -0
  128. package/src/rui/commands/AgentCommands.js +487 -0
  129. package/src/rui/commands/AgentResponseFormatter.js +832 -0
  130. package/src/scripts/verify-full-compliance.js +269 -0
  131. package/src/sync/sync-engine-core.js +1 -0
  132. package/src/sync/sync-engine-remote-handlers.js +135 -0
  133. package/src/task-generation/automated-task-generator.js +351 -0
  134. package/src/task-generation/prioritizer.js +287 -0
  135. package/src/task-generation/task-list-updater.js +215 -0
  136. package/src/task-generation/task-management-integration.js +480 -0
  137. package/src/task-generation/task-manager-integration.js +270 -0
  138. package/src/task-generation/violation-task-generator.js +474 -0
  139. package/src/task-management/continuous-scan-integration.js +342 -0
  140. package/src/timeout-management/index.js +12 -3
  141. package/src/timeout-management/response-time-tracker.js +167 -0
  142. package/src/timeout-management/timeout-calculator.js +159 -0
  143. package/src/timeout-management/timeout-config-manager.js +172 -0
  144. package/src/utils/ast-analyzer.js +417 -0
  145. package/src/utils/current-requirement-manager.js +276 -0
  146. package/src/utils/current-requirement-operations.js +472 -0
  147. package/src/utils/dependency-mapper.js +456 -0
  148. package/src/utils/download-with-progress.js +4 -2
  149. package/src/utils/electron-update-checker.js +4 -1
  150. package/src/utils/file-size-analyzer.js +272 -0
  151. package/src/utils/import-updater.js +280 -0
  152. package/src/utils/refactoring-tools.js +512 -0
  153. package/src/utils/report-generator.js +569 -0
  154. package/src/utils/reports/report-analysis.js +218 -0
  155. package/src/utils/reports/report-types.js +55 -0
  156. package/src/utils/reports/summary-generators.js +102 -0
  157. package/src/utils/requirement-file-management.js +157 -0
  158. package/src/utils/requirement-helpers/requirement-file-ops.js +392 -0
  159. package/src/utils/requirement-helpers/requirement-mover.js +414 -0
  160. package/src/utils/requirement-helpers/requirement-parser.js +326 -0
  161. package/src/utils/requirement-helpers/requirement-status.js +320 -0
  162. package/src/utils/requirement-helpers-new.js +55 -0
  163. package/src/utils/requirement-helpers-refactored.js +367 -0
  164. package/src/utils/requirement-helpers.js +291 -1191
  165. package/src/utils/requirement-movement-operations.js +450 -0
  166. package/src/utils/requirement-movement.js +312 -0
  167. package/src/utils/requirement-parsing-helpers.js +56 -0
  168. package/src/utils/requirement-statistics.js +200 -0
  169. package/src/utils/requirement-text-utils.js +58 -0
  170. package/src/utils/rollback/rollback-handlers.js +125 -0
  171. package/src/utils/rollback/rollback-operation.js +63 -0
  172. package/src/utils/rollback/rollback-recorder.js +166 -0
  173. package/src/utils/rollback/rollback-state-manager.js +175 -0
  174. package/src/utils/rollback/rollback-types.js +33 -0
  175. package/src/utils/rollback/rollback-utils.js +110 -0
  176. package/src/utils/rollback-manager-original.js +569 -0
  177. package/src/utils/rollback-manager.js +202 -0
  178. package/src/utils/smoke-test-cli.js +362 -0
  179. package/src/utils/smoke-test-gui.js +351 -0
  180. package/src/utils/smoke-test-orchestrator.js +321 -0
  181. package/src/utils/smoke-test-runner.js +60 -0
  182. package/src/utils/smoke-test-web.js +347 -0
  183. package/src/utils/specification-helpers.js +39 -13
  184. package/src/utils/specification-migration.js +97 -0
  185. package/src/utils/test-runner.js +579 -0
  186. package/src/utils/validation-framework.js +518 -0
  187. package/src/validation/compliance-analyzer.js +197 -0
  188. package/src/validation/compliance-report-generator.js +343 -0
  189. package/src/validation/compliance-reporter.js +711 -0
  190. package/src/validation/compliance-rules.js +127 -0
  191. package/src/validation/constitution-validator-new.js +196 -0
  192. package/src/validation/constitution-validator.js +17 -0
  193. package/src/validation/file-validators.js +170 -0
  194. package/src/validation/line-limit/file-analyzer.js +201 -0
  195. package/src/validation/line-limit/line-limit-validator.js +208 -0
  196. package/src/validation/line-limit/validation-result.js +144 -0
  197. package/src/validation/line-limit-core.js +225 -0
  198. package/src/validation/line-limit-reporter.js +134 -0
  199. package/src/validation/line-limit-result.js +125 -0
  200. package/src/validation/line-limit-validator.js +41 -0
  201. package/src/validation/metrics-calculator.js +660 -0
  202. 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;