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,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;