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,543 @@
1
+ /**
2
+ * Configuration Schema Validator
3
+ *
4
+ * Provides JSON schema validation for agent configurations.
5
+ * Follows constitutional requirements: <555 lines, test-first approach.
6
+ */
7
+
8
+ /**
9
+ * Configuration Schema Validator class
10
+ */
11
+ class ConfigurationSchemaValidator {
12
+ /**
13
+ * Create schema validator instance
14
+ * @param {Object} options - Validator options
15
+ */
16
+ constructor(options = {}) {
17
+ this.logger = options.logger || null;
18
+ this.strictMode = options.strictMode !== false; // Default to strict
19
+
20
+ // Define JSON schemas
21
+ this.schemas = {
22
+ agent: this.getAgentSchema(),
23
+ agentsConfig: this.getAgentsConfigSchema(),
24
+ installationMethod: this.getInstallationMethodSchema(),
25
+ verificationTest: this.getVerificationTestSchema()
26
+ };
27
+ }
28
+
29
+ /**
30
+ * Validate agent configuration
31
+ * @param {Object} agentConfig - Agent configuration to validate
32
+ * @returns {Object} - Validation result
33
+ */
34
+ validateAgent(agentConfig) {
35
+ return this.validate(agentConfig, this.schemas.agent, 'agent');
36
+ }
37
+
38
+ /**
39
+ * Validate agents configuration file
40
+ * @param {Object} agentsConfig - Agents configuration to validate
41
+ * @returns {Object} - Validation result
42
+ */
43
+ validateAgentsConfig(agentsConfig) {
44
+ return this.validate(agentsConfig, this.schemas.agentsConfig, 'agents config');
45
+ }
46
+
47
+ /**
48
+ * Validate installation method
49
+ * @param {Object} installationMethod - Installation method to validate
50
+ * @returns {Object} - Validation result
51
+ */
52
+ validateInstallationMethod(installationMethod) {
53
+ return this.validate(installationMethod, this.schemas.installationMethod, 'installation method');
54
+ }
55
+
56
+ /**
57
+ * Validate verification test
58
+ * @param {Object} verificationTest - Verification test to validate
59
+ * @returns {Object} - Validation result
60
+ */
61
+ validateVerificationTest(verificationTest) {
62
+ return this.validate(verificationTest, this.schemas.verificationTest, 'verification test');
63
+ }
64
+
65
+ /**
66
+ * Generic validation method
67
+ * @param {*} data - Data to validate
68
+ * @param {Object} schema - JSON schema to validate against
69
+ * @param {string} dataType - Type of data being validated
70
+ * @returns {Object} - Validation result
71
+ */
72
+ validate(data, schema, dataType) {
73
+ const result = {
74
+ valid: true,
75
+ errors: [],
76
+ warnings: [],
77
+ dataType,
78
+ timestamp: new Date().toISOString()
79
+ };
80
+
81
+ try {
82
+ // Basic type checking
83
+ if (data === null || data === undefined) {
84
+ result.valid = false;
85
+ result.errors.push(`${dataType} cannot be null or undefined`);
86
+ return result;
87
+ }
88
+
89
+ // Validate against schema
90
+ this.validateAgainstSchema(data, schema, '', result);
91
+
92
+ // Additional business logic validation
93
+ this.validateBusinessRules(data, dataType, result);
94
+
95
+ } catch (error) {
96
+ result.valid = false;
97
+ result.errors.push(`Validation error: ${error.message}`);
98
+
99
+ if (this.logger) {
100
+ this.logger.error('Schema validation failed', {
101
+ dataType,
102
+ error: error.message,
103
+ data: this.sanitizeData(data)
104
+ });
105
+ }
106
+ }
107
+
108
+ return result;
109
+ }
110
+
111
+ /**
112
+ * Validate data against JSON schema
113
+ * @param {*} data - Data to validate
114
+ * @param {Object} schema - Schema to validate against
115
+ * @param {string} path - Current path in data structure
116
+ * @param {Object} result - Validation result object
117
+ */
118
+ validateAgainstSchema(data, schema, path, result) {
119
+ // Check required properties
120
+ if (schema.required) {
121
+ for (const requiredProp of schema.required) {
122
+ if (!(requiredProp in data)) {
123
+ result.valid = false;
124
+ result.errors.push(`Missing required property: ${path}${requiredProp}`);
125
+ }
126
+ }
127
+ }
128
+
129
+ // Check each property
130
+ if (schema.properties) {
131
+ for (const [propName, propSchema] of Object.entries(schema.properties)) {
132
+ const propPath = path ? `${path}.${propName}` : propName;
133
+ const propValue = data[propName];
134
+
135
+ if (propValue === undefined || propValue === null) {
136
+ if (schema.required && schema.required.includes(propName)) {
137
+ result.valid = false;
138
+ result.errors.push(`Missing required property: ${propPath}`);
139
+ }
140
+ continue;
141
+ }
142
+
143
+ this.validateProperty(propValue, propSchema, propPath, result);
144
+ }
145
+ }
146
+
147
+ // Check additional properties
148
+ if (schema.additionalProperties === false && this.strictMode) {
149
+ for (const propName of Object.keys(data)) {
150
+ if (!schema.properties || !(propName in schema.properties)) {
151
+ result.warnings.push(`Additional property not allowed: ${path}${propName}`);
152
+ }
153
+ }
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Validate individual property
159
+ * @param {*} value - Property value
160
+ * @param {Object} schema - Property schema
161
+ * @param {string} path - Property path
162
+ * @param {Object} result - Validation result
163
+ */
164
+ validateProperty(value, schema, path, result) {
165
+ // Type validation
166
+ if (schema.type) {
167
+ if (!this.validateType(value, schema.type)) {
168
+ result.valid = false;
169
+ result.errors.push(`Invalid type for ${path}: expected ${schema.type}, got ${typeof value}`);
170
+ return;
171
+ }
172
+ }
173
+
174
+ // String validation
175
+ if (schema.type === 'string' && value !== null && value !== undefined) {
176
+ if (schema.minLength !== undefined && value.length < schema.minLength) {
177
+ result.valid = false;
178
+ result.errors.push(`${path} is too short: minimum ${schema.minLength} characters`);
179
+ }
180
+
181
+ if (schema.maxLength !== undefined && value.length > schema.maxLength) {
182
+ result.valid = false;
183
+ result.errors.push(`${path} is too long: maximum ${schema.maxLength} characters`);
184
+ }
185
+
186
+ if (schema.pattern && !new RegExp(schema.pattern).test(value)) {
187
+ result.valid = false;
188
+ result.errors.push(`${path} does not match required pattern: ${schema.pattern}`);
189
+ }
190
+ }
191
+
192
+ // Array validation
193
+ if (schema.type === 'array' && Array.isArray(value)) {
194
+ if (schema.minItems !== undefined && value.length < schema.minItems) {
195
+ result.valid = false;
196
+ result.errors.push(`${path} has too few items: minimum ${schema.minItems}`);
197
+ }
198
+
199
+ if (schema.maxItems !== undefined && value.length > schema.maxItems) {
200
+ result.valid = false;
201
+ result.errors.push(`${path} has too many items: maximum ${schema.maxItems}`);
202
+ }
203
+
204
+ // Validate array items
205
+ if (schema.items) {
206
+ value.forEach((item, index) => {
207
+ this.validateProperty(item, schema.items, `${path}[${index}]`, result);
208
+ });
209
+ }
210
+ }
211
+
212
+ // Enum validation
213
+ if (schema.enum && !schema.enum.includes(value)) {
214
+ result.valid = false;
215
+ result.errors.push(`Invalid value for ${path}: must be one of [${schema.enum.join(', ')}]`);
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Validate data type
221
+ * @param {*} value - Value to check
222
+ * @param {string|Array} expectedType - Expected type(s)
223
+ * @returns {boolean} - Whether type matches
224
+ */
225
+ validateType(value, expectedType) {
226
+ if (Array.isArray(expectedType)) {
227
+ return expectedType.some(type => this.checkType(value, type));
228
+ }
229
+ return this.checkType(value, expectedType);
230
+ }
231
+
232
+ /**
233
+ * Check single type
234
+ * @param {*} value - Value to check
235
+ * @param {string} type - Expected type
236
+ * @returns {boolean} - Whether type matches
237
+ */
238
+ checkType(value, type) {
239
+ switch (type) {
240
+ case 'string':
241
+ return typeof value === 'string';
242
+ case 'number':
243
+ return typeof value === 'number' && !isNaN(value);
244
+ case 'boolean':
245
+ return typeof value === 'boolean';
246
+ case 'object':
247
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
248
+ case 'array':
249
+ return Array.isArray(value);
250
+ default:
251
+ return typeof value === type;
252
+ }
253
+ }
254
+
255
+ /**
256
+ * Validate business rules
257
+ * @param {*} data - Data to validate
258
+ * @param {string} dataType - Type of data
259
+ * @param {Object} result - Validation result
260
+ */
261
+ validateBusinessRules(data, dataType, result) {
262
+ switch (dataType) {
263
+ case 'agent':
264
+ this.validateAgentBusinessRules(data, result);
265
+ break;
266
+ case 'installation method':
267
+ this.validateInstallationMethodBusinessRules(data, result);
268
+ break;
269
+ case 'verification test':
270
+ this.validateVerificationTestBusinessRules(data, result);
271
+ break;
272
+ }
273
+ }
274
+
275
+ /**
276
+ * Validate agent business rules
277
+ * @param {Object} agent - Agent data
278
+ * @param {Object} result - Validation result
279
+ */
280
+ validateAgentBusinessRules(agent, result) {
281
+ // Check agent ID format
282
+ if (agent.id && !/^[a-z0-9-]+$/.test(agent.id)) {
283
+ result.warnings.push('Agent ID should contain only lowercase letters, numbers, and hyphens');
284
+ }
285
+
286
+ // Check priority range
287
+ if (agent.priority !== undefined && (agent.priority < 1 || agent.priority > 100)) {
288
+ result.valid = false;
289
+ result.errors.push('Agent priority must be between 1 and 100');
290
+ }
291
+
292
+ // Check installation methods
293
+ if (agent.installationMethods && Array.isArray(agent.installationMethods)) {
294
+ if (agent.installationMethods.length === 0) {
295
+ result.valid = false;
296
+ result.errors.push('Agent must have at least one installation method');
297
+ }
298
+
299
+ // Check for duplicate priorities
300
+ const priorities = agent.installationMethods.map(m => m.priority).filter(p => p !== undefined);
301
+ const duplicatePriorities = priorities.filter((p, i) => priorities.indexOf(p) !== i);
302
+ if (duplicatePriorities.length > 0) {
303
+ result.valid = false;
304
+ result.errors.push(`Duplicate installation method priorities: ${duplicatePriorities.join(', ')}`);
305
+ }
306
+ }
307
+ }
308
+
309
+ /**
310
+ * Validate installation method business rules
311
+ * @param {Object} method - Installation method data
312
+ * @param {Object} result - Validation result
313
+ */
314
+ validateInstallationMethodBusinessRules(method, result) {
315
+ // Check priority range
316
+ if (method.priority !== undefined && (method.priority < 1 || method.priority > 10)) {
317
+ result.valid = false;
318
+ result.errors.push('Installation method priority must be between 1 and 10');
319
+ }
320
+
321
+ // Validate command template
322
+ if (method.command && typeof method.command === 'string') {
323
+ if (!method.command.includes('{') && !method.command.includes('[')) {
324
+ result.warnings.push('Installation command should contain placeholders for dynamic values');
325
+ }
326
+ }
327
+ }
328
+
329
+ /**
330
+ * Validate verification test business rules
331
+ * @param {Object} test - Verification test data
332
+ * @param {Object} result - Validation result
333
+ */
334
+ validateVerificationTestBusinessRules(test, result) {
335
+ // Check timeout range
336
+ if (test.timeout !== undefined && (test.timeout < 1 || test.timeout > 600)) {
337
+ result.valid = false;
338
+ result.errors.push('Verification test timeout must be between 1 and 600 seconds');
339
+ }
340
+
341
+ // Check test ID format
342
+ if (test.id && !/^[a-z0-9-_]+$/.test(test.id)) {
343
+ result.warnings.push('Test ID should contain only lowercase letters, numbers, hyphens, and underscores');
344
+ }
345
+ }
346
+
347
+ /**
348
+ * Get agent schema
349
+ * @returns {Object} - Agent JSON schema
350
+ */
351
+ getAgentSchema() {
352
+ return {
353
+ type: 'object',
354
+ required: ['id', 'name', 'description', 'enabled', 'type', 'priority', 'installationMethods'],
355
+ properties: {
356
+ id: {
357
+ type: 'string',
358
+ minLength: 1,
359
+ maxLength: 50,
360
+ pattern: '^[a-z0-9-]+$'
361
+ },
362
+ name: {
363
+ type: 'string',
364
+ minLength: 1,
365
+ maxLength: 100
366
+ },
367
+ description: {
368
+ type: 'string',
369
+ minLength: 10,
370
+ maxLength: 500
371
+ },
372
+ enabled: {
373
+ type: 'boolean'
374
+ },
375
+ type: {
376
+ type: 'string',
377
+ enum: ['ai-assistant', 'cli-tool', 'service', 'extension']
378
+ },
379
+ priority: {
380
+ type: 'number',
381
+ minimum: 1,
382
+ maximum: 100
383
+ },
384
+ installationMethods: {
385
+ type: 'array',
386
+ minItems: 1,
387
+ items: { $ref: '#/definitions/installationMethod' }
388
+ },
389
+ verificationCommands: {
390
+ type: 'array',
391
+ items: {
392
+ type: 'string',
393
+ minLength: 1
394
+ }
395
+ },
396
+ verificationTests: {
397
+ type: 'array',
398
+ items: { $ref: '#/definitions/verificationTest' }
399
+ }
400
+ },
401
+ additionalProperties: false
402
+ };
403
+ }
404
+
405
+ /**
406
+ * Get agents configuration schema
407
+ * @returns {Object} - Agents config JSON schema
408
+ */
409
+ getAgentsConfigSchema() {
410
+ return {
411
+ type: 'object',
412
+ required: ['agents'],
413
+ properties: {
414
+ agents: {
415
+ type: 'object',
416
+ patternProperties: {
417
+ '^[a-z0-9-]+$': { $ref: '#/definitions/agent' }
418
+ }
419
+ },
420
+ settings: {
421
+ type: 'object',
422
+ properties: {
423
+ defaultTimeout: { type: 'number', minimum: 30000 },
424
+ maxConcurrentInstallations: { type: 'number', minimum: 1, maximum: 10 },
425
+ retryAttempts: { type: 'number', minimum: 0, maximum: 10 },
426
+ retryDelay: { type: 'number', minimum: 1000, maximum: 60000 },
427
+ logLevel: {
428
+ type: 'string',
429
+ enum: ['error', 'warn', 'info', 'debug']
430
+ }
431
+ }
432
+ }
433
+ }
434
+ };
435
+ }
436
+
437
+ /**
438
+ * Get installation method schema
439
+ * @returns {Object} - Installation method JSON schema
440
+ */
441
+ getInstallationMethodSchema() {
442
+ return {
443
+ type: 'object',
444
+ required: ['type', 'command', 'priority'],
445
+ properties: {
446
+ type: {
447
+ type: 'string',
448
+ enum: ['WINGET', 'NPM', 'POWERSHELL', 'CHOCOLATEY', 'DIRECT']
449
+ },
450
+ command: {
451
+ type: 'string',
452
+ minLength: 1
453
+ },
454
+ packageId: {
455
+ type: ['string', 'null']
456
+ },
457
+ priority: {
458
+ type: 'number',
459
+ minimum: 1,
460
+ maximum: 10
461
+ },
462
+ requirements: {
463
+ type: 'array',
464
+ items: {
465
+ type: 'string'
466
+ }
467
+ },
468
+ verificationCommand: {
469
+ type: 'string',
470
+ minLength: 1
471
+ }
472
+ },
473
+ additionalProperties: false
474
+ };
475
+ }
476
+
477
+ /**
478
+ * Get verification test schema
479
+ * @returns {Object} - Verification test JSON schema
480
+ */
481
+ getVerificationTestSchema() {
482
+ return {
483
+ type: 'object',
484
+ required: ['id', 'type', 'description', 'command', 'timeout'],
485
+ properties: {
486
+ id: {
487
+ type: 'string',
488
+ minLength: 1,
489
+ maxLength: 50,
490
+ pattern: '^[a-z0-9-_]+$'
491
+ },
492
+ type: {
493
+ type: 'string',
494
+ enum: ['FILE_OPERATION', 'API_CALL', 'COMMAND_EXECUTION', 'NETWORK_TEST']
495
+ },
496
+ description: {
497
+ type: 'string',
498
+ minLength: 5,
499
+ maxLength: 200
500
+ },
501
+ command: {
502
+ type: 'string',
503
+ minLength: 1
504
+ },
505
+ expectedResult: {
506
+ type: 'string',
507
+ minLength: 1
508
+ },
509
+ timeout: {
510
+ type: 'number',
511
+ minimum: 1,
512
+ maximum: 600
513
+ }
514
+ },
515
+ additionalProperties: false
516
+ };
517
+ }
518
+
519
+ /**
520
+ * Sanitize data for logging
521
+ * @param {*} data - Data to sanitize
522
+ * @returns {*} - Sanitized data
523
+ */
524
+ sanitizeData(data) {
525
+ if (typeof data !== 'object' || data === null) {
526
+ return data;
527
+ }
528
+
529
+ const sanitized = {};
530
+ for (const [key, value] of Object.entries(data)) {
531
+ if (key.toLowerCase().includes('password') ||
532
+ key.toLowerCase().includes('secret') ||
533
+ key.toLowerCase().includes('token')) {
534
+ sanitized[key] = '[REDACTED]';
535
+ } else {
536
+ sanitized[key] = value;
537
+ }
538
+ }
539
+ return sanitized;
540
+ }
541
+ }
542
+
543
+ module.exports = ConfigurationSchemaValidator;