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