@buoy-design/core 0.1.9 → 0.1.10
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/analysis/drift-aggregator.d.ts +82 -0
- package/dist/analysis/drift-aggregator.d.ts.map +1 -0
- package/dist/analysis/drift-aggregator.js +241 -0
- package/dist/analysis/drift-aggregator.js.map +1 -0
- package/dist/analysis/index.d.ts +1 -0
- package/dist/analysis/index.d.ts.map +1 -1
- package/dist/analysis/index.js +2 -0
- package/dist/analysis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift Aggregator
|
|
3
|
+
*
|
|
4
|
+
* Post-processing layer that groups raw drift signals for actionability
|
|
5
|
+
* while preserving total counts for severity scoring.
|
|
6
|
+
*/
|
|
7
|
+
import type { DriftSignal } from "../models/index.js";
|
|
8
|
+
export interface DriftGroup {
|
|
9
|
+
/** Unique ID for this group */
|
|
10
|
+
id: string;
|
|
11
|
+
/** What grouped these signals together */
|
|
12
|
+
groupingKey: {
|
|
13
|
+
strategy: string;
|
|
14
|
+
value: string;
|
|
15
|
+
};
|
|
16
|
+
/** Human-readable summary */
|
|
17
|
+
summary: string;
|
|
18
|
+
/** All individual signals (preserved for scoring) */
|
|
19
|
+
signals: DriftSignal[];
|
|
20
|
+
/** Quick access counts */
|
|
21
|
+
totalCount: number;
|
|
22
|
+
bySeverity: {
|
|
23
|
+
critical: number;
|
|
24
|
+
warning: number;
|
|
25
|
+
info: number;
|
|
26
|
+
};
|
|
27
|
+
/** Unified suggestion if all signals share one */
|
|
28
|
+
commonSuggestion?: string;
|
|
29
|
+
/** Representative signal for display */
|
|
30
|
+
representative: DriftSignal;
|
|
31
|
+
}
|
|
32
|
+
export interface AggregationResult {
|
|
33
|
+
groups: DriftGroup[];
|
|
34
|
+
ungrouped: DriftSignal[];
|
|
35
|
+
totalSignals: number;
|
|
36
|
+
totalGroups: number;
|
|
37
|
+
/** Noise reduction metric: 100 signals → 5 groups = 20x */
|
|
38
|
+
reductionRatio: number;
|
|
39
|
+
}
|
|
40
|
+
export interface GroupingStrategy {
|
|
41
|
+
/** Unique identifier for this strategy */
|
|
42
|
+
type: string;
|
|
43
|
+
/**
|
|
44
|
+
* Extract a grouping key from a signal.
|
|
45
|
+
* @returns Grouping key string, or null if strategy doesn't apply
|
|
46
|
+
*/
|
|
47
|
+
getKey(signal: DriftSignal): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Generate human-readable summary for a group.
|
|
50
|
+
*/
|
|
51
|
+
summarize(signals: DriftSignal[], key: string): string;
|
|
52
|
+
}
|
|
53
|
+
export type BuiltInStrategyType = "value" | "suggestion" | "path" | "entity";
|
|
54
|
+
export interface AggregatorOptions {
|
|
55
|
+
/** Strategies to apply, in priority order. First match wins. */
|
|
56
|
+
strategies?: Array<BuiltInStrategyType | GroupingStrategy>;
|
|
57
|
+
/** Minimum signals to form a group (default: 2) */
|
|
58
|
+
minGroupSize?: number;
|
|
59
|
+
/** Path patterns for path-based grouping */
|
|
60
|
+
pathPatterns?: string[];
|
|
61
|
+
}
|
|
62
|
+
export declare class DriftAggregator {
|
|
63
|
+
private strategies;
|
|
64
|
+
private options;
|
|
65
|
+
constructor(options?: AggregatorOptions);
|
|
66
|
+
private resolveStrategy;
|
|
67
|
+
/**
|
|
68
|
+
* Aggregate signals into groups.
|
|
69
|
+
* Returns both grouped and ungrouped for flexible consumption.
|
|
70
|
+
*/
|
|
71
|
+
aggregate(signals: DriftSignal[]): AggregationResult;
|
|
72
|
+
private applyStrategy;
|
|
73
|
+
private createGroup;
|
|
74
|
+
}
|
|
75
|
+
export declare const builtInStrategies: {
|
|
76
|
+
readonly value: GroupingStrategy;
|
|
77
|
+
readonly suggestion: GroupingStrategy;
|
|
78
|
+
readonly path: GroupingStrategy;
|
|
79
|
+
readonly entity: GroupingStrategy;
|
|
80
|
+
};
|
|
81
|
+
export declare function createStrategy(config: GroupingStrategy): GroupingStrategy;
|
|
82
|
+
//# sourceMappingURL=drift-aggregator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift-aggregator.d.ts","sourceRoot":"","sources":["../../src/analysis/drift-aggregator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMtD,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IAEX,0CAA0C;IAC1C,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAEF,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,qDAAqD;IACrD,OAAO,EAAE,WAAW,EAAE,CAAC;IAEvB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAEhE,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,wCAAwC;IACxC,cAAc,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC;IAE3C;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACxD;AAED,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,CAAC;IAE3D,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAgJD,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,OAAO,CAAkD;gBAErD,OAAO,GAAE,iBAAsB;IAgB3C,OAAO,CAAC,eAAe;IAqBvB;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,iBAAiB;IAgCpD,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,WAAW;CAoBpB;AAMD,eAAO,MAAM,iBAAiB;;;;;CAKpB,CAAC;AAEX,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAEzE"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift Aggregator
|
|
3
|
+
*
|
|
4
|
+
* Post-processing layer that groups raw drift signals for actionability
|
|
5
|
+
* while preserving total counts for severity scoring.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Built-in Strategies
|
|
9
|
+
// ============================================================================
|
|
10
|
+
const valueStrategy = {
|
|
11
|
+
type: "value",
|
|
12
|
+
getKey(signal) {
|
|
13
|
+
if (signal.type !== "hardcoded-value")
|
|
14
|
+
return null;
|
|
15
|
+
const actual = signal.details.actual;
|
|
16
|
+
if (typeof actual !== "string")
|
|
17
|
+
return null;
|
|
18
|
+
return `value:${actual}`;
|
|
19
|
+
},
|
|
20
|
+
summarize(signals, key) {
|
|
21
|
+
const value = key.replace("value:", "");
|
|
22
|
+
return `${signals.length} components use hardcoded value "${value}"`;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const suggestionStrategy = {
|
|
26
|
+
type: "suggestion",
|
|
27
|
+
getKey(signal) {
|
|
28
|
+
const suggestions = signal.details.tokenSuggestions;
|
|
29
|
+
if (!suggestions?.length)
|
|
30
|
+
return null;
|
|
31
|
+
// Parse: "value → tokenName (confidence)"
|
|
32
|
+
const first = suggestions[0];
|
|
33
|
+
if (!first)
|
|
34
|
+
return null;
|
|
35
|
+
const match = first.match(/→\s*([^\s(]+)/);
|
|
36
|
+
if (!match)
|
|
37
|
+
return null;
|
|
38
|
+
return `suggestion:${match[1]}`;
|
|
39
|
+
},
|
|
40
|
+
summarize(signals, key) {
|
|
41
|
+
const token = key.replace("suggestion:", "");
|
|
42
|
+
return `${signals.length} issues fixable by using ${token}`;
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
function createPathStrategy(patterns) {
|
|
46
|
+
return {
|
|
47
|
+
type: "path",
|
|
48
|
+
getKey(signal) {
|
|
49
|
+
const location = signal.source.location;
|
|
50
|
+
if (!location || !location.includes("/"))
|
|
51
|
+
return null;
|
|
52
|
+
// Check configured patterns first
|
|
53
|
+
for (const pattern of patterns) {
|
|
54
|
+
if (matchGlob(location, pattern)) {
|
|
55
|
+
return `path:${pattern}`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Fallback: group by directory
|
|
59
|
+
const parts = location.split("/");
|
|
60
|
+
if (parts.length >= 2) {
|
|
61
|
+
const dir = parts.slice(0, -1).join("/");
|
|
62
|
+
return `path:${dir}`;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
},
|
|
66
|
+
summarize(signals, key) {
|
|
67
|
+
const path = key.replace("path:", "");
|
|
68
|
+
const types = [...new Set(signals.map((s) => s.type))];
|
|
69
|
+
return `${signals.length} issues in ${path}/ (${types.join(", ")})`;
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const entityStrategy = {
|
|
74
|
+
type: "entity",
|
|
75
|
+
getKey(signal) {
|
|
76
|
+
return `entity:${signal.source.entityId}`;
|
|
77
|
+
},
|
|
78
|
+
summarize(signals, _key) {
|
|
79
|
+
const entityName = signals[0]?.source.entityName ?? "Unknown";
|
|
80
|
+
const types = [...new Set(signals.map((s) => s.type))];
|
|
81
|
+
if (types.length === 1) {
|
|
82
|
+
return `${signals.length} ${types[0]} issues in ${entityName}`;
|
|
83
|
+
}
|
|
84
|
+
return `${signals.length} issues in ${entityName} (${types.join(", ")})`;
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
// ============================================================================
|
|
88
|
+
// Helpers
|
|
89
|
+
// ============================================================================
|
|
90
|
+
function matchGlob(path, pattern) {
|
|
91
|
+
// Convert glob to regex
|
|
92
|
+
// Use placeholder for ** to avoid single-star replacement affecting it
|
|
93
|
+
const regex = new RegExp("^" +
|
|
94
|
+
pattern
|
|
95
|
+
.replace(/\*\*/g, "<<<GLOBSTAR>>>")
|
|
96
|
+
.replace(/\*/g, "[^/]*")
|
|
97
|
+
.replace(/<<<GLOBSTAR>>>/g, ".*") +
|
|
98
|
+
"$");
|
|
99
|
+
return regex.test(path);
|
|
100
|
+
}
|
|
101
|
+
function countBySeverity(signals) {
|
|
102
|
+
const counts = { critical: 0, warning: 0, info: 0 };
|
|
103
|
+
for (const signal of signals) {
|
|
104
|
+
counts[signal.severity]++;
|
|
105
|
+
}
|
|
106
|
+
return counts;
|
|
107
|
+
}
|
|
108
|
+
function generateGroupId(strategy, key) {
|
|
109
|
+
// Simple hash for stable IDs
|
|
110
|
+
const content = `${strategy}:${key}`;
|
|
111
|
+
let hash = 0;
|
|
112
|
+
for (let i = 0; i < content.length; i++) {
|
|
113
|
+
const char = content.charCodeAt(i);
|
|
114
|
+
hash = (hash << 5) - hash + char;
|
|
115
|
+
hash = hash & hash;
|
|
116
|
+
}
|
|
117
|
+
return `group:${strategy}:${Math.abs(hash).toString(16)}`;
|
|
118
|
+
}
|
|
119
|
+
// ============================================================================
|
|
120
|
+
// DriftAggregator
|
|
121
|
+
// ============================================================================
|
|
122
|
+
export class DriftAggregator {
|
|
123
|
+
strategies;
|
|
124
|
+
options;
|
|
125
|
+
constructor(options = {}) {
|
|
126
|
+
this.options = {
|
|
127
|
+
minGroupSize: options.minGroupSize ?? 2,
|
|
128
|
+
pathPatterns: options.pathPatterns ?? [],
|
|
129
|
+
};
|
|
130
|
+
// Build strategy list
|
|
131
|
+
const strategyDefs = options.strategies ?? [
|
|
132
|
+
"value",
|
|
133
|
+
"suggestion",
|
|
134
|
+
"path",
|
|
135
|
+
"entity",
|
|
136
|
+
];
|
|
137
|
+
this.strategies = strategyDefs.map((s) => this.resolveStrategy(s));
|
|
138
|
+
}
|
|
139
|
+
resolveStrategy(strategy) {
|
|
140
|
+
if (typeof strategy === "object") {
|
|
141
|
+
return strategy;
|
|
142
|
+
}
|
|
143
|
+
switch (strategy) {
|
|
144
|
+
case "value":
|
|
145
|
+
return valueStrategy;
|
|
146
|
+
case "suggestion":
|
|
147
|
+
return suggestionStrategy;
|
|
148
|
+
case "path":
|
|
149
|
+
return createPathStrategy(this.options.pathPatterns);
|
|
150
|
+
case "entity":
|
|
151
|
+
return entityStrategy;
|
|
152
|
+
default:
|
|
153
|
+
throw new Error(`Unknown strategy: ${strategy}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Aggregate signals into groups.
|
|
158
|
+
* Returns both grouped and ungrouped for flexible consumption.
|
|
159
|
+
*/
|
|
160
|
+
aggregate(signals) {
|
|
161
|
+
if (signals.length === 0) {
|
|
162
|
+
return {
|
|
163
|
+
groups: [],
|
|
164
|
+
ungrouped: [],
|
|
165
|
+
totalSignals: 0,
|
|
166
|
+
totalGroups: 0,
|
|
167
|
+
reductionRatio: 1,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
const groups = [];
|
|
171
|
+
let remaining = [...signals];
|
|
172
|
+
// Multi-pass: each strategy gets a shot at remaining signals
|
|
173
|
+
for (const strategy of this.strategies) {
|
|
174
|
+
const { formed, leftover } = this.applyStrategy(strategy, remaining);
|
|
175
|
+
groups.push(...formed);
|
|
176
|
+
remaining = leftover;
|
|
177
|
+
}
|
|
178
|
+
const outputCount = groups.length + remaining.length;
|
|
179
|
+
return {
|
|
180
|
+
groups,
|
|
181
|
+
ungrouped: remaining,
|
|
182
|
+
totalSignals: signals.length,
|
|
183
|
+
totalGroups: groups.length,
|
|
184
|
+
reductionRatio: outputCount > 0 ? signals.length / outputCount : 1,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
applyStrategy(strategy, signals) {
|
|
188
|
+
const buckets = new Map();
|
|
189
|
+
const noKey = [];
|
|
190
|
+
for (const signal of signals) {
|
|
191
|
+
const key = strategy.getKey(signal);
|
|
192
|
+
if (key) {
|
|
193
|
+
const bucket = buckets.get(key) ?? [];
|
|
194
|
+
bucket.push(signal);
|
|
195
|
+
buckets.set(key, bucket);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
noKey.push(signal);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const formed = [];
|
|
202
|
+
const leftover = [...noKey];
|
|
203
|
+
for (const [key, bucket] of buckets) {
|
|
204
|
+
if (bucket.length >= this.options.minGroupSize) {
|
|
205
|
+
formed.push(this.createGroup(strategy, key, bucket));
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
leftover.push(...bucket);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return { formed, leftover };
|
|
212
|
+
}
|
|
213
|
+
createGroup(strategy, key, signals) {
|
|
214
|
+
const keyValue = key.includes(":") ? key.split(":").slice(1).join(":") : key;
|
|
215
|
+
return {
|
|
216
|
+
id: generateGroupId(strategy.type, key),
|
|
217
|
+
groupingKey: {
|
|
218
|
+
strategy: strategy.type,
|
|
219
|
+
value: keyValue,
|
|
220
|
+
},
|
|
221
|
+
summary: strategy.summarize(signals, key),
|
|
222
|
+
signals,
|
|
223
|
+
totalCount: signals.length,
|
|
224
|
+
bySeverity: countBySeverity(signals),
|
|
225
|
+
representative: signals[0],
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// ============================================================================
|
|
230
|
+
// Exports for extensibility
|
|
231
|
+
// ============================================================================
|
|
232
|
+
export const builtInStrategies = {
|
|
233
|
+
value: valueStrategy,
|
|
234
|
+
suggestion: suggestionStrategy,
|
|
235
|
+
path: createPathStrategy([]),
|
|
236
|
+
entity: entityStrategy,
|
|
237
|
+
};
|
|
238
|
+
export function createStrategy(config) {
|
|
239
|
+
return config;
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=drift-aggregator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift-aggregator.js","sourceRoot":"","sources":["../../src/analysis/drift-aggregator.ts"],"names":[],"mappings":"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"}
|
package/dist/analysis/index.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export { TokenSuggestionService, type TokenSuggestion, } from "./token-suggestio
|
|
|
3
3
|
export { stringSimilarity, levenshteinDistance, normalizeForComparison, } from "./string-utils.js";
|
|
4
4
|
export { MATCHING_CONFIG, NAMING_CONFIG, TOKEN_SUGGESTION_CONFIG, SCANNER_CONFIG, getOutlierThreshold, } from "./config.js";
|
|
5
5
|
export { generateAuditReport, findCloseMatches, calculateHealthScore, type AuditValue, type AuditReport, type CategoryStats, type FileIssue, type CloseMatch, } from "./audit.js";
|
|
6
|
+
export { DriftAggregator, createStrategy, builtInStrategies, type DriftGroup, type AggregationResult, type GroupingStrategy, type AggregatorOptions, type BuiltInStrategyType, } from "./drift-aggregator.js";
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,sBAAsB,EACtB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,sBAAsB,EACtB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAC"}
|
package/dist/analysis/index.js
CHANGED
|
@@ -7,4 +7,6 @@ export { stringSimilarity, levenshteinDistance, normalizeForComparison, } from "
|
|
|
7
7
|
export { MATCHING_CONFIG, NAMING_CONFIG, TOKEN_SUGGESTION_CONFIG, SCANNER_CONFIG, getOutlierThreshold, } from "./config.js";
|
|
8
8
|
// Audit report
|
|
9
9
|
export { generateAuditReport, findCloseMatches, calculateHealthScore, } from "./audit.js";
|
|
10
|
+
// Drift aggregation
|
|
11
|
+
export { DriftAggregator, createStrategy, builtInStrategies, } from "./drift-aggregator.js";
|
|
10
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAOnB,MAAM,oBAAoB,CAAC;AAE5B,6BAA6B;AAC7B,OAAO,EACL,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAEhC,mBAAmB;AACnB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,yBAAyB;AACzB,OAAO,EACL,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,eAAe;AACf,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,GAMrB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAOnB,MAAM,oBAAoB,CAAC;AAE5B,6BAA6B;AAC7B,OAAO,EACL,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAEhC,mBAAmB;AACnB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,yBAAyB;AACzB,OAAO,EACL,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,eAAe;AACf,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,GAMrB,MAAM,YAAY,CAAC;AAEpB,oBAAoB;AACpB,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,GAMlB,MAAM,uBAAuB,CAAC"}
|