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,495 @@
1
+ /**
2
+ * Test Requirement Manager
3
+ *
4
+ * Manages test requirement files for agent verification.
5
+ * Follows constitutional requirements: <555 lines, test-first approach.
6
+ */
7
+
8
+ const fs = require('fs').promises;
9
+ const path = require('path');
10
+ const crypto = require('crypto');
11
+
12
+ /**
13
+ * Test requirement manager class
14
+ */
15
+ class TestRequirementManager {
16
+ /**
17
+ * Create test requirement manager instance
18
+ * @param {Object} options - Manager options
19
+ */
20
+ constructor(options = {}) {
21
+ this.baseDir = options.baseDir || './temp/agents';
22
+ this.requirementPrefix = options.requirementPrefix || 'test-requirement';
23
+ this.cleanupDelay = options.cleanupDelay || 5000; // 5 seconds
24
+ this.maxRetries = options.maxRetries || 3;
25
+ this.retryDelay = options.retryDelay || 1000; // 1 second
26
+ this.logger = options.logger || null;
27
+ }
28
+
29
+ /**
30
+ * Create test requirement file
31
+ * @param {string} agentId - Agent identifier
32
+ * @param {Object} testConfig - Test configuration
33
+ * @returns {Promise<Object>} - File creation result
34
+ */
35
+ async createRequirementFile(agentId, testConfig = {}) {
36
+ const timestamp = Date.now();
37
+ const uniqueId = crypto.randomBytes(4).toString('hex');
38
+ const fileName = `${this.requirementPrefix}-${agentId}-${timestamp}-${uniqueId}.txt`;
39
+ const filePath = path.join(this.baseDir, fileName);
40
+
41
+ const content = testConfig.content || `test-requirement-${agentId}-${timestamp}`;
42
+
43
+ try {
44
+ // Ensure directory exists
45
+ await this.ensureDirectory(this.baseDir);
46
+
47
+ // Write file with retry logic
48
+ await this.writeWithRetry(filePath, content);
49
+
50
+ const result = {
51
+ success: true,
52
+ agentId,
53
+ fileName,
54
+ filePath,
55
+ content,
56
+ timestamp,
57
+ size: content.length
58
+ };
59
+
60
+ if (this.logger) {
61
+ await this.logger.info('Test requirement file created', {
62
+ agentId,
63
+ fileName,
64
+ filePath,
65
+ size: result.size
66
+ });
67
+ }
68
+
69
+ return result;
70
+ } catch (error) {
71
+ const errorResult = {
72
+ success: false,
73
+ agentId,
74
+ fileName,
75
+ error: error.message,
76
+ timestamp
77
+ };
78
+
79
+ if (this.logger) {
80
+ await this.logger.error('Failed to create test requirement file', {
81
+ agentId,
82
+ fileName,
83
+ error: error.message
84
+ });
85
+ }
86
+
87
+ throw new Error(`Failed to create test requirement file: ${error.message}`);
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Read test requirement file
93
+ * @param {string} filePath - Path to file
94
+ * @returns {Promise<Object>} - File read result
95
+ */
96
+ async readRequirementFile(filePath) {
97
+ try {
98
+ const content = await fs.readFile(filePath, 'utf8');
99
+ const stats = await fs.stat(filePath);
100
+
101
+ const result = {
102
+ success: true,
103
+ filePath,
104
+ content,
105
+ size: content.length,
106
+ modified: stats.mtime,
107
+ created: stats.birthtime
108
+ };
109
+
110
+ if (this.logger) {
111
+ await this.logger.info('Test requirement file read', {
112
+ filePath,
113
+ size: result.size
114
+ });
115
+ }
116
+
117
+ return result;
118
+ } catch (error) {
119
+ const errorResult = {
120
+ success: false,
121
+ filePath,
122
+ error: error.message
123
+ };
124
+
125
+ if (this.logger) {
126
+ await this.logger.error('Failed to read test requirement file', {
127
+ filePath,
128
+ error: error.message
129
+ });
130
+ }
131
+
132
+ throw new Error(`Failed to read test requirement file: ${error.message}`);
133
+ }
134
+ }
135
+
136
+ /**
137
+ * Verify test requirement file content
138
+ * @param {string} filePath - Path to file
139
+ * @param {string} expectedContent - Expected content
140
+ * @returns {Promise<Object>} - Verification result
141
+ */
142
+ async verifyRequirementFile(filePath, expectedContent) {
143
+ try {
144
+ const readResult = await this.readRequirementFile(filePath);
145
+
146
+ if (!readResult.success) {
147
+ return readResult;
148
+ }
149
+
150
+ const contentMatches = readResult.content === expectedContent;
151
+
152
+ const result = {
153
+ success: true,
154
+ filePath,
155
+ expectedContent,
156
+ actualContent: readResult.content,
157
+ contentMatches,
158
+ verified: contentMatches,
159
+ size: readResult.size,
160
+ modified: readResult.modified
161
+ };
162
+
163
+ if (this.logger) {
164
+ await this.logger.info('Test requirement file verified', {
165
+ filePath,
166
+ contentMatches,
167
+ size: result.size
168
+ });
169
+ }
170
+
171
+ return result;
172
+ } catch (error) {
173
+ const errorResult = {
174
+ success: false,
175
+ filePath,
176
+ expectedContent,
177
+ error: error.message,
178
+ verified: false
179
+ };
180
+
181
+ if (this.logger) {
182
+ await this.logger.error('Failed to verify test requirement file', {
183
+ filePath,
184
+ error: error.message
185
+ });
186
+ }
187
+
188
+ return errorResult;
189
+ }
190
+ }
191
+
192
+ /**
193
+ * Delete test requirement file
194
+ * @param {string} filePath - Path to file
195
+ * @param {boolean} immediate - Delete immediately or with delay
196
+ * @returns {Promise<Object>} - Deletion result
197
+ */
198
+ async deleteRequirementFile(filePath, immediate = false) {
199
+ try {
200
+ if (!immediate && this.cleanupDelay > 0) {
201
+ // Schedule delayed cleanup
202
+ setTimeout(async () => {
203
+ try {
204
+ await fs.unlink(filePath);
205
+
206
+ if (this.logger) {
207
+ await this.logger.info('Test requirement file cleaned up', {
208
+ filePath,
209
+ delayed: true
210
+ });
211
+ }
212
+ } catch (error) {
213
+ if (this.logger) {
214
+ await this.logger.warn('Failed to cleanup test requirement file', {
215
+ filePath,
216
+ error: error.message
217
+ });
218
+ }
219
+ }
220
+ }, this.cleanupDelay);
221
+
222
+ return {
223
+ success: true,
224
+ filePath,
225
+ scheduled: true,
226
+ cleanupDelay: this.cleanupDelay
227
+ };
228
+ } else {
229
+ // Immediate deletion
230
+ await fs.unlink(filePath);
231
+
232
+ const result = {
233
+ success: true,
234
+ filePath,
235
+ deleted: true,
236
+ immediate: true
237
+ };
238
+
239
+ if (this.logger) {
240
+ await this.logger.info('Test requirement file deleted', {
241
+ filePath,
242
+ immediate: true
243
+ });
244
+ }
245
+
246
+ return result;
247
+ }
248
+ } catch (error) {
249
+ const errorResult = {
250
+ success: false,
251
+ filePath,
252
+ error: error.message,
253
+ deleted: false
254
+ };
255
+
256
+ if (this.logger) {
257
+ await this.logger.error('Failed to delete test requirement file', {
258
+ filePath,
259
+ error: error.message
260
+ });
261
+ }
262
+
263
+ return errorResult;
264
+ }
265
+ }
266
+
267
+ /**
268
+ * Complete test requirement cycle (create, read, verify, delete)
269
+ * @param {string} agentId - Agent identifier
270
+ * @param {Object} testConfig - Test configuration
271
+ * @returns {Promise<Object>} - Cycle result
272
+ */
273
+ async completeRequirementCycle(agentId, testConfig = {}) {
274
+ const cycleId = crypto.randomBytes(8).toString('hex');
275
+ const startTime = Date.now();
276
+
277
+ try {
278
+ // Create requirement file
279
+ const createResult = await this.createRequirementFile(agentId, testConfig);
280
+
281
+ // Verify file content
282
+ const verifyResult = await this.verifyRequirementFile(
283
+ createResult.filePath,
284
+ createResult.content
285
+ );
286
+
287
+ // Delete requirement file
288
+ const deleteResult = await this.deleteRequirementFile(createResult.filePath, false);
289
+
290
+ const duration = Date.now() - startTime;
291
+
292
+ const cycleResult = {
293
+ success: verifyResult.contentMatches && deleteResult.success,
294
+ cycleId,
295
+ agentId,
296
+ duration,
297
+ steps: {
298
+ create: createResult,
299
+ verify: verifyResult,
300
+ delete: deleteResult
301
+ },
302
+ summary: {
303
+ fileCreated: createResult.success,
304
+ contentVerified: verifyResult.contentMatches,
305
+ fileDeleted: deleteResult.success || deleteResult.scheduled,
306
+ allStepsPassed: createResult.success && verifyResult.contentMatches && (deleteResult.success || deleteResult.scheduled)
307
+ }
308
+ };
309
+
310
+ if (this.logger) {
311
+ await this.logger.info('Test requirement cycle completed', {
312
+ cycleId,
313
+ agentId,
314
+ success: cycleResult.success,
315
+ duration,
316
+ summary: cycleResult.summary
317
+ });
318
+ }
319
+
320
+ return cycleResult;
321
+ } catch (error) {
322
+ const duration = Date.now() - startTime;
323
+
324
+ const errorResult = {
325
+ success: false,
326
+ cycleId,
327
+ agentId,
328
+ duration,
329
+ error: error.message,
330
+ steps: {},
331
+ summary: {
332
+ fileCreated: false,
333
+ contentVerified: false,
334
+ fileDeleted: false,
335
+ allStepsPassed: false
336
+ }
337
+ };
338
+
339
+ if (this.logger) {
340
+ await this.logger.error('Test requirement cycle failed', {
341
+ cycleId,
342
+ agentId,
343
+ error: error.message,
344
+ duration
345
+ });
346
+ }
347
+
348
+ return errorResult;
349
+ }
350
+ }
351
+
352
+ /**
353
+ * Clean up old test requirement files
354
+ * @param {number} maxAge - Maximum age in milliseconds
355
+ * @returns {Promise<Object>} - Cleanup result
356
+ */
357
+ async cleanupOldFiles(maxAge = 3600000) { // 1 hour default
358
+ try {
359
+ await this.ensureDirectory(this.baseDir);
360
+
361
+ const files = await fs.readdir(this.baseDir);
362
+ const now = Date.now();
363
+ let cleanedCount = 0;
364
+ let errorCount = 0;
365
+
366
+ for (const file of files) {
367
+ if (file.startsWith(this.requirementPrefix)) {
368
+ const filePath = path.join(this.baseDir, file);
369
+
370
+ try {
371
+ const stats = await fs.stat(filePath);
372
+ const age = now - stats.mtime.getTime();
373
+
374
+ if (age > maxAge) {
375
+ await fs.unlink(filePath);
376
+ cleanedCount++;
377
+
378
+ if (this.logger) {
379
+ await this.logger.info('Old test requirement file cleaned up', {
380
+ file,
381
+ age,
382
+ maxAge
383
+ });
384
+ }
385
+ }
386
+ } catch (error) {
387
+ errorCount++;
388
+
389
+ if (this.logger) {
390
+ await this.logger.warn('Failed to clean up old test file', {
391
+ file,
392
+ error: error.message
393
+ });
394
+ }
395
+ }
396
+ }
397
+ }
398
+
399
+ return {
400
+ success: true,
401
+ totalFiles: files.length,
402
+ cleanedCount,
403
+ errorCount,
404
+ maxAge
405
+ };
406
+ } catch (error) {
407
+ if (this.logger) {
408
+ await this.logger.error('Failed to cleanup old test files', {
409
+ error: error.message,
410
+ maxAge
411
+ });
412
+ }
413
+
414
+ return {
415
+ success: false,
416
+ error: error.message,
417
+ maxAge
418
+ };
419
+ }
420
+ }
421
+
422
+ /**
423
+ * Ensure directory exists
424
+ * @param {string} dirPath - Directory path
425
+ */
426
+ async ensureDirectory(dirPath) {
427
+ try {
428
+ await fs.mkdir(dirPath, { recursive: true });
429
+ } catch (error) {
430
+ if (error.code !== 'EEXIST') {
431
+ throw error;
432
+ }
433
+ }
434
+ }
435
+
436
+ /**
437
+ * Write file with retry logic
438
+ * @param {string} filePath - File path
439
+ * @param {string} content - File content
440
+ */
441
+ async writeWithRetry(filePath, content) {
442
+ let lastError;
443
+
444
+ for (let attempt = 1; attempt <= this.maxRetries; attempt++) {
445
+ try {
446
+ await fs.writeFile(filePath, content, 'utf8');
447
+ return;
448
+ } catch (error) {
449
+ lastError = error;
450
+
451
+ if (attempt < this.maxRetries) {
452
+ await this.delay(this.retryDelay * attempt);
453
+ }
454
+ }
455
+ }
456
+
457
+ throw lastError;
458
+ }
459
+
460
+ /**
461
+ * Delay helper
462
+ * @param {number} ms - Milliseconds to delay
463
+ */
464
+ delay(ms) {
465
+ return new Promise(resolve => setTimeout(resolve, ms));
466
+ }
467
+
468
+ /**
469
+ * Get manager information
470
+ * @returns {Object} - Manager info
471
+ */
472
+ getInfo() {
473
+ return {
474
+ name: 'Test Requirement Manager',
475
+ version: '1.0.0',
476
+ baseDir: this.baseDir,
477
+ requirementPrefix: this.requirementPrefix,
478
+ cleanupDelay: this.cleanupDelay,
479
+ maxRetries: this.maxRetries,
480
+ retryDelay: this.retryDelay,
481
+ features: [
482
+ 'file creation',
483
+ 'file reading',
484
+ 'content verification',
485
+ 'file deletion',
486
+ 'delayed cleanup',
487
+ 'batch cleanup',
488
+ 'retry logic',
489
+ 'error handling'
490
+ ]
491
+ };
492
+ }
493
+ }
494
+
495
+ module.exports = TestRequirementManager;