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