@buoy-design/core 0.1.9 → 0.1.11

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.
@@ -2,4 +2,5 @@ export * from "./naming-analyzer.js";
2
2
  export * from "./duplicate-detector.js";
3
3
  export * from "./prop-analyzer.js";
4
4
  export * from "./accessibility-analyzer.js";
5
+ export * from "./pattern-analyzer.js";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analysis/analyzers/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analysis/analyzers/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC"}
@@ -2,4 +2,5 @@ export * from "./naming-analyzer.js";
2
2
  export * from "./duplicate-detector.js";
3
3
  export * from "./prop-analyzer.js";
4
4
  export * from "./accessibility-analyzer.js";
5
+ export * from "./pattern-analyzer.js";
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analysis/analyzers/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analysis/analyzers/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Pattern Analyzer
3
+ *
4
+ * Detects repeated className patterns across the codebase.
5
+ * Suggests extracting common patterns into components or utility classes.
6
+ */
7
+ import type { DriftSignal } from "../../models/index.js";
8
+ export interface ClassOccurrence {
9
+ classes: string;
10
+ file: string;
11
+ line: number;
12
+ }
13
+ export interface PatternAnalyzerOptions {
14
+ minOccurrences?: number;
15
+ matching?: "exact" | "tight" | "loose";
16
+ }
17
+ /**
18
+ * Normalize a className string by sorting classes alphabetically.
19
+ * "flex items-center gap-2" -> "flex gap-2 items-center"
20
+ */
21
+ export declare function normalizeClassPattern(classes: string): string;
22
+ /**
23
+ * Group occurrences by normalized pattern.
24
+ */
25
+ export declare function groupPatterns(occurrences: ClassOccurrence[], matching?: "exact" | "tight" | "loose"): Map<string, ClassOccurrence[]>;
26
+ /**
27
+ * Detect repeated patterns and generate drift signals.
28
+ */
29
+ export declare function detectRepeatedPatterns(occurrences: ClassOccurrence[], options?: PatternAnalyzerOptions): DriftSignal[];
30
+ //# sourceMappingURL=pattern-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-analyzer.d.ts","sourceRoot":"","sources":["../../../src/analysis/analyzers/pattern-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAyDzD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACxC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,eAAe,EAAE,EAC9B,QAAQ,GAAE,OAAO,GAAG,OAAO,GAAG,OAAiB,GAC9C,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAoBhC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,eAAe,EAAE,EAC9B,OAAO,GAAE,sBAA2B,GACnC,WAAW,EAAE,CA4Df"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Pattern Analyzer
3
+ *
4
+ * Detects repeated className patterns across the codebase.
5
+ * Suggests extracting common patterns into components or utility classes.
6
+ */
7
+ import { createDriftId } from "../../models/index.js";
8
+ /**
9
+ * Variant categories for tight matching.
10
+ * These patterns identify Tailwind classes that represent the same concept with different values.
11
+ */
12
+ const VARIANT_PATTERNS = {
13
+ shadow: /^shadow(-none|-sm|-md|-lg|-xl|-2xl)?$/,
14
+ rounded: /^rounded(-none|-sm|-md|-lg|-xl|-2xl|-3xl|-full)?$/,
15
+ gap: /^gap-(\d+|px)$/,
16
+ p: /^p-(\d+|px)$/,
17
+ px: /^px-(\d+|px)$/,
18
+ py: /^py-(\d+|px)$/,
19
+ pt: /^pt-(\d+|px)$/,
20
+ pr: /^pr-(\d+|px)$/,
21
+ pb: /^pb-(\d+|px)$/,
22
+ pl: /^pl-(\d+|px)$/,
23
+ m: /^m-(\d+|px)$/,
24
+ mx: /^mx-(\d+|px)$/,
25
+ my: /^my-(\d+|px)$/,
26
+ mt: /^mt-(\d+|px)$/,
27
+ mr: /^mr-(\d+|px)$/,
28
+ mb: /^mb-(\d+|px)$/,
29
+ ml: /^ml-(\d+|px)$/,
30
+ text: /^text-(xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/,
31
+ };
32
+ /**
33
+ * Normalize a class for tight matching - replace variant values with placeholders.
34
+ */
35
+ function normalizeTight(classes) {
36
+ const classList = classes.trim().split(/\s+/).filter(Boolean);
37
+ const normalized = [];
38
+ const variants = [];
39
+ for (const cls of classList) {
40
+ let matched = false;
41
+ for (const [category, pattern] of Object.entries(VARIANT_PATTERNS)) {
42
+ if (pattern.test(cls)) {
43
+ normalized.push(`{${category}}`);
44
+ variants.push(cls);
45
+ matched = true;
46
+ break;
47
+ }
48
+ }
49
+ if (!matched) {
50
+ normalized.push(cls);
51
+ }
52
+ }
53
+ return {
54
+ normalized: normalized.sort().join(" "),
55
+ variants,
56
+ };
57
+ }
58
+ /**
59
+ * Normalize a className string by sorting classes alphabetically.
60
+ * "flex items-center gap-2" -> "flex gap-2 items-center"
61
+ */
62
+ export function normalizeClassPattern(classes) {
63
+ return classes
64
+ .trim()
65
+ .split(/\s+/)
66
+ .filter(Boolean)
67
+ .sort()
68
+ .join(" ");
69
+ }
70
+ /**
71
+ * Group occurrences by normalized pattern.
72
+ */
73
+ export function groupPatterns(occurrences, matching = "exact") {
74
+ const groups = new Map();
75
+ for (const occ of occurrences) {
76
+ let normalized;
77
+ if (matching === "tight") {
78
+ normalized = normalizeTight(occ.classes).normalized;
79
+ }
80
+ else {
81
+ normalized = normalizeClassPattern(occ.classes);
82
+ }
83
+ if (!normalized)
84
+ continue;
85
+ const existing = groups.get(normalized) || [];
86
+ existing.push(occ);
87
+ groups.set(normalized, existing);
88
+ }
89
+ return groups;
90
+ }
91
+ /**
92
+ * Detect repeated patterns and generate drift signals.
93
+ */
94
+ export function detectRepeatedPatterns(occurrences, options = {}) {
95
+ const { minOccurrences = 3, matching = "exact" } = options;
96
+ const groups = groupPatterns(occurrences, matching);
97
+ const drifts = [];
98
+ for (const [pattern, locations] of groups) {
99
+ if (locations.length < minOccurrences)
100
+ continue;
101
+ const classCount = pattern.split(" ").length;
102
+ const isSimple = classCount <= 3;
103
+ const firstLocation = locations[0];
104
+ // For tight matching, collect unique variants used across all locations
105
+ let suggestions;
106
+ let variants;
107
+ if (matching === "tight") {
108
+ // Collect all unique variants from the grouped occurrences
109
+ const variantSet = new Set();
110
+ for (const loc of locations) {
111
+ const { variants: locVariants } = normalizeTight(loc.classes);
112
+ for (const v of locVariants) {
113
+ variantSet.add(v);
114
+ }
115
+ }
116
+ variants = Array.from(variantSet);
117
+ // For tight matches with variants, suggest component with props
118
+ suggestions = [
119
+ "Consider extracting this pattern into a component with props for variants",
120
+ `Variants found: ${variants.join(", ")}`,
121
+ ];
122
+ }
123
+ else {
124
+ suggestions = isSimple
125
+ ? ["Consider creating a utility class for this pattern"]
126
+ : ["Consider extracting this pattern into a reusable component"];
127
+ }
128
+ drifts.push({
129
+ id: createDriftId("repeated-pattern", pattern.replace(/\s+/g, "-")),
130
+ type: "repeated-pattern",
131
+ severity: "info",
132
+ source: {
133
+ entityType: "component",
134
+ entityId: `pattern:${pattern.replace(/\s+/g, "-")}`,
135
+ entityName: pattern,
136
+ location: `${firstLocation.file}:${firstLocation.line}`,
137
+ },
138
+ message: `Pattern "${pattern}" appears ${locations.length} times across ${new Set(locations.map(l => l.file)).size} files`,
139
+ details: {
140
+ occurrences: locations.length,
141
+ locations: locations.map((l) => `${l.file}:${l.line}`),
142
+ suggestions,
143
+ ...(variants ? { variants } : {}),
144
+ },
145
+ detectedAt: new Date(),
146
+ });
147
+ }
148
+ return drifts;
149
+ }
150
+ //# sourceMappingURL=pattern-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-analyzer.js","sourceRoot":"","sources":["../../../src/analysis/analyzers/pattern-analyzer.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -3,4 +3,6 @@ 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";
7
+ export { detectRepeatedPatterns, normalizeClassPattern, groupPatterns, type ClassOccurrence, type PatternAnalyzerOptions, } from "./analyzers/pattern-analyzer.js";
6
8
  //# 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;AAG/B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,iCAAiC,CAAC"}
@@ -7,4 +7,8 @@ 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";
12
+ // Pattern analyzer (experimental)
13
+ export { detectRepeatedPatterns, normalizeClassPattern, groupPatterns, } from "./analyzers/pattern-analyzer.js";
10
14
  //# 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;AAE/B,kCAAkC;AAClC,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,GAGd,MAAM,iCAAiC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- export declare const DriftTypeSchema: z.ZodEnum<["deprecated-pattern", "accessibility-conflict", "semantic-mismatch", "orphaned-component", "orphaned-token", "value-divergence", "naming-inconsistency", "missing-documentation", "hardcoded-value", "framework-sprawl", "unused-component", "unused-token", "color-contrast"]>;
2
+ export declare const DriftTypeSchema: z.ZodEnum<["deprecated-pattern", "accessibility-conflict", "semantic-mismatch", "orphaned-component", "orphaned-token", "value-divergence", "naming-inconsistency", "missing-documentation", "hardcoded-value", "framework-sprawl", "unused-component", "unused-token", "color-contrast", "repeated-pattern"]>;
3
3
  export declare const SeveritySchema: z.ZodEnum<["info", "warning", "critical"]>;
4
4
  export declare const DriftSourceSchema: z.ZodObject<{
5
5
  entityType: z.ZodEnum<["component", "token"]>;
@@ -219,6 +219,8 @@ export declare const DriftDetailsSchema: z.ZodObject<{
219
219
  }[] | undefined;
220
220
  }>>;
221
221
  tokenSuggestions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
222
+ occurrences: z.ZodOptional<z.ZodNumber>;
223
+ locations: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
222
224
  }, "strip", z.ZodTypeAny, {
223
225
  expected?: unknown;
224
226
  actual?: unknown;
@@ -254,6 +256,8 @@ export declare const DriftDetailsSchema: z.ZodObject<{
254
256
  }[] | undefined;
255
257
  } | undefined;
