@aiready/pattern-detect 0.17.8 → 0.17.12

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 (190) hide show
  1. package/dist/analyzer-entry/index.d.mts +1 -1
  2. package/dist/analyzer-entry/index.d.ts +1 -1
  3. package/dist/analyzer-entry/index.js +370 -135
  4. package/dist/analyzer-entry/index.mjs +4 -3
  5. package/dist/chunk-2P7BQHGR.mjs +306 -0
  6. package/dist/{chunk-VGMM3L3O.mjs → chunk-3EORD7DC.mjs} +1 -1
  7. package/dist/{chunk-GREN7X5H.mjs → chunk-4PVPQMRT.mjs} +2 -2
  8. package/dist/{chunk-RS73WLNI.mjs → chunk-6VDL7TAS.mjs} +5 -113
  9. package/dist/chunk-AQIP4JGM.mjs +283 -0
  10. package/dist/{chunk-JBUZ6YHE.mjs → chunk-B4NLWKPZ.mjs} +85 -9
  11. package/dist/chunk-IPBGVPUX.mjs +143 -0
  12. package/dist/chunk-LUUJOUK5.mjs +283 -0
  13. package/dist/chunk-P3BOCGVV.mjs +498 -0
  14. package/dist/{scoring-entry.js → chunk-PHJE6A3J.mjs} +20 -37
  15. package/dist/chunk-PQXOORR4.mjs +234 -0
  16. package/dist/{chunk-GLKAGFKX.mjs → chunk-RDR75DVI.mjs} +85 -9
  17. package/dist/chunk-SXVLRPMF.mjs +143 -0
  18. package/dist/{chunk-DNZS4ESD.mjs → chunk-SY7RX5YQ.mjs} +85 -9
  19. package/dist/{context-rules-entry.js → chunk-TIBF7KST.mjs} +81 -78
  20. package/dist/chunk-WYYSQX5M.mjs +467 -0
  21. package/dist/{chunk-I6ETJC7L.mjs → chunk-X553BOMI.mjs} +56 -26
  22. package/dist/{chunk-K7BO57OO.mjs → chunk-Y6OB7K34.mjs} +80 -4
  23. package/dist/chunk-YLVV6YZ5.mjs +143 -0
  24. package/dist/chunk-ZUWPFVJV.mjs +115 -0
  25. package/dist/chunk-ZZMONVPE.mjs +467 -0
  26. package/dist/cli.js +402 -167
  27. package/dist/cli.mjs +4 -3
  28. package/dist/context-rules-entry/index.d.mts +35 -1
  29. package/dist/context-rules-entry/index.d.ts +35 -1
  30. package/dist/context-rules-entry/index.js +194 -48
  31. package/dist/context-rules-entry/index.mjs +1 -1
  32. package/dist/detector-entry/index.js +192 -46
  33. package/dist/detector-entry/index.mjs +2 -2
  34. package/dist/{analyzer-entry-BVz-HnZd.d.mts → index-B-pnXpgn.d.mts} +10 -1
  35. package/dist/{index-BwuoiCNm.d.ts → index-CWgYOKaK.d.ts} +35 -16
  36. package/dist/{index-BVz-HnZd.d.mts → index-Dl4BrGIT.d.mts} +35 -16
  37. package/dist/{analyzer-entry-BwuoiCNm.d.ts → index-DqS2e0kK.d.ts} +10 -1
  38. package/dist/index.d.mts +5 -6
  39. package/dist/index.d.ts +5 -6
  40. package/dist/index.js +467 -214
  41. package/dist/index.mjs +37 -22
  42. package/dist/scoring-entry/index.js +7 -3
  43. package/dist/scoring-entry/index.mjs +1 -1
  44. package/package.json +2 -2
  45. package/dist/analyzer-entry.d.mts +0 -100
  46. package/dist/analyzer-entry.d.ts +0 -100
  47. package/dist/analyzer-entry.js +0 -693
  48. package/dist/analyzer-entry.mjs +0 -12
  49. package/dist/chunk-262N2JB7.mjs +0 -497
  50. package/dist/chunk-2R7HOR5H.mjs +0 -777
  51. package/dist/chunk-3D7RVGHM.mjs +0 -64
  52. package/dist/chunk-3LS3E6MO.mjs +0 -508
  53. package/dist/chunk-3VRQYFW3.mjs +0 -782
  54. package/dist/chunk-3WK24ZOX.mjs +0 -860
  55. package/dist/chunk-3YYN6ZXN.mjs +0 -1038
  56. package/dist/chunk-4BPRGZRG.mjs +0 -1041
  57. package/dist/chunk-4UHDGB7U.mjs +0 -920
  58. package/dist/chunk-5LYDB7DY.mjs +0 -771
  59. package/dist/chunk-65G3HXLQ.mjs +0 -497
  60. package/dist/chunk-65UQ5J2J.mjs +0 -64
  61. package/dist/chunk-6JTVOBJX.mjs +0 -64
  62. package/dist/chunk-6OEHUI5J.mjs +0 -1045
  63. package/dist/chunk-6YUGU4P4.mjs +0 -914
  64. package/dist/chunk-7EJGNGXM.mjs +0 -771
  65. package/dist/chunk-7O2DUBSN.mjs +0 -1058
  66. package/dist/chunk-7S4AUL5S.mjs +0 -911
  67. package/dist/chunk-A76JUWER.mjs +0 -786
  68. package/dist/chunk-AJZUNNFH.mjs +0 -817
  69. package/dist/chunk-AXHGYYYZ.mjs +0 -404
  70. package/dist/chunk-BKRPSTT2.mjs +0 -64
  71. package/dist/chunk-BUBQ3W6W.mjs +0 -980
  72. package/dist/chunk-CCHM2VLK.mjs +0 -1051
  73. package/dist/chunk-CHFK6EBT.mjs +0 -419
  74. package/dist/chunk-CMT3MWWO.mjs +0 -948
  75. package/dist/chunk-CMWW24HW.mjs +0 -259
  76. package/dist/chunk-CTDBJP25.mjs +0 -1043
  77. package/dist/chunk-DGAKXYIP.mjs +0 -1041
  78. package/dist/chunk-DQSLTL7J.mjs +0 -788
  79. package/dist/chunk-DR5W7S3Z.mjs +0 -968
  80. package/dist/chunk-EFUKPMBE.mjs +0 -950
  81. package/dist/chunk-EVBFDILL.mjs +0 -927
  82. package/dist/chunk-EXORBAXR.mjs +0 -887
  83. package/dist/chunk-EZT3NZGB.mjs +0 -1057
  84. package/dist/chunk-FWUKMJEQ.mjs +0 -1133
  85. package/dist/chunk-GSJFORRO.mjs +0 -504
  86. package/dist/chunk-H4ADJYOG.mjs +0 -925
  87. package/dist/chunk-H5FB2USZ.mjs +0 -762
  88. package/dist/chunk-H73HEG7M.mjs +0 -670
  89. package/dist/chunk-HOS5Z2NC.mjs +0 -669
  90. package/dist/chunk-HXHQOQB5.mjs +0 -508
  91. package/dist/chunk-INEOYHUM.mjs +0 -911
  92. package/dist/chunk-INJ4SBTV.mjs +0 -754
  93. package/dist/chunk-J5CW6NYY.mjs +0 -64
  94. package/dist/chunk-JAFZCZAP.mjs +0 -776
  95. package/dist/chunk-JKVKOXYR.mjs +0 -407
  96. package/dist/chunk-JTHW7EYW.mjs +0 -1041
  97. package/dist/chunk-JWR3AHKO.mjs +0 -788
  98. package/dist/chunk-KC2CQMG2.mjs +0 -858
  99. package/dist/chunk-KDWGWBP5.mjs +0 -832
  100. package/dist/chunk-KPEK5REL.mjs +0 -919
  101. package/dist/chunk-KT6O2IAE.mjs +0 -861
  102. package/dist/chunk-KWMNN3TG.mjs +0 -391
  103. package/dist/chunk-LUA5FXSZ.mjs +0 -771
  104. package/dist/chunk-LYKRYBSM.mjs +0 -64
  105. package/dist/chunk-M4PQMW34.mjs +0 -480
  106. package/dist/chunk-MH6LBXZF.mjs +0 -816
  107. package/dist/chunk-MHU3CL4R.mjs +0 -64
  108. package/dist/chunk-MJWBS6SM.mjs +0 -1058
  109. package/dist/chunk-OFGMDX66.mjs +0 -402
  110. package/dist/chunk-P7B6Z4I2.mjs +0 -1043
  111. package/dist/chunk-PBCXSG7E.mjs +0 -658
  112. package/dist/chunk-PEEHSFDR.mjs +0 -1058
  113. package/dist/chunk-PSVG2NLH.mjs +0 -966
  114. package/dist/chunk-PWNQ6JZW.mjs +0 -508
  115. package/dist/chunk-QE4E3F7C.mjs +0 -410
  116. package/dist/chunk-QEP76HGK.mjs +0 -1039
  117. package/dist/chunk-QX2BQJEO.mjs +0 -1058
  118. package/dist/chunk-R2S73CVG.mjs +0 -503
  119. package/dist/chunk-RMGDSNLE.mjs +0 -770
  120. package/dist/chunk-S2KQFII2.mjs +0 -491
  121. package/dist/chunk-SLDK5PQK.mjs +0 -1129
  122. package/dist/chunk-SNSDVGWW.mjs +0 -783
  123. package/dist/chunk-SUUZMLPS.mjs +0 -391
  124. package/dist/chunk-SVCSIZ2A.mjs +0 -259
  125. package/dist/chunk-T2C6WS73.mjs +0 -670
  126. package/dist/chunk-TCG2G32F.mjs +0 -911
  127. package/dist/chunk-TGBZP7SB.mjs +0 -773
  128. package/dist/chunk-THF4RW63.mjs +0 -254
  129. package/dist/chunk-TJKDLVLN.mjs +0 -503
  130. package/dist/chunk-TXWPOVYU.mjs +0 -402
  131. package/dist/chunk-UB3CGOQ7.mjs +0 -64
  132. package/dist/chunk-UKIKN27B.mjs +0 -950
  133. package/dist/chunk-V5DP4FP6.mjs +0 -876
  134. package/dist/chunk-VRMXVYDZ.mjs +0 -419
  135. package/dist/chunk-WACZ5LFH.mjs +0 -1055
  136. package/dist/chunk-WC7CBAA7.mjs +0 -1058
  137. package/dist/chunk-WKBCNITM.mjs +0 -1072
  138. package/dist/chunk-WMOGJFME.mjs +0 -391
  139. package/dist/chunk-X4GR2N2M.mjs +0 -947
  140. package/dist/chunk-XCWY2DQY.mjs +0 -788
  141. package/dist/chunk-XJD35DS6.mjs +0 -1058
  142. package/dist/chunk-XNPID6FU.mjs +0 -391
  143. package/dist/chunk-XUUVS54V.mjs +0 -776
  144. package/dist/chunk-YCGV65F5.mjs +0 -508
  145. package/dist/chunk-YJYDBFT3.mjs +0 -780
  146. package/dist/chunk-YP3HEDQW.mjs +0 -859
  147. package/dist/chunk-YSDOUNJJ.mjs +0 -1142
  148. package/dist/chunk-Z6GBFFOV.mjs +0 -1040
  149. package/dist/cli.d.ts.map +0 -1
  150. package/dist/cli.js.map +0 -1
  151. package/dist/context-rules-entry-y2uJSngh.d.mts +0 -60
  152. package/dist/context-rules-entry-y2uJSngh.d.ts +0 -60
  153. package/dist/context-rules-entry.d.mts +0 -55
  154. package/dist/context-rules-entry.d.ts +0 -55
  155. package/dist/context-rules-entry.mjs +0 -12
  156. package/dist/context-rules.d.ts +0 -41
  157. package/dist/context-rules.d.ts.map +0 -1
  158. package/dist/context-rules.js +0 -225
  159. package/dist/context-rules.js.map +0 -1
  160. package/dist/detector-entry.d.mts +0 -14
  161. package/dist/detector-entry.d.ts +0 -14
  162. package/dist/detector-entry.js +0 -301
  163. package/dist/detector-entry.mjs +0 -7
  164. package/dist/detector.d.ts +0 -40
  165. package/dist/detector.d.ts.map +0 -1
  166. package/dist/detector.js +0 -385
  167. package/dist/detector.js.map +0 -1
  168. package/dist/extractors/python-extractor.d.ts +0 -19
  169. package/dist/extractors/python-extractor.d.ts.map +0 -1
  170. package/dist/extractors/python-extractor.js +0 -164
  171. package/dist/extractors/python-extractor.js.map +0 -1
  172. package/dist/grouping.d.ts +0 -54
  173. package/dist/grouping.d.ts.map +0 -1
  174. package/dist/grouping.js +0 -347
  175. package/dist/grouping.js.map +0 -1
  176. package/dist/index-y2uJSngh.d.mts +0 -60
  177. package/dist/index-y2uJSngh.d.ts +0 -60
  178. package/dist/index.d.ts.map +0 -1
  179. package/dist/index.js.map +0 -1
  180. package/dist/python-extractor-BGKGX6BK.mjs +0 -131
  181. package/dist/python-extractor-ELAKYK2W.mjs +0 -140
  182. package/dist/scoring-entry.d.mts +0 -23
  183. package/dist/scoring-entry.d.ts +0 -23
  184. package/dist/scoring-entry.mjs +0 -6
  185. package/dist/scoring.d.ts +0 -12
  186. package/dist/scoring.d.ts.map +0 -1
  187. package/dist/scoring.js +0 -116
  188. package/dist/scoring.js.map +0 -1
  189. package/dist/types-C4lmb2Yh.d.mts +0 -36
  190. package/dist/types-C4lmb2Yh.d.ts +0 -36
