@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
|
@@ -1,140 +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(
|
|
80
|
-
/^(get|set|is|has|create|delete|update|fetch)_?/,
|
|
81
|
-
""
|
|
82
|
-
);
|
|
83
|
-
const clean2 = name2.replace(
|
|
84
|
-
/^(get|set|is|has|create|delete|update|fetch)_?/,
|
|
85
|
-
""
|
|
86
|
-
);
|
|
87
|
-
if (clean1 === clean2) return 0.9;
|
|
88
|
-
if (clean1.includes(clean2) || clean2.includes(clean1)) {
|
|
89
|
-
return 0.7;
|
|
90
|
-
}
|
|
91
|
-
const set1 = new Set(clean1.split("_"));
|
|
92
|
-
const set2 = new Set(clean2.split("_"));
|
|
93
|
-
const intersection = new Set([...set1].filter((x) => set2.has(x)));
|
|
94
|
-
const union = /* @__PURE__ */ new Set([...set1, ...set2]);
|
|
95
|
-
return intersection.size / union.size;
|
|
96
|
-
}
|
|
97
|
-
function calculateImportSimilarity(imports1, imports2) {
|
|
98
|
-
if (imports1.length === 0 && imports2.length === 0) return 1;
|
|
99
|
-
if (imports1.length === 0 || imports2.length === 0) return 0;
|
|
100
|
-
const set1 = new Set(imports1);
|
|
101
|
-
const set2 = new Set(imports2);
|
|
102
|
-
const intersection = new Set([...set1].filter((x) => set2.has(x)));
|
|
103
|
-
const union = /* @__PURE__ */ new Set([...set1, ...set2]);
|
|
104
|
-
return intersection.size / union.size;
|
|
105
|
-
}
|
|
106
|
-
function calculateSignatureSimilarity(sig1, sig2) {
|
|
107
|
-
if (sig1 === sig2) return 1;
|
|
108
|
-
const params1 = (sig1.match(/\([^)]*\)/)?.[0] || "").split(",").filter(Boolean).length;
|
|
109
|
-
const params2 = (sig2.match(/\([^)]*\)/)?.[0] || "").split(",").filter(Boolean).length;
|
|
110
|
-
if (params1 === params2) return 0.8;
|
|
111
|
-
if (Math.abs(params1 - params2) === 1) return 0.5;
|
|
112
|
-
return 0;
|
|
113
|
-
}
|
|
114
|
-
function detectPythonAntiPatterns(patterns) {
|
|
115
|
-
const antiPatterns = [];
|
|
116
|
-
const nameGroups = /* @__PURE__ */ new Map();
|
|
117
|
-
for (const pattern of patterns) {
|
|
118
|
-
const baseName = pattern.name.replace(
|
|
119
|
-
/^(get|set|create|delete|update)_/,
|
|
120
|
-
""
|
|
121
|
-
);
|
|
122
|
-
if (!nameGroups.has(baseName)) {
|
|
123
|
-
nameGroups.set(baseName, []);
|
|
124
|
-
}
|
|
125
|
-
nameGroups.get(baseName).push(pattern);
|
|
126
|
-
}
|
|
127
|
-
for (const [baseName, group] of nameGroups) {
|
|
128
|
-
if (group.length >= 3) {
|
|
129
|
-
antiPatterns.push(
|
|
130
|
-
`Found ${group.length} functions with similar names (${baseName}): Consider consolidating`
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
return antiPatterns;
|
|
135
|
-
}
|
|
136
|
-
export {
|
|
137
|
-
calculatePythonSimilarity,
|
|
138
|
-
detectPythonAntiPatterns,
|
|
139
|
-
extractPythonPatterns
|
|
140
|
-
};
|
package/dist/scoring-entry.d.mts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { CostConfig, ToolScoringOutput } from '@aiready/core';
|
|
2
|
-
import { a as DuplicatePattern } from './types-C4lmb2Yh.mjs';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Calculate AI Readiness Score for pattern duplication (0-100)
|
|
6
|
-
*
|
|
7
|
-
* Based on:
|
|
8
|
-
* - Number of duplicates per file
|
|
9
|
-
* - Token waste per file
|
|
10
|
-
* - High-impact duplicates (>1000 tokens or >70% similarity)
|
|
11
|
-
*
|
|
12
|
-
* Includes business value metrics:
|
|
13
|
-
* - Estimated monthly cost of token waste
|
|
14
|
-
* - Estimated developer hours to fix
|
|
15
|
-
*
|
|
16
|
-
* @param duplicates - Array of detected duplicate patterns.
|
|
17
|
-
* @param totalFilesAnalyzed - Total count of files scanned.
|
|
18
|
-
* @param costConfig - Optional configuration for business value calculations.
|
|
19
|
-
* @returns Standardized scoring output for pattern detection.
|
|
20
|
-
*/
|
|
21
|
-
declare function calculatePatternScore(duplicates: DuplicatePattern[], totalFilesAnalyzed: number, costConfig?: Partial<CostConfig>): ToolScoringOutput;
|
|
22
|
-
|
|
23
|
-
export { calculatePatternScore };
|
package/dist/scoring-entry.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { CostConfig, ToolScoringOutput } from '@aiready/core';
|
|
2
|
-
import { a as DuplicatePattern } from './types-C4lmb2Yh.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Calculate AI Readiness Score for pattern duplication (0-100)
|
|
6
|
-
*
|
|
7
|
-
* Based on:
|
|
8
|
-
* - Number of duplicates per file
|
|
9
|
-
* - Token waste per file
|
|
10
|
-
* - High-impact duplicates (>1000 tokens or >70% similarity)
|
|
11
|
-
*
|
|
12
|
-
* Includes business value metrics:
|
|
13
|
-
* - Estimated monthly cost of token waste
|
|
14
|
-
* - Estimated developer hours to fix
|
|
15
|
-
*
|
|
16
|
-
* @param duplicates - Array of detected duplicate patterns.
|
|
17
|
-
* @param totalFilesAnalyzed - Total count of files scanned.
|
|
18
|
-
* @param costConfig - Optional configuration for business value calculations.
|
|
19
|
-
* @returns Standardized scoring output for pattern detection.
|
|
20
|
-
*/
|
|
21
|
-
declare function calculatePatternScore(duplicates: DuplicatePattern[], totalFilesAnalyzed: number, costConfig?: Partial<CostConfig>): ToolScoringOutput;
|
|
22
|
-
|
|
23
|
-
export { calculatePatternScore };
|
package/dist/scoring-entry.mjs
DELETED
package/dist/scoring.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { ToolScoringOutput } from '@aiready/core';
|
|
2
|
-
import type { DuplicatePattern } from './detector';
|
|
3
|
-
/**
|
|
4
|
-
* Calculate AI Readiness Score for pattern duplication (0-100)
|
|
5
|
-
*
|
|
6
|
-
* Based on:
|
|
7
|
-
* - Number of duplicates per file
|
|
8
|
-
* - Token waste per file
|
|
9
|
-
* - High-impact duplicates (>1000 tokens or >70% similarity)
|
|
10
|
-
*/
|
|
11
|
-
export declare function calculatePatternScore(duplicates: DuplicatePattern[], totalFilesAnalyzed: number): ToolScoringOutput;
|
|
12
|
-
//# sourceMappingURL=scoring.d.ts.map
|
package/dist/scoring.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,gBAAgB,EAAE,EAC9B,kBAAkB,EAAE,MAAM,GACzB,iBAAiB,CAyHnB"}
|
package/dist/scoring.js
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Calculate AI Readiness Score for pattern duplication (0-100)
|
|
3
|
-
*
|
|
4
|
-
* Based on:
|
|
5
|
-
* - Number of duplicates per file
|
|
6
|
-
* - Token waste per file
|
|
7
|
-
* - High-impact duplicates (>1000 tokens or >70% similarity)
|
|
8
|
-
*/
|
|
9
|
-
export function calculatePatternScore(duplicates, totalFilesAnalyzed) {
|
|
10
|
-
// Calculate raw metrics
|
|
11
|
-
const totalDuplicates = duplicates.length;
|
|
12
|
-
const totalTokenCost = duplicates.reduce((sum, d) => sum + d.tokenCost, 0);
|
|
13
|
-
const highImpactDuplicates = duplicates.filter(d => d.tokenCost > 1000 || d.similarity > 0.7).length;
|
|
14
|
-
// Avoid division by zero
|
|
15
|
-
if (totalFilesAnalyzed === 0) {
|
|
16
|
-
return {
|
|
17
|
-
toolName: 'pattern-detect',
|
|
18
|
-
score: 100,
|
|
19
|
-
rawMetrics: { totalDuplicates: 0, totalTokenCost: 0, highImpactDuplicates: 0, totalFilesAnalyzed: 0 },
|
|
20
|
-
factors: [],
|
|
21
|
-
recommendations: [],
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
// Normalize to duplicates per 100 files
|
|
25
|
-
const duplicatesPerFile = (totalDuplicates / totalFilesAnalyzed) * 100;
|
|
26
|
-
// Token waste per file
|
|
27
|
-
const tokenWastePerFile = totalTokenCost / totalFilesAnalyzed;
|
|
28
|
-
// Calculate penalties
|
|
29
|
-
// Duplicates penalty: 0-60 points
|
|
30
|
-
// - 0 duplicates = 0 penalty
|
|
31
|
-
// - 1 duplicate per 10 files (10 per 100) = 6 penalty
|
|
32
|
-
// - 1 duplicate per 5 files (20 per 100) = 12 penalty
|
|
33
|
-
// - 1 duplicate per file (100 per 100) = 60 penalty
|
|
34
|
-
const duplicatesPenalty = Math.min(60, duplicatesPerFile * 0.6);
|
|
35
|
-
// Token waste penalty: 0-40 points
|
|
36
|
-
// - 0 waste = 0 penalty
|
|
37
|
-
// - 1000 tokens/file = 8 penalty
|
|
38
|
-
// - 5000 tokens/file = 40 penalty
|
|
39
|
-
const tokenPenalty = Math.min(40, tokenWastePerFile / 125);
|
|
40
|
-
// High impact adjustment: -15 to +5 points
|
|
41
|
-
// - No high-impact duplicates = +5 bonus
|
|
42
|
-
// - 5+ high-impact duplicates = -10 penalty
|
|
43
|
-
const highImpactPenalty = highImpactDuplicates > 0
|
|
44
|
-
? Math.min(15, highImpactDuplicates * 2 - 5)
|
|
45
|
-
: -5; // bonus
|
|
46
|
-
const score = 100 - duplicatesPenalty - tokenPenalty - highImpactPenalty;
|
|
47
|
-
const finalScore = Math.max(0, Math.min(100, Math.round(score)));
|
|
48
|
-
// Build factors array
|
|
49
|
-
const factors = [
|
|
50
|
-
{
|
|
51
|
-
name: 'Duplication Density',
|
|
52
|
-
impact: -Math.round(duplicatesPenalty),
|
|
53
|
-
description: `${duplicatesPerFile.toFixed(1)} duplicates per 100 files`,
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: 'Token Waste',
|
|
57
|
-
impact: -Math.round(tokenPenalty),
|
|
58
|
-
description: `${Math.round(tokenWastePerFile)} tokens wasted per file`,
|
|
59
|
-
},
|
|
60
|
-
];
|
|
61
|
-
if (highImpactDuplicates > 0) {
|
|
62
|
-
factors.push({
|
|
63
|
-
name: 'High-Impact Patterns',
|
|
64
|
-
impact: -Math.round(highImpactPenalty),
|
|
65
|
-
description: `${highImpactDuplicates} high-impact duplicates (>1000 tokens or >70% similar)`,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
factors.push({
|
|
70
|
-
name: 'No High-Impact Patterns',
|
|
71
|
-
impact: 5,
|
|
72
|
-
description: 'No severe duplicates detected',
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
// Generate recommendations
|
|
76
|
-
const recommendations = [];
|
|
77
|
-
if (highImpactDuplicates > 0) {
|
|
78
|
-
const estimatedImpact = Math.min(15, highImpactDuplicates * 3);
|
|
79
|
-
recommendations.push({
|
|
80
|
-
action: `Deduplicate ${highImpactDuplicates} high-impact pattern${highImpactDuplicates > 1 ? 's' : ''}`,
|
|
81
|
-
estimatedImpact,
|
|
82
|
-
priority: 'high',
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
if (totalDuplicates > 10 && duplicatesPerFile > 20) {
|
|
86
|
-
const estimatedImpact = Math.min(10, Math.round(duplicatesPenalty * 0.3));
|
|
87
|
-
recommendations.push({
|
|
88
|
-
action: 'Extract common patterns into shared utilities',
|
|
89
|
-
estimatedImpact,
|
|
90
|
-
priority: 'medium',
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
if (tokenWastePerFile > 2000) {
|
|
94
|
-
const estimatedImpact = Math.min(8, Math.round(tokenPenalty * 0.4));
|
|
95
|
-
recommendations.push({
|
|
96
|
-
action: 'Consolidate duplicated logic to reduce AI context waste',
|
|
97
|
-
estimatedImpact,
|
|
98
|
-
priority: totalTokenCost > 10000 ? 'high' : 'medium',
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
return {
|
|
102
|
-
toolName: 'pattern-detect',
|
|
103
|
-
score: finalScore,
|
|
104
|
-
rawMetrics: {
|
|
105
|
-
totalDuplicates,
|
|
106
|
-
totalTokenCost,
|
|
107
|
-
highImpactDuplicates,
|
|
108
|
-
totalFilesAnalyzed,
|
|
109
|
-
duplicatesPerFile: Math.round(duplicatesPerFile * 10) / 10,
|
|
110
|
-
tokenWastePerFile: Math.round(tokenWastePerFile),
|
|
111
|
-
},
|
|
112
|
-
factors,
|
|
113
|
-
recommendations,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
//# sourceMappingURL=scoring.js.map
|
package/dist/scoring.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { Severity } from '@aiready/core';
|
|
2
|
-
|
|
3
|
-
type PatternType = 'api-handler' | 'validator' | 'utility' | 'class-method' | 'component' | 'function' | 'unknown';
|
|
4
|
-
interface DuplicatePattern {
|
|
5
|
-
file1: string;
|
|
6
|
-
line1: number;
|
|
7
|
-
endLine1: number;
|
|
8
|
-
file2: string;
|
|
9
|
-
line2: number;
|
|
10
|
-
endLine2: number;
|
|
11
|
-
code1: string;
|
|
12
|
-
code2: string;
|
|
13
|
-
similarity: number;
|
|
14
|
-
confidence: number;
|
|
15
|
-
patternType: PatternType;
|
|
16
|
-
tokenCost: number;
|
|
17
|
-
severity: Severity;
|
|
18
|
-
reason?: string;
|
|
19
|
-
suggestion?: string;
|
|
20
|
-
matchedRule?: string;
|
|
21
|
-
}
|
|
22
|
-
interface DetectionOptions {
|
|
23
|
-
minSimilarity: number;
|
|
24
|
-
minLines: number;
|
|
25
|
-
batchSize: number;
|
|
26
|
-
approx: boolean;
|
|
27
|
-
minSharedTokens: number;
|
|
28
|
-
maxCandidatesPerBlock: number;
|
|
29
|
-
streamResults: boolean;
|
|
30
|
-
excludePatterns?: string[];
|
|
31
|
-
confidenceThreshold?: number;
|
|
32
|
-
ignoreWhitelist?: string[];
|
|
33
|
-
onProgress?: (processed: number, total: number, message: string) => void;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export type { DetectionOptions as D, PatternType as P, DuplicatePattern as a };
|
package/dist/types-C4lmb2Yh.d.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { Severity } from '@aiready/core';
|
|
2
|
-
|
|
3
|
-
type PatternType = 'api-handler' | 'validator' | 'utility' | 'class-method' | 'component' | 'function' | 'unknown';
|
|
4
|
-
interface DuplicatePattern {
|
|
5
|
-
file1: string;
|
|
6
|
-
line1: number;
|
|
7
|
-
endLine1: number;
|
|
8
|
-
file2: string;
|
|
9
|
-
line2: number;
|
|
10
|
-
endLine2: number;
|
|
11
|
-
code1: string;
|
|
12
|
-
code2: string;
|
|
13
|
-
similarity: number;
|
|
14
|
-
confidence: number;
|
|
15
|
-
patternType: PatternType;
|
|
16
|
-
tokenCost: number;
|
|
17
|
-
severity: Severity;
|
|
18
|
-
reason?: string;
|
|
19
|
-
suggestion?: string;
|
|
20
|
-
matchedRule?: string;
|
|
21
|
-
}
|
|
22
|
-
interface DetectionOptions {
|
|
23
|
-
minSimilarity: number;
|
|
24
|
-
minLines: number;
|
|
25
|
-
batchSize: number;
|
|
26
|
-
approx: boolean;
|
|
27
|
-
minSharedTokens: number;
|
|
28
|
-
maxCandidatesPerBlock: number;
|
|
29
|
-
streamResults: boolean;
|
|
30
|
-
excludePatterns?: string[];
|
|
31
|
-
confidenceThreshold?: number;
|
|
32
|
-
ignoreWhitelist?: string[];
|
|
33
|
-
onProgress?: (processed: number, total: number, message: string) => void;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export type { DetectionOptions as D, PatternType as P, DuplicatePattern as a };
|