@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.
Files changed (41) hide show
  1. package/dist/__tests__/context-rules.test.d.ts +2 -0
  2. package/dist/__tests__/context-rules.test.d.ts.map +1 -0
  3. package/dist/__tests__/context-rules.test.js +189 -0
  4. package/dist/__tests__/context-rules.test.js.map +1 -0
  5. package/dist/__tests__/detector.test.d.ts +2 -0
  6. package/dist/__tests__/detector.test.d.ts.map +1 -0
  7. package/dist/__tests__/detector.test.js +259 -0
  8. package/dist/__tests__/detector.test.js.map +1 -0
  9. package/dist/__tests__/grouping.test.d.ts +2 -0
  10. package/dist/__tests__/grouping.test.d.ts.map +1 -0
  11. package/dist/__tests__/grouping.test.js +443 -0
  12. package/dist/__tests__/grouping.test.js.map +1 -0
  13. package/dist/__tests__/scoring.test.d.ts +2 -0
  14. package/dist/__tests__/scoring.test.d.ts.map +1 -0
  15. package/dist/__tests__/scoring.test.js +102 -0
  16. package/dist/__tests__/scoring.test.js.map +1 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/context-rules.d.ts +41 -0
  20. package/dist/context-rules.d.ts.map +1 -0
  21. package/dist/context-rules.js +225 -0
  22. package/dist/context-rules.js.map +1 -0
  23. package/dist/detector.d.ts +40 -0
  24. package/dist/detector.d.ts.map +1 -0
  25. package/dist/detector.js +385 -0
  26. package/dist/detector.js.map +1 -0
  27. package/dist/extractors/python-extractor.d.ts +19 -0
  28. package/dist/extractors/python-extractor.d.ts.map +1 -0
  29. package/dist/extractors/python-extractor.js +164 -0
  30. package/dist/extractors/python-extractor.js.map +1 -0
  31. package/dist/grouping.d.ts +54 -0
  32. package/dist/grouping.d.ts.map +1 -0
  33. package/dist/grouping.js +347 -0
  34. package/dist/grouping.js.map +1 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/scoring.d.ts +12 -0
  38. package/dist/scoring.d.ts.map +1 -0
  39. package/dist/scoring.js +116 -0
  40. package/dist/scoring.js.map +1 -0
  41. 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"}
@@ -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"}
@@ -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.4",
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.4"
48
+ "@aiready/core": "0.9.6"
49
49
  },
50
50
  "devDependencies": {
51
51
  "tsup": "^8.3.5",