vibecodingmachine-core 2026.2.20-438 → 2026.2.26-1739
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +240 -0
- package/package.json +10 -2
- package/src/agents/Agent.js +300 -0
- package/src/agents/AgentAdditionService.js +311 -0
- package/src/agents/AgentCheckService.js +690 -0
- package/src/agents/AgentInstallationService.js +140 -0
- package/src/agents/AgentSetupService.js +467 -0
- package/src/agents/AgentStatus.js +183 -0
- package/src/agents/AgentVerificationService.js +634 -0
- package/src/agents/ConfigurationSchemaValidator.js +543 -0
- package/src/agents/EnvironmentConfigurationManager.js +602 -0
- package/src/agents/InstallationErrorHandler.js +372 -0
- package/src/agents/InstallationLog.js +363 -0
- package/src/agents/InstallationMethod.js +510 -0
- package/src/agents/InstallationOrchestrator.js +352 -0
- package/src/agents/InstallationProgressReporter.js +372 -0
- package/src/agents/InstallationRetryManager.js +322 -0
- package/src/agents/InstallationType.js +254 -0
- package/src/agents/OperationTypes.js +310 -0
- package/src/agents/PerformanceMetricsCollector.js +493 -0
- package/src/agents/SecurityValidationService.js +534 -0
- package/src/agents/VerificationTest.js +354 -0
- package/src/agents/VerificationType.js +226 -0
- package/src/agents/WindowsPermissionHandler.js +518 -0
- package/src/agents/config/AgentConfigManager.js +393 -0
- package/src/agents/config/AgentDefaultsRegistry.js +373 -0
- package/src/agents/config/ConfigValidator.js +281 -0
- package/src/agents/discovery/AgentDiscoveryService.js +707 -0
- package/src/agents/logging/AgentLogger.js +511 -0
- package/src/agents/status/AgentStatusManager.js +481 -0
- package/src/agents/storage/FileManager.js +454 -0
- package/src/agents/verification/AgentCommunicationTester.js +474 -0
- package/src/agents/verification/BaseVerifier.js +430 -0
- package/src/agents/verification/CommandVerifier.js +480 -0
- package/src/agents/verification/FileOperationVerifier.js +453 -0
- package/src/agents/verification/ResultAnalyzer.js +707 -0
- package/src/agents/verification/TestRequirementManager.js +495 -0
- package/src/agents/verification/VerificationRunner.js +433 -0
- package/src/agents/windows/BaseWindowsInstaller.js +441 -0
- package/src/agents/windows/ChocolateyInstaller.js +509 -0
- package/src/agents/windows/DirectInstaller.js +443 -0
- package/src/agents/windows/InstallerFactory.js +391 -0
- package/src/agents/windows/NpmInstaller.js +505 -0
- package/src/agents/windows/PowerShellInstaller.js +458 -0
- package/src/agents/windows/WinGetInstaller.js +390 -0
- package/src/analysis/analysis-reporter.js +132 -0
- package/src/analysis/boundary-detector.js +712 -0
- package/src/analysis/categorizer.js +340 -0
- package/src/analysis/codebase-scanner.js +384 -0
- package/src/analysis/line-counter.js +513 -0
- package/src/analysis/priority-calculator.js +679 -0
- package/src/analysis/report/analysis-report.js +250 -0
- package/src/analysis/report/package-analyzer.js +278 -0
- package/src/analysis/report/recommendation-generator.js +382 -0
- package/src/analysis/report/statistics-generator.js +515 -0
- package/src/analysis/reports/analysis-report-model.js +101 -0
- package/src/analysis/reports/recommendation-generator.js +283 -0
- package/src/analysis/reports/report-generators.js +191 -0
- package/src/analysis/reports/statistics-calculator.js +231 -0
- package/src/analysis/reports/trend-analyzer.js +219 -0
- package/src/analysis/strategy-generator.js +814 -0
- package/src/auto-mode/AutoModeBusinessLogic.js +836 -0
- package/src/config/refactoring-config.js +307 -0
- package/src/health-tracking/json-storage.js +38 -2
- package/src/ide-integration/applescript-manager-core.js +233 -0
- package/src/ide-integration/applescript-manager.cjs +357 -28
- package/src/ide-integration/applescript-manager.js +89 -3599
- package/src/ide-integration/cdp-manager.js +306 -0
- package/src/ide-integration/claude-code-cli-manager.cjs +1 -1
- package/src/ide-integration/continuation-handler.js +337 -0
- package/src/ide-integration/ide-status-checker.js +292 -0
- package/src/ide-integration/macos-ide-manager.js +627 -0
- package/src/ide-integration/macos-text-sender.js +528 -0
- package/src/ide-integration/response-reader.js +548 -0
- package/src/ide-integration/windows-automation-manager.js +121 -0
- package/src/ide-integration/windows-ide-manager.js +373 -0
- package/src/index.cjs +25 -3
- package/src/index.js +15 -1
- package/src/llm/direct-llm-manager.cjs +90 -2
- package/src/models/compliance-report.js +538 -0
- package/src/models/file-analysis.js +681 -0
- package/src/models/refactoring-plan.js +770 -0
- package/src/monitoring/alert-system.js +834 -0
- package/src/monitoring/compliance-progress-tracker.js +437 -0
- package/src/monitoring/continuous-scan-notifications.js +661 -0
- package/src/monitoring/continuous-scanner.js +279 -0
- package/src/monitoring/file-monitor/file-analyzer.js +262 -0
- package/src/monitoring/file-monitor/file-monitor.js +237 -0
- package/src/monitoring/file-monitor/watcher.js +194 -0
- package/src/monitoring/file-monitor.js +17 -0
- package/src/monitoring/notification-manager.js +437 -0
- package/src/monitoring/scanner-core.js +368 -0
- package/src/monitoring/scanner-events.js +214 -0
- package/src/monitoring/violation-notification-system.js +515 -0
- package/src/refactoring/boundaries/cohesion-analyzer.js +316 -0
- package/src/refactoring/boundaries/extraction-result.js +285 -0
- package/src/refactoring/boundaries/extraction-strategies.js +392 -0
- package/src/refactoring/boundaries/module-boundary.js +209 -0
- package/src/refactoring/boundary/boundary-detector.js +741 -0
- package/src/refactoring/boundary/boundary-types.js +405 -0
- package/src/refactoring/boundary/extraction-strategies.js +554 -0
- package/src/refactoring/boundary-extraction-result.js +77 -0
- package/src/refactoring/boundary-extraction-strategies.js +330 -0
- package/src/refactoring/boundary-extractor.js +384 -0
- package/src/refactoring/boundary-types.js +46 -0
- package/src/refactoring/circular/circular-dependency.js +88 -0
- package/src/refactoring/circular/cycle-detection.js +147 -0
- package/src/refactoring/circular/dependency-node.js +82 -0
- package/src/refactoring/circular/dependency-result.js +107 -0
- package/src/refactoring/circular/dependency-types.js +58 -0
- package/src/refactoring/circular/graph-builder.js +213 -0
- package/src/refactoring/circular/resolution-strategy.js +72 -0
- package/src/refactoring/circular/strategy-generator.js +229 -0
- package/src/refactoring/circular-dependency-resolver-original.js +809 -0
- package/src/refactoring/circular-dependency-resolver.js +200 -0
- package/src/refactoring/code-mover.js +761 -0
- package/src/refactoring/file-splitter.js +696 -0
- package/src/refactoring/functionality-validator.js +816 -0
- package/src/refactoring/import-manager.js +774 -0
- package/src/refactoring/module-boundary.js +107 -0
- package/src/refactoring/refactoring-executor.js +672 -0
- package/src/refactoring/refactoring-rollback.js +614 -0
- package/src/refactoring/test-validator.js +631 -0
- package/src/requirement-management/default-requirement-manager.js +321 -0
- package/src/requirement-management/requirement-file-parser.js +159 -0
- package/src/requirement-management/requirement-sequencer.js +221 -0
- package/src/rui/commands/AgentCommandParser.js +600 -0
- package/src/rui/commands/AgentCommands.js +487 -0
- package/src/rui/commands/AgentResponseFormatter.js +832 -0
- package/src/scripts/verify-full-compliance.js +269 -0
- package/src/sync/sync-engine-core.js +1 -0
- package/src/sync/sync-engine-remote-handlers.js +135 -0
- package/src/task-generation/automated-task-generator.js +351 -0
- package/src/task-generation/prioritizer.js +287 -0
- package/src/task-generation/task-list-updater.js +215 -0
- package/src/task-generation/task-management-integration.js +480 -0
- package/src/task-generation/task-manager-integration.js +270 -0
- package/src/task-generation/violation-task-generator.js +474 -0
- package/src/task-management/continuous-scan-integration.js +342 -0
- package/src/timeout-management/index.js +12 -3
- package/src/timeout-management/response-time-tracker.js +167 -0
- package/src/timeout-management/timeout-calculator.js +159 -0
- package/src/timeout-management/timeout-config-manager.js +172 -0
- package/src/utils/ast-analyzer.js +417 -0
- package/src/utils/current-requirement-manager.js +276 -0
- package/src/utils/current-requirement-operations.js +472 -0
- package/src/utils/dependency-mapper.js +456 -0
- package/src/utils/download-with-progress.js +4 -2
- package/src/utils/electron-update-checker.js +4 -1
- package/src/utils/file-size-analyzer.js +272 -0
- package/src/utils/import-updater.js +280 -0
- package/src/utils/refactoring-tools.js +512 -0
- package/src/utils/report-generator.js +569 -0
- package/src/utils/reports/report-analysis.js +218 -0
- package/src/utils/reports/report-types.js +55 -0
- package/src/utils/reports/summary-generators.js +102 -0
- package/src/utils/requirement-file-management.js +157 -0
- package/src/utils/requirement-helpers/requirement-file-ops.js +392 -0
- package/src/utils/requirement-helpers/requirement-mover.js +414 -0
- package/src/utils/requirement-helpers/requirement-parser.js +326 -0
- package/src/utils/requirement-helpers/requirement-status.js +320 -0
- package/src/utils/requirement-helpers-new.js +55 -0
- package/src/utils/requirement-helpers-refactored.js +367 -0
- package/src/utils/requirement-helpers.js +291 -1191
- package/src/utils/requirement-movement-operations.js +450 -0
- package/src/utils/requirement-movement.js +312 -0
- package/src/utils/requirement-parsing-helpers.js +56 -0
- package/src/utils/requirement-statistics.js +200 -0
- package/src/utils/requirement-text-utils.js +58 -0
- package/src/utils/rollback/rollback-handlers.js +125 -0
- package/src/utils/rollback/rollback-operation.js +63 -0
- package/src/utils/rollback/rollback-recorder.js +166 -0
- package/src/utils/rollback/rollback-state-manager.js +175 -0
- package/src/utils/rollback/rollback-types.js +33 -0
- package/src/utils/rollback/rollback-utils.js +110 -0
- package/src/utils/rollback-manager-original.js +569 -0
- package/src/utils/rollback-manager.js +202 -0
- package/src/utils/smoke-test-cli.js +362 -0
- package/src/utils/smoke-test-gui.js +351 -0
- package/src/utils/smoke-test-orchestrator.js +321 -0
- package/src/utils/smoke-test-runner.js +60 -0
- package/src/utils/smoke-test-web.js +347 -0
- package/src/utils/specification-helpers.js +39 -13
- package/src/utils/specification-migration.js +97 -0
- package/src/utils/test-runner.js +579 -0
- package/src/utils/validation-framework.js +518 -0
- package/src/validation/compliance-analyzer.js +197 -0
- package/src/validation/compliance-report-generator.js +343 -0
- package/src/validation/compliance-reporter.js +711 -0
- package/src/validation/compliance-rules.js +127 -0
- package/src/validation/constitution-validator-new.js +196 -0
- package/src/validation/constitution-validator.js +17 -0
- package/src/validation/file-validators.js +170 -0
- package/src/validation/line-limit/file-analyzer.js +201 -0
- package/src/validation/line-limit/line-limit-validator.js +208 -0
- package/src/validation/line-limit/validation-result.js +144 -0
- package/src/validation/line-limit-core.js +225 -0
- package/src/validation/line-limit-reporter.js +134 -0
- package/src/validation/line-limit-result.js +125 -0
- package/src/validation/line-limit-validator.js +41 -0
- package/src/validation/metrics-calculator.js +660 -0
- package/src/sync/sync-engine-backup.js +0 -559
|
@@ -0,0 +1,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;
|