vibecodingmachine-core 2026.2.20-438 → 2026.2.26-1642
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,453 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Operation Verifier
|
|
3
|
+
*
|
|
4
|
+
* File create/read/delete verification implementation.
|
|
5
|
+
* Follows constitutional requirements: <555 lines, test-first approach.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const BaseVerifier = require('./BaseVerifier');
|
|
9
|
+
const { VerificationType } = require('../VerificationType');
|
|
10
|
+
const fs = require('fs').promises;
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const os = require('os');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* File operation verifier class
|
|
16
|
+
*/
|
|
17
|
+
class FileOperationVerifier extends BaseVerifier {
|
|
18
|
+
/**
|
|
19
|
+
* Create file operation verifier instance
|
|
20
|
+
* @param {Object} config - Verifier configuration
|
|
21
|
+
*/
|
|
22
|
+
constructor(config = {}) {
|
|
23
|
+
super({
|
|
24
|
+
type: VerificationType.FILE_OPERATION,
|
|
25
|
+
description: 'File create/read/delete test',
|
|
26
|
+
command: config.command || 'echo "test-requirement-{timestamp}" > test-requirement-{timestamp}.txt && cat test-requirement-{timestamp}.txt && rm test-requirement-{timestamp}.txt',
|
|
27
|
+
expectedResult: config.expectedResult || 'test-requirement-{timestamp}',
|
|
28
|
+
timeout: config.timeout || 10,
|
|
29
|
+
...config
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
this.testDir = config.testDir || os.tmpdir();
|
|
33
|
+
this.testFileName = config.testFileName || 'test-requirement-{timestamp}.txt';
|
|
34
|
+
this.cleanupOnSuccess = config.cleanupOnSuccess !== false;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Execute file operation verification
|
|
39
|
+
* @param {Object} options - Verification options
|
|
40
|
+
* @returns {Promise<Object>} - Verification result
|
|
41
|
+
*/
|
|
42
|
+
async verify(options = {}) {
|
|
43
|
+
const { context = {} } = options;
|
|
44
|
+
|
|
45
|
+
if (this.logger) {
|
|
46
|
+
await this.logger.info('Starting file operation verification', {
|
|
47
|
+
testDir: this.testDir,
|
|
48
|
+
testFileName: this.testFileName,
|
|
49
|
+
context
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const startTime = Date.now();
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
// Generate unique timestamp for this test
|
|
57
|
+
const timestamp = Date.now();
|
|
58
|
+
const testContext = { ...context, timestamp };
|
|
59
|
+
|
|
60
|
+
// Build test file path
|
|
61
|
+
const testFilePath = this.buildTestFilePath(timestamp);
|
|
62
|
+
|
|
63
|
+
// Execute file operations
|
|
64
|
+
const result = await this.executeFileOperations(testFilePath, testContext);
|
|
65
|
+
|
|
66
|
+
const verificationResult = {
|
|
67
|
+
id: this.generateId(),
|
|
68
|
+
agentId: options.agentId || '',
|
|
69
|
+
type: this.type,
|
|
70
|
+
description: this.description,
|
|
71
|
+
passed: result.success,
|
|
72
|
+
command: this.command,
|
|
73
|
+
result,
|
|
74
|
+
duration: Date.now() - startTime,
|
|
75
|
+
timeout: this.timeout * 1000,
|
|
76
|
+
timestamp: new Date().toISOString(),
|
|
77
|
+
testFilePath,
|
|
78
|
+
operations: result.operations || []
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
if (this.logger) {
|
|
82
|
+
const level = result.success ? 'info' : 'warn';
|
|
83
|
+
const message = result.success
|
|
84
|
+
? 'File operation verification passed'
|
|
85
|
+
: 'File operation verification failed';
|
|
86
|
+
|
|
87
|
+
await this.logger[level](message, {
|
|
88
|
+
agentId: options.agentId,
|
|
89
|
+
passed: result.success,
|
|
90
|
+
duration: verificationResult.duration,
|
|
91
|
+
testFilePath
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Cleanup if successful and cleanup is enabled
|
|
96
|
+
if (result.success && this.cleanupOnSuccess) {
|
|
97
|
+
await this.cleanup(testFilePath, testContext);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return verificationResult;
|
|
101
|
+
} catch (error) {
|
|
102
|
+
const errorResult = {
|
|
103
|
+
id: this.generateId(),
|
|
104
|
+
agentId: options.agentId || '',
|
|
105
|
+
type: this.type,
|
|
106
|
+
description: this.description,
|
|
107
|
+
passed: false,
|
|
108
|
+
error: error.message,
|
|
109
|
+
duration: Date.now() - startTime,
|
|
110
|
+
timeout: this.timeout * 1000,
|
|
111
|
+
timestamp: new Date().toISOString()
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
if (this.logger) {
|
|
115
|
+
await this.logger.error('File operation verification error', {
|
|
116
|
+
agentId: options.agentId,
|
|
117
|
+
error: error.message,
|
|
118
|
+
duration: errorResult.duration
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return errorResult;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Execute file operations for verification
|
|
128
|
+
* @param {string} testFilePath - Test file path
|
|
129
|
+
* @param {Object} context - Test context
|
|
130
|
+
* @returns {Promise<Object>} - Operation result
|
|
131
|
+
*/
|
|
132
|
+
async executeFileOperations(testFilePath, context) {
|
|
133
|
+
const operations = [];
|
|
134
|
+
|
|
135
|
+
try {
|
|
136
|
+
// Operation 1: Create file
|
|
137
|
+
await this.createTestFile(testFilePath, context);
|
|
138
|
+
operations.push({
|
|
139
|
+
type: 'create',
|
|
140
|
+
path: testFilePath,
|
|
141
|
+
success: true,
|
|
142
|
+
timestamp: new Date().toISOString()
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// Operation 2: Read file
|
|
146
|
+
const content = await this.readTestFile(testFilePath);
|
|
147
|
+
operations.push({
|
|
148
|
+
type: 'read',
|
|
149
|
+
path: testFilePath,
|
|
150
|
+
success: true,
|
|
151
|
+
content: content,
|
|
152
|
+
timestamp: new Date().toISOString()
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// Operation 3: Verify content
|
|
156
|
+
const expectedContent = this.getExpectedContent(context);
|
|
157
|
+
const contentMatches = this.verifyContent(content, expectedContent);
|
|
158
|
+
operations.push({
|
|
159
|
+
type: 'verify',
|
|
160
|
+
path: testFilePath,
|
|
161
|
+
success: contentMatches,
|
|
162
|
+
expected: expectedContent,
|
|
163
|
+
actual: content,
|
|
164
|
+
timestamp: new Date().toISOString()
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Operation 4: Delete file
|
|
168
|
+
await this.deleteTestFile(testFilePath);
|
|
169
|
+
operations.push({
|
|
170
|
+
type: 'delete',
|
|
171
|
+
path: testFilePath,
|
|
172
|
+
success: true,
|
|
173
|
+
timestamp: new Date().toISOString()
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
success: contentMatches,
|
|
178
|
+
operations,
|
|
179
|
+
testFilePath
|
|
180
|
+
};
|
|
181
|
+
} catch (error) {
|
|
182
|
+
// Add failed operation
|
|
183
|
+
operations.push({
|
|
184
|
+
type: 'error',
|
|
185
|
+
error: error.message,
|
|
186
|
+
timestamp: new Date().toISOString()
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
success: false,
|
|
191
|
+
operations,
|
|
192
|
+
error: error.message
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Build test file path with timestamp
|
|
199
|
+
* @param {number} timestamp - Timestamp for uniqueness
|
|
200
|
+
* @returns {string} - Test file path
|
|
201
|
+
*/
|
|
202
|
+
buildTestFilePath(timestamp) {
|
|
203
|
+
const fileName = this.testFileName.replace('{timestamp}', timestamp.toString());
|
|
204
|
+
return path.join(this.testDir, fileName);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Create test file with content
|
|
209
|
+
* @param {string} filePath - File path
|
|
210
|
+
* @param {Object} context - Test context
|
|
211
|
+
*/
|
|
212
|
+
async createTestFile(filePath, context) {
|
|
213
|
+
const content = this.getTestContent(context);
|
|
214
|
+
await fs.writeFile(filePath, content, 'utf8');
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Get test content based on context
|
|
219
|
+
* @param {Object} context - Test context
|
|
220
|
+
* @returns {string} - Test content
|
|
221
|
+
*/
|
|
222
|
+
getTestContent(context) {
|
|
223
|
+
const timestamp = context.timestamp || Date.now();
|
|
224
|
+
return `test-requirement-${timestamp}`;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Get expected content for verification
|
|
229
|
+
* @param {Object} context - Test context
|
|
230
|
+
* @returns {string} - Expected content
|
|
231
|
+
*/
|
|
232
|
+
getExpectedContent(context) {
|
|
233
|
+
const timestamp = context.timestamp || Date.now();
|
|
234
|
+
return `test-requirement-${timestamp}`;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Read test file content
|
|
239
|
+
* @param {string} filePath - File path
|
|
240
|
+
* @returns {Promise<string>} - File content
|
|
241
|
+
*/
|
|
242
|
+
async readTestFile(filePath) {
|
|
243
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
244
|
+
return content.trim();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Verify file content matches expected
|
|
249
|
+
* @param {string} actual - Actual content
|
|
250
|
+
* @param {string} expected - Expected content
|
|
251
|
+
* @returns {boolean} - True if content matches
|
|
252
|
+
*/
|
|
253
|
+
verifyContent(actual, expected) {
|
|
254
|
+
return actual === expected;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Delete test file
|
|
259
|
+
* @param {string} filePath - File path
|
|
260
|
+
*/
|
|
261
|
+
async deleteTestFile(filePath) {
|
|
262
|
+
try {
|
|
263
|
+
await fs.unlink(filePath);
|
|
264
|
+
} catch (error) {
|
|
265
|
+
// File might not exist, which is ok for delete operation
|
|
266
|
+
if (error.code !== 'ENOENT') {
|
|
267
|
+
throw error;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Cleanup test artifacts
|
|
274
|
+
* @param {string} testFilePath - Test file path
|
|
275
|
+
* @param {Object} context - Test context
|
|
276
|
+
*/
|
|
277
|
+
async cleanup(testFilePath, context) {
|
|
278
|
+
try {
|
|
279
|
+
// Delete the main test file
|
|
280
|
+
await this.deleteTestFile(testFilePath);
|
|
281
|
+
|
|
282
|
+
// Clean up any additional test files that might have been created
|
|
283
|
+
await this.cleanupAdditionalFiles(context);
|
|
284
|
+
} catch (error) {
|
|
285
|
+
if (this.logger) {
|
|
286
|
+
await this.logger.warn('Cleanup failed', {
|
|
287
|
+
testFilePath,
|
|
288
|
+
error: error.message
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Clean up additional test files
|
|
296
|
+
* @param {Object} context - Test context
|
|
297
|
+
*/
|
|
298
|
+
async cleanupAdditionalFiles(context) {
|
|
299
|
+
const timestamp = context.timestamp || Date.now();
|
|
300
|
+
const patterns = [
|
|
301
|
+
`test-requirement-${timestamp}.*`,
|
|
302
|
+
'test-requirement-*.txt',
|
|
303
|
+
'temp-verification-*.tmp',
|
|
304
|
+
'agent-test-*.log'
|
|
305
|
+
];
|
|
306
|
+
|
|
307
|
+
for (const pattern of patterns) {
|
|
308
|
+
try {
|
|
309
|
+
const files = await fs.readdir(this.testDir);
|
|
310
|
+
const matchingFiles = files.filter(file =>
|
|
311
|
+
file.match(new RegExp(pattern.replace('*', '.*')))
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
for (const file of matchingFiles) {
|
|
315
|
+
const filePath = path.join(this.testDir, file);
|
|
316
|
+
await fs.unlink(filePath);
|
|
317
|
+
}
|
|
318
|
+
} catch (error) {
|
|
319
|
+
// Ignore cleanup errors
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Check if directory is writable
|
|
326
|
+
* @param {string} dirPath - Directory path
|
|
327
|
+
* @returns {Promise<boolean>} - True if writable
|
|
328
|
+
*/
|
|
329
|
+
async checkDirectoryWritable(dirPath) {
|
|
330
|
+
try {
|
|
331
|
+
const testFile = path.join(dirPath, '.write-test');
|
|
332
|
+
await fs.writeFile(testFile, 'test', 'utf8');
|
|
333
|
+
await fs.unlink(testFile);
|
|
334
|
+
return true;
|
|
335
|
+
} catch (error) {
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Get disk space information
|
|
342
|
+
* @param {string} dirPath - Directory path
|
|
343
|
+
* @returns {Promise<Object>} - Disk space info
|
|
344
|
+
*/
|
|
345
|
+
async getDiskSpace(dirPath) {
|
|
346
|
+
try {
|
|
347
|
+
const stats = await fs.statfs(dirPath);
|
|
348
|
+
return {
|
|
349
|
+
total: stats.bsize * stats.blocks,
|
|
350
|
+
free: stats.bsize * stats.bavail,
|
|
351
|
+
available: stats.bsize * stats.bavail
|
|
352
|
+
};
|
|
353
|
+
} catch (error) {
|
|
354
|
+
return {
|
|
355
|
+
total: 0,
|
|
356
|
+
free: 0,
|
|
357
|
+
available: 0,
|
|
358
|
+
error: error.message
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Test file permissions
|
|
365
|
+
* @param {string} filePath - File path
|
|
366
|
+
* @returns {Promise<Object>} - Permission test result
|
|
367
|
+
*/
|
|
368
|
+
async testFilePermissions(filePath) {
|
|
369
|
+
try {
|
|
370
|
+
// Test read permission
|
|
371
|
+
await fs.access(filePath, fs.constants.R_OK);
|
|
372
|
+
|
|
373
|
+
// Test write permission
|
|
374
|
+
const dirPath = path.dirname(filePath);
|
|
375
|
+
await fs.access(dirPath, fs.constants.W_OK);
|
|
376
|
+
|
|
377
|
+
return {
|
|
378
|
+
readable: true,
|
|
379
|
+
writable: true,
|
|
380
|
+
executable: false
|
|
381
|
+
};
|
|
382
|
+
} catch (error) {
|
|
383
|
+
return {
|
|
384
|
+
readable: false,
|
|
385
|
+
writable: false,
|
|
386
|
+
executable: false,
|
|
387
|
+
error: error.message
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Get file operation verifier information
|
|
394
|
+
* @returns {Object} - Verifier info
|
|
395
|
+
*/
|
|
396
|
+
getVerifierInfo() {
|
|
397
|
+
return {
|
|
398
|
+
...this.getInfo(),
|
|
399
|
+
type: VerificationType.FILE_OPERATION,
|
|
400
|
+
supportedPlatforms: ['win32', 'darwin', 'linux'],
|
|
401
|
+
requirements: [
|
|
402
|
+
'file system access',
|
|
403
|
+
'write permissions',
|
|
404
|
+
'disk space'
|
|
405
|
+
],
|
|
406
|
+
features: [
|
|
407
|
+
'file creation',
|
|
408
|
+
'file reading',
|
|
409
|
+
'file deletion',
|
|
410
|
+
'content verification',
|
|
411
|
+
'permission testing'
|
|
412
|
+
],
|
|
413
|
+
limitations: [
|
|
414
|
+
'requires file system access',
|
|
415
|
+
'temporary files created',
|
|
416
|
+
'cleanup required',
|
|
417
|
+
'permission dependent'
|
|
418
|
+
]
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Create file operation verifier from configuration
|
|
424
|
+
* @param {Object} config - Configuration object
|
|
425
|
+
* @param {AgentLogger} logger - Logger instance
|
|
426
|
+
* @returns {FileOperationVerifier} - Verifier instance
|
|
427
|
+
*/
|
|
428
|
+
static fromConfig(config, logger = null) {
|
|
429
|
+
return new FileOperationVerifier({
|
|
430
|
+
...config,
|
|
431
|
+
logger
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Create default file operation verifier
|
|
437
|
+
* @param {string} agentId - Agent identifier
|
|
438
|
+
* @param {AgentLogger} logger - Logger instance
|
|
439
|
+
* @returns {FileOperationVerifier} - Default verifier instance
|
|
440
|
+
*/
|
|
441
|
+
static createDefault(agentId, logger = null) {
|
|
442
|
+
return new FileOperationVerifier({
|
|
443
|
+
id: `${agentId}-file-op`,
|
|
444
|
+
agentId,
|
|
445
|
+
command: 'echo "test-requirement-{timestamp}" > test-requirement-{timestamp}.txt && cat test-requirement-{timestamp}.txt && rm test-requirement-{timestamp}.txt',
|
|
446
|
+
expectedResult: 'test-requirement-{timestamp}',
|
|
447
|
+
timeout: 10,
|
|
448
|
+
logger
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
module.exports = FileOperationVerifier;
|