@aiready/pattern-detect 0.16.22 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/analyzer-entry/index.mjs +3 -3
  2. package/dist/chunk-J2G742QF.mjs +162 -0
  3. package/dist/chunk-J5CW6NYY.mjs +64 -0
  4. package/dist/chunk-NQBYYWHJ.mjs +143 -0
  5. package/dist/chunk-SUUZMLPS.mjs +391 -0
  6. package/dist/cli.js +336 -303
  7. package/dist/cli.mjs +347 -303
  8. package/dist/context-rules-entry/index.d.mts +2 -2
  9. package/dist/context-rules-entry/index.d.ts +2 -2
  10. package/dist/context-rules-entry/index.js +2 -25
  11. package/dist/context-rules-entry/index.mjs +1 -1
  12. package/dist/detector-entry/index.mjs +2 -2
  13. package/dist/index-szjQDBsm.d.mts +49 -0
  14. package/dist/index-szjQDBsm.d.ts +49 -0
  15. package/dist/index.d.mts +2 -2
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +4 -25
  18. package/dist/index.mjs +6 -4
  19. package/package.json +2 -2
  20. package/dist/__tests__/context-rules.test.d.ts +0 -2
  21. package/dist/__tests__/context-rules.test.d.ts.map +0 -1
  22. package/dist/__tests__/context-rules.test.js +0 -189
  23. package/dist/__tests__/context-rules.test.js.map +0 -1
  24. package/dist/__tests__/detector.test.d.ts +0 -2
  25. package/dist/__tests__/detector.test.d.ts.map +0 -1
  26. package/dist/__tests__/detector.test.js +0 -259
  27. package/dist/__tests__/detector.test.js.map +0 -1
  28. package/dist/__tests__/grouping.test.d.ts +0 -2
  29. package/dist/__tests__/grouping.test.d.ts.map +0 -1
  30. package/dist/__tests__/grouping.test.js +0 -443
  31. package/dist/__tests__/grouping.test.js.map +0 -1
  32. package/dist/__tests__/scoring.test.d.ts +0 -2
  33. package/dist/__tests__/scoring.test.d.ts.map +0 -1
  34. package/dist/__tests__/scoring.test.js +0 -102
  35. package/dist/__tests__/scoring.test.js.map +0 -1