@@ -1 +0,0 @@
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 DELETED
@@ -1,347 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"grouping.js","sourceRoot":"","sources":["../src/grouping.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiCH;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAAa,EAAE,KAAa;IACrD,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACpB,MAAc,EACd,IAAY,EACZ,MAAc,EACd,IAAY,EACZ,YAAoB,CAAC;IAErB,4CAA4C;IAC5C,OAAO,MAAM,IAAI,IAAI,GAAG,SAAS,IAAI,MAAM,IAAI,IAAI,GAAG,SAAS,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,UAA8B;IAE9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IAErD,qBAAqB;IACrB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,oDAAoD;IACpD,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,sCAAsC;QACtC,MAAM,YAAY,GAAG,4BAA4B,CAAC,SAAS,CAAC,CAAC;QAE7D,8BAA8B;QAC9B,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,iBAAiB,GACrB,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;QAC/E,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAEzE,gCAAgC;QAChC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzE,+BAA+B;QAC/B,MAAM,WAAW,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAE3D,sBAAsB;QACtB,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;YAC1C,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;SAC3C,CAAC,CAAC,CAAC;QAEJ,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ;YACR,UAAU,EAAE,YAAY;YACxB,cAAc;YACd,iBAAiB;YACjB,aAAa;YACb,QAAQ;YACR,WAAW;YACX,WAAW,EAAE,YAAY,CAAC,MAAM;YAChC,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,SAAS,4BAA4B,CACnC,UAA8B;IAE9B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,iDAAiD;IACjD,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3C,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QAClD,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,IAAI,OAAO,GAA4B,IAAI,CAAC;IAE5C,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,GAAG,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QAED,gDAAgD;QAChD,MAAM,aAAa,GAAG,aAAa,CACjC,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,QAAQ,EAChB,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,QAAQ,CACb,CAAC;QACF,MAAM,aAAa,GAAG,aAAa,CACjC,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,QAAQ,EAChB,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,QAAQ,CACb,CAAC;QAEF,IAAI,aAAa,IAAI,aAAa,EAAE,CAAC;YACnC,0DAA0D;YAC1D,uCAAuC;YACvC,OAAO,GAAG;gBACR,GAAG,OAAO;gBACV,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC;gBAClD,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC;gBAClD,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC;aACtD,CAAC;YACF,mBAAmB;YACnB,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,OAAO,GAAG,GAAG,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAA8B;IAE9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEvD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1D,+DAA+D;QAC/D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAErC,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,iBAAiB,GACrB,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;QAC7E,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxE,MAAM,WAAW,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAE1D,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzE,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,KAAK;YACL,WAAW;YACX,QAAQ;YACR,cAAc;YACd,iBAAiB;YACjB,cAAc,EAAE,WAAW,CAAC,MAAM;YAClC,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,MAAM,EAAE,WAAW,CAAC,MAAM;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAqB;IAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAEtC,wBAAwB;IACxB,IACE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACxH,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EACxH,CAAC;QACD,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED,qBAAqB;IACrB,IACE,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACnE,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACnE,GAAG,CAAC,WAAW,KAAK,WAAW,EAC/B,CAAC;QACD,sDAAsD;QACtD,yEAAyE;QACzE,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAC,KAAK,OAAO,UAAU,KAAK,GAAG,CAAC,KAAK,OAAO,UAAU,EAAE,CAAC,CAAC;QAC7F,IAAI,UAAU,IAAI,UAAU,IAAI,oBAAoB,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;YAC7E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;YACvD,OAAO,aAAa,QAAQ,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IACE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChF,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAChF,CAAC;QACD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,uBAAuB;IACvB,IAAI,GAAG,CAAC,WAAW,KAAK,aAAa,EAAE,CAAC;QACtC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,qBAAqB;IACrB,IAAI,GAAG,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,yBAAyB;IACzB,IACE,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxH,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EACxH,CAAC;QACD,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAED,iCAAiC;IACjC,OAAO,GAAG,GAAG,CAAC,WAAW,WAAW,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,KAAa,EAAE,KAAa;IACxD,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,SAAS,KAAK,SAAS,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAE1B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IACtE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACrE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IACpE,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,YAAY,CAAC;IACvE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAExE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,UAA8B;IACpD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,UAAsB;IAChD,MAAM,KAAK,GAA6B;QACtC,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,CAAC;KACR,CAAC;IAEF,IAAI,OAAO,GAAa,MAAM,CAAC;IAC/B,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,YAAY,EAAE,CAAC;YACnC,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,GAAG,QAAQ,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,UAA8B;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE9C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,UAAU,GAAgB,SAAS,CAAC;IACxC,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACrB,QAAQ,GAAG,KAAK,CAAC;YACjB,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,SAAiB,EACjB,WAAwB,EACxB,SAAiB;IAEjB,MAAM,SAAS,GACb;QACE,sBAAsB,EAAE;YACtB,IAAI,EAAE,yBAAyB,SAAS,SAAS;YACjD,UAAU,EACR,uGAAuG;YACzG,MAAM,EAAE,sFAAsF;SAC/F;QACD,mBAAmB,EAAE;YACnB,IAAI,EAAE,sBAAsB,SAAS,SAAS;YAC9C,UAAU,EACR,iFAAiF;YACnF,MAAM,EAAE,oFAAoF;SAC7F;QACD,cAAc,EAAE;YACd,IAAI,EAAE,yBAAyB,SAAS,SAAS;YACjD,UAAU,EAAE,oEAAoE;YAChF,MAAM,EAAE,mFAAmF;SAC5F;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,uBAAuB,SAAS,SAAS;YAC/C,UAAU,EAAE,yEAAyE;YACrF,MAAM,EAAE,6EAA6E;SACtF;QACD,wBAAwB,EAAE;YACxB,IAAI,EAAE,2BAA2B,SAAS,SAAS;YACnD,UAAU,EAAE,oEAAoE;YAChF,MAAM,EAAE,6FAA6F;SACtG;QACD,kBAAkB,EAAE;YAClB,IAAI,EAAE,8BAA8B,SAAS,SAAS;YACtD,UAAU,EAAE,oDAAoD;YAChE,MAAM,EAAE,gEAAgE;SACzE;QACD,gBAAgB,EAAE;YAChB,IAAI,EAAE,4BAA4B,SAAS,SAAS;YACpD,UAAU,EAAE,wDAAwD;YACpE,MAAM,EAAE,yDAAyD;SAClE;QACD,iBAAiB,EAAE;YACjB,IAAI,EAAE,6BAA6B,SAAS,SAAS;YACrD,UAAU,EAAE,uDAAuD;YACnE,MAAM,EAAE,yEAAyE;SAClF;KACF,CAAC;IAEJ,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAED,mBAAmB;IACnB,OAAO;QACL,IAAI,EAAE,GAAG,WAAW,aAAa,SAAS,SAAS;QACnD,UAAU,EAAE,kBAAkB,WAAW,iCAAiC;QAC1E,MAAM,EAAE,oBAAoB,WAAW,6BAA6B,SAAS,QAAQ;KACtF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAA2B,EAC3B,eAAuB,IAAI,EAC3B,eAAuB,CAAC;IAExB,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,IAAI,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,YAAY,CAC5F,CAAC;AACJ,CAAC"}
@@ -1,60 +0,0 @@
1
- import { Severity } from '@aiready/core';
2
-
3
- /**
4
- * Context-aware severity detection for duplicate patterns
5
- * Identifies intentional duplication patterns and adjusts severity accordingly
6
- */
7
- interface ContextRule {
8
- name: string;
9
- detect: (file: string, code: string) => boolean;
10
- severity: Severity;
11
- reason: string;
12
- suggestion?: string;
13
- }
14
- /**
15
- * Context rules for detecting intentional or acceptable duplication patterns
16
- * Rules are checked in order - first match wins
17
- */
18
- declare const CONTEXT_RULES: ContextRule[];
19
- /**
20
- * Calculate severity based on context rules and code characteristics
21
- *
22
- * @param file1 - First file path in the duplicate pair.
23
- * @param file2 - Second file path in the duplicate pair.
24
- * @param code - Snippet of the duplicated code.
25
- * @param similarity - The calculated similarity score (0-1).
26
- * @param linesOfCode - Number of lines in the duplicated block.
27
- * @returns An object containing the severity level and reasoning.
28
- */
29
- declare function calculateSeverity(file1: string, file2: string, code: string, similarity: number, linesOfCode: number): {
30
- severity: Severity;
31
- reason?: string;
32
- suggestion?: string;
33
- matchedRule?: string;
34
- };
35
- /**
36
- * Get a human-readable severity label with emoji
37
- *
38
- * @param severity - The severity level to label.
39
- * @returns Formatted label string for UI display.
40
- */
41
- declare function getSeverityLabel(severity: Severity): string;
42
- /**
43
- * Filter duplicates by minimum severity threshold
44
- *
45
- * @param duplicates - List of items with a severity property.
46
- * @param minSeverity - Minimum threshold for inclusion.
47
- * @returns Filtered list of items.
48
- */
49
- declare function filterBySeverity<T extends {
50
- severity: Severity;
51
- }>(duplicates: T[], minSeverity: Severity): T[];
52
- /**
53
- * Get numerical similarity threshold associated with a severity level
54
- *
55
- * @param severity - The severity level to look up.
56
- * @returns Minimum similarity value for this severity.
57
- */
58
- declare function getSeverityThreshold(severity: Severity): number;
59
-
60
- export { CONTEXT_RULES as C, type ContextRule as a, getSeverityThreshold as b, calculateSeverity as c, filterBySeverity as f, getSeverityLabel as g };
@@ -1,60 +0,0 @@
1
- import { Severity } from '@aiready/core';
2
-
3
- /**
4
- * Context-aware severity detection for duplicate patterns
5
- * Identifies intentional duplication patterns and adjusts severity accordingly
6
- */
7
- interface ContextRule {
8
- name: string;
9
- detect: (file: string, code: string) => boolean;
10
- severity: Severity;
11
- reason: string;
12
- suggestion?: string;
13
- }
14
- /**
15
- * Context rules for detecting intentional or acceptable duplication patterns
16
- * Rules are checked in order - first match wins
17
- */
18
- declare const CONTEXT_RULES: ContextRule[];
19
- /**
20
- * Calculate severity based on context rules and code characteristics
21
- *
22
- * @param file1 - First file path in the duplicate pair.
23
- * @param file2 - Second file path in the duplicate pair.
24
- * @param code - Snippet of the duplicated code.
25
- * @param similarity - The calculated similarity score (0-1).
26
- * @param linesOfCode - Number of lines in the duplicated block.
27
- * @returns An object containing the severity level and reasoning.
28
- */
29
- declare function calculateSeverity(file1: string, file2: string, code: string, similarity: number, linesOfCode: number): {
30
- severity: Severity;
31
- reason?: string;
32
- suggestion?: string;
33
- matchedRule?: string;
34
- };
35
- /**
36
- * Get a human-readable severity label with emoji
37
- *
38
- * @param severity - The severity level to label.
39
- * @returns Formatted label string for UI display.
40
- */
41
- declare function getSeverityLabel(severity: Severity): string;
42
- /**
43
- * Filter duplicates by minimum severity threshold
44
- *
45
- * @param duplicates - List of items with a severity property.
46
- * @param minSeverity - Minimum threshold for inclusion.
47
- * @returns Filtered list of items.
48
- */
49
- declare function filterBySeverity<T extends {
50
- severity: Severity;
51
- }>(duplicates: T[], minSeverity: Severity): T[];
52
- /**
53
- * Get numerical similarity threshold associated with a severity level
54
- *
55
- * @param severity - The severity level to look up.
56
- * @returns Minimum similarity value for this severity.
57
- */
58
- declare function getSeverityThreshold(severity: Severity): number;
59
-
60
- export { CONTEXT_RULES as C, type ContextRule as a, getSeverityThreshold as b, calculateSeverity as c, filterBySeverity as f, getSeverityLabel as g };
@@ -1 +0,0 @@
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"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,131 +0,0 @@
1
- // src/extractors/python-extractor.ts
2
- import { getParser } from "@aiready/core";
3
- async function extractPythonPatterns(files) {
4
- const patterns = [];
5
- const parser = getParser("dummy.py");
6
- if (!parser) {
7
- console.warn("Python parser not available");
8
- return patterns;
9
- }
10
- const pythonFiles = files.filter((f) => f.toLowerCase().endsWith(".py"));
11
- for (const file of pythonFiles) {
12
- try {
13
- const fs = await import("fs");
14
- const code = await fs.promises.readFile(file, "utf-8");
15
- const result = parser.parse(code, file);
16
- for (const exp of result.exports) {
17
- if (exp.type === "function") {
18
- patterns.push({
19
- file,
20
- name: exp.name,
21
- type: "function",
22
- startLine: exp.loc?.start.line || 0,
23
- endLine: exp.loc?.end.line || 0,
24
- imports: exp.imports || [],
25
- dependencies: exp.dependencies || [],
26
- signature: generatePythonSignature(exp),
27
- language: "python"
28
- });
29
- } else if (exp.type === "class") {
30
- patterns.push({
31
- file,
32
- name: exp.name,
33
- type: "class",
34
- startLine: exp.loc?.start.line || 0,
35
- endLine: exp.loc?.end.line || 0,
36
- imports: exp.imports || [],
37
- dependencies: exp.dependencies || [],
38
- signature: `class ${exp.name}`,
39
- language: "python"
40
- });
41
- }
42
- }
43
- } catch (error) {
44
- console.warn(`Failed to extract patterns from ${file}:`, error);
45
- }
46
- }
47
- return patterns;
48
- }
49
- function generatePythonSignature(exp) {
50
- const params = exp.parameters?.join(", ") || "";
51
- return `def ${exp.name}(${params})`;
52
- }
53
- function calculatePythonSimilarity(pattern1, pattern2) {
54
- let similarity = 0;
55
- let factors = 0;
56
- const nameSimilarity = calculateNameSimilarity(pattern1.name, pattern2.name);
57
- similarity += nameSimilarity * 0.3;
58
- factors += 0.3;
59
- const importSimilarity = calculateImportSimilarity(
60
- pattern1.imports || [],
61
- pattern2.imports || []
62
- );
63
- similarity += importSimilarity * 0.4;
64
- factors += 0.4;
65
- if (pattern1.type === pattern2.type) {
66
- similarity += 0.1;
67
- }
68
- factors += 0.1;
69
- const sigSimilarity = calculateSignatureSimilarity(
70
- pattern1.signature,
71
- pattern2.signature
72
- );
73
- similarity += sigSimilarity * 0.2;
74
- factors += 0.2;
75
- return factors > 0 ? similarity / factors : 0;
76
- }
77
- function calculateNameSimilarity(name1, name2) {
78
- if (name1 === name2) return 1;
79
- const clean1 = name1.replace(/^(get|set|is|has|create|delete|update|fetch)_?/, "");
80
- const clean2 = name2.replace(/^(get|set|is|has|create|delete|update|fetch)_?/, "");
81
- if (clean1 === clean2) return 0.9;
82
- if (clean1.includes(clean2) || clean2.includes(clean1)) {
83
- return 0.7;
84
- }
85
- const set1 = new Set(clean1.split("_"));
86
- const set2 = new Set(clean2.split("_"));
87
- const intersection = new Set([...set1].filter((x) => set2.has(x)));
88
- const union = /* @__PURE__ */ new Set([...set1, ...set2]);
89
- return intersection.size / union.size;
90
- }
91
- function calculateImportSimilarity(imports1, imports2) {
92
- if (imports1.length === 0 && imports2.length === 0) return 1;
93
- if (imports1.length === 0 || imports2.length === 0) return 0;
94
- const set1 = new Set(imports1);
95
- const set2 = new Set(imports2);
96
- const intersection = new Set([...set1].filter((x) => set2.has(x)));
97
- const union = /* @__PURE__ */ new Set([...set1, ...set2]);
98
- return intersection.size / union.size;
99
- }
100
- function calculateSignatureSimilarity(sig1, sig2) {
101
- if (sig1 === sig2) return 1;
102
- const params1 = (sig1.match(/\([^)]*\)/)?.[0] || "").split(",").filter(Boolean).length;
103
- const params2 = (sig2.match(/\([^)]*\)/)?.[0] || "").split(",").filter(Boolean).length;
104
- if (params1 === params2) return 0.8;
105
- if (Math.abs(params1 - params2) === 1) return 0.5;
106
- return 0;
107
- }
108
- function detectPythonAntiPatterns(patterns) {
109
- const antiPatterns = [];
110
- const nameGroups = /* @__PURE__ */ new Map();
111
- for (const pattern of patterns) {
112
- const baseName = pattern.name.replace(/^(get|set|create|delete|update)_/, "");
113
- if (!nameGroups.has(baseName)) {
114
- nameGroups.set(baseName, []);
115
- }
116
- nameGroups.get(baseName).push(pattern);
117
- }
118
- for (const [baseName, group] of nameGroups) {
119
- if (group.length >= 3) {
120
- antiPatterns.push(
121
- `Found ${group.length} functions with similar names (${baseName}): Consider consolidating`
122
- );
123
- }
124
- }
125
- return antiPatterns;
126
- }
127
- export {
128
- calculatePythonSimilarity,
129
- detectPythonAntiPatterns,
130
- extractPythonPatterns
131
- };