256
258
  tokenSuggestions?: string[] | undefined;
259
+ occurrences?: number | undefined;
260
+ locations?: string[] | undefined;
257
261
  }, {
258
262
  expected?: unknown;
259
263
  actual?: unknown;
@@ -289,6 +293,8 @@ export declare const DriftDetailsSchema: z.ZodObject<{
289
293
  }[] | undefined;
290
294
  } | undefined;
291
295
  tokenSuggestions?: string[] | undefined;
296
+ occurrences?: number | undefined;
297
+ locations?: string[] | undefined;
292
298
  }>;
293
299
  export declare const DriftResolutionTypeSchema: z.ZodEnum<["ignored", "fixed", "documented"]>;
294
300
  export declare const DriftResolutionSchema: z.ZodObject<{
@@ -309,7 +315,7 @@ export declare const DriftResolutionSchema: z.ZodObject<{
309
315
  }>;
310
316
  export declare const DriftSignalSchema: z.ZodObject<{
311
317
  id: z.ZodString;
312
- type: z.ZodEnum<["deprecated-pattern", "accessibility-conflict", "semantic-mismatch", "orphaned-component", "orphaned-token", "value-divergence", "naming-inconsistency", "missing-documentation", "hardcoded-value", "framework-sprawl", "unused-component", "unused-token", "color-contrast"]>;
318
+ type: z.ZodEnum<["deprecated-pattern", "accessibility-conflict", "semantic-mismatch", "orphaned-component", "orphaned-token", "value-divergence", "naming-inconsistency", "missing-documentation", "hardcoded-value", "framework-sprawl", "unused-component", "unused-token", "color-contrast", "repeated-pattern"]>;
313
319
  severity: z.ZodEnum<["info", "warning", "critical"]>;
314
320
  source: z.ZodObject<{
315
321
  entityType: z.ZodEnum<["component", "token"]>;
@@ -455,6 +461,8 @@ export declare const DriftSignalSchema: z.ZodObject<{
455
461
  }[] | undefined;
456
462
  }>>;
457
463
  tokenSuggestions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
464
+ occurrences: z.ZodOptional<z.ZodNumber>;
465
+ locations: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
458
466
  }, "strip", z.ZodTypeAny, {
459
467
  expected?: unknown;
460
468
  actual?: unknown;
@@ -490,6 +498,8 @@ export declare const DriftSignalSchema: z.ZodObject<{
490
498
  }[] | undefined;
491
499
  } | undefined;
492
500
  tokenSuggestions?: string[] | undefined;
501
+ occurrences?: number | undefined;
502
+ locations?: string[] | undefined;
493
503
  }, {
494
504
  expected?: unknown;
495
505
  actual?: unknown;
@@ -525,6 +535,8 @@ export declare const DriftSignalSchema: z.ZodObject<{
525
535
  }[] | undefined;
526
536
  } | undefined;