@@ -1,443 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { groupDuplicatesByFilePair, createRefactorClusters, filterClustersByImpact, } from '../grouping';
3
- describe('grouping utilities', () => {
4
- describe('groupDuplicatesByFilePair', () => {
5
- it('should group duplicates by file pair', () => {
6
- const duplicates = [
7
- {
8
- file1: 'a.ts',
9
- file2: 'b.ts',
10
- line1: 1,
11
- endLine1: 10,
12
- line2: 1,
13
- endLine2: 10,
14
- similarity: 0.95,
15
- patternType: 'function',
16
- tokenCost: 100,
17
- severity: 'critical',
18
- reason: 'Test duplicate',
19
- suggestion: 'Extract to common function',
20
- matchedRule: null,
21
- },
22
- {
23
- file1: 'a.ts',
24
- file2: 'b.ts',
25
- line1: 20,
26
- endLine1: 30,
27
- line2: 20,
28
- endLine2: 30,
29
- similarity: 0.9,
30
- patternType: 'function',
31
- tokenCost: 80,
32
- severity: 'major',
33
- reason: 'Another duplicate',
34
- suggestion: 'Consolidate logic',
35
- matchedRule: null,
36
- },
37
- {
38
- file1: 'c.ts',
39
- file2: 'd.ts',
40
- line1: 1,
41
- endLine1: 5,
42
- line2: 1,
43
- endLine2: 5,
44
- similarity: 0.85,
45
- patternType: 'utility',
46
- tokenCost: 50,
47
- severity: 'minor',
48
- reason: 'Utility duplicate',
49
- suggestion: 'Share utility',
50
- matchedRule: null,
51
- },
52
- ];
53
- const groups = groupDuplicatesByFilePair(duplicates);
54
- expect(groups).toHaveLength(2);
55
- // Find the a.ts::b.ts group
56
- const abGroup = groups.find(g => g.filePair === 'a.ts::b.ts');
57
- expect(abGroup).toBeDefined();
58
- expect(abGroup.occurrences).toBe(2);
59
- expect(abGroup.totalTokenCost).toBe(180);
60
- expect(abGroup.averageSimilarity).toBeCloseTo(0.925, 2);
61
- expect(abGroup.maxSimilarity).toBe(0.95);
62
- expect(abGroup.severity).toBe('critical'); // Highest severity
63
- expect(abGroup.lineRanges).toHaveLength(2);
64
- // Find the c.ts::d.ts group
65
- const cdGroup = groups.find(g => g.filePair === 'c.ts::d.ts');
66
- expect(cdGroup).toBeDefined();
67
- expect(cdGroup.occurrences).toBe(1);
68
- expect(cdGroup.totalTokenCost).toBe(50);
69
- });
70
- it('should normalize file pairs (a::b === b::a)', () => {
71
- const duplicates = [
72
- {
73
- file1: 'a.ts',
74
- file2: 'b.ts',
75
- line1: 1,
76
- endLine1: 10,
77
- line2: 1,
78
- endLine2: 10,
79
- similarity: 0.9,
80
- patternType: 'function',
81
- tokenCost: 100,
82
- severity: 'major',
83
- reason: 'Test',
84
- suggestion: 'Fix',
85
- matchedRule: null,
86
- },
87
- {
88
- file1: 'b.ts',
89
- file2: 'a.ts',
90
- line1: 20,
91
- endLine1: 30,
92
- line2: 20,
93
- endLine2: 30,
94
- similarity: 0.85,
95
- patternType: 'function',
96
- tokenCost: 90,
97
- severity: 'major',
98
- reason: 'Test',
99
- suggestion: 'Fix',
100
- matchedRule: null,
101
- },
102
- ];
103
- const groups = groupDuplicatesByFilePair(duplicates);
104
- expect(groups).toHaveLength(1);
105
- expect(groups[0].occurrences).toBe(2);
106
- expect(groups[0].totalTokenCost).toBe(190);
107
- });
108
- it('should deduplicate overlapping line ranges', () => {
109
- const duplicates = [
110
- {
111
- file1: 'a.ts',
112
- file2: 'b.ts',
113
- line1: 1,
114
- endLine1: 10,
115
- line2: 1,
116
- endLine2: 10,
117
- similarity: 0.95,
118
- patternType: 'function',
119
- tokenCost: 100,
120
- severity: 'critical',
121
- reason: 'Test',
122
- suggestion: 'Fix',
123
- matchedRule: null,
124
- },
125
- {
126
- file1: 'a.ts',
127
- file2: 'b.ts',
128
- line1: 2,
129
- endLine1: 9,
130
- line2: 2,
131
- endLine2: 9,
132
- similarity: 0.8,
133
- patternType: 'function',
134
- tokenCost: 80,
135
- severity: 'major',
136
- reason: 'Test',
137
- suggestion: 'Fix',
138
- matchedRule: null,
139
- },
140
- {
141
- file1: 'a.ts',
142
- file2: 'b.ts',
143
- line1: 8,
144
- endLine1: 15,
145
- line2: 8,
146
- endLine2: 15,
147
- similarity: 0.85,
148
- patternType: 'function',
149
- tokenCost: 90,
150
- severity: 'major',
151
- reason: 'Test',
152
- suggestion: 'Fix',
153
- matchedRule: null,
154
- },
155
- ];
156
- const groups = groupDuplicatesByFilePair(duplicates);
157
- expect(groups).toHaveLength(1);
158
- // Should keep only the highest similarity overlapping ranges
159
- // 1-10 overlaps with 2-9 (keep 1-10, 95%)
160
- // 1-10 overlaps with 8-15 (keep both, different ranges)
161
- expect(groups[0].lineRanges.length).toBeLessThanOrEqual(2);
162
- });
163
- it('should handle empty input', () => {
164
- const groups = groupDuplicatesByFilePair([]);
165
- expect(groups).toHaveLength(0);
166
- });
167
- });
168
- describe('createRefactorClusters', () => {
169
- it('should create blog-seo cluster', () => {
170
- const duplicates = [
171
- {
172
- file1: 'blog/ato-receipt-requirements-2026.tsx',
173
- file2: 'blog/ato-mileage-rates-2026.tsx',
174
- line1: 1,
175
- endLine1: 50,
176
- line2: 1,
177
- endLine2: 50,
178
- similarity: 0.88,
179
- patternType: 'component',
180
- tokenCost: 1500,
181
- severity: 'minor',
182
- reason: 'SEO boilerplate',
183
- suggestion: 'Extract BlogPageLayout',
184
- matchedRule: null,
185
- },
186
- {
187
- file1: 'blog/ato-receipt-requirements-2026.tsx',
188
- file2: 'blog/tax-deductions-2026.tsx',
189
- line1: 1,
190
- endLine1: 50,
191
- line2: 1,
192
- endLine2: 50,
193
- similarity: 0.85,
194
- patternType: 'component',
195
- tokenCost: 1400,
196
- severity: 'minor',
197
- reason: 'SEO boilerplate',
198
- suggestion: 'Extract BlogPageLayout',
199
- matchedRule: null,
200
- },
201
- {
202
- file1: 'blog/ato-mileage-rates-2026.tsx',
203
- file2: 'blog/tax-deductions-2026.tsx',
204
- line1: 1,
205
- endLine1: 50,
206
- line2: 1,
207
- endLine2: 50,
208
- similarity: 0.87,
209
- patternType: 'component',
210
- tokenCost: 1450,
211
- severity: 'minor',
212
- reason: 'SEO boilerplate',
213
- suggestion: 'Extract BlogPageLayout',
214
- matchedRule: null,
215
- },
216
- ];
217
- const clusters = createRefactorClusters(duplicates);
218
- console.log('Created clusters:', clusters.map(c => ({ id: c.id, name: c.name })));
219
- const blogCluster = clusters.find(c => c.id.startsWith('blog-seo'));
220
- expect(blogCluster).toBeDefined();
221
- expect(blogCluster.name).toContain('Blog SEO Boilerplate');
222
- expect(blogCluster.files).toHaveLength(3); // 3 unique files
223
- expect(blogCluster.totalTokenCost).toBe(4350);
224
- expect(blogCluster.suggestion).toContain('BlogPageLayout');
225
- });
226
- it('should create component clusters by category', () => {
227
- const duplicates = [
228
- {
229
- file1: 'components/buttons/PrimaryButton.tsx',
230
- file2: 'components/buttons/SecondaryButton.tsx',
231
- line1: 1,
232
- endLine1: 20,
233
- line2: 1,
234
- endLine2: 20,
235
- similarity: 0.9,
236
- patternType: 'component',
237
- tokenCost: 500,
238
- severity: 'minor',
239
- reason: 'Button pattern',
240
- suggestion: 'Extract BaseButton',
241
- matchedRule: null,
242
- },
243
- {
244
- file1: 'components/buttons/PrimaryButton.tsx',
245
- file2: 'components/buttons/TertiaryButton.tsx',
246
- line1: 1,
247
- endLine1: 20,
248
- line2: 1,
249
- endLine2: 20,
250
- similarity: 0.88,
251
- patternType: 'component',
252
- tokenCost: 480,
253
- severity: 'minor',
254
- reason: 'Button pattern',
255
- suggestion: 'Extract BaseButton',
256
- matchedRule: null,
257
- },
258
- {
259
- file1: 'components/cards/ProductCard.tsx',
260
- file2: 'components/cards/UserCard.tsx',
261
- line1: 1,
262
- endLine1: 30,
263
- line2: 1,
264
- endLine2: 30,
265
- similarity: 0.85,
266
- patternType: 'component',
267
- tokenCost: 600,
268
- severity: 'minor',
269
- reason: 'Card pattern',
270
- suggestion: 'Extract BaseCard',
271
- matchedRule: null,
272
- },
273
- {
274
- file1: 'components/cards/ProductCard.tsx',
275
- file2: 'components/cards/ProfileCard.tsx',
276
- line1: 1,
277
- endLine1: 30,
278
- line2: 1,
279
- endLine2: 30,
280
- similarity: 0.83,
281
- patternType: 'component',
282
- tokenCost: 580,
283
- severity: 'minor',
284
- reason: 'Card pattern',
285
- suggestion: 'Extract BaseCard',
286
- matchedRule: null,
287
- },
288
- ];
289
- const clusters = createRefactorClusters(duplicates);
290
- console.log('Input duplicates:', duplicates.map(d => ({ file1: d.file1, file2: d.file2, type: d.patternType })));
291
- console.log('Created clusters:', clusters.map(c => ({ id: c.id, name: c.name, files: c.files })));
292
- const buttonCluster = clusters.find(c => c.id.includes('button'));
293
- const cardCluster = clusters.find(c => c.id.includes('card'));
294
- expect(buttonCluster).toBeDefined();
295
- expect(buttonCluster.name).toContain('Button');
296
- expect(buttonCluster.files.length).toBeGreaterThanOrEqual(2);
297
- expect(cardCluster).toBeDefined();
298
- expect(cardCluster.name).toContain('Card');
299
- expect(cardCluster.files.length).toBeGreaterThanOrEqual(2);
300
- });
301
- it('should create e2e-test cluster', () => {
302
- const duplicates = [
303
- {
304
- file1: 'e2e/login.test.ts',
305
- file2: 'e2e/signup.test.ts',
306
- line1: 10,
307
- endLine1: 30,
308
- line2: 10,
309
- endLine2: 30,
310
- similarity: 0.92,
311
- patternType: 'function',
312
- tokenCost: 400,
313
- severity: 'minor',
314
- reason: 'Test helpers',
315
- suggestion: 'Extract test utilities',
316
- matchedRule: null,
317
- },
318
- {
319
- file1: 'e2e/login.test.ts',
320
- file2: 'e2e/profile.test.ts',
321
- line1: 10,
322
- endLine1: 30,
323
- line2: 10,
324
- endLine2: 30,
325
- similarity: 0.88,
326
- patternType: 'function',
327
- tokenCost: 380,
328
- severity: 'minor',
329
- reason: 'Test helpers',
330
- suggestion: 'Extract test utilities',
331
- matchedRule: null,
332
- },
333
- ];
334
- const clusters = createRefactorClusters(duplicates);
335
- const e2eCluster = clusters.find(c => c.id === 'e2e-test-patterns');
336
- expect(e2eCluster).toBeDefined();
337
- expect(e2eCluster.name).toContain('E2E Test');
338
- expect(e2eCluster.suggestion).toContain('test utilities');
339
- });
340
- it('should handle empty input', () => {
341
- const clusters = createRefactorClusters([]);
342
- expect(clusters).toHaveLength(0);
343
- });
344
- });
345
- describe('filterClustersByImpact', () => {
346
- it('should filter clusters by minimum token cost', () => {
347
- const duplicates = [
348
- {
349
- file1: 'a.ts',
350
- file2: 'b.ts',
351
- line1: 1,
352
- endLine1: 10,
353
- line2: 1,
354
- endLine2: 10,
355
- similarity: 0.9,
356
- patternType: 'function',
357
- tokenCost: 2000,
358
- severity: 'major',
359
- reason: 'High cost',
360
- suggestion: 'Refactor',
361
- matchedRule: null,
362
- },
363
- {
364
- file1: 'c.ts',
365
- file2: 'd.ts',
366
- line1: 1,
367
- endLine1: 5,
368
- line2: 1,
369
- endLine2: 5,
370
- similarity: 0.8,
371
- patternType: 'utility',
372
- tokenCost: 100,
373
- severity: 'info',
374
- reason: 'Low cost',
375
- suggestion: 'Maybe refactor',
376
- matchedRule: null,
377
- },
378
- ];
379
- const allClusters = createRefactorClusters(duplicates);
380
- const filtered = filterClustersByImpact(allClusters, 1000, 1);
381
- // Only clusters with >= 1000 tokens should remain
382
- expect(filtered.every(c => c.totalTokenCost >= 1000)).toBe(true);
383
- });
384
- it('should filter clusters by minimum file count', () => {
385
- const duplicates = [
386
- {
387
- file1: 'a.ts',
388
- file2: 'b.ts',
389
- line1: 1,
390
- endLine1: 10,
391
- line2: 1,
392
- endLine2: 10,
393
- similarity: 0.9,
394
- patternType: 'function',
395
- tokenCost: 500,
396
- severity: 'major',
397
- reason: 'Test',
398
- suggestion: 'Fix',
399
- matchedRule: null,
400
- },
401
- {
402
- file1: 'a.ts',
403
- file2: 'c.ts',
404
- line1: 1,
405
- endLine1: 10,
406
- line2: 1,
407
- endLine2: 10,
408
- similarity: 0.85,
409
- patternType: 'function',
410
- tokenCost: 500,
411
- severity: 'major',
412
- reason: 'Test',
413
- suggestion: 'Fix',
414
- matchedRule: null,
415
- },
416
- {
417
- file1: 'x.ts',
418
- file2: 'y.ts',
419
- line1: 1,
420
- endLine1: 5,
421
- line2: 1,
422
- endLine2: 5,
423
- similarity: 0.8,
424
- patternType: 'utility',
425
- tokenCost: 500,
426
- severity: 'info',
427
- reason: 'Test',
428
- suggestion: 'Fix',
429
- matchedRule: null,
430
- },
431
- ];
432
- const allClusters = createRefactorClusters(duplicates);
433
- const filtered = filterClustersByImpact(allClusters, 0, 3);
434
- // Only clusters with >= 3 files should remain
435
- expect(filtered.every(c => c.files.length >= 3)).toBe(true);
436
- });
437
- it('should handle empty input', () => {
438
- const filtered = filterClustersByImpact([], 1000, 3);
439
- expect(filtered).toHaveLength(0);
440
- });
441
- });
442
- });
443
- //# sourceMappingURL=grouping.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"grouping.test.js","sourceRoot":"","sources":["../../src/__tests__/grouping.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=scoring.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scoring.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scoring.test.ts"],"names":[],"mappings":""}
@@ -1,102 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { calculatePatternScore } from '../scoring';
3
- describe('Pattern Scoring', () => {
4
- describe('calculatePatternScore', () => {
5
- it('should return perfect score for no duplicates', () => {
6
- const result = calculatePatternScore([], 100);
7
- expect(result.score).toBe(100);
8
- expect(result.toolName).toBe('pattern-detect');
9
- expect(result.rawMetrics.totalDuplicates).toBe(0);
10
- expect(result.recommendations).toHaveLength(0);
11
- });
12
- it('should penalize high duplication density', () => {
13
- const duplicates = Array(50).fill({
14
- file1: 'test1.ts',
15
- file2: 'test2.ts',
16
- line1: 1,
17
- line2: 1,
18
- endLine1: 10,
19
- endLine2: 10,
20
- similarity: 0.8,
21
- code: 'test code',
22
- tokenCost: 500,
23
- });
24
- // 50 duplicates / 10 files = 5 duplicates per file
25
- // duplicatesPenalty = min(60, 5 * 0.6) = 3
26
- const result = calculatePatternScore(duplicates, 10);
27
- expect(result.score).toBeLessThan(100);
28
- expect(result.rawMetrics.totalDuplicates).toBe(50);
29
- expect(result.factors.length).toBeGreaterThan(0);
30
- });
31
- it('should penalize high token waste', () => {
32
- const duplicates = [
33
- {
34
- file1: 'test1.ts',
35
- file2: 'test2.ts',
36
- line1: 1,
37
- line2: 1,
38
- endLine1: 100,
39
- endLine2: 100,
40
- similarity: 0.9,
41
- code: 'test code'.repeat(100),
42
- tokenCost: 5000,
43
- },
44
- ];
45
- const result = calculatePatternScore(duplicates, 1);
46
- expect(result.score).toBeLessThan(90);
47
- expect(result.rawMetrics.totalTokenCost).toBe(5000);
48
- expect(result.recommendations.length).toBeGreaterThan(0);
49
- });
50
- it('should identify high-impact duplicates', () => {
51
- const duplicates = [
52
- {
53
- file1: 'test1.ts',
54
- file2: 'test2.ts',
55
- line1: 1,
56
- line2: 1,
57
- endLine1: 10,
58
- endLine2: 10,
59
- similarity: 0.95, // High similarity
60
- code: 'test code',
61
- tokenCost: 1500, // High token cost
62
- },
63
- {
64
- file1: 'test3.ts',
65
- file2: 'test4.ts',
66
- line1: 1,
67
- line2: 1,
68
- endLine1: 5,
69
- endLine2: 5,
70
- similarity: 0.5,
71
- code: 'test',
72
- tokenCost: 200,
73
- },
74
- ];
75
- const result = calculatePatternScore(duplicates, 10);
76
- expect(result.rawMetrics.highImpactDuplicates).toBe(1);
77
- expect(result.factors.some(f => f.name.includes('High-Impact'))).toBe(true);
78
- });
79
- it('should generate recommendations for severe issues', () => {
80
- const duplicates = Array(100).fill({
81
- file1: 'test.ts',
82
- file2: 'test2.ts',
83
- line1: 1,
84
- line2: 1,
85
- endLine1: 10,
86
- endLine2: 10,
87
- similarity: 0.9,
88
- code: 'test',
89
- tokenCost: 1000,
90
- });
91
- const result = calculatePatternScore(duplicates, 20);
92
- expect(result.recommendations.length).toBeGreaterThan(0);
93
- expect(result.recommendations.some(r => r.priority === 'high')).toBe(true);
94
- });
95
- it('should handle edge case of zero files analyzed', () => {
96
- const duplicates = [];
97
- const result = calculatePatternScore(duplicates, 0);
98
- expect(result.score).toBe(100);
99
- });
100
- });
101
- });
102
- //# sourceMappingURL=scoring.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scoring.test.js","sourceRoot":"","sources":["../../src/__tests__/scoring.test.ts"],"names":[],"mappings":"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"}