@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.
- package/dist/analyzer-entry/index.d.mts +1 -1
- package/dist/analyzer-entry/index.d.ts +1 -1
- package/dist/analyzer-entry/index.js +370 -135
- package/dist/analyzer-entry/index.mjs +4 -3
- package/dist/chunk-2P7BQHGR.mjs +306 -0
- package/dist/{chunk-VGMM3L3O.mjs → chunk-3EORD7DC.mjs} +1 -1
- package/dist/{chunk-GREN7X5H.mjs → chunk-4PVPQMRT.mjs} +2 -2
- package/dist/{chunk-RS73WLNI.mjs → chunk-6VDL7TAS.mjs} +5 -113
- package/dist/chunk-AQIP4JGM.mjs +283 -0
- package/dist/{chunk-JBUZ6YHE.mjs → chunk-B4NLWKPZ.mjs} +85 -9
- package/dist/chunk-IPBGVPUX.mjs +143 -0
- package/dist/chunk-LUUJOUK5.mjs +283 -0
- package/dist/chunk-P3BOCGVV.mjs +498 -0
- package/dist/{scoring-entry.js → chunk-PHJE6A3J.mjs} +20 -37
- package/dist/chunk-PQXOORR4.mjs +234 -0
- package/dist/{chunk-GLKAGFKX.mjs → chunk-RDR75DVI.mjs} +85 -9
- package/dist/chunk-SXVLRPMF.mjs +143 -0
- package/dist/{chunk-DNZS4ESD.mjs → chunk-SY7RX5YQ.mjs} +85 -9
- package/dist/{context-rules-entry.js → chunk-TIBF7KST.mjs} +81 -78
- package/dist/chunk-WYYSQX5M.mjs +467 -0
- package/dist/{chunk-I6ETJC7L.mjs → chunk-X553BOMI.mjs} +56 -26
- package/dist/{chunk-K7BO57OO.mjs → chunk-Y6OB7K34.mjs} +80 -4
- package/dist/chunk-YLVV6YZ5.mjs +143 -0
- package/dist/chunk-ZUWPFVJV.mjs +115 -0
- package/dist/chunk-ZZMONVPE.mjs +467 -0
- package/dist/cli.js +402 -167
- package/dist/cli.mjs +4 -3
- package/dist/context-rules-entry/index.d.mts +35 -1
- package/dist/context-rules-entry/index.d.ts +35 -1
- package/dist/context-rules-entry/index.js +194 -48
- package/dist/context-rules-entry/index.mjs +1 -1
- package/dist/detector-entry/index.js +192 -46
- package/dist/detector-entry/index.mjs +2 -2
- package/dist/{analyzer-entry-BVz-HnZd.d.mts → index-B-pnXpgn.d.mts} +10 -1
- package/dist/{index-BwuoiCNm.d.ts → index-CWgYOKaK.d.ts} +35 -16
- package/dist/{index-BVz-HnZd.d.mts → index-Dl4BrGIT.d.mts} +35 -16
- package/dist/{analyzer-entry-BwuoiCNm.d.ts → index-DqS2e0kK.d.ts} +10 -1
- package/dist/index.d.mts +5 -6
- package/dist/index.d.ts +5 -6
- package/dist/index.js +467 -214
- package/dist/index.mjs +37 -22
- package/dist/scoring-entry/index.js +7 -3
- package/dist/scoring-entry/index.mjs +1 -1
- package/package.json +2 -2
- package/dist/analyzer-entry.d.mts +0 -100
- package/dist/analyzer-entry.d.ts +0 -100
- package/dist/analyzer-entry.js +0 -693
- package/dist/analyzer-entry.mjs +0 -12
- package/dist/chunk-262N2JB7.mjs +0 -497
- package/dist/chunk-2R7HOR5H.mjs +0 -777
- package/dist/chunk-3D7RVGHM.mjs +0 -64
- package/dist/chunk-3LS3E6MO.mjs +0 -508
- package/dist/chunk-3VRQYFW3.mjs +0 -782
- package/dist/chunk-3WK24ZOX.mjs +0 -860
- package/dist/chunk-3YYN6ZXN.mjs +0 -1038
- package/dist/chunk-4BPRGZRG.mjs +0 -1041
- package/dist/chunk-4UHDGB7U.mjs +0 -920
- package/dist/chunk-5LYDB7DY.mjs +0 -771
- package/dist/chunk-65G3HXLQ.mjs +0 -497
- package/dist/chunk-65UQ5J2J.mjs +0 -64
- package/dist/chunk-6JTVOBJX.mjs +0 -64
- package/dist/chunk-6OEHUI5J.mjs +0 -1045
- package/dist/chunk-6YUGU4P4.mjs +0 -914
- package/dist/chunk-7EJGNGXM.mjs +0 -771
- package/dist/chunk-7O2DUBSN.mjs +0 -1058
- package/dist/chunk-7S4AUL5S.mjs +0 -911
- package/dist/chunk-A76JUWER.mjs +0 -786
- package/dist/chunk-AJZUNNFH.mjs +0 -817
- package/dist/chunk-AXHGYYYZ.mjs +0 -404
- package/dist/chunk-BKRPSTT2.mjs +0 -64
- package/dist/chunk-BUBQ3W6W.mjs +0 -980
- package/dist/chunk-CCHM2VLK.mjs +0 -1051
- package/dist/chunk-CHFK6EBT.mjs +0 -419
- package/dist/chunk-CMT3MWWO.mjs +0 -948
- package/dist/chunk-CMWW24HW.mjs +0 -259
- package/dist/chunk-CTDBJP25.mjs +0 -1043
- package/dist/chunk-DGAKXYIP.mjs +0 -1041
- package/dist/chunk-DQSLTL7J.mjs +0 -788
- package/dist/chunk-DR5W7S3Z.mjs +0 -968
- package/dist/chunk-EFUKPMBE.mjs +0 -950
- package/dist/chunk-EVBFDILL.mjs +0 -927
- package/dist/chunk-EXORBAXR.mjs +0 -887
- package/dist/chunk-EZT3NZGB.mjs +0 -1057
- package/dist/chunk-FWUKMJEQ.mjs +0 -1133
- package/dist/chunk-GSJFORRO.mjs +0 -504
- package/dist/chunk-H4ADJYOG.mjs +0 -925
- package/dist/chunk-H5FB2USZ.mjs +0 -762
- package/dist/chunk-H73HEG7M.mjs +0 -670
- package/dist/chunk-HOS5Z2NC.mjs +0 -669
- package/dist/chunk-HXHQOQB5.mjs +0 -508
- package/dist/chunk-INEOYHUM.mjs +0 -911
- package/dist/chunk-INJ4SBTV.mjs +0 -754
- package/dist/chunk-J5CW6NYY.mjs +0 -64
- package/dist/chunk-JAFZCZAP.mjs +0 -776
- package/dist/chunk-JKVKOXYR.mjs +0 -407
- package/dist/chunk-JTHW7EYW.mjs +0 -1041
- package/dist/chunk-JWR3AHKO.mjs +0 -788
- package/dist/chunk-KC2CQMG2.mjs +0 -858
- package/dist/chunk-KDWGWBP5.mjs +0 -832
- package/dist/chunk-KPEK5REL.mjs +0 -919
- package/dist/chunk-KT6O2IAE.mjs +0 -861
- package/dist/chunk-KWMNN3TG.mjs +0 -391
- package/dist/chunk-LUA5FXSZ.mjs +0 -771
- package/dist/chunk-LYKRYBSM.mjs +0 -64
- package/dist/chunk-M4PQMW34.mjs +0 -480
- package/dist/chunk-MH6LBXZF.mjs +0 -816
- package/dist/chunk-MHU3CL4R.mjs +0 -64
- package/dist/chunk-MJWBS6SM.mjs +0 -1058
- package/dist/chunk-OFGMDX66.mjs +0 -402
- package/dist/chunk-P7B6Z4I2.mjs +0 -1043
- package/dist/chunk-PBCXSG7E.mjs +0 -658
- package/dist/chunk-PEEHSFDR.mjs +0 -1058
- package/dist/chunk-PSVG2NLH.mjs +0 -966
- package/dist/chunk-PWNQ6JZW.mjs +0 -508
- package/dist/chunk-QE4E3F7C.mjs +0 -410
- package/dist/chunk-QEP76HGK.mjs +0 -1039
- package/dist/chunk-QX2BQJEO.mjs +0 -1058
- package/dist/chunk-R2S73CVG.mjs +0 -503
- package/dist/chunk-RMGDSNLE.mjs +0 -770
- package/dist/chunk-S2KQFII2.mjs +0 -491
- package/dist/chunk-SLDK5PQK.mjs +0 -1129
- package/dist/chunk-SNSDVGWW.mjs +0 -783
- package/dist/chunk-SUUZMLPS.mjs +0 -391
- package/dist/chunk-SVCSIZ2A.mjs +0 -259
- package/dist/chunk-T2C6WS73.mjs +0 -670
- package/dist/chunk-TCG2G32F.mjs +0 -911
- package/dist/chunk-TGBZP7SB.mjs +0 -773
- package/dist/chunk-THF4RW63.mjs +0 -254
- package/dist/chunk-TJKDLVLN.mjs +0 -503
- package/dist/chunk-TXWPOVYU.mjs +0 -402
- package/dist/chunk-UB3CGOQ7.mjs +0 -64
- package/dist/chunk-UKIKN27B.mjs +0 -950
- package/dist/chunk-V5DP4FP6.mjs +0 -876
- package/dist/chunk-VRMXVYDZ.mjs +0 -419
- package/dist/chunk-WACZ5LFH.mjs +0 -1055
- package/dist/chunk-WC7CBAA7.mjs +0 -1058
- package/dist/chunk-WKBCNITM.mjs +0 -1072
- package/dist/chunk-WMOGJFME.mjs +0 -391
- package/dist/chunk-X4GR2N2M.mjs +0 -947
- package/dist/chunk-XCWY2DQY.mjs +0 -788
- package/dist/chunk-XJD35DS6.mjs +0 -1058
- package/dist/chunk-XNPID6FU.mjs +0 -391
- package/dist/chunk-XUUVS54V.mjs +0 -776
- package/dist/chunk-YCGV65F5.mjs +0 -508
- package/dist/chunk-YJYDBFT3.mjs +0 -780
- package/dist/chunk-YP3HEDQW.mjs +0 -859
- package/dist/chunk-YSDOUNJJ.mjs +0 -1142
- package/dist/chunk-Z6GBFFOV.mjs +0 -1040
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/context-rules-entry-y2uJSngh.d.mts +0 -60
- package/dist/context-rules-entry-y2uJSngh.d.ts +0 -60
- package/dist/context-rules-entry.d.mts +0 -55
- package/dist/context-rules-entry.d.ts +0 -55
- package/dist/context-rules-entry.mjs +0 -12
- package/dist/context-rules.d.ts +0 -41
- package/dist/context-rules.d.ts.map +0 -1
- package/dist/context-rules.js +0 -225
- package/dist/context-rules.js.map +0 -1
- package/dist/detector-entry.d.mts +0 -14
- package/dist/detector-entry.d.ts +0 -14
- package/dist/detector-entry.js +0 -301
- package/dist/detector-entry.mjs +0 -7
- package/dist/detector.d.ts +0 -40
- package/dist/detector.d.ts.map +0 -1
- package/dist/detector.js +0 -385
- package/dist/detector.js.map +0 -1
- package/dist/extractors/python-extractor.d.ts +0 -19
- package/dist/extractors/python-extractor.d.ts.map +0 -1
- package/dist/extractors/python-extractor.js +0 -164
- package/dist/extractors/python-extractor.js.map +0 -1
- package/dist/grouping.d.ts +0 -54
- package/dist/grouping.d.ts.map +0 -1
- package/dist/grouping.js +0 -347
- package/dist/grouping.js.map +0 -1
- package/dist/index-y2uJSngh.d.mts +0 -60
- package/dist/index-y2uJSngh.d.ts +0 -60
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/python-extractor-BGKGX6BK.mjs +0 -131
- package/dist/python-extractor-ELAKYK2W.mjs +0 -140
- package/dist/scoring-entry.d.mts +0 -23
- package/dist/scoring-entry.d.ts +0 -23
- package/dist/scoring-entry.mjs +0 -6
- package/dist/scoring.d.ts +0 -12
- package/dist/scoring.d.ts.map +0 -1
- package/dist/scoring.js +0 -116
- package/dist/scoring.js.map +0 -1
- package/dist/types-C4lmb2Yh.d.mts +0 -36
- package/dist/types-C4lmb2Yh.d.ts +0 -36
package/dist/grouping.d.ts.map
DELETED
|
@@ -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
|
package/dist/grouping.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grouping.js","sourceRoot":"","sources":["../src/grouping.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 };
|
package/dist/index-y2uJSngh.d.ts
DELETED
|
@@ -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 };
|
package/dist/index.d.ts.map
DELETED
|
@@ -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
|
-
};
|