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