@aiready/consistency 0.6.12 → 0.6.13
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/.turbo/turbo-build.log +9 -9
- package/.turbo/turbo-test.log +84 -162
- package/dist/index.d.mts +12 -2
- package/dist/index.d.ts +12 -2
- package/dist/index.js +93 -0
- package/dist/index.mjs +92 -0
- package/package.json +2 -2
- package/src/__tests__/scoring.test.ts +150 -0
- package/src/index.ts +1 -0
- package/src/scoring.ts +128 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @aiready/consistency@0.6.
|
|
3
|
+
> @aiready/consistency@0.6.13 build /Users/pengcao/projects/aiready/packages/consistency
|
|
4
4
|
> tsup src/index.ts src/cli.ts --format cjs,esm --dts
|
|
5
5
|
|
|
6
6
|
[34mCLI[39m Building entry: src/cli.ts, src/index.ts
|
|
@@ -9,16 +9,16 @@
|
|
|
9
9
|
[34mCLI[39m Target: es2020
|
|
10
10
|
[34mCJS[39m Build start
|
|
11
11
|
[34mESM[39m Build start
|
|
12
|
-
[32mCJS[39m [1mdist/index.js [22m[32m47.29 KB[39m
|
|
13
|
-
[32mCJS[39m [1mdist/cli.js [22m[32m46.80 KB[39m
|
|
14
|
-
[32mCJS[39m ⚡️ Build success in 215ms
|
|
15
12
|
[32mESM[39m [1mdist/cli.mjs [22m[32m8.76 KB[39m
|
|
13
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m12.69 KB[39m
|
|
16
14
|
[32mESM[39m [1mdist/chunk-7PHHJOGC.mjs [22m[32m36.87 KB[39m
|
|
17
|
-
[32mESM[39m
|
|
18
|
-
[
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 167ms
|
|
16
|
+
[32mCJS[39m [1mdist/index.js [22m[32m50.65 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/cli.js [22m[32m46.80 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 167ms
|
|
19
19
|
DTS Build start
|
|
20
|
-
DTS ⚡️ Build success in
|
|
20
|
+
DTS ⚡️ Build success in 2088ms
|
|
21
21
|
DTS dist/cli.d.ts 20.00 B
|
|
22
|
-
DTS dist/index.d.ts
|
|
22
|
+
DTS dist/index.d.ts 3.38 KB
|
|
23
23
|
DTS dist/cli.d.mts 20.00 B
|
|
24
|
-
DTS dist/index.d.mts
|
|
24
|
+
DTS dist/index.d.mts 3.38 KB
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,51 +1,61 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @aiready/consistency@0.6.
|
|
3
|
+
> @aiready/consistency@0.6.13 test /Users/pengcao/projects/aiready/packages/consistency
|
|
4
4
|
> vitest run
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
[1m[7m[36m RUN [39m[27m[22m [36mv2.1.9 [39m[90m/Users/pengcao/projects/aiready/packages/consistency[39m
|
|
8
8
|
|
|
9
|
-
[?25l [90m·[39m [2msrc/__tests__/[
|
|
10
|
-
[?25l[2K[1A[2K[G [
|
|
11
|
-
[
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
[90m·[39m consistency scoring[2m (2)[22m
|
|
19
|
-
[90m·[39m recommendations[2m (3)[22m
|
|
20
|
-
[90m·[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
21
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
9
|
+
[?25l [90m·[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
10
|
+
[?25l[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
11
|
+
[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
12
|
+
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
13
|
+
[?25l[?25l[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
14
|
+
[90m·[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
15
|
+
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
16
|
+
[?25l[?25l[?25l[?25l[?25l[?25l[?25l[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
17
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
22
18
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
23
|
-
[
|
|
24
|
-
[
|
|
19
|
+
[32m✓[39m should analyze naming issues
|
|
20
|
+
[33m⠙[39m should detect minimum severity filtering
|
|
25
21
|
[90m·[39m analyzeNaming[2m (8)[22m
|
|
26
22
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
27
23
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
28
24
|
[90m·[39m recommendations[2m (3)[22m
|
|
29
|
-
[
|
|
30
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
25
|
+
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
26
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
27
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
31
28
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
32
|
-
[
|
|
33
|
-
[
|
|
29
|
+
[32m✓[39m should analyze naming issues
|
|
30
|
+
[33m⠹[39m should detect minimum severity filtering
|
|
34
31
|
[90m·[39m analyzeNaming[2m (8)[22m
|
|
35
32
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
36
33
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
37
34
|
[90m·[39m recommendations[2m (3)[22m
|
|
38
|
-
[
|
|
39
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
40
|
-
|
|
35
|
+
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
36
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
37
|
+
[32m✓[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
38
|
+
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
39
|
+
[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
40
|
+
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
41
|
+
[32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
42
|
+
|
|
43
|
+
[2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
|
|
44
|
+
[2m Tests [22m [1m[32m29 passed[39m[22m[90m (29)[39m
|
|
45
|
+
[2m Start at [22m 16:05:50
|
|
46
|
+
[2m Duration [22m 2.20s[2m (transform 335ms, setup 0ms, collect 2.05s, tests 167ms, environment 0ms, prepare 750ms)[22m
|
|
47
|
+
|
|
48
|
+
[?25h[?25h
|
|
49
|
+
[22m
|
|
41
50
|
[33m⠼[39m should analyze naming issues
|
|
42
51
|
[90m·[39m should detect minimum severity filtering
|
|
43
52
|
[90m·[39m analyzeNaming[2m (8)[22m
|
|
44
53
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
45
54
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
46
55
|
[90m·[39m recommendations[2m (3)[22m
|
|
47
|
-
[
|
|
48
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
56
|
+
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
57
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
58
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
49
59
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
50
60
|
[33m⠴[39m should analyze naming issues
|
|
51
61
|
[90m·[39m should detect minimum severity filtering
|
|
@@ -53,8 +63,9 @@
|
|
|
53
63
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
54
64
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
55
65
|
[90m·[39m recommendations[2m (3)[22m
|
|
56
|
-
[
|
|
57
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
66
|
+
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
67
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
68
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
58
69
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
59
70
|
[33m⠦[39m should analyze naming issues
|
|
60
71
|
[90m·[39m should detect minimum severity filtering
|
|
@@ -62,8 +73,9 @@
|
|
|
62
73
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
63
74
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
64
75
|
[90m·[39m recommendations[2m (3)[22m
|
|
65
|
-
[
|
|
66
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
76
|
+
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
77
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
78
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
67
79
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
68
80
|
[33m⠧[39m should analyze naming issues
|
|
69
81
|
[90m·[39m should detect minimum severity filtering
|
|
@@ -72,7 +84,8 @@
|
|
|
72
84
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
73
85
|
[90m·[39m recommendations[2m (3)[22m
|
|
74
86
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
75
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
87
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
88
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
76
89
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
77
90
|
[33m⠇[39m should analyze naming issues
|
|
78
91
|
[90m·[39m should detect minimum severity filtering
|
|
@@ -81,7 +94,8 @@
|
|
|
81
94
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
82
95
|
[90m·[39m recommendations[2m (3)[22m
|
|
83
96
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
84
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
97
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
98
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
85
99
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
86
100
|
[33m⠏[39m should analyze naming issues
|
|
87
101
|
[90m·[39m should detect minimum severity filtering
|
|
@@ -90,7 +104,8 @@
|
|
|
90
104
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
91
105
|
[90m·[39m recommendations[2m (3)[22m
|
|
92
106
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
93
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
107
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
108
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
94
109
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
95
110
|
[33m⠋[39m should analyze naming issues
|
|
96
111
|
[90m·[39m should detect minimum severity filtering
|
|
@@ -99,7 +114,8 @@
|
|
|
99
114
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
100
115
|
[90m·[39m recommendations[2m (3)[22m
|
|
101
116
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
102
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
117
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
118
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
103
119
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
104
120
|
[33m⠙[39m should analyze naming issues
|
|
105
121
|
[90m·[39m should detect minimum severity filtering
|
|
@@ -108,7 +124,8 @@
|
|
|
108
124
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
109
125
|
[90m·[39m recommendations[2m (3)[22m
|
|
110
126
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
111
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
127
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
128
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
112
129
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
113
130
|
[33m⠹[39m should analyze naming issues
|
|
114
131
|
[90m·[39m should detect minimum severity filtering
|
|
@@ -117,183 +134,88 @@
|
|
|
117
134
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
118
135
|
[90m·[39m recommendations[2m (3)[22m
|
|
119
136
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
120
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
137
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
138
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
121
139
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
122
|
-
[
|
|
123
|
-
[90m·[39m should detect minimum severity filtering
|
|
124
|
-
[90m·[39m analyzeNaming[2m (8)[22m
|
|
125
|
-
[90m·[39m analyzePatterns[2m (3)[22m
|
|
126
|
-
[90m·[39m consistency scoring[2m (2)[22m
|
|
127
|
-
[90m·[39m recommendations[2m (3)[22m
|
|
128
|
-
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
129
|
-
[33m⠼[39m should analyze naming issues
|
|
130
|
-
[90m·[39m should detect minimum severity filtering
|
|
131
|
-
[90m·[39m analyzeNaming[2m (8)[22m
|
|
132
|
-
[90m·[39m analyzePatterns[2m (3)[22m
|
|
133
|
-
[90m·[39m consistency scoring[2m (2)[22m
|
|
134
|
-
[90m·[39m recommendations[2m (3)[22m
|
|
135
|
-
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
136
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
137
|
-
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
138
|
-
[33m⠴[39m should analyze naming issues
|
|
139
|
-
[90m·[39m should detect minimum severity filtering
|
|
140
|
-
[90m·[39m analyzeNaming[2m (8)[22m
|
|
141
|
-
[90m·[39m analyzePatterns[2m (3)[22m
|
|
142
|
-
[90m·[39m consistency scoring[2m (2)[22m
|
|
143
|
-
[90m·[39m recommendations[2m (3)[22m
|
|
144
|
-
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
145
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
146
|
-
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
147
|
-
[33m⠦[39m should analyze naming issues
|
|
148
|
-
[90m·[39m should detect minimum severity filtering
|
|
149
|
-
[90m·[39m analyzeNaming[2m (8)[22m
|
|
150
|
-
[90m·[39m analyzePatterns[2m (3)[22m
|
|
151
|
-
[90m·[39m consistency scoring[2m (2)[22m
|
|
152
|
-
[90m·[39m recommendations[2m (3)[22m
|
|
153
|
-
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
154
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
155
|
-
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
156
|
-
[33m⠧[39m should analyze naming issues
|
|
157
|
-
[90m·[39m should detect minimum severity filtering
|
|
158
|
-
[90m·[39m analyzeNaming[2m (8)[22m
|
|
159
|
-
[90m·[39m analyzePatterns[2m (3)[22m
|
|
160
|
-
[90m·[39m consistency scoring[2m (2)[22m
|
|
161
|
-
[90m·[39m recommendations[2m (3)[22m
|
|
162
|
-
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
163
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
164
|
-
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
165
|
-
[32m✓[39m should analyze naming issues[33m 312[2mms[22m[39m
|
|
140
|
+
[32m✓[39m should analyze naming issues
|
|
166
141
|
[33m⠙[39m should detect minimum severity filtering
|
|
167
142
|
[90m·[39m analyzeNaming[2m (8)[22m
|
|
168
143
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
169
144
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
170
145
|
[90m·[39m recommendations[2m (3)[22m
|
|
171
146
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
172
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
147
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
148
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
173
149
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
174
|
-
[32m✓[39m should analyze naming issues
|
|
150
|
+
[32m✓[39m should analyze naming issues
|
|
175
151
|
[33m⠹[39m should detect minimum severity filtering
|
|
176
152
|
[90m·[39m analyzeNaming[2m (8)[22m
|
|
177
153
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
178
154
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
179
155
|
[90m·[39m recommendations[2m (3)[22m
|
|
180
156
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
181
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
157
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
158
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
182
159
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
183
|
-
[32m✓[39m should analyze naming issues
|
|
160
|
+
[32m✓[39m should analyze naming issues
|
|
184
161
|
[33m⠸[39m should detect minimum severity filtering
|
|
185
162
|
[90m·[39m analyzeNaming[2m (8)[22m
|
|
186
163
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
187
164
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
188
165
|
[90m·[39m recommendations[2m (3)[22m
|
|
189
166
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
190
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
191
|
-
|
|
192
|
-
[32m✓[39m should analyze naming issues[33m 312[2mms[22m[39m
|
|
193
|
-
[33m⠼[39m should detect minimum severity filtering
|
|
194
|
-
[90m·[39m analyzeNaming[2m (8)[22m
|
|
195
|
-
[90m·[39m analyzePatterns[2m (3)[22m
|
|
196
|
-
[90m·[39m consistency scoring[2m (2)[22m
|
|
197
|
-
[90m·[39m recommendations[2m (3)[22m
|
|
198
|
-
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
199
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
200
|
-
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
201
|
-
[32m✓[39m should analyze naming issues[33m 312[2mms[22m[39m
|
|
202
|
-
[33m⠴[39m should detect minimum severity filtering
|
|
203
|
-
[90m·[39m analyzeNaming[2m (8)[22m
|
|
204
|
-
[90m·[39m analyzePatterns[2m (3)[22m
|
|
205
|
-
[90m·[39m consistency scoring[2m (2)[22m
|
|
206
|
-
[90m·[39m recommendations[2m (3)[22m
|
|
207
|
-
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
208
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
209
|
-
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
210
|
-
[32m✓[39m should analyze naming issues[33m 312[2mms[22m[39m
|
|
211
|
-
[33m⠦[39m should detect minimum severity filtering
|
|
212
|
-
[90m·[39m analyzeNaming[2m (8)[22m
|
|
213
|
-
[90m·[39m analyzePatterns[2m (3)[22m
|
|
214
|
-
[90m·[39m consistency scoring[2m (2)[22m
|
|
215
|
-
[90m·[39m recommendations[2m (3)[22m
|
|
216
|
-
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
217
|
-
[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m[33m 415[2mms[22m[39m
|
|
218
|
-
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
219
|
-
|
|
220
|
-
[2m Test Files [22m [1m[32m2 passed[39m[22m[90m (2)[39m
|
|
221
|
-
[2m Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
|
|
222
|
-
[2m Start at [22m 18:01:20
|
|
223
|
-
[2m Duration [22m 2.38s[2m (transform 742ms, setup 0ms, collect 2.26s, tests 425ms, environment 0ms, prepare 531ms)[22m
|
|
224
|
-
|
|
225
|
-
[?25h[?25h
|
|
226
|
-
[2mms[22m[39m
|
|
227
|
-
[32m✓[39m analyzeNaming[2m (8)[22m
|
|
228
|
-
[32m✓[39m analyzePatterns[2m (3)[22m
|
|
229
|
-
[32m✓[39m consistency scoring[2m (2)[22m
|
|
230
|
-
[33m❯[39m recommendations[2m (3)[22m
|
|
231
|
-
[33m⠙[39m should generate relevant recommendations
|
|
232
|
-
[90m·[39m should suggest standardizing error handling
|
|
233
|
-
[90m·[39m should suggest using async/await consistently
|
|
167
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
168
|
+
[32m✓[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
234
169
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
235
|
-
[2K[1A[2K[1A[2K[1A[2K[
|
|
170
|
+
[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
236
171
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
172
|
+
[32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
237
173
|
|
|
238
|
-
[2m Test Files [22m [1m[
|
|
239
|
-
[2m Tests [22m [1m[
|
|
240
|
-
[2m Start at [22m
|
|
241
|
-
[2m Duration [22m 2.
|
|
174
|
+
[2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
|
|
175
|
+
[2m Tests [22m [1m[32m29 passed[39m[22m[90m (29)[39m
|
|
176
|
+
[2m Start at [22m 16:05:50
|
|
177
|
+
[2m Duration [22m 2.46s[2m (transform 373ms, setup 0ms, collect 2.05s, tests 286ms, environment 0ms, prepare 1.01s)[22m
|
|
242
178
|
|
|
243
179
|
[?25h[?25h
|
|
244
|
-
|
|
245
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
180
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
246
181
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
247
182
|
[32m✓[39m should analyze naming issues
|
|
248
|
-
[33m
|
|
249
|
-
[90m·[39m analyzeNaming[2m (8)[22m
|
|
250
|
-
[90m·[39m analyzePatterns[2m (3)[22m
|
|
251
|
-
[90m·[39m consistency scoring[2m (2)[22m
|
|
252
|
-
[90m·[39m recommendations[2m (3)[22m
|
|
253
|
-
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
254
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
255
|
-
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
256
|
-
[32m✓[39m should analyze naming issues
|
|
257
|
-
[33m⠸[39m should detect minimum severity filtering
|
|
183
|
+
[33m⠙[39m should detect minimum severity filtering
|
|
258
184
|
[90m·[39m analyzeNaming[2m (8)[22m
|
|
259
185
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
260
186
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
261
187
|
[90m·[39m recommendations[2m (3)[22m
|
|
262
188
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
263
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
189
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
190
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
264
191
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
265
192
|
[32m✓[39m should analyze naming issues
|
|
266
|
-
[33m
|
|
193
|
+
[33m⠹[39m should detect minimum severity filtering
|
|
267
194
|
[90m·[39m analyzeNaming[2m (8)[22m
|
|
268
195
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
269
196
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
270
197
|
[90m·[39m recommendations[2m (3)[22m
|
|
271
198
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
272
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
199
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
200
|
+
[33m❯[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m
|
|
273
201
|
[33m❯[39m analyzeConsistency[2m (2)[22m
|
|
274
202
|
[32m✓[39m should analyze naming issues
|
|
275
|
-
[33m
|
|
203
|
+
[33m⠸[39m should detect minimum severity filtering
|
|
276
204
|
[90m·[39m analyzeNaming[2m (8)[22m
|
|
277
205
|
[90m·[39m analyzePatterns[2m (3)[22m
|
|
278
206
|
[90m·[39m consistency scoring[2m (2)[22m
|
|
279
207
|
[90m·[39m recommendations[2m (3)[22m
|
|
280
208
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
281
|
-
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [
|
|
282
|
-
|
|
283
|
-
[32m✓[39m analyzeNaming[2m (8)[22m
|
|
284
|
-
[32m✓[39m analyzePatterns[2m (3)[22m
|
|
285
|
-
[32m✓[39m consistency scoring[2m (2)[22m
|
|
286
|
-
[33m❯[39m recommendations[2m (3)[22m
|
|
287
|
-
[33m⠙[39m should generate relevant recommendations
|
|
288
|
-
[90m·[39m should suggest standardizing error handling
|
|
289
|
-
[90m·[39m should suggest using async/await consistently
|
|
209
|
+
[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
210
|
+
[32m✓[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m[33m 370[2mms[22m[39m
|
|
290
211
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
291
|
-
[2K[1A[2K[1A[2K[1A[2K[
|
|
212
|
+
[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/__tests__/[22manalyzer[2m.test.ts[22m[2m (18)[22m[33m 370[2mms[22m[39m
|
|
292
213
|
[32m✓[39m [2msrc/__tests__/[22mlanguage-filter[2m.test.ts[22m[2m (3)[22m
|
|
214
|
+
[32m✓[39m [2msrc/__tests__/[22mscoring[2m.test.ts[22m[2m (8)[22m
|
|
293
215
|
|
|
294
|
-
[2m Test Files [22m [1m[
|
|
295
|
-
[2m Tests [22m [1m[
|
|
296
|
-
[2m Start at [22m
|
|
297
|
-
[2m Duration [22m 2.
|
|
216
|
+
[2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
|
|
217
|
+
[2m Tests [22m [1m[32m29 passed[39m[22m[90m (29)[39m
|
|
218
|
+
[2m Start at [22m 16:05:50
|
|
219
|
+
[2m Duration [22m 2.65s[2m (transform 1.05s, setup 0ms, collect 3.33s, tests 464ms, environment 0ms, prepare 765ms)[22m
|
|
298
220
|
|
|
299
221
|
[?25h[?25h
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ScanOptions, AnalysisResult, Issue } from '@aiready/core';
|
|
1
|
+
import { ScanOptions, AnalysisResult, Issue, ToolScoringOutput } from '@aiready/core';
|
|
2
2
|
|
|
3
3
|
interface ConsistencyOptions extends ScanOptions {
|
|
4
4
|
/** Check naming conventions and quality */
|
|
@@ -86,4 +86,14 @@ declare function detectNamingConventions(files: string[], allIssues: Array<{
|
|
|
86
86
|
*/
|
|
87
87
|
declare function analyzePatterns(files: string[]): Promise<PatternIssue[]>;
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
/**
|
|
90
|
+
* Calculate AI Readiness Score for code consistency (0-100)
|
|
91
|
+
*
|
|
92
|
+
* Based on:
|
|
93
|
+
* - Issue density (issues per file)
|
|
94
|
+
* - Weighted severity (critical: 10pts, major: 3pts, minor: 0.5pts)
|
|
95
|
+
* - Pattern consistency across codebase
|
|
96
|
+
*/
|
|
97
|
+
declare function calculateConsistencyScore(issues: ConsistencyIssue[], totalFilesAnalyzed: number): ToolScoringOutput;
|
|
98
|
+
|
|
99
|
+
export { type ArchitectureIssue, type ConsistencyIssue, type ConsistencyOptions, type ConsistencyReport, type NamingIssue, type PatternIssue, analyzeConsistency, analyzeNaming, analyzeNamingAST, analyzePatterns, calculateConsistencyScore, detectNamingConventions };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ScanOptions, AnalysisResult, Issue } from '@aiready/core';
|
|
1
|
+
import { ScanOptions, AnalysisResult, Issue, ToolScoringOutput } from '@aiready/core';
|
|
2
2
|
|
|
3
3
|
interface ConsistencyOptions extends ScanOptions {
|
|
4
4
|
/** Check naming conventions and quality */
|
|
@@ -86,4 +86,14 @@ declare function detectNamingConventions(files: string[], allIssues: Array<{
|
|
|
86
86
|
*/
|
|
87
87
|
declare function analyzePatterns(files: string[]): Promise<PatternIssue[]>;
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
/**
|
|
90
|
+
* Calculate AI Readiness Score for code consistency (0-100)
|
|
91
|
+
*
|
|
92
|
+
* Based on:
|
|
93
|
+
* - Issue density (issues per file)
|
|
94
|
+
* - Weighted severity (critical: 10pts, major: 3pts, minor: 0.5pts)
|
|
95
|
+
* - Pattern consistency across codebase
|
|
96
|
+
*/
|
|
97
|
+
declare function calculateConsistencyScore(issues: ConsistencyIssue[], totalFilesAnalyzed: number): ToolScoringOutput;
|
|
98
|
+
|
|
99
|
+
export { type ArchitectureIssue, type ConsistencyIssue, type ConsistencyOptions, type ConsistencyReport, type NamingIssue, type PatternIssue, analyzeConsistency, analyzeNaming, analyzeNamingAST, analyzePatterns, calculateConsistencyScore, detectNamingConventions };
|
package/dist/index.js
CHANGED
|
@@ -24,6 +24,7 @@ __export(index_exports, {
|
|
|
24
24
|
analyzeNaming: () => analyzeNaming,
|
|
25
25
|
analyzeNamingAST: () => analyzeNamingAST,
|
|
26
26
|
analyzePatterns: () => analyzePatterns,
|
|
27
|
+
calculateConsistencyScore: () => calculateConsistencyScore2,
|
|
27
28
|
detectNamingConventions: () => detectNamingConventions
|
|
28
29
|
});
|
|
29
30
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -1573,11 +1574,103 @@ function analyzeFileNaming(file, content, customAbbreviations, customShortWords,
|
|
|
1573
1574
|
});
|
|
1574
1575
|
return issues;
|
|
1575
1576
|
}
|
|
1577
|
+
|
|
1578
|
+
// src/scoring.ts
|
|
1579
|
+
function calculateConsistencyScore2(issues, totalFilesAnalyzed) {
|
|
1580
|
+
const criticalIssues = issues.filter((i) => i.severity === "critical").length;
|
|
1581
|
+
const majorIssues = issues.filter((i) => i.severity === "major").length;
|
|
1582
|
+
const minorIssues = issues.filter((i) => i.severity === "minor").length;
|
|
1583
|
+
const totalIssues = issues.length;
|
|
1584
|
+
const issuesPerFile = totalFilesAnalyzed > 0 ? totalIssues / totalFilesAnalyzed : 0;
|
|
1585
|
+
const densityPenalty = Math.min(50, issuesPerFile * 15);
|
|
1586
|
+
const weightedCount = criticalIssues * 10 + majorIssues * 3 + minorIssues * 0.5;
|
|
1587
|
+
const avgWeightedIssuesPerFile = totalFilesAnalyzed > 0 ? weightedCount / totalFilesAnalyzed : 0;
|
|
1588
|
+
const severityPenalty = Math.min(50, avgWeightedIssuesPerFile * 2);
|
|
1589
|
+
const rawScore = 100 - densityPenalty - severityPenalty;
|
|
1590
|
+
const score = Math.max(0, Math.min(100, Math.round(rawScore)));
|
|
1591
|
+
const factors = [
|
|
1592
|
+
{
|
|
1593
|
+
name: "Issue Density",
|
|
1594
|
+
impact: -Math.round(densityPenalty),
|
|
1595
|
+
description: `${issuesPerFile.toFixed(2)} issues per file ${issuesPerFile < 1 ? "(excellent)" : issuesPerFile < 3 ? "(acceptable)" : "(high)"}`
|
|
1596
|
+
}
|
|
1597
|
+
];
|
|
1598
|
+
if (criticalIssues > 0) {
|
|
1599
|
+
const criticalImpact = Math.min(30, criticalIssues * 10);
|
|
1600
|
+
factors.push({
|
|
1601
|
+
name: "Critical Issues",
|
|
1602
|
+
impact: -criticalImpact,
|
|
1603
|
+
description: `${criticalIssues} critical consistency issue${criticalIssues > 1 ? "s" : ""} (high AI confusion risk)`
|
|
1604
|
+
});
|
|
1605
|
+
}
|
|
1606
|
+
if (majorIssues > 0) {
|
|
1607
|
+
const majorImpact = Math.min(20, Math.round(majorIssues * 3));
|
|
1608
|
+
factors.push({
|
|
1609
|
+
name: "Major Issues",
|
|
1610
|
+
impact: -majorImpact,
|
|
1611
|
+
description: `${majorIssues} major issue${majorIssues > 1 ? "s" : ""} (moderate AI confusion risk)`
|
|
1612
|
+
});
|
|
1613
|
+
}
|
|
1614
|
+
if (minorIssues > 0 && minorIssues >= totalFilesAnalyzed) {
|
|
1615
|
+
const minorImpact = -Math.round(minorIssues * 0.5);
|
|
1616
|
+
factors.push({
|
|
1617
|
+
name: "Minor Issues",
|
|
1618
|
+
impact: minorImpact,
|
|
1619
|
+
description: `${minorIssues} minor issue${minorIssues > 1 ? "s" : ""} (slight AI confusion risk)`
|
|
1620
|
+
});
|
|
1621
|
+
}
|
|
1622
|
+
const recommendations = [];
|
|
1623
|
+
if (criticalIssues > 0) {
|
|
1624
|
+
const estimatedImpact = Math.min(30, criticalIssues * 10);
|
|
1625
|
+
recommendations.push({
|
|
1626
|
+
action: "Fix critical naming/pattern inconsistencies (highest AI confusion risk)",
|
|
1627
|
+
estimatedImpact,
|
|
1628
|
+
priority: "high"
|
|
1629
|
+
});
|
|
1630
|
+
}
|
|
1631
|
+
if (majorIssues > 5) {
|
|
1632
|
+
const estimatedImpact = Math.min(15, Math.round(majorIssues / 2));
|
|
1633
|
+
recommendations.push({
|
|
1634
|
+
action: "Standardize naming conventions across codebase",
|
|
1635
|
+
estimatedImpact,
|
|
1636
|
+
priority: "medium"
|
|
1637
|
+
});
|
|
1638
|
+
}
|
|
1639
|
+
if (issuesPerFile > 3) {
|
|
1640
|
+
recommendations.push({
|
|
1641
|
+
action: "Establish and enforce coding style guide to reduce inconsistencies",
|
|
1642
|
+
estimatedImpact: 12,
|
|
1643
|
+
priority: "medium"
|
|
1644
|
+
});
|
|
1645
|
+
}
|
|
1646
|
+
if (totalIssues > 20 && minorIssues / totalIssues > 0.7) {
|
|
1647
|
+
recommendations.push({
|
|
1648
|
+
action: "Enable linter/formatter to automatically fix minor style issues",
|
|
1649
|
+
estimatedImpact: 8,
|
|
1650
|
+
priority: "low"
|
|
1651
|
+
});
|
|
1652
|
+
}
|
|
1653
|
+
return {
|
|
1654
|
+
toolName: "consistency",
|
|
1655
|
+
score,
|
|
1656
|
+
rawMetrics: {
|
|
1657
|
+
totalIssues,
|
|
1658
|
+
criticalIssues,
|
|
1659
|
+
majorIssues,
|
|
1660
|
+
minorIssues,
|
|
1661
|
+
issuesPerFile: Math.round(issuesPerFile * 100) / 100,
|
|
1662
|
+
avgWeightedIssuesPerFile: Math.round(avgWeightedIssuesPerFile * 100) / 100
|
|
1663
|
+
},
|
|
1664
|
+
factors,
|
|
1665
|
+
recommendations
|
|
1666
|
+
};
|
|
1667
|
+
}
|
|
1576
1668
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1577
1669
|
0 && (module.exports = {
|
|
1578
1670
|
analyzeConsistency,
|
|
1579
1671
|
analyzeNaming,
|
|
1580
1672
|
analyzeNamingAST,
|
|
1581
1673
|
analyzePatterns,
|
|
1674
|
+
calculateConsistencyScore,
|
|
1582
1675
|
detectNamingConventions
|
|
1583
1676
|
});
|
package/dist/index.mjs
CHANGED
|
@@ -186,10 +186,102 @@ function analyzeFileNaming(file, content, customAbbreviations, customShortWords,
|
|
|
186
186
|
});
|
|
187
187
|
return issues;
|
|
188
188
|
}
|
|
189
|
+
|
|
190
|
+
// src/scoring.ts
|
|
191
|
+
function calculateConsistencyScore(issues, totalFilesAnalyzed) {
|
|
192
|
+
const criticalIssues = issues.filter((i) => i.severity === "critical").length;
|
|
193
|
+
const majorIssues = issues.filter((i) => i.severity === "major").length;
|
|
194
|
+
const minorIssues = issues.filter((i) => i.severity === "minor").length;
|
|
195
|
+
const totalIssues = issues.length;
|
|
196
|
+
const issuesPerFile = totalFilesAnalyzed > 0 ? totalIssues / totalFilesAnalyzed : 0;
|
|
197
|
+
const densityPenalty = Math.min(50, issuesPerFile * 15);
|
|
198
|
+
const weightedCount = criticalIssues * 10 + majorIssues * 3 + minorIssues * 0.5;
|
|
199
|
+
const avgWeightedIssuesPerFile = totalFilesAnalyzed > 0 ? weightedCount / totalFilesAnalyzed : 0;
|
|
200
|
+
const severityPenalty = Math.min(50, avgWeightedIssuesPerFile * 2);
|
|
201
|
+
const rawScore = 100 - densityPenalty - severityPenalty;
|
|
202
|
+
const score = Math.max(0, Math.min(100, Math.round(rawScore)));
|
|
203
|
+
const factors = [
|
|
204
|
+
{
|
|
205
|
+
name: "Issue Density",
|
|
206
|
+
impact: -Math.round(densityPenalty),
|
|
207
|
+
description: `${issuesPerFile.toFixed(2)} issues per file ${issuesPerFile < 1 ? "(excellent)" : issuesPerFile < 3 ? "(acceptable)" : "(high)"}`
|
|
208
|
+
}
|
|
209
|
+
];
|
|
210
|
+
if (criticalIssues > 0) {
|
|
211
|
+
const criticalImpact = Math.min(30, criticalIssues * 10);
|
|
212
|
+
factors.push({
|
|
213
|
+
name: "Critical Issues",
|
|
214
|
+
impact: -criticalImpact,
|
|
215
|
+
description: `${criticalIssues} critical consistency issue${criticalIssues > 1 ? "s" : ""} (high AI confusion risk)`
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
if (majorIssues > 0) {
|
|
219
|
+
const majorImpact = Math.min(20, Math.round(majorIssues * 3));
|
|
220
|
+
factors.push({
|
|
221
|
+
name: "Major Issues",
|
|
222
|
+
impact: -majorImpact,
|
|
223
|
+
description: `${majorIssues} major issue${majorIssues > 1 ? "s" : ""} (moderate AI confusion risk)`
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
if (minorIssues > 0 && minorIssues >= totalFilesAnalyzed) {
|
|
227
|
+
const minorImpact = -Math.round(minorIssues * 0.5);
|
|
228
|
+
factors.push({
|
|
229
|
+
name: "Minor Issues",
|
|
230
|
+
impact: minorImpact,
|
|
231
|
+
description: `${minorIssues} minor issue${minorIssues > 1 ? "s" : ""} (slight AI confusion risk)`
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
const recommendations = [];
|
|
235
|
+
if (criticalIssues > 0) {
|
|
236
|
+
const estimatedImpact = Math.min(30, criticalIssues * 10);
|
|
237
|
+
recommendations.push({
|
|
238
|
+
action: "Fix critical naming/pattern inconsistencies (highest AI confusion risk)",
|
|
239
|
+
estimatedImpact,
|
|
240
|
+
priority: "high"
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
if (majorIssues > 5) {
|
|
244
|
+
const estimatedImpact = Math.min(15, Math.round(majorIssues / 2));
|
|
245
|
+
recommendations.push({
|
|
246
|
+
action: "Standardize naming conventions across codebase",
|
|
247
|
+
estimatedImpact,
|
|
248
|
+
priority: "medium"
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
if (issuesPerFile > 3) {
|
|
252
|
+
recommendations.push({
|
|
253
|
+
action: "Establish and enforce coding style guide to reduce inconsistencies",
|
|
254
|
+
estimatedImpact: 12,
|
|
255
|
+
priority: "medium"
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
if (totalIssues > 20 && minorIssues / totalIssues > 0.7) {
|
|
259
|
+
recommendations.push({
|
|
260
|
+
action: "Enable linter/formatter to automatically fix minor style issues",
|
|
261
|
+
estimatedImpact: 8,
|
|
262
|
+
priority: "low"
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
toolName: "consistency",
|
|
267
|
+
score,
|
|
268
|
+
rawMetrics: {
|
|
269
|
+
totalIssues,
|
|
270
|
+
criticalIssues,
|
|
271
|
+
majorIssues,
|
|
272
|
+
minorIssues,
|
|
273
|
+
issuesPerFile: Math.round(issuesPerFile * 100) / 100,
|
|
274
|
+
avgWeightedIssuesPerFile: Math.round(avgWeightedIssuesPerFile * 100) / 100
|
|
275
|
+
},
|
|
276
|
+
factors,
|
|
277
|
+
recommendations
|
|
278
|
+
};
|
|
279
|
+
}
|
|
189
280
|
export {
|
|
190
281
|
analyzeConsistency,
|
|
191
282
|
analyzeNaming,
|
|
192
283
|
analyzeNamingAST,
|
|
193
284
|
analyzePatterns,
|
|
285
|
+
calculateConsistencyScore,
|
|
194
286
|
detectNamingConventions
|
|
195
287
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiready/consistency",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.13",
|
|
4
4
|
"description": "Detects consistency issues in naming, patterns, and architecture that confuse AI models",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@typescript-eslint/typescript-estree": "^8.53.0",
|
|
44
44
|
"chalk": "^5.3.0",
|
|
45
45
|
"commander": "^12.1.0",
|
|
46
|
-
"@aiready/core": "0.7.
|
|
46
|
+
"@aiready/core": "0.7.10"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@types/node": "^22.10.5",
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { calculateConsistencyScore } from '../scoring';
|
|
3
|
+
import type { ConsistencyIssue } from '../types';
|
|
4
|
+
|
|
5
|
+
describe('Consistency Scoring', () => {
|
|
6
|
+
describe('calculateConsistencyScore', () => {
|
|
7
|
+
it('should return perfect score for no issues', () => {
|
|
8
|
+
const result = calculateConsistencyScore([], 100);
|
|
9
|
+
|
|
10
|
+
expect(result.score).toBe(100);
|
|
11
|
+
expect(result.toolName).toBe('consistency');
|
|
12
|
+
expect(result.rawMetrics.totalIssues).toBe(0);
|
|
13
|
+
expect(result.recommendations).toHaveLength(0);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should penalize high issue density', () => {
|
|
17
|
+
const issues: ConsistencyIssue[] = Array(50).fill({
|
|
18
|
+
severity: 'minor',
|
|
19
|
+
category: 'naming',
|
|
20
|
+
message: 'Test issue',
|
|
21
|
+
location: { file: 'test.ts', line: 1 },
|
|
22
|
+
} as ConsistencyIssue);
|
|
23
|
+
|
|
24
|
+
// 50 issues / 10 files = 5 issues per file
|
|
25
|
+
// densityPenalty = min(50, 5 * 15) = 50
|
|
26
|
+
const result = calculateConsistencyScore(issues, 10);
|
|
27
|
+
|
|
28
|
+
expect(result.score).toBeLessThan(60);
|
|
29
|
+
expect(result.rawMetrics.issuesPerFile).toBe(5);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should heavily penalize critical issues', () => {
|
|
33
|
+
const issues: ConsistencyIssue[] = [
|
|
34
|
+
{
|
|
35
|
+
severity: 'critical',
|
|
36
|
+
category: 'naming',
|
|
37
|
+
message: 'Critical naming issue',
|
|
38
|
+
location: { file: 'test.ts', line: 1 },
|
|
39
|
+
} as ConsistencyIssue,
|
|
40
|
+
{
|
|
41
|
+
severity: 'critical',
|
|
42
|
+
category: 'naming',
|
|
43
|
+
message: 'Another critical issue',
|
|
44
|
+
location: { file: 'test.ts', line: 10 },
|
|
45
|
+
} as ConsistencyIssue,
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const result = calculateConsistencyScore(issues, 10);
|
|
49
|
+
|
|
50
|
+
// 2 issues / 10 files = 0.2 issues/file → densityPenalty = 3
|
|
51
|
+
// weightedCount = 2*10 = 20, avgWeighted = 2.0 → severityPenalty = 4
|
|
52
|
+
// score = 100 - 3 - 4 = 93
|
|
53
|
+
expect(result.score).toBe(93);
|
|
54
|
+
expect(result.rawMetrics.criticalIssues).toBe(2);
|
|
55
|
+
expect(result.factors.some(f => f.name === 'Critical Issues')).toBe(true);
|
|
56
|
+
expect(result.recommendations.some(r => r.priority === 'high')).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('should apply weighted severity penalties', () => {
|
|
60
|
+
const issues: ConsistencyIssue[] = [
|
|
61
|
+
...Array(5).fill({ severity: 'critical' } as ConsistencyIssue),
|
|
62
|
+
...Array(10).fill({ severity: 'major' } as ConsistencyIssue),
|
|
63
|
+
...Array(20).fill({ severity: 'minor' } as ConsistencyIssue),
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
const result = calculateConsistencyScore(
|
|
67
|
+
issues.map((i, idx) => ({
|
|
68
|
+
...i,
|
|
69
|
+
category: 'naming',
|
|
70
|
+
message: 'test',
|
|
71
|
+
location: { file: 'test.ts', line: idx },
|
|
72
|
+
})) as ConsistencyIssue[],
|
|
73
|
+
50
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
expect(result.rawMetrics.criticalIssues).toBe(5);
|
|
77
|
+
expect(result.rawMetrics.majorIssues).toBe(10);
|
|
78
|
+
expect(result.rawMetrics.minorIssues).toBe(20);
|
|
79
|
+
// 35 issues / 50 files = 0.7 issues/file → densityPenalty = 10.5
|
|
80
|
+
// weightedCount = 50+30+10 = 90, avgWeighted = 1.8 → severityPenalty = 3.6
|
|
81
|
+
// score = 100 - 10.5 - 3.6 = 85.9 → 86
|
|
82
|
+
expect(result.score).toBe(86);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('should generate appropriate recommendations', () => {
|
|
86
|
+
const issues: ConsistencyIssue[] = [
|
|
87
|
+
...Array(3).fill({ severity: 'critical', category: 'naming' } as ConsistencyIssue),
|
|
88
|
+
...Array(10).fill({ severity: 'major', category: 'patterns' } as ConsistencyIssue),
|
|
89
|
+
];
|
|
90
|
+
|
|
91
|
+
const result = calculateConsistencyScore(
|
|
92
|
+
issues.map((i, idx) => ({
|
|
93
|
+
...i,
|
|
94
|
+
message: 'test',
|
|
95
|
+
location: { file: 'test.ts', line: idx },
|
|
96
|
+
})) as ConsistencyIssue[],
|
|
97
|
+
5
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
expect(result.recommendations.length).toBeGreaterThan(0);
|
|
101
|
+
expect(result.recommendations.some(r => r.action.includes('critical'))).toBe(true);
|
|
102
|
+
expect(result.recommendations.some(r => r.action.includes('naming'))).toBe(true);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('should handle edge case of zero files', () => {
|
|
106
|
+
const issues: ConsistencyIssue[] = [];
|
|
107
|
+
|
|
108
|
+
const result = calculateConsistencyScore(issues, 0);
|
|
109
|
+
|
|
110
|
+
expect(result.score).toBe(100);
|
|
111
|
+
expect(result.rawMetrics.issuesPerFile).toBe(0);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('should recommend linter for many minor issues', () => {
|
|
115
|
+
const issues: ConsistencyIssue[] = Array(30).fill({
|
|
116
|
+
severity: 'minor',
|
|
117
|
+
category: 'naming',
|
|
118
|
+
message: 'Minor style issue',
|
|
119
|
+
location: { file: 'test.ts', line: 1 },
|
|
120
|
+
} as ConsistencyIssue);
|
|
121
|
+
|
|
122
|
+
const result = calculateConsistencyScore(issues, 10);
|
|
123
|
+
|
|
124
|
+
expect(result.recommendations.some(r => r.action.includes('linter'))).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('should combine all penalty types', () => {
|
|
128
|
+
const issues: ConsistencyIssue[] = [
|
|
129
|
+
...Array(10).fill({ severity: 'critical', category: 'naming' } as ConsistencyIssue),
|
|
130
|
+
...Array(20).fill({ severity: 'major', category: 'patterns' } as ConsistencyIssue),
|
|
131
|
+
...Array(40).fill({ severity: 'minor', category: 'naming' } as ConsistencyIssue),
|
|
132
|
+
];
|
|
133
|
+
|
|
134
|
+
const result = calculateConsistencyScore(
|
|
135
|
+
issues.map((i, idx) => ({
|
|
136
|
+
...i,
|
|
137
|
+
message: 'test',
|
|
138
|
+
location: { file: 'test.ts', line: idx },
|
|
139
|
+
})) as ConsistencyIssue[],
|
|
140
|
+
10
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
// 70 issues / 10 files = 7 issues/file
|
|
144
|
+
// High density + critical issues + weighted severity
|
|
145
|
+
expect(result.score).toBeLessThan(30);
|
|
146
|
+
expect(result.factors.length).toBeGreaterThan(2);
|
|
147
|
+
expect(result.recommendations.length).toBeGreaterThan(0);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
});
|
package/src/index.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { analyzeNamingAST } from './analyzers/naming-ast';
|
|
|
3
3
|
export { analyzeNaming } from './analyzers/naming'; // Legacy regex version
|
|
4
4
|
export { detectNamingConventions } from './analyzers/naming-constants';
|
|
5
5
|
export { analyzePatterns } from './analyzers/patterns';
|
|
6
|
+
export { calculateConsistencyScore } from './scoring';
|
|
6
7
|
export type {
|
|
7
8
|
ConsistencyOptions,
|
|
8
9
|
ConsistencyReport,
|
package/src/scoring.ts
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { ToolScoringOutput } from '@aiready/core';
|
|
2
|
+
import type { ConsistencyIssue } from './types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Calculate AI Readiness Score for code consistency (0-100)
|
|
6
|
+
*
|
|
7
|
+
* Based on:
|
|
8
|
+
* - Issue density (issues per file)
|
|
9
|
+
* - Weighted severity (critical: 10pts, major: 3pts, minor: 0.5pts)
|
|
10
|
+
* - Pattern consistency across codebase
|
|
11
|
+
*/
|
|
12
|
+
export function calculateConsistencyScore(
|
|
13
|
+
issues: ConsistencyIssue[],
|
|
14
|
+
totalFilesAnalyzed: number
|
|
15
|
+
): ToolScoringOutput {
|
|
16
|
+
const criticalIssues = issues.filter(i => i.severity === 'critical').length;
|
|
17
|
+
const majorIssues = issues.filter(i => i.severity === 'major').length;
|
|
18
|
+
const minorIssues = issues.filter(i => i.severity === 'minor').length;
|
|
19
|
+
const totalIssues = issues.length;
|
|
20
|
+
|
|
21
|
+
// Issue density penalty (0-50 points)
|
|
22
|
+
// Ideal: 0 issues/file = 0 penalty
|
|
23
|
+
// Acceptable: <1 issue/file = 10 penalty
|
|
24
|
+
// High: 1-3 issues/file = 10-40 penalty
|
|
25
|
+
// Critical: >3 issues/file = 40-50 penalty
|
|
26
|
+
const issuesPerFile = totalFilesAnalyzed > 0 ? totalIssues / totalFilesAnalyzed : 0;
|
|
27
|
+
const densityPenalty = Math.min(50, issuesPerFile * 15);
|
|
28
|
+
|
|
29
|
+
// Weighted severity penalty (0-50 points)
|
|
30
|
+
// Each critical: 10 points
|
|
31
|
+
// Each major: 3 points
|
|
32
|
+
// Each minor: 0.5 points
|
|
33
|
+
const weightedCount = (criticalIssues * 10) + (majorIssues * 3) + (minorIssues * 0.5);
|
|
34
|
+
const avgWeightedIssuesPerFile = totalFilesAnalyzed > 0 ? weightedCount / totalFilesAnalyzed : 0;
|
|
35
|
+
const severityPenalty = Math.min(50, avgWeightedIssuesPerFile * 2);
|
|
36
|
+
|
|
37
|
+
// Calculate final score
|
|
38
|
+
const rawScore = 100 - densityPenalty - severityPenalty;
|
|
39
|
+
const score = Math.max(0, Math.min(100, Math.round(rawScore)));
|
|
40
|
+
|
|
41
|
+
// Build factors array
|
|
42
|
+
const factors: ToolScoringOutput['factors'] = [
|
|
43
|
+
{
|
|
44
|
+
name: 'Issue Density',
|
|
45
|
+
impact: -Math.round(densityPenalty),
|
|
46
|
+
description: `${issuesPerFile.toFixed(2)} issues per file ${issuesPerFile < 1 ? '(excellent)' : issuesPerFile < 3 ? '(acceptable)' : '(high)'}`,
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
if (criticalIssues > 0) {
|
|
51
|
+
const criticalImpact = Math.min(30, criticalIssues * 10);
|
|
52
|
+
factors.push({
|
|
53
|
+
name: 'Critical Issues',
|
|
54
|
+
impact: -criticalImpact,
|
|
55
|
+
description: `${criticalIssues} critical consistency issue${criticalIssues > 1 ? 's' : ''} (high AI confusion risk)`,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (majorIssues > 0) {
|
|
60
|
+
const majorImpact = Math.min(20, Math.round(majorIssues * 3));
|
|
61
|
+
factors.push({
|
|
62
|
+
name: 'Major Issues',
|
|
63
|
+
impact: -majorImpact,
|
|
64
|
+
description: `${majorIssues} major issue${majorIssues > 1 ? 's' : ''} (moderate AI confusion risk)`,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (minorIssues > 0 && minorIssues >= totalFilesAnalyzed) {
|
|
69
|
+
const minorImpact = -Math.round(minorIssues * 0.5);
|
|
70
|
+
factors.push({
|
|
71
|
+
name: 'Minor Issues',
|
|
72
|
+
impact: minorImpact,
|
|
73
|
+
description: `${minorIssues} minor issue${minorIssues > 1 ? 's' : ''} (slight AI confusion risk)`,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Generate recommendations
|
|
78
|
+
const recommendations: ToolScoringOutput['recommendations'] = [];
|
|
79
|
+
|
|
80
|
+
if (criticalIssues > 0) {
|
|
81
|
+
const estimatedImpact = Math.min(30, criticalIssues * 10);
|
|
82
|
+
recommendations.push({
|
|
83
|
+
action: 'Fix critical naming/pattern inconsistencies (highest AI confusion risk)',
|
|
84
|
+
estimatedImpact,
|
|
85
|
+
priority: 'high',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (majorIssues > 5) {
|
|
90
|
+
const estimatedImpact = Math.min(15, Math.round(majorIssues / 2));
|
|
91
|
+
recommendations.push({
|
|
92
|
+
action: 'Standardize naming conventions across codebase',
|
|
93
|
+
estimatedImpact,
|
|
94
|
+
priority: 'medium',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (issuesPerFile > 3) {
|
|
99
|
+
recommendations.push({
|
|
100
|
+
action: 'Establish and enforce coding style guide to reduce inconsistencies',
|
|
101
|
+
estimatedImpact: 12,
|
|
102
|
+
priority: 'medium',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (totalIssues > 20 && minorIssues / totalIssues > 0.7) {
|
|
107
|
+
recommendations.push({
|
|
108
|
+
action: 'Enable linter/formatter to automatically fix minor style issues',
|
|
109
|
+
estimatedImpact: 8,
|
|
110
|
+
priority: 'low',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
toolName: 'consistency',
|
|
116
|
+
score,
|
|
117
|
+
rawMetrics: {
|
|
118
|
+
totalIssues,
|
|
119
|
+
criticalIssues,
|
|
120
|
+
majorIssues,
|
|
121
|
+
minorIssues,
|
|
122
|
+
issuesPerFile: Math.round(issuesPerFile * 100) / 100,
|
|
123
|
+
avgWeightedIssuesPerFile: Math.round(avgWeightedIssuesPerFile * 100) / 100,
|
|
124
|
+
},
|
|
125
|
+
factors,
|
|
126
|
+
recommendations,
|
|
127
|
+
};
|
|
128
|
+
}
|