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.
Files changed (221) hide show
  1. package/dist/analyzers/ast-analyzer.d.ts +251 -0
  2. package/dist/analyzers/ast-analyzer.d.ts.map +1 -0
  3. package/dist/analyzers/ast-analyzer.js +548 -0
  4. package/dist/analyzers/ast-analyzer.js.map +1 -0
  5. package/dist/analyzers/flow-analyzer.d.ts +241 -0
  6. package/dist/analyzers/flow-analyzer.d.ts.map +1 -0
  7. package/dist/analyzers/flow-analyzer.js +1219 -0
  8. package/dist/analyzers/flow-analyzer.js.map +1 -0
  9. package/dist/analyzers/index.d.ts +18 -0
  10. package/dist/analyzers/index.d.ts.map +1 -0
  11. package/dist/analyzers/index.js +19 -0
  12. package/dist/analyzers/index.js.map +1 -0
  13. package/dist/analyzers/semantic-analyzer.d.ts +252 -0
  14. package/dist/analyzers/semantic-analyzer.d.ts.map +1 -0
  15. package/dist/analyzers/semantic-analyzer.js +1182 -0
  16. package/dist/analyzers/semantic-analyzer.js.map +1 -0
  17. package/dist/analyzers/type-analyzer.d.ts +289 -0
  18. package/dist/analyzers/type-analyzer.d.ts.map +1 -0
  19. package/dist/analyzers/type-analyzer.js +1269 -0
  20. package/dist/analyzers/type-analyzer.js.map +1 -0
  21. package/dist/analyzers/types.d.ts +537 -0
  22. package/dist/analyzers/types.d.ts.map +1 -0
  23. package/dist/analyzers/types.js +11 -0
  24. package/dist/analyzers/types.js.map +1 -0
  25. package/dist/config/config-loader.d.ts +166 -0
  26. package/dist/config/config-loader.d.ts.map +1 -0
  27. package/dist/config/config-loader.js +429 -0
  28. package/dist/config/config-loader.js.map +1 -0
  29. package/dist/config/config-validator.d.ts +204 -0
  30. package/dist/config/config-validator.d.ts.map +1 -0
  31. package/dist/config/config-validator.js +632 -0
  32. package/dist/config/config-validator.js.map +1 -0
  33. package/dist/config/defaults.d.ts +8 -0
  34. package/dist/config/defaults.d.ts.map +1 -0
  35. package/dist/config/defaults.js +26 -0
  36. package/dist/config/defaults.js.map +1 -0
  37. package/dist/config/index.d.ts +10 -0
  38. package/dist/config/index.d.ts.map +1 -0
  39. package/dist/config/index.js +10 -0
  40. package/dist/config/index.js.map +1 -0
  41. package/dist/config/types.d.ts +47 -0
  42. package/dist/config/types.d.ts.map +1 -0
  43. package/dist/config/types.js +7 -0
  44. package/dist/config/types.js.map +1 -0
  45. package/dist/index.d.ts +37 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +39 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/manifest/exporter.d.ts +21 -0
  50. package/dist/manifest/exporter.d.ts.map +1 -0
  51. package/dist/manifest/exporter.js +339 -0
  52. package/dist/manifest/exporter.js.map +1 -0
  53. package/dist/manifest/index.d.ts +14 -0
  54. package/dist/manifest/index.d.ts.map +1 -0
  55. package/dist/manifest/index.js +15 -0
  56. package/dist/manifest/index.js.map +1 -0
  57. package/dist/manifest/manifest-store.d.ts +111 -0
  58. package/dist/manifest/manifest-store.d.ts.map +1 -0
  59. package/dist/manifest/manifest-store.js +418 -0
  60. package/dist/manifest/manifest-store.js.map +1 -0
  61. package/dist/manifest/types.d.ts +238 -0
  62. package/dist/manifest/types.d.ts.map +1 -0
  63. package/dist/manifest/types.js +11 -0
  64. package/dist/manifest/types.js.map +1 -0
  65. package/dist/matcher/confidence-scorer.d.ts +188 -0
  66. package/dist/matcher/confidence-scorer.d.ts.map +1 -0
  67. package/dist/matcher/confidence-scorer.js +302 -0
  68. package/dist/matcher/confidence-scorer.js.map +1 -0
  69. package/dist/matcher/index.d.ts +24 -0
  70. package/dist/matcher/index.d.ts.map +1 -0
  71. package/dist/matcher/index.js +26 -0
  72. package/dist/matcher/index.js.map +1 -0
  73. package/dist/matcher/outlier-detector.d.ts +252 -0
  74. package/dist/matcher/outlier-detector.d.ts.map +1 -0
  75. package/dist/matcher/outlier-detector.js +544 -0
  76. package/dist/matcher/outlier-detector.js.map +1 -0
  77. package/dist/matcher/pattern-matcher.d.ts +169 -0
  78. package/dist/matcher/pattern-matcher.d.ts.map +1 -0
  79. package/dist/matcher/pattern-matcher.js +692 -0
  80. package/dist/matcher/pattern-matcher.js.map +1 -0
  81. package/dist/matcher/types.d.ts +476 -0
  82. package/dist/matcher/types.d.ts.map +1 -0
  83. package/dist/matcher/types.js +36 -0
  84. package/dist/matcher/types.js.map +1 -0
  85. package/dist/parsers/base-parser.d.ts +282 -0
  86. package/dist/parsers/base-parser.d.ts.map +1 -0
  87. package/dist/parsers/base-parser.js +421 -0
  88. package/dist/parsers/base-parser.js.map +1 -0
  89. package/dist/parsers/css-parser.d.ts +225 -0
  90. package/dist/parsers/css-parser.d.ts.map +1 -0
  91. package/dist/parsers/css-parser.js +477 -0
  92. package/dist/parsers/css-parser.js.map +1 -0
  93. package/dist/parsers/index.d.ts +15 -0
  94. package/dist/parsers/index.d.ts.map +1 -0
  95. package/dist/parsers/index.js +15 -0
  96. package/dist/parsers/index.js.map +1 -0
  97. package/dist/parsers/json-parser.d.ts +219 -0
  98. package/dist/parsers/json-parser.d.ts.map +1 -0
  99. package/dist/parsers/json-parser.js +602 -0
  100. package/dist/parsers/json-parser.js.map +1 -0
  101. package/dist/parsers/markdown-parser.d.ts +276 -0
  102. package/dist/parsers/markdown-parser.d.ts.map +1 -0
  103. package/dist/parsers/markdown-parser.js +731 -0
  104. package/dist/parsers/markdown-parser.js.map +1 -0
  105. package/dist/parsers/parser-manager.d.ts +294 -0
  106. package/dist/parsers/parser-manager.d.ts.map +1 -0
  107. package/dist/parsers/parser-manager.js +738 -0
  108. package/dist/parsers/parser-manager.js.map +1 -0
  109. package/dist/parsers/python-parser.d.ts +204 -0
  110. package/dist/parsers/python-parser.d.ts.map +1 -0
  111. package/dist/parsers/python-parser.js +517 -0
  112. package/dist/parsers/python-parser.js.map +1 -0
  113. package/dist/parsers/types.d.ts +43 -0
  114. package/dist/parsers/types.d.ts.map +1 -0
  115. package/dist/parsers/types.js +7 -0
  116. package/dist/parsers/types.js.map +1 -0
  117. package/dist/parsers/typescript-parser.d.ts +264 -0
  118. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  119. package/dist/parsers/typescript-parser.js +658 -0
  120. package/dist/parsers/typescript-parser.js.map +1 -0
  121. package/dist/rules/evaluator.d.ts +305 -0
  122. package/dist/rules/evaluator.d.ts.map +1 -0
  123. package/dist/rules/evaluator.js +579 -0
  124. package/dist/rules/evaluator.js.map +1 -0
  125. package/dist/rules/index.d.ts +13 -0
  126. package/dist/rules/index.d.ts.map +1 -0
  127. package/dist/rules/index.js +13 -0
  128. package/dist/rules/index.js.map +1 -0
  129. package/dist/rules/quick-fix-generator.d.ts +334 -0
  130. package/dist/rules/quick-fix-generator.d.ts.map +1 -0
  131. package/dist/rules/quick-fix-generator.js +1075 -0
  132. package/dist/rules/quick-fix-generator.js.map +1 -0
  133. package/dist/rules/rule-engine.d.ts +241 -0
  134. package/dist/rules/rule-engine.d.ts.map +1 -0
  135. package/dist/rules/rule-engine.js +585 -0
  136. package/dist/rules/rule-engine.js.map +1 -0
  137. package/dist/rules/severity-manager.d.ts +394 -0
  138. package/dist/rules/severity-manager.d.ts.map +1 -0
  139. package/dist/rules/severity-manager.js +619 -0
  140. package/dist/rules/severity-manager.js.map +1 -0
  141. package/dist/rules/types.d.ts +370 -0
  142. package/dist/rules/types.d.ts.map +1 -0
  143. package/dist/rules/types.js +133 -0
  144. package/dist/rules/types.js.map +1 -0
  145. package/dist/rules/variant-manager.d.ts +388 -0
  146. package/dist/rules/variant-manager.d.ts.map +1 -0
  147. package/dist/rules/variant-manager.js +777 -0
  148. package/dist/rules/variant-manager.js.map +1 -0
  149. package/dist/scanner/change-detector.d.ts +164 -0
  150. package/dist/scanner/change-detector.d.ts.map +1 -0
  151. package/dist/scanner/change-detector.js +263 -0
  152. package/dist/scanner/change-detector.js.map +1 -0
  153. package/dist/scanner/dependency-graph.d.ts +270 -0
  154. package/dist/scanner/dependency-graph.d.ts.map +1 -0
  155. package/dist/scanner/dependency-graph.js +436 -0
  156. package/dist/scanner/dependency-graph.js.map +1 -0
  157. package/dist/scanner/file-walker.d.ts +127 -0
  158. package/dist/scanner/file-walker.d.ts.map +1 -0
  159. package/dist/scanner/file-walker.js +526 -0
  160. package/dist/scanner/file-walker.js.map +1 -0
  161. package/dist/scanner/index.d.ts +12 -0
  162. package/dist/scanner/index.d.ts.map +1 -0
  163. package/dist/scanner/index.js +12 -0
  164. package/dist/scanner/index.js.map +1 -0
  165. package/dist/scanner/types.d.ts +218 -0
  166. package/dist/scanner/types.d.ts.map +1 -0
  167. package/dist/scanner/types.js +10 -0
  168. package/dist/scanner/types.js.map +1 -0
  169. package/dist/scanner/worker-pool.d.ts +317 -0
  170. package/dist/scanner/worker-pool.d.ts.map +1 -0
  171. package/dist/scanner/worker-pool.js +571 -0
  172. package/dist/scanner/worker-pool.js.map +1 -0
  173. package/dist/store/cache-manager.d.ts +179 -0
  174. package/dist/store/cache-manager.d.ts.map +1 -0
  175. package/dist/store/cache-manager.js +391 -0
  176. package/dist/store/cache-manager.js.map +1 -0
  177. package/dist/store/history-store.d.ts +314 -0
  178. package/dist/store/history-store.d.ts.map +1 -0
  179. package/dist/store/history-store.js +707 -0
  180. package/dist/store/history-store.js.map +1 -0
  181. package/dist/store/index.d.ts +20 -0
  182. package/dist/store/index.d.ts.map +1 -0
  183. package/dist/store/index.js +26 -0
  184. package/dist/store/index.js.map +1 -0
  185. package/dist/store/lock-file-manager.d.ts +202 -0
  186. package/dist/store/lock-file-manager.d.ts.map +1 -0
  187. package/dist/store/lock-file-manager.js +475 -0
  188. package/dist/store/lock-file-manager.js.map +1 -0
  189. package/dist/store/pattern-store.d.ts +289 -0
  190. package/dist/store/pattern-store.d.ts.map +1 -0
  191. package/dist/store/pattern-store.js +936 -0
  192. package/dist/store/pattern-store.js.map +1 -0
  193. package/dist/store/schema-validator.d.ts +159 -0
  194. package/dist/store/schema-validator.d.ts.map +1 -0
  195. package/dist/store/schema-validator.js +1096 -0
  196. package/dist/store/schema-validator.js.map +1 -0
  197. package/dist/store/types.d.ts +585 -0
  198. package/dist/store/types.d.ts.map +1 -0
  199. package/dist/store/types.js +82 -0
  200. package/dist/store/types.js.map +1 -0
  201. package/dist/types/analysis.d.ts +19 -0
  202. package/dist/types/analysis.d.ts.map +1 -0
  203. package/dist/types/analysis.js +5 -0
  204. package/dist/types/analysis.js.map +1 -0
  205. package/dist/types/common.d.ts +7 -0
  206. package/dist/types/common.d.ts.map +1 -0
  207. package/dist/types/common.js +5 -0
  208. package/dist/types/common.js.map +1 -0
  209. package/dist/types/index.d.ts +12 -0
  210. package/dist/types/index.d.ts.map +1 -0
  211. package/dist/types/index.js +10 -0
  212. package/dist/types/index.js.map +1 -0
  213. package/dist/types/patterns.d.ts +40 -0
  214. package/dist/types/patterns.d.ts.map +1 -0
  215. package/dist/types/patterns.js +7 -0
  216. package/dist/types/patterns.js.map +1 -0
  217. package/dist/types/violations.d.ts +7 -0
  218. package/dist/types/violations.d.ts.map +1 -0
  219. package/dist/types/violations.js +7 -0
  220. package/dist/types/violations.js.map +1 -0
  221. 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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"}