@aiready/pattern-detect 0.11.4 → 0.11.6
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/__tests__/context-rules.test.d.ts +2 -0
- package/dist/__tests__/context-rules.test.d.ts.map +1 -0
- package/dist/__tests__/context-rules.test.js +189 -0
- package/dist/__tests__/context-rules.test.js.map +1 -0
- package/dist/__tests__/detector.test.d.ts +2 -0
- package/dist/__tests__/detector.test.d.ts.map +1 -0
- package/dist/__tests__/detector.test.js +259 -0
- package/dist/__tests__/detector.test.js.map +1 -0
- package/dist/__tests__/grouping.test.d.ts +2 -0
- package/dist/__tests__/grouping.test.d.ts.map +1 -0
- package/dist/__tests__/grouping.test.js +443 -0
- package/dist/__tests__/grouping.test.js.map +1 -0
- package/dist/__tests__/scoring.test.d.ts +2 -0
- package/dist/__tests__/scoring.test.d.ts.map +1 -0
- package/dist/__tests__/scoring.test.js +102 -0
- package/dist/__tests__/scoring.test.js.map +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js.map +1 -0
- package/dist/context-rules.d.ts +41 -0
- package/dist/context-rules.d.ts.map +1 -0
- package/dist/context-rules.js +225 -0
- package/dist/context-rules.js.map +1 -0
- package/dist/detector.d.ts +40 -0
- package/dist/detector.d.ts.map +1 -0
- package/dist/detector.js +385 -0
- package/dist/detector.js.map +1 -0
- package/dist/extractors/python-extractor.d.ts +19 -0
- package/dist/extractors/python-extractor.d.ts.map +1 -0
- package/dist/extractors/python-extractor.js +164 -0
- package/dist/extractors/python-extractor.js.map +1 -0
- package/dist/grouping.d.ts +54 -0
- package/dist/grouping.d.ts.map +1 -0
- package/dist/grouping.js +347 -0
- package/dist/grouping.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/scoring.d.ts +12 -0
- package/dist/scoring.d.ts.map +1 -0
- package/dist/scoring.js +116 -0
- package/dist/scoring.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grouping.d.ts","sourceRoot":"","sources":["../src/grouping.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,KAAK,CAAC;QAChB,KAAK,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QACtC,KAAK,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;KACvC,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAwBD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,gBAAgB,EAAE,GAC7B,cAAc,EAAE,CAoDlB;AA8DD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,gBAAgB,EAAE,GAC7B,eAAe,EAAE,CA0CnB;AAiOD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EAAE,EAC3B,YAAY,GAAE,MAAa,EAC3B,YAAY,GAAE,MAAU,GACvB,eAAe,EAAE,CAInB"}
|
package/dist/grouping.js
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grouping and clustering utilities for duplicate patterns
|
|
3
|
+
* Reduces noise by consolidating similar duplicates and creating refactor clusters
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Normalize file pair to ensure consistent ordering
|
|
7
|
+
* file1::file2 === file2::file1
|
|
8
|
+
*/
|
|
9
|
+
function normalizeFilePair(file1, file2) {
|
|
10
|
+
return file1 < file2 ? `${file1}::${file2}` : `${file2}::${file1}`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Check if two line ranges overlap or are adjacent
|
|
14
|
+
*/
|
|
15
|
+
function rangesOverlap(start1, end1, start2, end2, tolerance = 5) {
|
|
16
|
+
// Allow small tolerance for adjacent blocks
|
|
17
|
+
return start1 <= end2 + tolerance && start2 <= end1 + tolerance;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Group duplicates by file pair, consolidating similar line ranges
|
|
21
|
+
* Reduces "80% similar entries for the same file pairs" noise
|
|
22
|
+
*/
|
|
23
|
+
export function groupDuplicatesByFilePair(duplicates) {
|
|
24
|
+
const groups = new Map();
|
|
25
|
+
// Group by file pair
|
|
26
|
+
for (const dup of duplicates) {
|
|
27
|
+
const key = normalizeFilePair(dup.file1, dup.file2);
|
|
28
|
+
if (!groups.has(key)) {
|
|
29
|
+
groups.set(key, []);
|
|
30
|
+
}
|
|
31
|
+
groups.get(key).push(dup);
|
|
32
|
+
}
|
|
33
|
+
// Convert to DuplicateGroup with aggregated metrics
|
|
34
|
+
const result = [];
|
|
35
|
+
for (const [filePair, groupDups] of groups.entries()) {
|
|
36
|
+
// Deduplicate overlapping line ranges
|
|
37
|
+
const deduplicated = deduplicateOverlappingRanges(groupDups);
|
|
38
|
+
// Calculate aggregate metrics
|
|
39
|
+
const totalTokenCost = deduplicated.reduce((sum, d) => sum + d.tokenCost, 0);
|
|
40
|
+
const averageSimilarity = deduplicated.reduce((sum, d) => sum + d.similarity, 0) / deduplicated.length;
|
|
41
|
+
const maxSimilarity = Math.max(...deduplicated.map((d) => d.similarity));
|
|
42
|
+
// Use highest severity in group
|
|
43
|
+
const severity = getHighestSeverity(deduplicated.map((d) => d.severity));
|
|
44
|
+
// Use most common pattern type
|
|
45
|
+
const patternType = getMostCommonPatternType(deduplicated);
|
|
46
|
+
// Collect line ranges
|
|
47
|
+
const lineRanges = deduplicated.map((d) => ({
|
|
48
|
+
file1: { start: d.line1, end: d.endLine1 },
|
|
49
|
+
file2: { start: d.line2, end: d.endLine2 },
|
|
50
|
+
}));
|
|
51
|
+
result.push({
|
|
52
|
+
filePair,
|
|
53
|
+
duplicates: deduplicated,
|
|
54
|
+
totalTokenCost,
|
|
55
|
+
averageSimilarity,
|
|
56
|
+
maxSimilarity,
|
|
57
|
+
severity,
|
|
58
|
+
patternType,
|
|
59
|
+
occurrences: deduplicated.length,
|
|
60
|
+
lineRanges,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// Sort by total token cost (highest first)
|
|
64
|
+
return result.sort((a, b) => b.totalTokenCost - a.totalTokenCost);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Deduplicate overlapping line ranges within the same file pair
|
|
68
|
+
* Keeps the duplicate with highest similarity for each overlapping region
|
|
69
|
+
*/
|
|
70
|
+
function deduplicateOverlappingRanges(duplicates) {
|
|
71
|
+
if (duplicates.length === 0)
|
|
72
|
+
return [];
|
|
73
|
+
// Sort by line1, then by similarity (descending)
|
|
74
|
+
const sorted = [...duplicates].sort((a, b) => {
|
|
75
|
+
if (a.line1 !== b.line1)
|
|
76
|
+
return a.line1 - b.line1;
|
|
77
|
+
return b.similarity - a.similarity;
|
|
78
|
+
});
|
|
79
|
+
const result = [];
|
|
80
|
+
let current = null;
|
|
81
|
+
for (const dup of sorted) {
|
|
82
|
+
if (!current) {
|
|
83
|
+
current = dup;
|
|
84
|
+
result.push(dup);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// Check if this duplicate overlaps with current
|
|
88
|
+
const overlapsFile1 = rangesOverlap(current.line1, current.endLine1, dup.line1, dup.endLine1);
|
|
89
|
+
const overlapsFile2 = rangesOverlap(current.line2, current.endLine2, dup.line2, dup.endLine2);
|
|
90
|
+
if (overlapsFile1 && overlapsFile2) {
|
|
91
|
+
// Overlaps - keep current (higher similarity due to sort)
|
|
92
|
+
// Update current to cover merged range
|
|
93
|
+
current = {
|
|
94
|
+
...current,
|
|
95
|
+
endLine1: Math.max(current.endLine1, dup.endLine1),
|
|
96
|
+
endLine2: Math.max(current.endLine2, dup.endLine2),
|
|
97
|
+
tokenCost: Math.max(current.tokenCost, dup.tokenCost),
|
|
98
|
+
};
|
|
99
|
+
// Update in result
|
|
100
|
+
result[result.length - 1] = current;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// No overlap - add as new duplicate
|
|
104
|
+
current = dup;
|
|
105
|
+
result.push(dup);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create refactor clusters for related duplicates
|
|
112
|
+
* Groups UI patterns, components, etc. into actionable clusters
|
|
113
|
+
*/
|
|
114
|
+
export function createRefactorClusters(duplicates) {
|
|
115
|
+
const clusters = new Map();
|
|
116
|
+
for (const dup of duplicates) {
|
|
117
|
+
const clusterId = identifyCluster(dup);
|
|
118
|
+
if (!clusters.has(clusterId)) {
|
|
119
|
+
clusters.set(clusterId, []);
|
|
120
|
+
}
|
|
121
|
+
clusters.get(clusterId).push(dup);
|
|
122
|
+
}
|
|
123
|
+
const result = [];
|
|
124
|
+
for (const [clusterId, clusterDups] of clusters.entries()) {
|
|
125
|
+
// Only create cluster if there are multiple related duplicates
|
|
126
|
+
if (clusterDups.length < 2)
|
|
127
|
+
continue;
|
|
128
|
+
const files = getUniqueFiles(clusterDups);
|
|
129
|
+
const totalTokenCost = clusterDups.reduce((sum, d) => sum + d.tokenCost, 0);
|
|
130
|
+
const averageSimilarity = clusterDups.reduce((sum, d) => sum + d.similarity, 0) / clusterDups.length;
|
|
131
|
+
const severity = getHighestSeverity(clusterDups.map((d) => d.severity));
|
|
132
|
+
const patternType = getMostCommonPatternType(clusterDups);
|
|
133
|
+
const clusterInfo = getClusterInfo(clusterId, patternType, files.length);
|
|
134
|
+
result.push({
|
|
135
|
+
id: clusterId,
|
|
136
|
+
name: clusterInfo.name,
|
|
137
|
+
files,
|
|
138
|
+
patternType,
|
|
139
|
+
severity,
|
|
140
|
+
totalTokenCost,
|
|
141
|
+
averageSimilarity,
|
|
142
|
+
duplicateCount: clusterDups.length,
|
|
143
|
+
suggestion: clusterInfo.suggestion,
|
|
144
|
+
reason: clusterInfo.reason,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Sort by token cost (highest first)
|
|
148
|
+
return result.sort((a, b) => b.totalTokenCost - a.totalTokenCost);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Identify which cluster a duplicate belongs to based on file patterns
|
|
152
|
+
*/
|
|
153
|
+
function identifyCluster(dup) {
|
|
154
|
+
const file1 = dup.file1.toLowerCase();
|
|
155
|
+
const file2 = dup.file2.toLowerCase();
|
|
156
|
+
// Blog/article patterns
|
|
157
|
+
if ((file1.includes('/blog/') || file1.startsWith('blog/') || file1.includes('/articles/') || file1.startsWith('articles/')) &&
|
|
158
|
+
(file2.includes('/blog/') || file2.startsWith('blog/') || file2.includes('/articles/') || file2.startsWith('articles/'))) {
|
|
159
|
+
return 'blog-seo-boilerplate';
|
|
160
|
+
}
|
|
161
|
+
// Component patterns
|
|
162
|
+
if ((file1.includes('/components/') || file1.startsWith('components/')) &&
|
|
163
|
+
(file2.includes('/components/') || file2.startsWith('components/')) &&
|
|
164
|
+
dup.patternType === 'component') {
|
|
165
|
+
// Group by component type (e.g., Button, Card, Modal)
|
|
166
|
+
// Use original file paths (not lowercased) for component name extraction
|
|
167
|
+
const component1 = extractComponentName(dup.file1);
|
|
168
|
+
const component2 = extractComponentName(dup.file2);
|
|
169
|
+
console.log(`Component check: ${dup.file1} -> ${component1}, ${dup.file2} -> ${component2}`);
|
|
170
|
+
if (component1 && component2 && areSimilarComponents(component1, component2)) {
|
|
171
|
+
const category = getComponentCategory(component1);
|
|
172
|
+
console.log(`Creating cluster: component-${category}`);
|
|
173
|
+
return `component-${category}`;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// E2E test patterns
|
|
177
|
+
if ((file1.includes('/e2e/') || file1.startsWith('e2e/') || file1.includes('.e2e.')) &&
|
|
178
|
+
(file2.includes('/e2e/') || file2.startsWith('e2e/') || file2.includes('.e2e.'))) {
|
|
179
|
+
return 'e2e-test-patterns';
|
|
180
|
+
}
|
|
181
|
+
// API handler patterns
|
|
182
|
+
if (dup.patternType === 'api-handler') {
|
|
183
|
+
return 'api-handlers';
|
|
184
|
+
}
|
|
185
|
+
// Validator patterns
|
|
186
|
+
if (dup.patternType === 'validator') {
|
|
187
|
+
return 'validators';
|
|
188
|
+
}
|
|
189
|
+
// Infrastructure scripts
|
|
190
|
+
if ((file1.includes('/scripts/') || file1.startsWith('scripts/') || file1.includes('/infra/') || file1.startsWith('infra/')) &&
|
|
191
|
+
(file2.includes('/scripts/') || file2.startsWith('scripts/') || file2.includes('/infra/') || file2.startsWith('infra/'))) {
|
|
192
|
+
return 'infrastructure-scripts';
|
|
193
|
+
}
|
|
194
|
+
// Default: group by pattern type
|
|
195
|
+
return `${dup.patternType}-patterns`;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Extract component name from file path
|
|
199
|
+
*/
|
|
200
|
+
function extractComponentName(filePath) {
|
|
201
|
+
const match = filePath.match(/[/\\]?([A-Z][a-zA-Z0-9]*)\.(tsx|jsx|ts|js)$/);
|
|
202
|
+
return match ? match[1] : null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Check if two component names are similar (same category)
|
|
206
|
+
*/
|
|
207
|
+
function areSimilarComponents(name1, name2) {
|
|
208
|
+
const category1 = getComponentCategory(name1);
|
|
209
|
+
const category2 = getComponentCategory(name2);
|
|
210
|
+
return category1 === category2;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Categorize component by name pattern
|
|
214
|
+
*/
|
|
215
|
+
function getComponentCategory(name) {
|
|
216
|
+
name = name.toLowerCase();
|
|
217
|
+
if (name.includes('button') || name.includes('btn'))
|
|
218
|
+
return 'button';
|
|
219
|
+
if (name.includes('card'))
|
|
220
|
+
return 'card';
|
|
221
|
+
if (name.includes('modal') || name.includes('dialog'))
|
|
222
|
+
return 'modal';
|
|
223
|
+
if (name.includes('form'))
|
|
224
|
+
return 'form';
|
|
225
|
+
if (name.includes('input') || name.includes('field'))
|
|
226
|
+
return 'input';
|
|
227
|
+
if (name.includes('table') || name.includes('grid'))
|
|
228
|
+
return 'table';
|
|
229
|
+
if (name.includes('nav') || name.includes('menu'))
|
|
230
|
+
return 'navigation';
|
|
231
|
+
if (name.includes('header') || name.includes('footer'))
|
|
232
|
+
return 'layout';
|
|
233
|
+
return 'misc';
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get unique files from duplicates
|
|
237
|
+
*/
|
|
238
|
+
function getUniqueFiles(duplicates) {
|
|
239
|
+
const files = new Set();
|
|
240
|
+
for (const dup of duplicates) {
|
|
241
|
+
files.add(dup.file1);
|
|
242
|
+
files.add(dup.file2);
|
|
243
|
+
}
|
|
244
|
+
return Array.from(files).sort();
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get highest severity from a list
|
|
248
|
+
*/
|
|
249
|
+
function getHighestSeverity(severities) {
|
|
250
|
+
const order = {
|
|
251
|
+
critical: 4,
|
|
252
|
+
major: 3,
|
|
253
|
+
minor: 2,
|
|
254
|
+
info: 1,
|
|
255
|
+
};
|
|
256
|
+
let highest = 'info';
|
|
257
|
+
let highestValue = 0;
|
|
258
|
+
for (const severity of severities) {
|
|
259
|
+
if (order[severity] > highestValue) {
|
|
260
|
+
highestValue = order[severity];
|
|
261
|
+
highest = severity;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return highest;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get most common pattern type
|
|
268
|
+
*/
|
|
269
|
+
function getMostCommonPatternType(duplicates) {
|
|
270
|
+
const counts = new Map();
|
|
271
|
+
for (const dup of duplicates) {
|
|
272
|
+
counts.set(dup.patternType, (counts.get(dup.patternType) || 0) + 1);
|
|
273
|
+
}
|
|
274
|
+
let mostCommon = 'unknown';
|
|
275
|
+
let maxCount = 0;
|
|
276
|
+
for (const [type, count] of counts.entries()) {
|
|
277
|
+
if (count > maxCount) {
|
|
278
|
+
maxCount = count;
|
|
279
|
+
mostCommon = type;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return mostCommon;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Get cluster-specific information
|
|
286
|
+
*/
|
|
287
|
+
function getClusterInfo(clusterId, patternType, fileCount) {
|
|
288
|
+
const templates = {
|
|
289
|
+
'blog-seo-boilerplate': {
|
|
290
|
+
name: `Blog SEO Boilerplate (${fileCount} files)`,
|
|
291
|
+
suggestion: 'Create BlogPageLayout component with SEO schema generator, breadcrumb component, and metadata helpers',
|
|
292
|
+
reason: 'SEO boilerplate duplication increases maintenance burden and schema consistency risk',
|
|
293
|
+
},
|
|
294
|
+
'e2e-test-patterns': {
|
|
295
|
+
name: `E2E Test Patterns (${fileCount} files)`,
|
|
296
|
+
suggestion: 'Extract page object helpers and common test utilities (waitFor, fillForm, etc.)',
|
|
297
|
+
reason: 'Test helper extraction improves maintainability while preserving test independence',
|
|
298
|
+
},
|
|
299
|
+
'api-handlers': {
|
|
300
|
+
name: `API Handler Patterns (${fileCount} files)`,
|
|
301
|
+
suggestion: 'Extract common middleware, error handling, and response formatting',
|
|
302
|
+
reason: 'API handler duplication leads to inconsistent error handling and response formats',
|
|
303
|
+
},
|
|
304
|
+
'validators': {
|
|
305
|
+
name: `Validator Patterns (${fileCount} files)`,
|
|
306
|
+
suggestion: 'Consolidate into shared schema validators (Zod/Yup) with reusable rules',
|
|
307
|
+
reason: 'Validator duplication causes inconsistent validation and harder maintenance',
|
|
308
|
+
},
|
|
309
|
+
'infrastructure-scripts': {
|
|
310
|
+
name: `Infrastructure Scripts (${fileCount} files)`,
|
|
311
|
+
suggestion: 'Extract common CLI parsing, file I/O, and error handling utilities',
|
|
312
|
+
reason: 'Script duplication is often acceptable for one-off tasks, but common patterns can be shared',
|
|
313
|
+
},
|
|
314
|
+
'component-button': {
|
|
315
|
+
name: `Button Component Variants (${fileCount} files)`,
|
|
316
|
+
suggestion: 'Create unified Button component with variant props',
|
|
317
|
+
reason: 'Multiple button variants should share base styles and behavior',
|
|
318
|
+
},
|
|
319
|
+
'component-card': {
|
|
320
|
+
name: `Card Component Variants (${fileCount} files)`,
|
|
321
|
+
suggestion: 'Create unified Card component with composition pattern',
|
|
322
|
+
reason: 'Card variants should share layout structure and styling',
|
|
323
|
+
},
|
|
324
|
+
'component-modal': {
|
|
325
|
+
name: `Modal Component Variants (${fileCount} files)`,
|
|
326
|
+
suggestion: 'Create base Modal component with customizable content',
|
|
327
|
+
reason: 'Modal variants should share overlay, animation, and accessibility logic',
|
|
328
|
+
},
|
|
329
|
+
};
|
|
330
|
+
if (templates[clusterId]) {
|
|
331
|
+
return templates[clusterId];
|
|
332
|
+
}
|
|
333
|
+
// Default template
|
|
334
|
+
return {
|
|
335
|
+
name: `${patternType} Cluster (${fileCount} files)`,
|
|
336
|
+
suggestion: `Extract common ${patternType} patterns into shared utilities`,
|
|
337
|
+
reason: `Multiple similar ${patternType} patterns detected across ${fileCount} files`,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Filter clusters by minimum impact threshold
|
|
342
|
+
* Reduces noise from minor refactoring opportunities
|
|
343
|
+
*/
|
|
344
|
+
export function filterClustersByImpact(clusters, minTokenCost = 1000, minFileCount = 3) {
|
|
345
|
+
return clusters.filter((cluster) => cluster.totalTokenCost >= minTokenCost || cluster.files.length >= minFileCount);
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=grouping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grouping.js","sourceRoot":"","sources":["../src/grouping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAS,WAAW,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAA2B,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAEjC,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,KAAK,CAAC;QACnB,KAAK,EAAE,KAAK,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC,CAAC;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,WAAW,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AA8BD;;GAEG;AACH,iBAAe,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0E5H;AAoBD,wBAAsB,eAAe,CACnC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC;IACT,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;CAC7B,CAAC,CAwHD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EAAE,GACxB,cAAc,CA8DhB;AAED,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ToolScoringOutput } from '@aiready/core';
|
|
2
|
+
import type { DuplicatePattern } from './detector';
|
|
3
|
+
/**
|
|
4
|
+
* Calculate AI Readiness Score for pattern duplication (0-100)
|
|
5
|
+
*
|
|
6
|
+
* Based on:
|
|
7
|
+
* - Number of duplicates per file
|
|
8
|
+
* - Token waste per file
|
|
9
|
+
* - High-impact duplicates (>1000 tokens or >70% similarity)
|
|
10
|
+
*/
|
|
11
|
+
export declare function calculatePatternScore(duplicates: DuplicatePattern[], totalFilesAnalyzed: number): ToolScoringOutput;
|
|
12
|
+
//# sourceMappingURL=scoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,gBAAgB,EAAE,EAC9B,kBAAkB,EAAE,MAAM,GACzB,iBAAiB,CAyHnB"}
|
package/dist/scoring.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate AI Readiness Score for pattern duplication (0-100)
|
|
3
|
+
*
|
|
4
|
+
* Based on:
|
|
5
|
+
* - Number of duplicates per file
|
|
6
|
+
* - Token waste per file
|
|
7
|
+
* - High-impact duplicates (>1000 tokens or >70% similarity)
|
|
8
|
+
*/
|
|
9
|
+
export function calculatePatternScore(duplicates, totalFilesAnalyzed) {
|
|
10
|
+
// Calculate raw metrics
|
|
11
|
+
const totalDuplicates = duplicates.length;
|
|
12
|
+
const totalTokenCost = duplicates.reduce((sum, d) => sum + d.tokenCost, 0);
|
|
13
|
+
const highImpactDuplicates = duplicates.filter(d => d.tokenCost > 1000 || d.similarity > 0.7).length;
|
|
14
|
+
// Avoid division by zero
|
|
15
|
+
if (totalFilesAnalyzed === 0) {
|
|
16
|
+
return {
|
|
17
|
+
toolName: 'pattern-detect',
|
|
18
|
+
score: 100,
|
|
19
|
+
rawMetrics: { totalDuplicates: 0, totalTokenCost: 0, highImpactDuplicates: 0, totalFilesAnalyzed: 0 },
|
|
20
|
+
factors: [],
|
|
21
|
+
recommendations: [],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
// Normalize to duplicates per 100 files
|
|
25
|
+
const duplicatesPerFile = (totalDuplicates / totalFilesAnalyzed) * 100;
|
|
26
|
+
// Token waste per file
|
|
27
|
+
const tokenWastePerFile = totalTokenCost / totalFilesAnalyzed;
|
|
28
|
+
// Calculate penalties
|
|
29
|
+
// Duplicates penalty: 0-60 points
|
|
30
|
+
// - 0 duplicates = 0 penalty
|
|
31
|
+
// - 1 duplicate per 10 files (10 per 100) = 6 penalty
|
|
32
|
+
// - 1 duplicate per 5 files (20 per 100) = 12 penalty
|
|
33
|
+
// - 1 duplicate per file (100 per 100) = 60 penalty
|
|
34
|
+
const duplicatesPenalty = Math.min(60, duplicatesPerFile * 0.6);
|
|
35
|
+
// Token waste penalty: 0-40 points
|
|
36
|
+
// - 0 waste = 0 penalty
|
|
37
|
+
// - 1000 tokens/file = 8 penalty
|
|
38
|
+
// - 5000 tokens/file = 40 penalty
|
|
39
|
+
const tokenPenalty = Math.min(40, tokenWastePerFile / 125);
|
|
40
|
+
// High impact adjustment: -15 to +5 points
|
|
41
|
+
// - No high-impact duplicates = +5 bonus
|
|
42
|
+
// - 5+ high-impact duplicates = -10 penalty
|
|
43
|
+
const highImpactPenalty = highImpactDuplicates > 0
|
|
44
|
+
? Math.min(15, highImpactDuplicates * 2 - 5)
|
|
45
|
+
: -5; // bonus
|
|
46
|
+
const score = 100 - duplicatesPenalty - tokenPenalty - highImpactPenalty;
|
|
47
|
+
const finalScore = Math.max(0, Math.min(100, Math.round(score)));
|
|
48
|
+
// Build factors array
|
|
49
|
+
const factors = [
|
|
50
|
+
{
|
|
51
|
+
name: 'Duplication Density',
|
|
52
|
+
impact: -Math.round(duplicatesPenalty),
|
|
53
|
+
description: `${duplicatesPerFile.toFixed(1)} duplicates per 100 files`,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'Token Waste',
|
|
57
|
+
impact: -Math.round(tokenPenalty),
|
|
58
|
+
description: `${Math.round(tokenWastePerFile)} tokens wasted per file`,
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
if (highImpactDuplicates > 0) {
|
|
62
|
+
factors.push({
|
|
63
|
+
name: 'High-Impact Patterns',
|
|
64
|
+
impact: -Math.round(highImpactPenalty),
|
|
65
|
+
description: `${highImpactDuplicates} high-impact duplicates (>1000 tokens or >70% similar)`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
factors.push({
|
|
70
|
+
name: 'No High-Impact Patterns',
|
|
71
|
+
impact: 5,
|
|
72
|
+
description: 'No severe duplicates detected',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Generate recommendations
|
|
76
|
+
const recommendations = [];
|
|
77
|
+
if (highImpactDuplicates > 0) {
|
|
78
|
+
const estimatedImpact = Math.min(15, highImpactDuplicates * 3);
|
|
79
|
+
recommendations.push({
|
|
80
|
+
action: `Deduplicate ${highImpactDuplicates} high-impact pattern${highImpactDuplicates > 1 ? 's' : ''}`,
|
|
81
|
+
estimatedImpact,
|
|
82
|
+
priority: 'high',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (totalDuplicates > 10 && duplicatesPerFile > 20) {
|
|
86
|
+
const estimatedImpact = Math.min(10, Math.round(duplicatesPenalty * 0.3));
|
|
87
|
+
recommendations.push({
|
|
88
|
+
action: 'Extract common patterns into shared utilities',
|
|
89
|
+
estimatedImpact,
|
|
90
|
+
priority: 'medium',
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (tokenWastePerFile > 2000) {
|
|
94
|
+
const estimatedImpact = Math.min(8, Math.round(tokenPenalty * 0.4));
|
|
95
|
+
recommendations.push({
|
|
96
|
+
action: 'Consolidate duplicated logic to reduce AI context waste',
|
|
97
|
+
estimatedImpact,
|
|
98
|
+
priority: totalTokenCost > 10000 ? 'high' : 'medium',
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
toolName: 'pattern-detect',
|
|
103
|
+
score: finalScore,
|
|
104
|
+
rawMetrics: {
|
|
105
|
+
totalDuplicates,
|
|
106
|
+
totalTokenCost,
|
|
107
|
+
highImpactDuplicates,
|
|
108
|
+
totalFilesAnalyzed,
|
|
109
|
+
duplicatesPerFile: Math.round(duplicatesPerFile * 10) / 10,
|
|
110
|
+
tokenWastePerFile: Math.round(tokenWastePerFile),
|
|
111
|
+
},
|
|
112
|
+
factors,
|
|
113
|
+
recommendations,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=scoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiready/pattern-detect",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.6",
|
|
4
4
|
"description": "Semantic duplicate pattern detection for AI-generated code - finds similar implementations that waste AI context tokens",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"commander": "^14.0.0",
|
|
47
47
|
"chalk": "^5.3.0",
|
|
48
|
-
"@aiready/core": "0.9.
|
|
48
|
+
"@aiready/core": "0.9.6"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"tsup": "^8.3.5",
|