527
537
  tokenSuggestions?: string[] | undefined;
538
+ occurrences?: number | undefined;
539
+ locations?: string[] | undefined;
528
540
  }>;
529
541
  detectedAt: z.ZodDate;
530
542
  resolvedAt: z.ZodOptional<z.ZodDate>;
@@ -545,7 +557,7 @@ export declare const DriftSignalSchema: z.ZodObject<{
545
557
  resolvedBy?: string | undefined;
546
558
  }>>;
547
559
  }, "strip", z.ZodTypeAny, {
548
- type: "deprecated-pattern" | "accessibility-conflict" | "semantic-mismatch" | "orphaned-component" | "orphaned-token" | "value-divergence" | "naming-inconsistency" | "missing-documentation" | "hardcoded-value" | "framework-sprawl" | "unused-component" | "unused-token" | "color-contrast";
560
+ type: "deprecated-pattern" | "accessibility-conflict" | "semantic-mismatch" | "orphaned-component" | "orphaned-token" | "value-divergence" | "naming-inconsistency" | "missing-documentation" | "hardcoded-value" | "framework-sprawl" | "unused-component" | "unused-token" | "color-contrast" | "repeated-pattern";
549
561
  message: string;
550
562
  id: string;
551
563
  source: {
@@ -590,6 +602,8 @@ export declare const DriftSignalSchema: z.ZodObject<{
590
602
  }[] | undefined;
591
603
  } | undefined;
592
604
  tokenSuggestions?: string[] | undefined;
605
+ occurrences?: number | undefined;
606
+ locations?: string[] | undefined;
593
607
  };
