@aiready/consistency 0.8.4 → 0.8.6
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 +7 -7
- package/.turbo/turbo-test.log +10 -7
- package/dist/__tests__/analyzer.test.d.ts +2 -0
- package/dist/__tests__/analyzer.test.d.ts.map +1 -0
- package/dist/__tests__/analyzer.test.js +157 -0
- package/dist/__tests__/analyzer.test.js.map +1 -0
- package/dist/__tests__/language-filter.test.d.ts +2 -0
- package/dist/__tests__/language-filter.test.d.ts.map +1 -0
- package/dist/__tests__/language-filter.test.js +46 -0
- package/dist/__tests__/language-filter.test.js.map +1 -0
- package/dist/__tests__/scoring.test.d.ts +2 -0
- package/dist/__tests__/scoring.test.d.ts.map +1 -0
- package/dist/__tests__/scoring.test.js +118 -0
- package/dist/__tests__/scoring.test.js.map +1 -0
- package/dist/analyzer.d.ts +7 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +160 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/analyzers/naming-ast.d.ts +7 -0
- package/dist/analyzers/naming-ast.d.ts.map +1 -0
- package/dist/analyzers/naming-ast.js +253 -0
- package/dist/analyzers/naming-ast.js.map +1 -0
- package/dist/analyzers/naming-constants.d.ts +21 -0
- package/dist/analyzers/naming-constants.d.ts.map +1 -0
- package/dist/analyzers/naming-constants.js +96 -0
- package/dist/analyzers/naming-constants.js.map +1 -0
- package/dist/analyzers/naming-python.d.ts +16 -0
- package/dist/analyzers/naming-python.d.ts.map +1 -0
- package/dist/analyzers/naming-python.js +165 -0
- package/dist/analyzers/naming-python.js.map +1 -0
- package/dist/analyzers/naming.d.ts +6 -0
- package/dist/analyzers/naming.d.ts.map +1 -0
- package/dist/analyzers/naming.js +234 -0
- package/dist/analyzers/naming.js.map +1 -0
- package/dist/analyzers/patterns.d.ts +10 -0
- package/dist/analyzers/patterns.d.ts.map +1 -0
- package/dist/analyzers/patterns.js +197 -0
- package/dist/analyzers/patterns.js.map +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/scoring.d.ts +12 -0
- package/dist/scoring.d.ts.map +1 -0
- package/dist/scoring.js +110 -0
- package/dist/scoring.js.map +1 -0
- package/dist/types.d.ts +53 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/ast-parser.d.ts +46 -0
- package/dist/utils/ast-parser.d.ts.map +1 -0
- package/dist/utils/ast-parser.js +157 -0
- package/dist/utils/ast-parser.js.map +1 -0
- package/dist/utils/config-loader.d.ts +19 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +31 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/context-detector.d.ts +40 -0
- package/dist/utils/context-detector.d.ts.map +1 -0
- package/dist/utils/context-detector.js +225 -0
- package/dist/utils/context-detector.js.map +1 -0
- package/dist/utils/scope-tracker.d.ts +87 -0
- package/dist/utils/scope-tracker.d.ts.map +1 -0
- package/dist/utils/scope-tracker.js +161 -0
- package/dist/utils/scope-tracker.js.map +1 -0
- package/package.json +2 -2
- package/tsconfig.tsbuildinfo +1 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @aiready/consistency@0.8.
|
|
3
|
+
> @aiready/consistency@0.8.6 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,15 +9,15 @@
|
|
|
9
9
|
[34mCLI[39m Target: es2020
|
|
10
10
|
[34mCJS[39m Build start
|
|
11
11
|
[34mESM[39m Build start
|
|
12
|
-
[
|
|
13
|
-
[32mCJS[39m [1mdist/cli.js [22m[32m50.90 KB[39m
|
|
14
|
-
[32mCJS[39m ⚡️ Build success in 72ms
|
|
12
|
+
[32mESM[39m [1mdist/cli.mjs [22m[32m8.76 KB[39m
|
|
15
13
|
[32mESM[39m [1mdist/chunk-YEHXYHGY.mjs [22m[32m40.95 KB[39m
|
|
16
14
|
[32mESM[39m [1mdist/index.mjs [22m[32m12.69 KB[39m
|
|
17
|
-
[32mESM[39m
|
|
18
|
-
[
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 119ms
|
|
16
|
+
[32mCJS[39m [1mdist/cli.js [22m[32m50.90 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/index.js [22m[32m55.33 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 119ms
|
|
19
19
|
DTS Build start
|
|
20
|
-
DTS ⚡️ Build success in
|
|
20
|
+
DTS ⚡️ Build success in 2110ms
|
|
21
21
|
DTS dist/cli.d.ts 20.00 B
|
|
22
22
|
DTS dist/index.d.ts 3.27 KB
|
|
23
23
|
DTS dist/cli.d.mts 20.00 B
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @aiready/consistency@0.8.
|
|
3
|
+
> @aiready/consistency@0.8.6 test /Users/pengcao/projects/aiready/packages/consistency
|
|
4
4
|
> vitest run
|
|
5
5
|
|
|
6
6
|
[?25l
|
|
7
7
|
[1m[46m RUN [49m[22m [36mv4.0.18 [39m[90m/Users/pengcao/projects/aiready/packages/consistency[39m
|
|
8
8
|
|
|
9
|
-
[32m✓[39m src/__tests__/scoring.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m
|
|
9
|
+
[32m✓[39m src/__tests__/scoring.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
|
|
10
|
+
[32m✓[39m dist/__tests__/scoring.test.js [2m([22m[2m8 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
11
|
+
[32m✓[39m dist/__tests__/language-filter.test.js [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
10
12
|
[32m✓[39m src/__tests__/language-filter.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
11
|
-
[32m✓[39m
|
|
13
|
+
[32m✓[39m dist/__tests__/analyzer.test.js [2m([22m[2m18 tests[22m[2m)[22m[32m 242[2mms[22m[39m
|
|
14
|
+
[32m✓[39m src/__tests__/analyzer.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 217[2mms[22m[39m
|
|
12
15
|
|
|
13
|
-
[2m Test Files [22m [1m[
|
|
14
|
-
[2m Tests [22m [1m[
|
|
15
|
-
[2m Start at [22m 22:
|
|
16
|
-
[2m Duration [22m
|
|
16
|
+
[2m Test Files [22m [1m[32m6 passed[39m[22m[90m (6)[39m
|
|
17
|
+
[2m Tests [22m [1m[32m58 passed[39m[22m[90m (58)[39m
|
|
18
|
+
[2m Start at [22m 22:46:18
|
|
19
|
+
[2m Duration [22m 2.18s[2m (transform 2.46s, setup 0ms, import 4.94s, tests 482ms, environment 0ms)[22m
|
|
17
20
|
|
|
18
21
|
[?25h
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/analyzer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { analyzeConsistency } from '../analyzer';
|
|
3
|
+
import { analyzePatterns } from '../analyzers/patterns';
|
|
4
|
+
describe('analyzeConsistency', () => {
|
|
5
|
+
it('should analyze naming issues', async () => {
|
|
6
|
+
const report = await analyzeConsistency({
|
|
7
|
+
rootDir: './src',
|
|
8
|
+
checkNaming: true,
|
|
9
|
+
checkPatterns: false,
|
|
10
|
+
});
|
|
11
|
+
expect(report).toHaveProperty('summary');
|
|
12
|
+
expect(report).toHaveProperty('results');
|
|
13
|
+
expect(report).toHaveProperty('recommendations');
|
|
14
|
+
expect(report.summary).toHaveProperty('namingIssues');
|
|
15
|
+
});
|
|
16
|
+
it('should detect minimum severity filtering', async () => {
|
|
17
|
+
const report = await analyzeConsistency({
|
|
18
|
+
rootDir: './src',
|
|
19
|
+
minSeverity: 'major',
|
|
20
|
+
});
|
|
21
|
+
// All issues should be major or critical
|
|
22
|
+
for (const result of report.results) {
|
|
23
|
+
for (const issue of result.issues) {
|
|
24
|
+
expect(['major', 'critical']).toContain(issue.severity);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('analyzeNaming', () => {
|
|
30
|
+
it('should detect single letter variables', () => {
|
|
31
|
+
const testCode = `
|
|
32
|
+
const x = 10;
|
|
33
|
+
const y = 20;
|
|
34
|
+
const result = x + y;
|
|
35
|
+
`;
|
|
36
|
+
// In a real test, we'd create temp files or mock file reading
|
|
37
|
+
// For now, this is a placeholder structure
|
|
38
|
+
expect(true).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
it('should NOT flag acceptable abbreviations', () => {
|
|
41
|
+
// These should all be acceptable and NOT flagged
|
|
42
|
+
const acceptableAbbreviations = [
|
|
43
|
+
'env', 'req', 'res', 'ctx', 'err', 'api', 'url', 'id',
|
|
44
|
+
'max', 'min', 'now', 'utm', 'has', 'is', 'can',
|
|
45
|
+
'db', 'fs', 'os', 'ui', 'tmp', 'src', 'dst',
|
|
46
|
+
// New additions from Phase 1
|
|
47
|
+
'img', 'txt', 'doc', 'md', 'ts', 'js', 'ddb', 's3',
|
|
48
|
+
'fcp', 'lcp', 'fps', 'po', 'dto', 'e2e', 'a11y', 'i18n'
|
|
49
|
+
];
|
|
50
|
+
// These abbreviations should not trigger warnings
|
|
51
|
+
expect(acceptableAbbreviations.length).toBeGreaterThan(0);
|
|
52
|
+
});
|
|
53
|
+
it('should NOT flag common short English words', () => {
|
|
54
|
+
// Full words, not abbreviations - should be accepted
|
|
55
|
+
const commonWords = [
|
|
56
|
+
'day', 'key', 'net', 'to', 'go', 'for', 'not', 'new', 'old',
|
|
57
|
+
'top', 'end', 'run', 'try', 'use', 'get', 'set', 'add', 'put'
|
|
58
|
+
];
|
|
59
|
+
// These are full words and should not be flagged as abbreviations
|
|
60
|
+
expect(commonWords.length).toBeGreaterThan(0);
|
|
61
|
+
});
|
|
62
|
+
it('should detect snake_case in TypeScript files', () => {
|
|
63
|
+
const testCode = `
|
|
64
|
+
const user_name = 'John';
|
|
65
|
+
const user_id = 123;
|
|
66
|
+
`;
|
|
67
|
+
// Test would check for convention-mix issues
|
|
68
|
+
expect(true).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
it('should detect unclear boolean names', () => {
|
|
71
|
+
const testCode = `
|
|
72
|
+
const enabled: boolean = true;
|
|
73
|
+
const active: boolean = false;
|
|
74
|
+
`;
|
|
75
|
+
// Should suggest prefixes like isEnabled, isActive
|
|
76
|
+
expect(true).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
it('should allow common abbreviations', () => {
|
|
79
|
+
const testCode = `
|
|
80
|
+
const id = '123';
|
|
81
|
+
const url = 'https://example.com';
|
|
82
|
+
const api = new ApiClient();
|
|
83
|
+
`;
|
|
84
|
+
// Should not flag these as issues
|
|
85
|
+
expect(true).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it('should NOT flag multi-line arrow function parameters (Phase 3)', () => {
|
|
88
|
+
// Multi-line arrow functions should not trigger single-letter warnings
|
|
89
|
+
const multiLineArrowCode = `
|
|
90
|
+
items.map(
|
|
91
|
+
s => s.value
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
items.filter(
|
|
95
|
+
item =>
|
|
96
|
+
item.valid
|
|
97
|
+
)
|
|
98
|
+
`;
|
|
99
|
+
// 's' and 'item' should not be flagged as poor naming
|
|
100
|
+
expect(true).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
it('should NOT flag short-lived comparison variables (Phase 3)', () => {
|
|
103
|
+
// Variables used only within 3-5 lines for comparisons
|
|
104
|
+
const shortLivedCode = `
|
|
105
|
+
const a = obj1;
|
|
106
|
+
const b = obj2;
|
|
107
|
+
return compare(a, b);
|
|
108
|
+
`;
|
|
109
|
+
// 'a' and 'b' should not be flagged as they're short-lived
|
|
110
|
+
expect(true).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('analyzePatterns', () => {
|
|
114
|
+
it('should detect mixed error handling', async () => {
|
|
115
|
+
// Test would analyze files with different error handling approaches
|
|
116
|
+
const issues = await analyzePatterns([]);
|
|
117
|
+
expect(Array.isArray(issues)).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
it('should detect mixed async patterns', async () => {
|
|
120
|
+
// Test would check for async/await vs promises vs callbacks
|
|
121
|
+
const issues = await analyzePatterns([]);
|
|
122
|
+
expect(Array.isArray(issues)).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it('should detect mixed import styles', async () => {
|
|
125
|
+
// Test would check for ES modules vs CommonJS
|
|
126
|
+
const issues = await analyzePatterns([]);
|
|
127
|
+
expect(Array.isArray(issues)).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('consistency scoring', () => {
|
|
131
|
+
it('should calculate consistency score correctly', () => {
|
|
132
|
+
// Lower issues = higher score
|
|
133
|
+
expect(true).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
it('should weight critical issues more than info', () => {
|
|
136
|
+
// Critical issues should reduce score more
|
|
137
|
+
expect(true).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe('recommendations', () => {
|
|
141
|
+
it('should generate relevant recommendations', async () => {
|
|
142
|
+
const report = await analyzeConsistency({
|
|
143
|
+
rootDir: './src',
|
|
144
|
+
});
|
|
145
|
+
expect(Array.isArray(report.recommendations)).toBe(true);
|
|
146
|
+
expect(report.recommendations.length).toBeGreaterThan(0);
|
|
147
|
+
});
|
|
148
|
+
it('should suggest standardizing error handling', () => {
|
|
149
|
+
// When mixed error handling detected
|
|
150
|
+
expect(true).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
it('should suggest using async/await consistently', () => {
|
|
153
|
+
// When mixed async patterns detected
|
|
154
|
+
expect(true).toBe(true);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
//# sourceMappingURL=analyzer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.test.js","sourceRoot":"","sources":["../../src/__tests__/analyzer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QAEH,yCAAyC;QACzC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG;;;;CAIpB,CAAC;QACE,8DAA8D;QAC9D,2CAA2C;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,iDAAiD;QACjD,MAAM,uBAAuB,GAAG;YAC9B,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI;YACrD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;YAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;YAC3C,6BAA6B;YAC7B,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;YAClD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;SACxD,CAAC;QACF,kDAAkD;QAClD,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,qDAAqD;QACrD,MAAM,WAAW,GAAG;YAClB,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;YAC3D,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;SAC9D,CAAC;QACF,kEAAkE;QAClE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,QAAQ,GAAG;;;CAGpB,CAAC;QACE,6CAA6C;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG;;;CAGpB,CAAC;QACE,mDAAmD;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,QAAQ,GAAG;;;;CAIpB,CAAC;QACE,kCAAkC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,uEAAuE;QACvE,MAAM,kBAAkB,GAAG;;;;;;;;;CAS9B,CAAC;QACE,sDAAsD;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,uDAAuD;QACvD,MAAM,cAAc,GAAG;;;;CAI1B,CAAC;QACE,2DAA2D;QAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,oEAAoE;QACpE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,4DAA4D;QAC5D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,8CAA8C;QAC9C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,8BAA8B;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,2CAA2C;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,qCAAqC;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,qCAAqC;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-filter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/language-filter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { analyzeNamingAST } from '../analyzers/naming-ast';
|
|
3
|
+
describe('Language File Filtering', () => {
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
// Suppress console warnings during tests
|
|
6
|
+
vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
7
|
+
});
|
|
8
|
+
it('should only process JS/TS files', async () => {
|
|
9
|
+
const mixedFiles = [
|
|
10
|
+
'/path/to/file.ts',
|
|
11
|
+
'/path/to/file.tsx',
|
|
12
|
+
'/path/to/file.js',
|
|
13
|
+
'/path/to/file.jsx',
|
|
14
|
+
'/path/to/file.py', // Should be filtered out
|
|
15
|
+
'/path/to/file.java', // Should be filtered out
|
|
16
|
+
'/path/to/file.rb', // Should be filtered out
|
|
17
|
+
'/path/to/file.go', // Should be filtered out
|
|
18
|
+
];
|
|
19
|
+
// This test verifies that the function doesn't crash on non-JS/TS files
|
|
20
|
+
// In reality, it will try to read these files if they exist, but parseFile will return null
|
|
21
|
+
// and they'll be skipped. The filtering happens before parseFile is called.
|
|
22
|
+
await expect(analyzeNamingAST(mixedFiles)).resolves.not.toThrow();
|
|
23
|
+
});
|
|
24
|
+
it('should filter out Python files before parsing', async () => {
|
|
25
|
+
const files = [
|
|
26
|
+
'/path/to/script.py',
|
|
27
|
+
'/path/to/another.py',
|
|
28
|
+
];
|
|
29
|
+
// Should not attempt to parse Python files
|
|
30
|
+
const result = await analyzeNamingAST(files);
|
|
31
|
+
expect(result).toEqual([]);
|
|
32
|
+
});
|
|
33
|
+
it('should accept all JS/TS file extensions', async () => {
|
|
34
|
+
const jstsFiles = [
|
|
35
|
+
'test.js',
|
|
36
|
+
'test.jsx',
|
|
37
|
+
'test.ts',
|
|
38
|
+
'test.tsx',
|
|
39
|
+
'TEST.JS', // Test case-insensitive
|
|
40
|
+
'TEST.TS',
|
|
41
|
+
];
|
|
42
|
+
// These should all pass the filter (though they won't parse if they don't exist)
|
|
43
|
+
await expect(analyzeNamingAST(jstsFiles)).resolves.not.toThrow();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=language-filter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-filter.test.js","sourceRoot":"","sources":["../../src/__tests__/language-filter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,UAAU,CAAC,GAAG,EAAE;QACd,yCAAyC;QACzC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,UAAU,GAAG;YACjB,kBAAkB;YAClB,mBAAmB;YACnB,kBAAkB;YAClB,mBAAmB;YACnB,kBAAkB,EAAM,yBAAyB;YACjD,oBAAoB,EAAI,yBAAyB;YACjD,kBAAkB,EAAM,yBAAyB;YACjD,kBAAkB,EAAM,yBAAyB;SAClD,CAAC;QAEF,wEAAwE;QACxE,4FAA4F;QAC5F,4EAA4E;QAC5E,MAAM,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,KAAK,GAAG;YACZ,oBAAoB;YACpB,qBAAqB;SACtB,CAAC;QAEF,2CAA2C;QAC3C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,SAAS,GAAG;YAChB,SAAS;YACT,UAAU;YACV,SAAS;YACT,UAAU;YACV,SAAS,EAAG,wBAAwB;YACpC,SAAS;SACV,CAAC;QAEF,iFAAiF;QACjF,MAAM,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scoring.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { calculateConsistencyScore } from '../scoring';
|
|
3
|
+
describe('Consistency Scoring', () => {
|
|
4
|
+
describe('calculateConsistencyScore', () => {
|
|
5
|
+
it('should return perfect score for no issues', () => {
|
|
6
|
+
const result = calculateConsistencyScore([], 100);
|
|
7
|
+
expect(result.score).toBe(100);
|
|
8
|
+
expect(result.toolName).toBe('consistency');
|
|
9
|
+
expect(result.rawMetrics.totalIssues).toBe(0);
|
|
10
|
+
expect(result.recommendations).toHaveLength(0);
|
|
11
|
+
});
|
|
12
|
+
it('should penalize high issue density', () => {
|
|
13
|
+
const issues = Array(50).fill({
|
|
14
|
+
severity: 'minor',
|
|
15
|
+
category: 'naming',
|
|
16
|
+
message: 'Test issue',
|
|
17
|
+
location: { file: 'test.ts', line: 1 },
|
|
18
|
+
});
|
|
19
|
+
// 50 issues / 10 files = 5 issues per file
|
|
20
|
+
// densityPenalty = min(50, 5 * 15) = 50
|
|
21
|
+
const result = calculateConsistencyScore(issues, 10);
|
|
22
|
+
expect(result.score).toBeLessThan(60);
|
|
23
|
+
expect(result.rawMetrics.issuesPerFile).toBe(5);
|
|
24
|
+
});
|
|
25
|
+
it('should heavily penalize critical issues', () => {
|
|
26
|
+
const issues = [
|
|
27
|
+
{
|
|
28
|
+
severity: 'critical',
|
|
29
|
+
category: 'naming',
|
|
30
|
+
message: 'Critical naming issue',
|
|
31
|
+
location: { file: 'test.ts', line: 1 },
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
severity: 'critical',
|
|
35
|
+
category: 'naming',
|
|
36
|
+
message: 'Another critical issue',
|
|
37
|
+
location: { file: 'test.ts', line: 10 },
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
const result = calculateConsistencyScore(issues, 10);
|
|
41
|
+
// 2 issues / 10 files = 0.2 issues/file → densityPenalty = 3
|
|
42
|
+
// weightedCount = 2*10 = 20, avgWeighted = 2.0 → severityPenalty = 4
|
|
43
|
+
// score = 100 - 3 - 4 = 93
|
|
44
|
+
expect(result.score).toBe(93);
|
|
45
|
+
expect(result.rawMetrics.criticalIssues).toBe(2);
|
|
46
|
+
expect(result.factors.some(f => f.name === 'Critical Issues')).toBe(true);
|
|
47
|
+
expect(result.recommendations.some(r => r.priority === 'high')).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
it('should apply weighted severity penalties', () => {
|
|
50
|
+
const issues = [
|
|
51
|
+
...Array(5).fill({ severity: 'critical' }),
|
|
52
|
+
...Array(10).fill({ severity: 'major' }),
|
|
53
|
+
...Array(20).fill({ severity: 'minor' }),
|
|
54
|
+
];
|
|
55
|
+
const result = calculateConsistencyScore(issues.map((i, idx) => ({
|
|
56
|
+
...i,
|
|
57
|
+
category: 'naming',
|
|
58
|
+
message: 'test',
|
|
59
|
+
location: { file: 'test.ts', line: idx },
|
|
60
|
+
})), 50);
|
|
61
|
+
expect(result.rawMetrics.criticalIssues).toBe(5);
|
|
62
|
+
expect(result.rawMetrics.majorIssues).toBe(10);
|
|
63
|
+
expect(result.rawMetrics.minorIssues).toBe(20);
|
|
64
|
+
// 35 issues / 50 files = 0.7 issues/file → densityPenalty = 10.5
|
|
65
|
+
// weightedCount = 50+30+10 = 90, avgWeighted = 1.8 → severityPenalty = 3.6
|
|
66
|
+
// score = 100 - 10.5 - 3.6 = 85.9 → 86
|
|
67
|
+
expect(result.score).toBe(86);
|
|
68
|
+
});
|
|
69
|
+
it('should generate appropriate recommendations', () => {
|
|
70
|
+
const issues = [
|
|
71
|
+
...Array(3).fill({ severity: 'critical', category: 'naming' }),
|
|
72
|
+
...Array(10).fill({ severity: 'major', category: 'patterns' }),
|
|
73
|
+
];
|
|
74
|
+
const result = calculateConsistencyScore(issues.map((i, idx) => ({
|
|
75
|
+
...i,
|
|
76
|
+
message: 'test',
|
|
77
|
+
location: { file: 'test.ts', line: idx },
|
|
78
|
+
})), 5);
|
|
79
|
+
expect(result.recommendations.length).toBeGreaterThan(0);
|
|
80
|
+
expect(result.recommendations.some(r => r.action.includes('critical'))).toBe(true);
|
|
81
|
+
expect(result.recommendations.some(r => r.action.includes('naming'))).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
it('should handle edge case of zero files', () => {
|
|
84
|
+
const issues = [];
|
|
85
|
+
const result = calculateConsistencyScore(issues, 0);
|
|
86
|
+
expect(result.score).toBe(100);
|
|
87
|
+
expect(result.rawMetrics.issuesPerFile).toBe(0);
|
|
88
|
+
});
|
|
89
|
+
it('should recommend linter for many minor issues', () => {
|
|
90
|
+
const issues = Array(30).fill({
|
|
91
|
+
severity: 'minor',
|
|
92
|
+
category: 'naming',
|
|
93
|
+
message: 'Minor style issue',
|
|
94
|
+
location: { file: 'test.ts', line: 1 },
|
|
95
|
+
});
|
|
96
|
+
const result = calculateConsistencyScore(issues, 10);
|
|
97
|
+
expect(result.recommendations.some(r => r.action.includes('linter'))).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
it('should combine all penalty types', () => {
|
|
100
|
+
const issues = [
|
|
101
|
+
...Array(10).fill({ severity: 'critical', category: 'naming' }),
|
|
102
|
+
...Array(20).fill({ severity: 'major', category: 'patterns' }),
|
|
103
|
+
...Array(40).fill({ severity: 'minor', category: 'naming' }),
|
|
104
|
+
];
|
|
105
|
+
const result = calculateConsistencyScore(issues.map((i, idx) => ({
|
|
106
|
+
...i,
|
|
107
|
+
message: 'test',
|
|
108
|
+
location: { file: 'test.ts', line: idx },
|
|
109
|
+
})), 10);
|
|
110
|
+
// 70 issues / 10 files = 7 issues/file
|
|
111
|
+
// High density + critical issues + weighted severity
|
|
112
|
+
expect(result.score).toBeLessThan(30);
|
|
113
|
+
expect(result.factors.length).toBeGreaterThan(2);
|
|
114
|
+
expect(result.recommendations.length).toBeGreaterThan(0);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=scoring.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.test.js","sourceRoot":"","sources":["../../src/__tests__/scoring.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ConsistencyOptions, ConsistencyReport } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Main consistency analyzer that orchestrates all analysis types
|
|
4
|
+
* Supports: TypeScript, JavaScript, Python
|
|
5
|
+
*/
|
|
6
|
+
export declare function analyzeConsistency(options: ConsistencyOptions): Promise<ConsistencyReport>;
|
|
7
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;AAKvF;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAyI5B"}
|
package/dist/analyzer.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { scanFiles } from '@aiready/core';
|
|
2
|
+
import { analyzeNamingAST } from './analyzers/naming-ast';
|
|
3
|
+
import { analyzePythonNaming } from './analyzers/naming-python';
|
|
4
|
+
import { analyzePatterns } from './analyzers/patterns';
|
|
5
|
+
/**
|
|
6
|
+
* Main consistency analyzer that orchestrates all analysis types
|
|
7
|
+
* Supports: TypeScript, JavaScript, Python
|
|
8
|
+
*/
|
|
9
|
+
export async function analyzeConsistency(options) {
|
|
10
|
+
const { checkNaming = true, checkPatterns = true, checkArchitecture = false, // Not implemented yet
|
|
11
|
+
minSeverity = 'info', ...scanOptions } = options;
|
|
12
|
+
// Scan files
|
|
13
|
+
const filePaths = await scanFiles(scanOptions);
|
|
14
|
+
// Separate files by language
|
|
15
|
+
const tsJsFiles = filePaths.filter(f => /\.(ts|tsx|js|jsx)$/i.test(f));
|
|
16
|
+
const pythonFiles = filePaths.filter(f => /\.py$/i.test(f));
|
|
17
|
+
// Collect issues by category - now handles multiple languages
|
|
18
|
+
let namingIssues = [];
|
|
19
|
+
if (checkNaming) {
|
|
20
|
+
const tsJsNamingIssues = tsJsFiles.length > 0 ? await analyzeNamingAST(tsJsFiles) : [];
|
|
21
|
+
const pythonNamingIssues = pythonFiles.length > 0 ? await analyzePythonNaming(pythonFiles) : [];
|
|
22
|
+
namingIssues = [...tsJsNamingIssues, ...pythonNamingIssues];
|
|
23
|
+
}
|
|
24
|
+
const patternIssues = checkPatterns ? await analyzePatterns(filePaths) : [];
|
|
25
|
+
// Convert to AnalysisResult format
|
|
26
|
+
const results = [];
|
|
27
|
+
const fileIssuesMap = new Map();
|
|
28
|
+
// Process naming issues
|
|
29
|
+
for (const issue of namingIssues) {
|
|
30
|
+
if (!shouldIncludeSeverity(issue.severity, minSeverity)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const consistencyIssue = {
|
|
34
|
+
type: issue.type === 'convention-mix' ? 'naming-inconsistency' : 'naming-quality',
|
|
35
|
+
category: 'naming',
|
|
36
|
+
severity: issue.severity,
|
|
37
|
+
message: `${issue.type}: ${issue.identifier}`,
|
|
38
|
+
location: {
|
|
39
|
+
file: issue.file,
|
|
40
|
+
line: issue.line,
|
|
41
|
+
column: issue.column
|
|
42
|
+
},
|
|
43
|
+
suggestion: issue.suggestion
|
|
44
|
+
};
|
|
45
|
+
if (!fileIssuesMap.has(issue.file)) {
|
|
46
|
+
fileIssuesMap.set(issue.file, []);
|
|
47
|
+
}
|
|
48
|
+
fileIssuesMap.get(issue.file).push(consistencyIssue);
|
|
49
|
+
}
|
|
50
|
+
// Process pattern issues
|
|
51
|
+
for (const issue of patternIssues) {
|
|
52
|
+
if (!shouldIncludeSeverity(issue.severity, minSeverity)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const consistencyIssue = {
|
|
56
|
+
type: 'pattern-inconsistency',
|
|
57
|
+
category: 'patterns',
|
|
58
|
+
severity: issue.severity,
|
|
59
|
+
message: issue.description,
|
|
60
|
+
location: {
|
|
61
|
+
file: issue.files[0] || 'multiple files',
|
|
62
|
+
line: 1
|
|
63
|
+
},
|
|
64
|
+
examples: issue.examples,
|
|
65
|
+
suggestion: `Standardize ${issue.type} patterns across ${issue.files.length} files`
|
|
66
|
+
};
|
|
67
|
+
// Add to first file in the pattern
|
|
68
|
+
const firstFile = issue.files[0];
|
|
69
|
+
if (firstFile && !fileIssuesMap.has(firstFile)) {
|
|
70
|
+
fileIssuesMap.set(firstFile, []);
|
|
71
|
+
}
|
|
72
|
+
if (firstFile) {
|
|
73
|
+
fileIssuesMap.get(firstFile).push(consistencyIssue);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Convert to AnalysisResult format
|
|
77
|
+
for (const [fileName, issues] of fileIssuesMap) {
|
|
78
|
+
results.push({
|
|
79
|
+
fileName,
|
|
80
|
+
issues: issues,
|
|
81
|
+
metrics: {
|
|
82
|
+
consistencyScore: calculateConsistencyScore(issues)
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Sort results by severity first, then by issue count per file
|
|
87
|
+
results.sort((fileResultA, fileResultB) => {
|
|
88
|
+
const severityOrder = { critical: 0, major: 1, minor: 2, info: 3 };
|
|
89
|
+
// Get highest severity in each file
|
|
90
|
+
const maxSeverityA = Math.min(...fileResultA.issues.map(i => severityOrder[i.severity]));
|
|
91
|
+
const maxSeverityB = Math.min(...fileResultB.issues.map(i => severityOrder[i.severity]));
|
|
92
|
+
// Sort by severity first
|
|
93
|
+
if (maxSeverityA !== maxSeverityB) {
|
|
94
|
+
return maxSeverityA - maxSeverityB;
|
|
95
|
+
}
|
|
96
|
+
// Then by issue count (descending)
|
|
97
|
+
return fileResultB.issues.length - fileResultA.issues.length;
|
|
98
|
+
});
|
|
99
|
+
// Generate recommendations
|
|
100
|
+
const recommendations = generateRecommendations(namingIssues, patternIssues);
|
|
101
|
+
// Compute filtered counts (respecting minSeverity) to report accurate summary
|
|
102
|
+
const namingCountFiltered = namingIssues.filter(i => shouldIncludeSeverity(i.severity, minSeverity)).length;
|
|
103
|
+
const patternCountFiltered = patternIssues.filter(i => shouldIncludeSeverity(i.severity, minSeverity)).length;
|
|
104
|
+
// Detect naming conventions (TODO: re-implement for AST version)
|
|
105
|
+
// const conventionAnalysis = detectNamingConventions(filePaths, namingIssues);
|
|
106
|
+
return {
|
|
107
|
+
summary: {
|
|
108
|
+
totalIssues: namingCountFiltered + patternCountFiltered,
|
|
109
|
+
namingIssues: namingCountFiltered,
|
|
110
|
+
patternIssues: patternCountFiltered,
|
|
111
|
+
architectureIssues: 0,
|
|
112
|
+
filesAnalyzed: filePaths.length
|
|
113
|
+
},
|
|
114
|
+
results,
|
|
115
|
+
recommendations
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function shouldIncludeSeverity(severity, minSeverity) {
|
|
119
|
+
const severityLevels = { info: 0, minor: 1, major: 2, critical: 3 };
|
|
120
|
+
return severityLevels[severity] >= severityLevels[minSeverity];
|
|
121
|
+
}
|
|
122
|
+
function calculateConsistencyScore(issues) {
|
|
123
|
+
// Higher score = more consistent (fewer issues)
|
|
124
|
+
const weights = { critical: 10, major: 5, minor: 2, info: 1 };
|
|
125
|
+
const totalWeight = issues.reduce((sum, issue) => sum + weights[issue.severity], 0);
|
|
126
|
+
// Score from 0-1, where 1 is perfect
|
|
127
|
+
return Math.max(0, 1 - totalWeight / 100);
|
|
128
|
+
}
|
|
129
|
+
function generateRecommendations(namingIssues, patternIssues) {
|
|
130
|
+
const recommendations = [];
|
|
131
|
+
if (namingIssues.length > 0) {
|
|
132
|
+
const conventionMixCount = namingIssues.filter(i => i.type === 'convention-mix').length;
|
|
133
|
+
if (conventionMixCount > 0) {
|
|
134
|
+
recommendations.push(`Standardize naming conventions: Found ${conventionMixCount} snake_case variables in TypeScript/JavaScript (use camelCase)`);
|
|
135
|
+
}
|
|
136
|
+
const poorNamingCount = namingIssues.filter(i => i.type === 'poor-naming').length;
|
|
137
|
+
if (poorNamingCount > 0) {
|
|
138
|
+
recommendations.push(`Improve variable naming: Found ${poorNamingCount} single-letter or unclear variable names`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (patternIssues.length > 0) {
|
|
142
|
+
const errorHandlingIssues = patternIssues.filter(i => i.type === 'error-handling');
|
|
143
|
+
if (errorHandlingIssues.length > 0) {
|
|
144
|
+
recommendations.push('Standardize error handling strategy across the codebase (prefer try-catch with typed errors)');
|
|
145
|
+
}
|
|
146
|
+
const asyncIssues = patternIssues.filter(i => i.type === 'async-style');
|
|
147
|
+
if (asyncIssues.length > 0) {
|
|
148
|
+
recommendations.push('Use async/await consistently instead of mixing with promise chains or callbacks');
|
|
149
|
+
}
|
|
150
|
+
const importIssues = patternIssues.filter(i => i.type === 'import-style');
|
|
151
|
+
if (importIssues.length > 0) {
|
|
152
|
+
recommendations.push('Use ES modules consistently across the project (avoid mixing with CommonJS)');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (recommendations.length === 0) {
|
|
156
|
+
recommendations.push('No major consistency issues found! Your codebase follows good practices.');
|
|
157
|
+
}
|
|
158
|
+
return recommendations;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { NamingIssue } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* AST-based naming analyzer
|
|
4
|
+
* Only supports TypeScript/JavaScript files (.ts, .tsx, .js, .jsx)
|
|
5
|
+
*/
|
|
6
|
+
export declare function analyzeNamingAST(files: string[]): Promise<NamingIssue[]>;
|
|
7
|
+
//# sourceMappingURL=naming-ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming-ast.d.ts","sourceRoot":"","sources":["../../src/analyzers/naming-ast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAmB5C;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA8B9E"}
|