driftdetect-core 0.1.0
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/dist/analyzers/ast-analyzer.d.ts +251 -0
- package/dist/analyzers/ast-analyzer.d.ts.map +1 -0
- package/dist/analyzers/ast-analyzer.js +548 -0
- package/dist/analyzers/ast-analyzer.js.map +1 -0
- package/dist/analyzers/flow-analyzer.d.ts +241 -0
- package/dist/analyzers/flow-analyzer.d.ts.map +1 -0
- package/dist/analyzers/flow-analyzer.js +1219 -0
- package/dist/analyzers/flow-analyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +18 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +19 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/semantic-analyzer.d.ts +252 -0
- package/dist/analyzers/semantic-analyzer.d.ts.map +1 -0
- package/dist/analyzers/semantic-analyzer.js +1182 -0
- package/dist/analyzers/semantic-analyzer.js.map +1 -0
- package/dist/analyzers/type-analyzer.d.ts +289 -0
- package/dist/analyzers/type-analyzer.d.ts.map +1 -0
- package/dist/analyzers/type-analyzer.js +1269 -0
- package/dist/analyzers/type-analyzer.js.map +1 -0
- package/dist/analyzers/types.d.ts +537 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +11 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/config/config-loader.d.ts +166 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +429 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-validator.d.ts +204 -0
- package/dist/config/config-validator.d.ts.map +1 -0
- package/dist/config/config-validator.js +632 -0
- package/dist/config/config-validator.js.map +1 -0
- package/dist/config/defaults.d.ts +8 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +26 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +10 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +47 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +7 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/exporter.d.ts +21 -0
- package/dist/manifest/exporter.d.ts.map +1 -0
- package/dist/manifest/exporter.js +339 -0
- package/dist/manifest/exporter.js.map +1 -0
- package/dist/manifest/index.d.ts +14 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +15 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/manifest-store.d.ts +111 -0
- package/dist/manifest/manifest-store.d.ts.map +1 -0
- package/dist/manifest/manifest-store.js +418 -0
- package/dist/manifest/manifest-store.js.map +1 -0
- package/dist/manifest/types.d.ts +238 -0
- package/dist/manifest/types.d.ts.map +1 -0
- package/dist/manifest/types.js +11 -0
- package/dist/manifest/types.js.map +1 -0
- package/dist/matcher/confidence-scorer.d.ts +188 -0
- package/dist/matcher/confidence-scorer.d.ts.map +1 -0
- package/dist/matcher/confidence-scorer.js +302 -0
- package/dist/matcher/confidence-scorer.js.map +1 -0
- package/dist/matcher/index.d.ts +24 -0
- package/dist/matcher/index.d.ts.map +1 -0
- package/dist/matcher/index.js +26 -0
- package/dist/matcher/index.js.map +1 -0
- package/dist/matcher/outlier-detector.d.ts +252 -0
- package/dist/matcher/outlier-detector.d.ts.map +1 -0
- package/dist/matcher/outlier-detector.js +544 -0
- package/dist/matcher/outlier-detector.js.map +1 -0
- package/dist/matcher/pattern-matcher.d.ts +169 -0
- package/dist/matcher/pattern-matcher.d.ts.map +1 -0
- package/dist/matcher/pattern-matcher.js +692 -0
- package/dist/matcher/pattern-matcher.js.map +1 -0
- package/dist/matcher/types.d.ts +476 -0
- package/dist/matcher/types.d.ts.map +1 -0
- package/dist/matcher/types.js +36 -0
- package/dist/matcher/types.js.map +1 -0
- package/dist/parsers/base-parser.d.ts +282 -0
- package/dist/parsers/base-parser.d.ts.map +1 -0
- package/dist/parsers/base-parser.js +421 -0
- package/dist/parsers/base-parser.js.map +1 -0
- package/dist/parsers/css-parser.d.ts +225 -0
- package/dist/parsers/css-parser.d.ts.map +1 -0
- package/dist/parsers/css-parser.js +477 -0
- package/dist/parsers/css-parser.js.map +1 -0
- package/dist/parsers/index.d.ts +15 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +15 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/json-parser.d.ts +219 -0
- package/dist/parsers/json-parser.d.ts.map +1 -0
- package/dist/parsers/json-parser.js +602 -0
- package/dist/parsers/json-parser.js.map +1 -0
- package/dist/parsers/markdown-parser.d.ts +276 -0
- package/dist/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/parsers/markdown-parser.js +731 -0
- package/dist/parsers/markdown-parser.js.map +1 -0
- package/dist/parsers/parser-manager.d.ts +294 -0
- package/dist/parsers/parser-manager.d.ts.map +1 -0
- package/dist/parsers/parser-manager.js +738 -0
- package/dist/parsers/parser-manager.js.map +1 -0
- package/dist/parsers/python-parser.d.ts +204 -0
- package/dist/parsers/python-parser.d.ts.map +1 -0
- package/dist/parsers/python-parser.js +517 -0
- package/dist/parsers/python-parser.js.map +1 -0
- package/dist/parsers/types.d.ts +43 -0
- package/dist/parsers/types.d.ts.map +1 -0
- package/dist/parsers/types.js +7 -0
- package/dist/parsers/types.js.map +1 -0
- package/dist/parsers/typescript-parser.d.ts +264 -0
- package/dist/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/parsers/typescript-parser.js +658 -0
- package/dist/parsers/typescript-parser.js.map +1 -0
- package/dist/rules/evaluator.d.ts +305 -0
- package/dist/rules/evaluator.d.ts.map +1 -0
- package/dist/rules/evaluator.js +579 -0
- package/dist/rules/evaluator.js.map +1 -0
- package/dist/rules/index.d.ts +13 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +13 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/quick-fix-generator.d.ts +334 -0
- package/dist/rules/quick-fix-generator.d.ts.map +1 -0
- package/dist/rules/quick-fix-generator.js +1075 -0
- package/dist/rules/quick-fix-generator.js.map +1 -0
- package/dist/rules/rule-engine.d.ts +241 -0
- package/dist/rules/rule-engine.d.ts.map +1 -0
- package/dist/rules/rule-engine.js +585 -0
- package/dist/rules/rule-engine.js.map +1 -0
- package/dist/rules/severity-manager.d.ts +394 -0
- package/dist/rules/severity-manager.d.ts.map +1 -0
- package/dist/rules/severity-manager.js +619 -0
- package/dist/rules/severity-manager.js.map +1 -0
- package/dist/rules/types.d.ts +370 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +133 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/variant-manager.d.ts +388 -0
- package/dist/rules/variant-manager.d.ts.map +1 -0
- package/dist/rules/variant-manager.js +777 -0
- package/dist/rules/variant-manager.js.map +1 -0
- package/dist/scanner/change-detector.d.ts +164 -0
- package/dist/scanner/change-detector.d.ts.map +1 -0
- package/dist/scanner/change-detector.js +263 -0
- package/dist/scanner/change-detector.js.map +1 -0
- package/dist/scanner/dependency-graph.d.ts +270 -0
- package/dist/scanner/dependency-graph.d.ts.map +1 -0
- package/dist/scanner/dependency-graph.js +436 -0
- package/dist/scanner/dependency-graph.js.map +1 -0
- package/dist/scanner/file-walker.d.ts +127 -0
- package/dist/scanner/file-walker.d.ts.map +1 -0
- package/dist/scanner/file-walker.js +526 -0
- package/dist/scanner/file-walker.js.map +1 -0
- package/dist/scanner/index.d.ts +12 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +12 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/types.d.ts +218 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +10 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/scanner/worker-pool.d.ts +317 -0
- package/dist/scanner/worker-pool.d.ts.map +1 -0
- package/dist/scanner/worker-pool.js +571 -0
- package/dist/scanner/worker-pool.js.map +1 -0
- package/dist/store/cache-manager.d.ts +179 -0
- package/dist/store/cache-manager.d.ts.map +1 -0
- package/dist/store/cache-manager.js +391 -0
- package/dist/store/cache-manager.js.map +1 -0
- package/dist/store/history-store.d.ts +314 -0
- package/dist/store/history-store.d.ts.map +1 -0
- package/dist/store/history-store.js +707 -0
- package/dist/store/history-store.js.map +1 -0
- package/dist/store/index.d.ts +20 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +26 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/lock-file-manager.d.ts +202 -0
- package/dist/store/lock-file-manager.d.ts.map +1 -0
- package/dist/store/lock-file-manager.js +475 -0
- package/dist/store/lock-file-manager.js.map +1 -0
- package/dist/store/pattern-store.d.ts +289 -0
- package/dist/store/pattern-store.d.ts.map +1 -0
- package/dist/store/pattern-store.js +936 -0
- package/dist/store/pattern-store.js.map +1 -0
- package/dist/store/schema-validator.d.ts +159 -0
- package/dist/store/schema-validator.d.ts.map +1 -0
- package/dist/store/schema-validator.js +1096 -0
- package/dist/store/schema-validator.js.map +1 -0
- package/dist/store/types.d.ts +585 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +82 -0
- package/dist/store/types.js.map +1 -0
- package/dist/types/analysis.d.ts +19 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +5 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/common.d.ts +7 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +5 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/patterns.d.ts +40 -0
- package/dist/types/patterns.d.ts.map +1 -0
- package/dist/types/patterns.js +7 -0
- package/dist/types/patterns.js.map +1 -0
- package/dist/types/violations.d.ts +7 -0
- package/dist/types/violations.d.ts.map +1 -0
- package/dist/types/violations.js +7 -0
- package/dist/types/violations.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule Engine - Pattern evaluation and violation generation
|
|
3
|
+
*
|
|
4
|
+
* Evaluates patterns against code/AST and generates Violation objects
|
|
5
|
+
* when patterns are violated. Integrates with the PatternMatcher for
|
|
6
|
+
* pattern matching and SeverityManager for severity handling.
|
|
7
|
+
*
|
|
8
|
+
* @requirements 24.1 - THE Enforcement_System SHALL support severity levels: error, warning, info, hint
|
|
9
|
+
*/
|
|
10
|
+
import { PatternMatcher } from '../matcher/pattern-matcher.js';
|
|
11
|
+
import { SeverityManager } from './severity-manager.js';
|
|
12
|
+
import { createRangeFromCoords } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Default RuleEngine configuration
|
|
15
|
+
*/
|
|
16
|
+
export const DEFAULT_RULE_ENGINE_CONFIG = {
|
|
17
|
+
severityConfig: {},
|
|
18
|
+
matcherOptions: {},
|
|
19
|
+
generateQuickFixes: true,
|
|
20
|
+
aiExplainAvailable: false,
|
|
21
|
+
aiFixAvailable: false,
|
|
22
|
+
maxViolationsPerFile: 100,
|
|
23
|
+
maxViolationsPerPattern: 50,
|
|
24
|
+
trackOccurrences: true,
|
|
25
|
+
projectRoot: '.',
|
|
26
|
+
};
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Rule Engine Class
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* RuleEngine class for evaluating patterns against code and generating violations.
|
|
32
|
+
*
|
|
33
|
+
* The rule engine:
|
|
34
|
+
* - Takes patterns and code/AST as input
|
|
35
|
+
* - Evaluates patterns against the code using PatternMatcher
|
|
36
|
+
* - Generates Violation objects when patterns are violated
|
|
37
|
+
* - Uses SeverityManager for severity handling
|
|
38
|
+
*
|
|
39
|
+
* @requirements 24.1 - Enforcement system with severity levels
|
|
40
|
+
*/
|
|
41
|
+
export class RuleEngine {
|
|
42
|
+
config;
|
|
43
|
+
patternMatcher;
|
|
44
|
+
severityManager;
|
|
45
|
+
violationTracker;
|
|
46
|
+
violationIdCounter;
|
|
47
|
+
/**
|
|
48
|
+
* Create a new RuleEngine instance.
|
|
49
|
+
*
|
|
50
|
+
* @param config - Optional configuration options
|
|
51
|
+
*/
|
|
52
|
+
constructor(config) {
|
|
53
|
+
this.config = {
|
|
54
|
+
...DEFAULT_RULE_ENGINE_CONFIG,
|
|
55
|
+
...config,
|
|
56
|
+
};
|
|
57
|
+
this.patternMatcher = new PatternMatcher();
|
|
58
|
+
this.severityManager = new SeverityManager(this.config.severityConfig);
|
|
59
|
+
this.violationTracker = this.createViolationTracker();
|
|
60
|
+
this.violationIdCounter = 0;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create a new violation tracker.
|
|
64
|
+
*/
|
|
65
|
+
createViolationTracker() {
|
|
66
|
+
return {
|
|
67
|
+
byPattern: new Map(),
|
|
68
|
+
byFile: new Map(),
|
|
69
|
+
firstSeen: new Map(),
|
|
70
|
+
occurrences: new Map(),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Evaluate a single pattern against code.
|
|
75
|
+
*
|
|
76
|
+
* @param input - The evaluation input (file, content, AST)
|
|
77
|
+
* @param patternWithContext - The pattern to evaluate with context
|
|
78
|
+
* @returns Rule evaluation result with violations
|
|
79
|
+
*/
|
|
80
|
+
evaluate(input, patternWithContext) {
|
|
81
|
+
const startTime = Date.now();
|
|
82
|
+
const violations = [];
|
|
83
|
+
const errors = [];
|
|
84
|
+
const { pattern, expected, definition } = patternWithContext;
|
|
85
|
+
try {
|
|
86
|
+
// Create matcher context
|
|
87
|
+
const context = this.createMatcherContext(input);
|
|
88
|
+
// Get pattern definition for matching
|
|
89
|
+
const patternDef = definition || this.patternToDefinition(pattern);
|
|
90
|
+
// Check if this file should be evaluated for this pattern
|
|
91
|
+
if (!this.shouldEvaluateFile(input.file, pattern)) {
|
|
92
|
+
return {
|
|
93
|
+
ruleId: pattern.id,
|
|
94
|
+
file: input.file,
|
|
95
|
+
passed: true,
|
|
96
|
+
violations: [],
|
|
97
|
+
duration: Date.now() - startTime,
|
|
98
|
+
errors: [],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Match pattern against code
|
|
102
|
+
const matches = this.patternMatcher.match(context, patternDef, this.config.matcherOptions);
|
|
103
|
+
// Find violations (outliers or missing expected patterns)
|
|
104
|
+
const foundViolations = this.findViolations(input, pattern, matches, expected);
|
|
105
|
+
// Apply violation limits
|
|
106
|
+
const limitedViolations = this.applyViolationLimits(foundViolations, pattern.id, input.file);
|
|
107
|
+
violations.push(...limitedViolations);
|
|
108
|
+
// Record violations for escalation tracking
|
|
109
|
+
if (this.config.trackOccurrences) {
|
|
110
|
+
for (const _violation of violations) {
|
|
111
|
+
this.severityManager.recordViolation(pattern.id, pattern.category);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
errors.push({
|
|
117
|
+
message: error instanceof Error ? error.message : String(error),
|
|
118
|
+
code: 'EVALUATION_ERROR',
|
|
119
|
+
recoverable: true,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
ruleId: pattern.id,
|
|
124
|
+
file: input.file,
|
|
125
|
+
passed: violations.length === 0,
|
|
126
|
+
violations,
|
|
127
|
+
duration: Date.now() - startTime,
|
|
128
|
+
errors,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Evaluate multiple patterns against code.
|
|
133
|
+
*
|
|
134
|
+
* @param input - The evaluation input (file, content, AST)
|
|
135
|
+
* @param patterns - Array of patterns to evaluate
|
|
136
|
+
* @returns Array of rule evaluation results
|
|
137
|
+
*/
|
|
138
|
+
evaluateAll(input, patterns) {
|
|
139
|
+
const results = [];
|
|
140
|
+
for (const patternWithContext of patterns) {
|
|
141
|
+
const result = this.evaluate(input, patternWithContext);
|
|
142
|
+
results.push(result);
|
|
143
|
+
}
|
|
144
|
+
return results;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Evaluate patterns against multiple files.
|
|
148
|
+
*
|
|
149
|
+
* @param inputs - Array of evaluation inputs
|
|
150
|
+
* @param patterns - Array of patterns to evaluate
|
|
151
|
+
* @returns Summary of all evaluations
|
|
152
|
+
*/
|
|
153
|
+
evaluateFiles(inputs, patterns) {
|
|
154
|
+
const startTime = Date.now();
|
|
155
|
+
const allResults = [];
|
|
156
|
+
const filesEvaluated = [];
|
|
157
|
+
for (const input of inputs) {
|
|
158
|
+
filesEvaluated.push(input.file);
|
|
159
|
+
const results = this.evaluateAll(input, patterns);
|
|
160
|
+
allResults.push(...results);
|
|
161
|
+
}
|
|
162
|
+
return this.summarizeResults(allResults, filesEvaluated, startTime);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get all violations from evaluation results.
|
|
166
|
+
*
|
|
167
|
+
* @param results - Array of rule evaluation results
|
|
168
|
+
* @returns All violations sorted by severity
|
|
169
|
+
*/
|
|
170
|
+
getViolations(results) {
|
|
171
|
+
const violations = [];
|
|
172
|
+
for (const result of results) {
|
|
173
|
+
violations.push(...result.violations);
|
|
174
|
+
}
|
|
175
|
+
return this.severityManager.sortBySeverity(violations);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get blocking violations from evaluation results.
|
|
179
|
+
*
|
|
180
|
+
* @param results - Array of rule evaluation results
|
|
181
|
+
* @returns Violations that block commits/merges
|
|
182
|
+
*/
|
|
183
|
+
getBlockingViolations(results) {
|
|
184
|
+
const violations = this.getViolations(results);
|
|
185
|
+
return violations.filter((v) => this.severityManager.isBlocking(v.severity));
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check if any violations are blocking.
|
|
189
|
+
*
|
|
190
|
+
* @param results - Array of rule evaluation results
|
|
191
|
+
* @returns True if any violation blocks commits/merges
|
|
192
|
+
*/
|
|
193
|
+
hasBlockingViolations(results) {
|
|
194
|
+
const violations = this.getViolations(results);
|
|
195
|
+
return this.severityManager.hasBlockingViolations(violations);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get the severity manager instance.
|
|
199
|
+
*
|
|
200
|
+
* @returns The severity manager
|
|
201
|
+
*/
|
|
202
|
+
getSeverityManager() {
|
|
203
|
+
return this.severityManager;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Reset the rule engine state.
|
|
207
|
+
*/
|
|
208
|
+
reset() {
|
|
209
|
+
this.violationTracker = this.createViolationTracker();
|
|
210
|
+
this.violationIdCounter = 0;
|
|
211
|
+
this.severityManager.resetViolationCounts();
|
|
212
|
+
this.patternMatcher.clearCache();
|
|
213
|
+
}
|
|
214
|
+
// ============================================================================
|
|
215
|
+
// Private Methods - Context Creation
|
|
216
|
+
// ============================================================================
|
|
217
|
+
/**
|
|
218
|
+
* Create a matcher context from evaluation input.
|
|
219
|
+
*/
|
|
220
|
+
createMatcherContext(input) {
|
|
221
|
+
return {
|
|
222
|
+
file: input.file,
|
|
223
|
+
content: input.content,
|
|
224
|
+
ast: input.ast,
|
|
225
|
+
language: input.language,
|
|
226
|
+
projectRoot: this.config.projectRoot,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Convert a Pattern to a PatternDefinition for matching.
|
|
231
|
+
*/
|
|
232
|
+
patternToDefinition(pattern) {
|
|
233
|
+
// Build the base definition
|
|
234
|
+
const definition = {
|
|
235
|
+
id: pattern.id,
|
|
236
|
+
name: pattern.name,
|
|
237
|
+
description: pattern.description,
|
|
238
|
+
category: pattern.category,
|
|
239
|
+
subcategory: pattern.subcategory,
|
|
240
|
+
matchType: pattern.detector.type === 'custom' ? 'custom' : pattern.detector.type,
|
|
241
|
+
enabled: true,
|
|
242
|
+
};
|
|
243
|
+
// Add AST config if present
|
|
244
|
+
if (pattern.detector.ast) {
|
|
245
|
+
definition.astConfig = pattern.detector.ast;
|
|
246
|
+
}
|
|
247
|
+
// Add regex config if present with all required fields
|
|
248
|
+
if (pattern.detector.regex) {
|
|
249
|
+
const regexConfig = {
|
|
250
|
+
pattern: pattern.detector.regex.pattern,
|
|
251
|
+
};
|
|
252
|
+
if (pattern.detector.regex.flags) {
|
|
253
|
+
regexConfig.flags = pattern.detector.regex.flags;
|
|
254
|
+
}
|
|
255
|
+
if (pattern.detector.regex.captureGroups) {
|
|
256
|
+
regexConfig.captureGroups = pattern.detector.regex.captureGroups;
|
|
257
|
+
}
|
|
258
|
+
definition.regexConfig = regexConfig;
|
|
259
|
+
}
|
|
260
|
+
// Add structural config if present with all required fields
|
|
261
|
+
if (pattern.detector.structural) {
|
|
262
|
+
const structuralConfig = {};
|
|
263
|
+
if (pattern.detector.structural.pathPattern) {
|
|
264
|
+
structuralConfig.pathPattern = pattern.detector.structural.pathPattern;
|
|
265
|
+
}
|
|
266
|
+
if (pattern.detector.structural.directoryPattern) {
|
|
267
|
+
structuralConfig.directoryPattern = pattern.detector.structural.directoryPattern;
|
|
268
|
+
}
|
|
269
|
+
if (pattern.detector.structural.namingPattern) {
|
|
270
|
+
structuralConfig.namingPattern = pattern.detector.structural.namingPattern;
|
|
271
|
+
}
|
|
272
|
+
if (pattern.detector.structural.requiredSiblings) {
|
|
273
|
+
structuralConfig.requiredSiblings = pattern.detector.structural.requiredSiblings;
|
|
274
|
+
}
|
|
275
|
+
definition.structuralConfig = structuralConfig;
|
|
276
|
+
}
|
|
277
|
+
// Add metadata if present
|
|
278
|
+
if (pattern.metadata.firstSeen || pattern.metadata.lastSeen || pattern.metadata.tags) {
|
|
279
|
+
const metadata = {};
|
|
280
|
+
if (pattern.metadata.firstSeen) {
|
|
281
|
+
metadata.firstSeen = new Date(pattern.metadata.firstSeen);
|
|
282
|
+
}
|
|
283
|
+
if (pattern.metadata.lastSeen) {
|
|
284
|
+
metadata.lastSeen = new Date(pattern.metadata.lastSeen);
|
|
285
|
+
}
|
|
286
|
+
if (pattern.metadata.tags) {
|
|
287
|
+
metadata.tags = pattern.metadata.tags;
|
|
288
|
+
}
|
|
289
|
+
definition.metadata = metadata;
|
|
290
|
+
}
|
|
291
|
+
return definition;
|
|
292
|
+
}
|
|
293
|
+
// ============================================================================
|
|
294
|
+
// Private Methods - Violation Detection
|
|
295
|
+
// ============================================================================
|
|
296
|
+
/**
|
|
297
|
+
* Check if a file should be evaluated for a pattern.
|
|
298
|
+
*/
|
|
299
|
+
shouldEvaluateFile(_file, _pattern) {
|
|
300
|
+
// Check if file is in pattern locations or could potentially match
|
|
301
|
+
// For now, evaluate all files - more sophisticated filtering can be added
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Find violations based on pattern matches.
|
|
306
|
+
*/
|
|
307
|
+
findViolations(input, pattern, matches, expected) {
|
|
308
|
+
const violations = [];
|
|
309
|
+
// Check for outliers in matches
|
|
310
|
+
for (const match of matches) {
|
|
311
|
+
if (match.isOutlier) {
|
|
312
|
+
const violation = this.createViolationFromOutlier(input, pattern, match, expected);
|
|
313
|
+
violations.push(violation);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Check for missing expected patterns
|
|
317
|
+
if (this.shouldHavePattern(input, pattern) && matches.length === 0) {
|
|
318
|
+
const violation = this.createMissingPatternViolation(input, pattern, expected);
|
|
319
|
+
violations.push(violation);
|
|
320
|
+
}
|
|
321
|
+
// Check pattern locations for violations
|
|
322
|
+
const locationViolations = this.checkPatternLocations(input, pattern, matches);
|
|
323
|
+
violations.push(...locationViolations);
|
|
324
|
+
return violations;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Check if a file should have a pattern.
|
|
328
|
+
*/
|
|
329
|
+
shouldHavePattern(input, pattern) {
|
|
330
|
+
// Check if file matches pattern's expected locations
|
|
331
|
+
const hasLocationInFile = pattern.locations.some((loc) => loc.file === input.file);
|
|
332
|
+
// If pattern has locations in this file, it should match
|
|
333
|
+
return hasLocationInFile;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Check pattern locations for violations.
|
|
337
|
+
*/
|
|
338
|
+
checkPatternLocations(input, pattern, _matches) {
|
|
339
|
+
const violations = [];
|
|
340
|
+
// Get outlier locations in this file
|
|
341
|
+
const outlierLocations = pattern.outliers.filter((loc) => loc.file === input.file);
|
|
342
|
+
// Create violations for outlier locations
|
|
343
|
+
for (const outlier of outlierLocations) {
|
|
344
|
+
const violation = this.createViolationFromOutlierLocation(input, pattern, outlier);
|
|
345
|
+
violations.push(violation);
|
|
346
|
+
}
|
|
347
|
+
return violations;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Create a violation from an outlier match.
|
|
351
|
+
*/
|
|
352
|
+
createViolationFromOutlier(input, pattern, match, expected) {
|
|
353
|
+
const severity = this.severityManager.getEffectiveSeverityWithEscalation(pattern.id, pattern.category);
|
|
354
|
+
const range = this.locationToRange(match.location);
|
|
355
|
+
const violationKey = this.getViolationKey(pattern.id, input.file, range);
|
|
356
|
+
const violationInput = {
|
|
357
|
+
patternId: pattern.id,
|
|
358
|
+
severity,
|
|
359
|
+
file: input.file,
|
|
360
|
+
range,
|
|
361
|
+
message: this.generateViolationMessage(pattern, match),
|
|
362
|
+
expected: expected || this.getExpectedFromPattern(pattern),
|
|
363
|
+
actual: match.matchedText || 'Code deviates from pattern',
|
|
364
|
+
};
|
|
365
|
+
if (match.outlierReason) {
|
|
366
|
+
violationInput.explanation = match.outlierReason;
|
|
367
|
+
}
|
|
368
|
+
return this.createViolation(violationInput, violationKey);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Create a violation for a missing pattern.
|
|
372
|
+
*/
|
|
373
|
+
createMissingPatternViolation(input, pattern, expected) {
|
|
374
|
+
const severity = this.severityManager.getEffectiveSeverityWithEscalation(pattern.id, pattern.category);
|
|
375
|
+
// Find the expected location in this file
|
|
376
|
+
const expectedLocation = pattern.locations.find((loc) => loc.file === input.file);
|
|
377
|
+
const range = expectedLocation
|
|
378
|
+
? this.patternLocationToRange(expectedLocation)
|
|
379
|
+
: createRangeFromCoords(0, 0, 0, 0);
|
|
380
|
+
const violationKey = this.getViolationKey(pattern.id, input.file, range);
|
|
381
|
+
return this.createViolation({
|
|
382
|
+
patternId: pattern.id,
|
|
383
|
+
severity,
|
|
384
|
+
file: input.file,
|
|
385
|
+
range,
|
|
386
|
+
message: `Missing expected pattern: ${pattern.name}`,
|
|
387
|
+
explanation: `Expected to find pattern "${pattern.name}" but it was not detected.`,
|
|
388
|
+
expected: expected || this.getExpectedFromPattern(pattern),
|
|
389
|
+
actual: 'Pattern not found',
|
|
390
|
+
}, violationKey);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Create a violation from an outlier location.
|
|
394
|
+
*/
|
|
395
|
+
createViolationFromOutlierLocation(input, pattern, outlier) {
|
|
396
|
+
const severity = this.severityManager.getEffectiveSeverityWithEscalation(pattern.id, pattern.category);
|
|
397
|
+
const range = createRangeFromCoords(outlier.line - 1, // Convert to 0-indexed
|
|
398
|
+
outlier.column - 1, (outlier.endLine || outlier.line) - 1, (outlier.endColumn || outlier.column) - 1);
|
|
399
|
+
const violationKey = this.getViolationKey(pattern.id, input.file, range);
|
|
400
|
+
return this.createViolation({
|
|
401
|
+
patternId: pattern.id,
|
|
402
|
+
severity,
|
|
403
|
+
file: input.file,
|
|
404
|
+
range,
|
|
405
|
+
message: `Pattern violation: ${pattern.name}`,
|
|
406
|
+
explanation: outlier.reason,
|
|
407
|
+
expected: this.getExpectedFromPattern(pattern),
|
|
408
|
+
actual: `Code at line ${outlier.line} deviates from pattern`,
|
|
409
|
+
}, violationKey);
|
|
410
|
+
}
|
|
411
|
+
// ============================================================================
|
|
412
|
+
// Private Methods - Violation Creation
|
|
413
|
+
// ============================================================================
|
|
414
|
+
/**
|
|
415
|
+
* Create a violation with tracking.
|
|
416
|
+
*/
|
|
417
|
+
createViolation(input, violationKey) {
|
|
418
|
+
const id = this.generateViolationId();
|
|
419
|
+
// Track first seen and occurrences
|
|
420
|
+
let firstSeen = this.violationTracker.firstSeen.get(violationKey);
|
|
421
|
+
if (!firstSeen) {
|
|
422
|
+
firstSeen = new Date();
|
|
423
|
+
this.violationTracker.firstSeen.set(violationKey, firstSeen);
|
|
424
|
+
}
|
|
425
|
+
const occurrences = (this.violationTracker.occurrences.get(violationKey) || 0) + 1;
|
|
426
|
+
this.violationTracker.occurrences.set(violationKey, occurrences);
|
|
427
|
+
const violation = {
|
|
428
|
+
id,
|
|
429
|
+
patternId: input.patternId,
|
|
430
|
+
severity: input.severity,
|
|
431
|
+
file: input.file,
|
|
432
|
+
range: input.range,
|
|
433
|
+
message: input.message,
|
|
434
|
+
expected: input.expected,
|
|
435
|
+
actual: input.actual,
|
|
436
|
+
aiExplainAvailable: this.config.aiExplainAvailable,
|
|
437
|
+
aiFixAvailable: this.config.aiFixAvailable,
|
|
438
|
+
firstSeen,
|
|
439
|
+
occurrences,
|
|
440
|
+
};
|
|
441
|
+
// Add optional properties only if they are defined
|
|
442
|
+
if (input.explanation !== undefined) {
|
|
443
|
+
violation.explanation = input.explanation;
|
|
444
|
+
}
|
|
445
|
+
if (input.quickFix !== undefined) {
|
|
446
|
+
violation.quickFix = input.quickFix;
|
|
447
|
+
}
|
|
448
|
+
return violation;
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Generate a unique violation ID.
|
|
452
|
+
*/
|
|
453
|
+
generateViolationId() {
|
|
454
|
+
this.violationIdCounter++;
|
|
455
|
+
return `violation-${Date.now()}-${this.violationIdCounter}`;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Generate a violation key for deduplication.
|
|
459
|
+
*/
|
|
460
|
+
getViolationKey(patternId, file, range) {
|
|
461
|
+
return `${patternId}:${file}:${range.start.line}:${range.start.character}`;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Generate a violation message from pattern and match.
|
|
465
|
+
*/
|
|
466
|
+
generateViolationMessage(pattern, match) {
|
|
467
|
+
if (match.outlierReason) {
|
|
468
|
+
return `${pattern.name}: ${match.outlierReason}`;
|
|
469
|
+
}
|
|
470
|
+
return `Code deviates from pattern: ${pattern.name}`;
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Get expected code/structure from pattern.
|
|
474
|
+
*/
|
|
475
|
+
getExpectedFromPattern(pattern) {
|
|
476
|
+
return pattern.description || `Follow the ${pattern.name} pattern`;
|
|
477
|
+
}
|
|
478
|
+
// ============================================================================
|
|
479
|
+
// Private Methods - Location Conversion
|
|
480
|
+
// ============================================================================
|
|
481
|
+
/**
|
|
482
|
+
* Convert a Location to a Range.
|
|
483
|
+
*/
|
|
484
|
+
locationToRange(location) {
|
|
485
|
+
return createRangeFromCoords(location.line - 1, // Convert to 0-indexed
|
|
486
|
+
location.column - 1, (location.endLine || location.line) - 1, (location.endColumn || location.column) - 1);
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Convert a PatternLocation to a Range.
|
|
490
|
+
*/
|
|
491
|
+
patternLocationToRange(location) {
|
|
492
|
+
return createRangeFromCoords(location.line - 1, // Convert to 0-indexed
|
|
493
|
+
location.column - 1, (location.endLine || location.line) - 1, (location.endColumn || location.column) - 1);
|
|
494
|
+
}
|
|
495
|
+
// ============================================================================
|
|
496
|
+
// Private Methods - Violation Limits
|
|
497
|
+
// ============================================================================
|
|
498
|
+
/**
|
|
499
|
+
* Apply violation limits per file and pattern.
|
|
500
|
+
*/
|
|
501
|
+
applyViolationLimits(violations, patternId, file) {
|
|
502
|
+
// Get current counts
|
|
503
|
+
const patternCount = this.violationTracker.byPattern.get(patternId) || 0;
|
|
504
|
+
const fileCount = this.violationTracker.byFile.get(file) || 0;
|
|
505
|
+
// Calculate remaining capacity
|
|
506
|
+
const patternRemaining = this.config.maxViolationsPerPattern - patternCount;
|
|
507
|
+
const fileRemaining = this.config.maxViolationsPerFile - fileCount;
|
|
508
|
+
const maxToAdd = Math.min(patternRemaining, fileRemaining, violations.length);
|
|
509
|
+
if (maxToAdd <= 0) {
|
|
510
|
+
return [];
|
|
511
|
+
}
|
|
512
|
+
// Take only up to the limit
|
|
513
|
+
const limited = violations.slice(0, maxToAdd);
|
|
514
|
+
// Update counts
|
|
515
|
+
this.violationTracker.byPattern.set(patternId, patternCount + limited.length);
|
|
516
|
+
this.violationTracker.byFile.set(file, fileCount + limited.length);
|
|
517
|
+
return limited;
|
|
518
|
+
}
|
|
519
|
+
// ============================================================================
|
|
520
|
+
// Private Methods - Result Summarization
|
|
521
|
+
// ============================================================================
|
|
522
|
+
/**
|
|
523
|
+
* Summarize evaluation results.
|
|
524
|
+
*/
|
|
525
|
+
summarizeResults(results, filesEvaluated, startTime) {
|
|
526
|
+
const violations = this.getViolations(results);
|
|
527
|
+
const violationsBySeverity = this.severityManager.groupBySeverity(violations);
|
|
528
|
+
let rulesPassed = 0;
|
|
529
|
+
let rulesFailed = 0;
|
|
530
|
+
for (const result of results) {
|
|
531
|
+
if (result.passed) {
|
|
532
|
+
rulesPassed++;
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
rulesFailed++;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
return {
|
|
539
|
+
rulesEvaluated: results.length,
|
|
540
|
+
rulesPassed,
|
|
541
|
+
rulesFailed,
|
|
542
|
+
totalViolations: violations.length,
|
|
543
|
+
violationsBySeverity: {
|
|
544
|
+
error: violationsBySeverity.error.length,
|
|
545
|
+
warning: violationsBySeverity.warning.length,
|
|
546
|
+
info: violationsBySeverity.info.length,
|
|
547
|
+
hint: violationsBySeverity.hint.length,
|
|
548
|
+
},
|
|
549
|
+
totalDuration: Date.now() - startTime,
|
|
550
|
+
filesEvaluated,
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
// ============================================================================
|
|
555
|
+
// Factory Functions
|
|
556
|
+
// ============================================================================
|
|
557
|
+
/**
|
|
558
|
+
* Create a RuleEngine with default configuration.
|
|
559
|
+
*
|
|
560
|
+
* @returns New RuleEngine instance
|
|
561
|
+
*/
|
|
562
|
+
export function createRuleEngine() {
|
|
563
|
+
return new RuleEngine();
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Create a RuleEngine with custom configuration.
|
|
567
|
+
*
|
|
568
|
+
* @param config - Configuration options
|
|
569
|
+
* @returns New RuleEngine instance
|
|
570
|
+
*/
|
|
571
|
+
export function createRuleEngineWithConfig(config) {
|
|
572
|
+
return new RuleEngine(config);
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Create a RuleEngine with AI features enabled.
|
|
576
|
+
*
|
|
577
|
+
* @returns New RuleEngine instance with AI features
|
|
578
|
+
*/
|
|
579
|
+
export function createRuleEngineWithAI() {
|
|
580
|
+
return new RuleEngine({
|
|
581
|
+
aiExplainAvailable: true,
|
|
582
|
+
aiFixAvailable: true,
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
//# sourceMappingURL=rule-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../../src/rules/rule-engine.ts"],"names":[],"mappings":"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"}
|