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,544 @@
1
+ /**
2
+ * Outlier Detector - Statistical outlier detection for pattern deviations
3
+ *
4
+ * Identifies code that deviates from established patterns using statistical
5
+ * methods including z-score analysis, IQR (Interquartile Range) detection,
6
+ * and rule-based detection for specific pattern violations.
7
+ *
8
+ * @requirements 5.7 - Outlier detection for code that deviates from patterns
9
+ */
10
+ /**
11
+ * Default outlier detector configuration
12
+ */
13
+ export const DEFAULT_OUTLIER_CONFIG = {
14
+ sensitivity: 0.5,
15
+ zScoreThreshold: 2.0,
16
+ iqrMultiplier: 1.5,
17
+ minSampleSize: 5,
18
+ method: 'statistical',
19
+ includeContext: true,
20
+ };
21
+ /**
22
+ * OutlierDetector class for detecting statistical outliers in pattern matches.
23
+ *
24
+ * Supports multiple detection methods:
25
+ * - Statistical: Uses z-score and IQR analysis
26
+ * - Rule-based: Uses predefined rules for specific violations
27
+ * - Clustering: Groups similar matches and identifies outliers (future)
28
+ * - ML-based: Machine learning-based detection (future)
29
+ *
30
+ * @requirements 5.7 - Outlier detection for code that deviates from patterns
31
+ */
32
+ export class OutlierDetector {
33
+ config;
34
+ rules;
35
+ /**
36
+ * Create a new OutlierDetector instance.
37
+ *
38
+ * @param config - Optional configuration for outlier detection
39
+ */
40
+ constructor(config) {
41
+ this.config = {
42
+ ...DEFAULT_OUTLIER_CONFIG,
43
+ ...config,
44
+ };
45
+ this.rules = new Map();
46
+ // Register default rules
47
+ this.registerDefaultRules();
48
+ }
49
+ /**
50
+ * Detect outliers in a set of pattern matches.
51
+ *
52
+ * @param matches - Array of pattern match results to analyze
53
+ * @param patternId - ID of the pattern being analyzed
54
+ * @returns Outlier detection result with all detected outliers
55
+ *
56
+ * @requirements 5.7 - Outlier detection for code that deviates from patterns
57
+ */
58
+ detect(matches, patternId) {
59
+ const timestamp = new Date();
60
+ const outliers = [];
61
+ if (matches.length === 0) {
62
+ return {
63
+ patternId,
64
+ outliers: [],
65
+ totalAnalyzed: 0,
66
+ outlierRate: 0,
67
+ timestamp,
68
+ method: this.config.method,
69
+ };
70
+ }
71
+ // Choose detection method based on configuration and sample size
72
+ const method = this.selectMethod(matches.length);
73
+ switch (method) {
74
+ case 'statistical':
75
+ outliers.push(...this.detectStatistical(matches, patternId));
76
+ break;
77
+ case 'rule-based':
78
+ outliers.push(...this.detectRuleBased(matches, patternId));
79
+ break;
80
+ case 'clustering':
81
+ // Fall back to statistical for now
82
+ outliers.push(...this.detectStatistical(matches, patternId));
83
+ break;
84
+ case 'ml-based':
85
+ // Fall back to statistical for now
86
+ outliers.push(...this.detectStatistical(matches, patternId));
87
+ break;
88
+ }
89
+ // Calculate outlier rate
90
+ const outlierRate = matches.length > 0 ? outliers.length / matches.length : 0;
91
+ return {
92
+ patternId,
93
+ outliers,
94
+ totalAnalyzed: matches.length,
95
+ outlierRate,
96
+ timestamp,
97
+ method,
98
+ };
99
+ }
100
+ /**
101
+ * Detect outliers using statistical methods (z-score and IQR).
102
+ *
103
+ * @param matches - Pattern matches to analyze
104
+ * @param patternId - Pattern ID
105
+ * @returns Array of detected outliers
106
+ */
107
+ detectStatistical(matches, patternId) {
108
+ const outliers = [];
109
+ // Extract confidence values as data points
110
+ const dataPoints = matches.map((match) => ({
111
+ value: match.confidence,
112
+ match,
113
+ }));
114
+ // Detect outliers using z-score method
115
+ const zScoreOutliers = this.detectByZScore(dataPoints, patternId);
116
+ outliers.push(...zScoreOutliers);
117
+ // Detect outliers using IQR method (may find additional outliers)
118
+ const iqrOutliers = this.detectByIQR(dataPoints, patternId);
119
+ // Merge results, avoiding duplicates
120
+ for (const iqrOutlier of iqrOutliers) {
121
+ const isDuplicate = outliers.some((o) => o.location.file === iqrOutlier.location.file &&
122
+ o.location.line === iqrOutlier.location.line);
123
+ if (!isDuplicate) {
124
+ outliers.push(iqrOutlier);
125
+ }
126
+ }
127
+ return outliers;
128
+ }
129
+ /**
130
+ * Detect outliers using z-score method.
131
+ *
132
+ * Z-score measures how many standard deviations a value is from the mean.
133
+ * Values with |z-score| > threshold are considered outliers.
134
+ *
135
+ * @param dataPoints - Data points to analyze
136
+ * @param patternId - Pattern ID
137
+ * @returns Array of detected outliers
138
+ */
139
+ detectByZScore(dataPoints, patternId) {
140
+ const outliers = [];
141
+ if (dataPoints.length < this.config.minSampleSize) {
142
+ return outliers;
143
+ }
144
+ const values = dataPoints.map((dp) => dp.value);
145
+ const stats = this.calculateStatistics(values);
146
+ // Skip if standard deviation is 0 (all values are the same)
147
+ if (stats.standardDeviation === 0) {
148
+ return outliers;
149
+ }
150
+ for (const dataPoint of dataPoints) {
151
+ const zScore = (dataPoint.value - stats.mean) / stats.standardDeviation;
152
+ const absZScore = Math.abs(zScore);
153
+ // Adjust threshold based on sensitivity
154
+ const adjustedThreshold = this.config.zScoreThreshold * (1 + (1 - this.config.sensitivity));
155
+ if (absZScore > adjustedThreshold) {
156
+ const significance = this.classifySignificance(absZScore);
157
+ const percentile = this.calculatePercentile(dataPoint.value, values);
158
+ const outlierStats = {
159
+ mean: stats.mean,
160
+ standardDeviation: stats.standardDeviation,
161
+ zScore,
162
+ percentile,
163
+ sampleSize: dataPoints.length,
164
+ };
165
+ const outlier = this.createOutlierInfo(dataPoint.match, patternId, zScore < 0 ? 'Low confidence outlier' : 'High confidence outlier', this.calculateDeviationScore(absZScore), this.determineOutlierType(dataPoint.match, zScore), significance, outlierStats);
166
+ outliers.push(outlier);
167
+ }
168
+ }
169
+ return outliers;
170
+ }
171
+ /**
172
+ * Detect outliers using IQR (Interquartile Range) method.
173
+ *
174
+ * IQR is the range between Q1 (25th percentile) and Q3 (75th percentile).
175
+ * Values outside [Q1 - k*IQR, Q3 + k*IQR] are considered outliers.
176
+ *
177
+ * @param dataPoints - Data points to analyze
178
+ * @param patternId - Pattern ID
179
+ * @returns Array of detected outliers
180
+ */
181
+ detectByIQR(dataPoints, patternId) {
182
+ const outliers = [];
183
+ if (dataPoints.length < this.config.minSampleSize) {
184
+ return outliers;
185
+ }
186
+ const values = dataPoints.map((dp) => dp.value);
187
+ const sortedValues = [...values].sort((a, b) => a - b);
188
+ const q1 = this.calculateQuartile(sortedValues, 0.25);
189
+ const q3 = this.calculateQuartile(sortedValues, 0.75);
190
+ const iqr = q3 - q1;
191
+ // Skip if IQR is 0 (all values are very similar)
192
+ if (iqr === 0) {
193
+ return outliers;
194
+ }
195
+ // Adjust multiplier based on sensitivity
196
+ const adjustedMultiplier = this.config.iqrMultiplier * (1 + (1 - this.config.sensitivity));
197
+ const lowerBound = q1 - adjustedMultiplier * iqr;
198
+ const upperBound = q3 + adjustedMultiplier * iqr;
199
+ const stats = this.calculateStatistics(values);
200
+ for (const dataPoint of dataPoints) {
201
+ if (dataPoint.value < lowerBound || dataPoint.value > upperBound) {
202
+ const zScore = stats.standardDeviation > 0
203
+ ? (dataPoint.value - stats.mean) / stats.standardDeviation
204
+ : 0;
205
+ const percentile = this.calculatePercentile(dataPoint.value, values);
206
+ // Calculate how far outside the bounds the value is
207
+ const distanceFromBound = dataPoint.value < lowerBound
208
+ ? lowerBound - dataPoint.value
209
+ : dataPoint.value - upperBound;
210
+ const normalizedDistance = iqr > 0 ? distanceFromBound / iqr : 0;
211
+ const significance = this.classifySignificanceByIQR(normalizedDistance);
212
+ const outlierStats = {
213
+ mean: stats.mean,
214
+ standardDeviation: stats.standardDeviation,
215
+ zScore,
216
+ percentile,
217
+ sampleSize: dataPoints.length,
218
+ };
219
+ const outlier = this.createOutlierInfo(dataPoint.match, patternId, dataPoint.value < lowerBound
220
+ ? 'Value below IQR lower bound'
221
+ : 'Value above IQR upper bound', this.clamp(normalizedDistance / 3, 0, 1), // Normalize to 0-1
222
+ this.determineOutlierType(dataPoint.match, zScore), significance, outlierStats);
223
+ outliers.push(outlier);
224
+ }
225
+ }
226
+ return outliers;
227
+ }
228
+ /**
229
+ * Detect outliers using rule-based detection.
230
+ *
231
+ * @param matches - Pattern matches to analyze
232
+ * @param patternId - Pattern ID
233
+ * @returns Array of detected outliers
234
+ */
235
+ detectRuleBased(matches, patternId) {
236
+ const outliers = [];
237
+ for (const match of matches) {
238
+ for (const rule of this.rules.values()) {
239
+ if (rule.check(match, matches)) {
240
+ const outlier = {
241
+ location: match.location,
242
+ patternId,
243
+ reason: rule.getReason(match),
244
+ deviationScore: this.config.sensitivity,
245
+ deviationType: rule.type,
246
+ significance: 'medium',
247
+ };
248
+ if (rule.getExpected) {
249
+ outlier.expected = rule.getExpected(match, matches);
250
+ }
251
+ if (match.matchedText) {
252
+ outlier.actual = match.matchedText;
253
+ }
254
+ if (rule.getSuggestedFix) {
255
+ outlier.suggestedFix = rule.getSuggestedFix(match);
256
+ }
257
+ outliers.push(outlier);
258
+ }
259
+ }
260
+ }
261
+ return outliers;
262
+ }
263
+ /**
264
+ * Register a custom outlier detection rule.
265
+ *
266
+ * @param rule - The rule to register
267
+ */
268
+ registerRule(rule) {
269
+ this.rules.set(rule.id, rule);
270
+ }
271
+ /**
272
+ * Unregister an outlier detection rule.
273
+ *
274
+ * @param ruleId - ID of the rule to unregister
275
+ * @returns True if the rule was removed, false if it didn't exist
276
+ */
277
+ unregisterRule(ruleId) {
278
+ return this.rules.delete(ruleId);
279
+ }
280
+ /**
281
+ * Get all registered rules.
282
+ *
283
+ * @returns Array of registered rules
284
+ */
285
+ getRules() {
286
+ return Array.from(this.rules.values());
287
+ }
288
+ /**
289
+ * Get the current configuration.
290
+ *
291
+ * @returns Copy of the current configuration
292
+ */
293
+ getConfig() {
294
+ return { ...this.config };
295
+ }
296
+ /**
297
+ * Update the configuration.
298
+ *
299
+ * @param config - Partial configuration to update
300
+ */
301
+ updateConfig(config) {
302
+ this.config = {
303
+ ...this.config,
304
+ ...config,
305
+ };
306
+ }
307
+ // ============================================================================
308
+ // Private Helper Methods
309
+ // ============================================================================
310
+ /**
311
+ * Select the appropriate detection method based on sample size and config.
312
+ */
313
+ selectMethod(sampleSize) {
314
+ if (sampleSize < this.config.minSampleSize) {
315
+ return 'rule-based';
316
+ }
317
+ return this.config.method;
318
+ }
319
+ /**
320
+ * Calculate basic statistics for a set of values.
321
+ */
322
+ calculateStatistics(values) {
323
+ if (values.length === 0) {
324
+ return { mean: 0, standardDeviation: 0 };
325
+ }
326
+ const mean = values.reduce((sum, v) => sum + v, 0) / values.length;
327
+ if (values.length === 1) {
328
+ return { mean, standardDeviation: 0 };
329
+ }
330
+ const squaredDiffs = values.map((v) => Math.pow(v - mean, 2));
331
+ const variance = squaredDiffs.reduce((sum, v) => sum + v, 0) / values.length;
332
+ const standardDeviation = Math.sqrt(variance);
333
+ return { mean, standardDeviation };
334
+ }
335
+ /**
336
+ * Calculate a quartile value from sorted data.
337
+ */
338
+ calculateQuartile(sortedValues, quartile) {
339
+ if (sortedValues.length === 0) {
340
+ return 0;
341
+ }
342
+ const index = quartile * (sortedValues.length - 1);
343
+ const lower = Math.floor(index);
344
+ const upper = Math.ceil(index);
345
+ if (lower === upper) {
346
+ return sortedValues[lower] ?? 0;
347
+ }
348
+ const lowerValue = sortedValues[lower] ?? 0;
349
+ const upperValue = sortedValues[upper] ?? 0;
350
+ const fraction = index - lower;
351
+ return lowerValue + fraction * (upperValue - lowerValue);
352
+ }
353
+ /**
354
+ * Calculate the percentile rank of a value in a dataset.
355
+ */
356
+ calculatePercentile(value, values) {
357
+ if (values.length === 0) {
358
+ return 0;
359
+ }
360
+ const belowCount = values.filter((v) => v < value).length;
361
+ const equalCount = values.filter((v) => v === value).length;
362
+ return ((belowCount + 0.5 * equalCount) / values.length) * 100;
363
+ }
364
+ /**
365
+ * Classify outlier significance based on z-score.
366
+ */
367
+ classifySignificance(absZScore) {
368
+ if (absZScore >= 3.0) {
369
+ return 'high';
370
+ }
371
+ if (absZScore >= 2.5) {
372
+ return 'medium';
373
+ }
374
+ return 'low';
375
+ }
376
+ /**
377
+ * Classify outlier significance based on IQR distance.
378
+ */
379
+ classifySignificanceByIQR(normalizedDistance) {
380
+ if (normalizedDistance >= 3.0) {
381
+ return 'high';
382
+ }
383
+ if (normalizedDistance >= 2.0) {
384
+ return 'medium';
385
+ }
386
+ return 'low';
387
+ }
388
+ /**
389
+ * Calculate deviation score from z-score (normalized to 0-1).
390
+ */
391
+ calculateDeviationScore(absZScore) {
392
+ // Map z-score to 0-1 range using sigmoid-like function
393
+ // z-score of 2 -> ~0.5, z-score of 4 -> ~0.9
394
+ return this.clamp(1 - 1 / (1 + absZScore / 2), 0, 1);
395
+ }
396
+ /**
397
+ * Determine the outlier type based on match characteristics.
398
+ */
399
+ determineOutlierType(match, zScore) {
400
+ // If confidence is very low, it's likely inconsistent
401
+ if (match.confidence < 0.3) {
402
+ return 'inconsistent';
403
+ }
404
+ // If z-score is negative (below mean), might be missing elements
405
+ if (zScore < -2) {
406
+ return 'missing';
407
+ }
408
+ // If z-score is very positive (above mean), might have extra elements
409
+ if (zScore > 2) {
410
+ return 'extra';
411
+ }
412
+ // Default to structural deviation
413
+ switch (match.matchType) {
414
+ case 'ast':
415
+ return 'syntactic';
416
+ case 'structural':
417
+ return 'structural';
418
+ case 'regex':
419
+ return 'stylistic';
420
+ default:
421
+ return 'inconsistent';
422
+ }
423
+ }
424
+ /**
425
+ * Create an OutlierInfo object from match data.
426
+ */
427
+ createOutlierInfo(match, patternId, reason, deviationScore, deviationType, significance, statistics) {
428
+ const outlier = {
429
+ location: match.location,
430
+ patternId,
431
+ reason,
432
+ deviationScore,
433
+ deviationType,
434
+ significance,
435
+ };
436
+ if (match.matchedText) {
437
+ outlier.actual = match.matchedText;
438
+ }
439
+ if (this.config.includeContext && statistics) {
440
+ outlier.context = {
441
+ statistics,
442
+ };
443
+ }
444
+ return outlier;
445
+ }
446
+ /**
447
+ * Clamp a value to a range.
448
+ */
449
+ clamp(value, min, max) {
450
+ return Math.max(min, Math.min(max, value));
451
+ }
452
+ /**
453
+ * Register default outlier detection rules.
454
+ */
455
+ registerDefaultRules() {
456
+ // Rule: Low confidence match
457
+ this.registerRule({
458
+ id: 'low-confidence',
459
+ name: 'Low Confidence Match',
460
+ type: 'inconsistent',
461
+ check: (match) => match.confidence < 0.3,
462
+ getReason: (match) => `Match has very low confidence (${(match.confidence * 100).toFixed(1)}%)`,
463
+ getSuggestedFix: () => 'Review and update the code to match the established pattern',
464
+ });
465
+ // Rule: Already marked as outlier
466
+ this.registerRule({
467
+ id: 'marked-outlier',
468
+ name: 'Pre-marked Outlier',
469
+ type: 'inconsistent',
470
+ check: (match) => match.isOutlier === true,
471
+ getReason: (match) => match.outlierReason ?? 'Match was pre-marked as an outlier',
472
+ });
473
+ // Rule: Missing similarity score
474
+ this.registerRule({
475
+ id: 'low-similarity',
476
+ name: 'Low Similarity',
477
+ type: 'structural',
478
+ check: (match) => match.similarity !== undefined && match.similarity < 0.5,
479
+ getReason: (match) => `Match has low similarity to canonical pattern (${((match.similarity ?? 0) * 100).toFixed(1)}%)`,
480
+ getSuggestedFix: () => 'Refactor code to more closely match the established pattern',
481
+ });
482
+ }
483
+ }
484
+ /**
485
+ * Detect outliers using default configuration.
486
+ * Convenience function for quick outlier detection.
487
+ *
488
+ * @param matches - Pattern matches to analyze
489
+ * @param patternId - Pattern ID
490
+ * @returns Outlier detection result
491
+ */
492
+ export function detectOutliers(matches, patternId) {
493
+ const detector = new OutlierDetector();
494
+ return detector.detect(matches, patternId);
495
+ }
496
+ /**
497
+ * Calculate statistics for a set of values.
498
+ * Utility function for external use.
499
+ *
500
+ * @param values - Array of numeric values
501
+ * @returns Statistics object with mean, stddev, and quartiles
502
+ */
503
+ export function calculateStatistics(values) {
504
+ if (values.length === 0) {
505
+ return {
506
+ mean: 0,
507
+ standardDeviation: 0,
508
+ q1: 0,
509
+ median: 0,
510
+ q3: 0,
511
+ iqr: 0,
512
+ };
513
+ }
514
+ const mean = values.reduce((sum, v) => sum + v, 0) / values.length;
515
+ const squaredDiffs = values.map((v) => Math.pow(v - mean, 2));
516
+ const variance = squaredDiffs.reduce((sum, v) => sum + v, 0) / values.length;
517
+ const standardDeviation = Math.sqrt(variance);
518
+ const sortedValues = [...values].sort((a, b) => a - b);
519
+ const calculateQuartile = (q) => {
520
+ const index = q * (sortedValues.length - 1);
521
+ const lower = Math.floor(index);
522
+ const upper = Math.ceil(index);
523
+ if (lower === upper) {
524
+ return sortedValues[lower] ?? 0;
525
+ }
526
+ const lowerValue = sortedValues[lower] ?? 0;
527
+ const upperValue = sortedValues[upper] ?? 0;
528
+ const fraction = index - lower;
529
+ return lowerValue + fraction * (upperValue - lowerValue);
530
+ };
531
+ const q1 = calculateQuartile(0.25);
532
+ const median = calculateQuartile(0.5);
533
+ const q3 = calculateQuartile(0.75);
534
+ const iqr = q3 - q1;
535
+ return {
536
+ mean,
537
+ standardDeviation,
538
+ q1,
539
+ median,
540
+ q3,
541
+ iqr,
542
+ };
543
+ }
544
+ //# sourceMappingURL=outlier-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outlier-detector.js","sourceRoot":"","sources":["../../src/matcher/outlier-detector.ts"],"names":[],"mappings":"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"}