594
608
  detectedAt: Date;
595
609
  resolvedAt?: Date | undefined;
@@ -606,7 +620,7 @@ export declare const DriftSignalSchema: z.ZodObject<{
606
620
  resolvedBy?: string | undefined;
607
621
  } | undefined;
608
622
  }, {
609
- type: "deprecated-pattern" | "accessibility-conflict" | "semantic-mismatch" | "orphaned-component" | "orphaned-token" | "value-divergence" | "naming-inconsistency" | "missing-documentation" | "hardcoded-value" | "framework-sprawl" | "unused-component" | "unused-token" | "color-contrast";
623
+ type: "deprecated-pattern" | "accessibility-conflict" | "semantic-mismatch" | "orphaned-component" | "orphaned-token" | "value-divergence" | "naming-inconsistency" | "missing-documentation" | "hardcoded-value" | "framework-sprawl" | "unused-component" | "unused-token" | "color-contrast" | "repeated-pattern";
610
624
  message: string;
611
625
  id: string;
612
626
  source: {
@@ -651,6 +665,8 @@ export declare const DriftSignalSchema: z.ZodObject<{
651
665
  }[] | undefined;
652
666
  } | undefined;
653
667
  tokenSuggestions?: string[] | undefined;
668
+ occurrences?: number | undefined;
669
+ locations?: string[] | undefined;
654
670
  };
655
671
  detectedAt: Date;
656
672
  resolvedAt?: Date | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/models/drift.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/models/drift.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ export const DriftTypeSchema = z.enum([
14
14
  "unused-component",
15
15
  "unused-token",
16
16
  "color-contrast",
17
+ "repeated-pattern",
17
18
  ]);
18
19
  // Severity levels
19
20
  export const SeveritySchema = z.enum(["info", "warning", "critical"]);
@@ -81,6 +82,9 @@ export const DriftDetailsSchema = z.object({
81
82
  // Actionable token suggestions for hardcoded values
82
83
  // Format: "hardcodedValue → tokenName (confidence% match)"
83
84
  tokenSuggestions: z.array(z.string()).optional(),
85
+ // For repeated-pattern drift type
86
+ occurrences: z.number().optional(),
87
+ locations: z.array(z.string()).optional(),
84
88
  });
85
89
  // Drift resolution
86
90
  export const DriftResolutionTypeSchema = z.enum([
@@ -166,6 +170,7 @@ export function getDefaultSeverity(type) {
166
170
  case "naming-inconsistency":
167
171
  case "missing-documentation":
168
172
  case "unused-token":
173
+ case "repeated-pattern":
169
174
  return "info";
170
175
  }
171
176
  }
@@ -184,6 +189,7 @@ export const DRIFT_TYPE_LABELS = {
184
189
  "unused-component": "Unused Component",
185
190
  "unused-token": "Unused Token",
186
191
  "color-contrast": "Color Contrast",
192
+ "repeated-pattern": "Repeated Pattern",
187
193
  };
188
194
  /**
189
195
  * Drift Type Descriptions
@@ -204,6 +210,7 @@ export const DRIFT_TYPE_DESCRIPTIONS = {
204
210
  "unused-component": "Component is defined but never imported or used elsewhere in the codebase",
205
211
  "unused-token": "Design token is defined but never referenced in components or stylesheets",
206
212
  "color-contrast": "Color combinations fail WCAG accessibility contrast ratio requirements",
213
+ "repeated-pattern": "ClassName pattern appears multiple times across the codebase and could be extracted into a reusable component or utility class",
207
214
  };
208
215
  // Human-readable severity labels
209
216
  export const SEVERITY_LABELS = {
@@ -1 +1 @@
1
- {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/models/drift.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/models/drift.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-design/core",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "Core domain models and analysis for Buoy design drift detection",
5
5
  "type": "module",
6
6
  "license": "MIT",