@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
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { readFileContent } from '@aiready/core';
|
|
2
|
+
import { COMMON_SHORT_WORDS, ACCEPTABLE_ABBREVIATIONS, snakeCaseToCamelCase, } from './naming-constants';
|
|
3
|
+
import { loadNamingConfig } from '../utils/config-loader';
|
|
4
|
+
/**
|
|
5
|
+
* Analyzes naming conventions and quality
|
|
6
|
+
*/
|
|
7
|
+
export async function analyzeNaming(files) {
|
|
8
|
+
const issues = [];
|
|
9
|
+
// Load and merge configuration
|
|
10
|
+
const { customAbbreviations, customShortWords, disabledChecks } = await loadNamingConfig(files);
|
|
11
|
+
for (const file of files) {
|
|
12
|
+
const content = await readFileContent(file);
|
|
13
|
+
const fileIssues = analyzeFileNaming(file, content, customAbbreviations, customShortWords, disabledChecks);
|
|
14
|
+
issues.push(...fileIssues);
|
|
15
|
+
}
|
|
16
|
+
return issues;
|
|
17
|
+
}
|
|
18
|
+
function analyzeFileNaming(file, content, customAbbreviations, customShortWords, disabledChecks) {
|
|
19
|
+
const issues = [];
|
|
20
|
+
// Check if this is a test file (more lenient rules)
|
|
21
|
+
const isTestFile = file.match(/\.(test|spec)\.(ts|tsx|js|jsx)$/);
|
|
22
|
+
// Split into lines for line number tracking
|
|
23
|
+
const lines = content.split('\n');
|
|
24
|
+
// Merge custom sets with defaults
|
|
25
|
+
const allAbbreviations = new Set([...ACCEPTABLE_ABBREVIATIONS, ...customAbbreviations]);
|
|
26
|
+
const allShortWords = new Set([...COMMON_SHORT_WORDS, ...customShortWords]);
|
|
27
|
+
/**
|
|
28
|
+
* Helper: Get context window around a line (for multi-line pattern detection)
|
|
29
|
+
*/
|
|
30
|
+
const getContextWindow = (index, windowSize = 3) => {
|
|
31
|
+
const start = Math.max(0, index - windowSize);
|
|
32
|
+
const end = Math.min(lines.length, index + windowSize + 1);
|
|
33
|
+
return lines.slice(start, end).join('\n');
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Helper: Check if a variable is short-lived (used only within 3-5 lines)
|
|
37
|
+
*/
|
|
38
|
+
const isShortLivedVariable = (varName, declarationIndex) => {
|
|
39
|
+
const searchRange = 5; // Check 5 lines after declaration
|
|
40
|
+
const endIndex = Math.min(lines.length, declarationIndex + searchRange + 1);
|
|
41
|
+
let usageCount = 0;
|
|
42
|
+
for (let i = declarationIndex; i < endIndex; i++) {
|
|
43
|
+
// Match variable name as whole word
|
|
44
|
+
const regex = new RegExp(`\\b${varName}\\b`, 'g');
|
|
45
|
+
const matches = lines[i].match(regex);
|
|
46
|
+
if (matches) {
|
|
47
|
+
usageCount += matches.length;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// If variable is only used 2-3 times within 5 lines, it's short-lived
|
|
51
|
+
// (1 = declaration, 1-2 = actual usage)
|
|
52
|
+
return usageCount >= 2 && usageCount <= 3;
|
|
53
|
+
};
|
|
54
|
+
// Check for naming patterns
|
|
55
|
+
lines.forEach((line, index) => {
|
|
56
|
+
const lineNumber = index + 1;
|
|
57
|
+
const contextWindow = getContextWindow(index);
|
|
58
|
+
// Check for single letter variables (except i, j, k, l in loops/common contexts)
|
|
59
|
+
if (!disabledChecks.has('single-letter')) {
|
|
60
|
+
const singleLetterMatches = line.matchAll(/\b(?:const|let|var)\s+([a-hm-z])\s*=/gi);
|
|
61
|
+
for (const match of singleLetterMatches) {
|
|
62
|
+
const letter = match[1].toLowerCase();
|
|
63
|
+
// Coverage metrics context (s/b/f/l are standard for statements/branches/functions/lines)
|
|
64
|
+
const isCoverageContext = /coverage|summary|metrics|pct|percent/i.test(line) ||
|
|
65
|
+
/\.(?:statements|branches|functions|lines)\.pct/i.test(line);
|
|
66
|
+
if (isCoverageContext && ['s', 'b', 'f', 'l'].includes(letter)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
// Enhanced loop/iterator context detection
|
|
70
|
+
const isInLoopContext = line.includes('for') ||
|
|
71
|
+
/\.(map|filter|forEach|reduce|find|some|every)\s*\(/.test(line) ||
|
|
72
|
+
line.includes('=>') || // Arrow function
|
|
73
|
+
/\w+\s*=>\s*/.test(line); // Callback pattern
|
|
74
|
+
// Check for i18n/translation context
|
|
75
|
+
const isI18nContext = line.includes('useTranslation') ||
|
|
76
|
+
line.includes('i18n.t') ||
|
|
77
|
+
/\bt\s*\(['"]/.test(line); // t('key') pattern
|
|
78
|
+
// Check for arrow function parameter (improved detection with context window)
|
|
79
|
+
const isArrowFunctionParam = /\(\s*[a-z]\s*(?:,\s*[a-z]\s*)*\)\s*=>/.test(line) || // (s) => or (a, b) =>
|
|
80
|
+
/[a-z]\s*=>/.test(line) || // s => on same line
|
|
81
|
+
// Multi-line arrow function detection: look for pattern in context window
|
|
82
|
+
new RegExp(`\\b${letter}\\s*\\)\\s*$`).test(line) && /=>/.test(contextWindow) || // (s)\n =>
|
|
83
|
+
new RegExp(`\\.(?:map|filter|forEach|reduce|find|some|every)\\s*\\(\\s*$`).test(lines[index - 1] || '') && /=>/.test(contextWindow); // .map(\n s =>
|
|
84
|
+
// Check if variable is short-lived (comparison/temporary contexts)
|
|
85
|
+
const isShortLived = isShortLivedVariable(letter, index);
|
|
86
|
+
if (!isInLoopContext && !isI18nContext && !isArrowFunctionParam && !isShortLived && !['x', 'y', 'z', 'i', 'j', 'k', 'l', 'n', 'm'].includes(letter)) {
|
|
87
|
+
// Skip in test files unless it's really unclear
|
|
88
|
+
if (isTestFile && ['a', 'b', 'c', 'd', 'e', 'f', 's'].includes(letter)) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
issues.push({
|
|
92
|
+
file,
|
|
93
|
+
line: lineNumber,
|
|
94
|
+
type: 'poor-naming',
|
|
95
|
+
identifier: match[1],
|
|
96
|
+
severity: 'minor',
|
|
97
|
+
suggestion: `Use descriptive variable name instead of single letter '${match[1]}'`
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Check for overly abbreviated variables
|
|
103
|
+
if (!disabledChecks.has('abbreviation')) {
|
|
104
|
+
const abbreviationMatches = line.matchAll(/\b(?:const|let|var)\s+([a-z]{1,3})(?=[A-Z]|_|\s*=)/g);
|
|
105
|
+
for (const match of abbreviationMatches) {
|
|
106
|
+
const abbrev = match[1].toLowerCase();
|
|
107
|
+
// Skip if it's a common short English word (full word, not abbreviation)
|
|
108
|
+
if (allShortWords.has(abbrev)) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
// Skip acceptable abbreviations (including custom ones)
|
|
112
|
+
if (allAbbreviations.has(abbrev)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// Check for arrow function parameter context (with multi-line detection)
|
|
116
|
+
const isArrowFunctionParam = /\(\s*[a-z]\s*(?:,\s*[a-z]\s*)*\)\s*=>/.test(line) || // (s) => or (a, b) =>
|
|
117
|
+
new RegExp(`\\b${abbrev}\\s*=>`).test(line) || // s => on same line
|
|
118
|
+
// Multi-line arrow function: check context window
|
|
119
|
+
(new RegExp(`\\b${abbrev}\\s*\\)\\s*$`).test(line) && /=>/.test(contextWindow)) || // (s)\n =>
|
|
120
|
+
(new RegExp(`\\.(?:map|filter|forEach|reduce|find|some|every)\\s*\\(\\s*$`).test(lines[index - 1] || '') &&
|
|
121
|
+
new RegExp(`^\\s*${abbrev}\\s*=>`).test(line)); // .map(\n s =>
|
|
122
|
+
if (isArrowFunctionParam) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
// For very short names (1-2 letters), check for date/time context
|
|
126
|
+
if (abbrev.length <= 2) {
|
|
127
|
+
const isDateTimeContext = /date|time|day|hour|minute|second|timestamp/i.test(line);
|
|
128
|
+
if (isDateTimeContext && ['d', 't', 'dt'].includes(abbrev)) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// Check for user/auth context
|
|
132
|
+
const isUserContext = /user|auth|account/i.test(line);
|
|
133
|
+
if (isUserContext && abbrev === 'u') {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
issues.push({
|
|
138
|
+
file,
|
|
139
|
+
line: lineNumber,
|
|
140
|
+
type: 'abbreviation',
|
|
141
|
+
identifier: match[1],
|
|
142
|
+
severity: 'info',
|
|
143
|
+
suggestion: `Consider using full word instead of abbreviation '${match[1]}'`
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Check for snake_case vs camelCase mixing in TypeScript/JavaScript
|
|
148
|
+
if (!disabledChecks.has('convention-mix') && file.match(/\.(ts|tsx|js|jsx)$/)) {
|
|
149
|
+
const camelCaseVars = line.match(/\b(?:const|let|var)\s+([a-z][a-zA-Z0-9]*)\s*=/);
|
|
150
|
+
const snakeCaseVars = line.match(/\b(?:const|let|var)\s+([a-z][a-z0-9]*_[a-z0-9_]*)\s*=/);
|
|
151
|
+
if (snakeCaseVars) {
|
|
152
|
+
issues.push({
|
|
153
|
+
file,
|
|
154
|
+
line: lineNumber,
|
|
155
|
+
type: 'convention-mix',
|
|
156
|
+
identifier: snakeCaseVars[1],
|
|
157
|
+
severity: 'minor',
|
|
158
|
+
suggestion: `Use camelCase '${snakeCaseToCamelCase(snakeCaseVars[1])}' instead of snake_case in TypeScript/JavaScript`
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Check for unclear boolean names (should start with is/has/should/can)
|
|
163
|
+
if (!disabledChecks.has('unclear')) {
|
|
164
|
+
const booleanMatches = line.matchAll(/\b(?:const|let|var)\s+([a-z][a-zA-Z0-9]*)\s*:\s*boolean/gi);
|
|
165
|
+
for (const match of booleanMatches) {
|
|
166
|
+
const name = match[1];
|
|
167
|
+
if (!name.match(/^(is|has|should|can|will|did)/i)) {
|
|
168
|
+
issues.push({
|
|
169
|
+
file,
|
|
170
|
+
line: lineNumber,
|
|
171
|
+
type: 'unclear',
|
|
172
|
+
identifier: name,
|
|
173
|
+
severity: 'info',
|
|
174
|
+
suggestion: `Boolean variable '${name}' should start with is/has/should/can for clarity`
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Check for function names that don't indicate action
|
|
180
|
+
if (!disabledChecks.has('unclear')) {
|
|
181
|
+
const functionMatches = line.matchAll(/function\s+([a-z][a-zA-Z0-9]*)/g);
|
|
182
|
+
for (const match of functionMatches) {
|
|
183
|
+
const name = match[1];
|
|
184
|
+
// Skip JavaScript/TypeScript keywords that shouldn't be function names
|
|
185
|
+
const isKeyword = ['for', 'if', 'else', 'while', 'do', 'switch', 'case', 'break', 'continue', 'return', 'throw', 'try', 'catch', 'finally', 'with', 'yield', 'await'].includes(name);
|
|
186
|
+
if (isKeyword) {
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
// Skip common entry point names
|
|
190
|
+
const isEntryPoint = ['main', 'init', 'setup', 'bootstrap'].includes(name);
|
|
191
|
+
if (isEntryPoint) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
// Functions should typically start with verbs, but allow:
|
|
195
|
+
// 1. Factory/builder patterns (ends with Factory, Builder, etc.)
|
|
196
|
+
// 2. Descriptive compound names that explain what they return
|
|
197
|
+
// 3. Event handlers (onClick, onSubmit, etc.)
|
|
198
|
+
// 4. Descriptive aggregate/collection patterns
|
|
199
|
+
// 5. Very long descriptive names (>15 chars)
|
|
200
|
+
// 6. Compound words with 3+ capitals
|
|
201
|
+
// 7. Helper/utility functions (common patterns)
|
|
202
|
+
// 8. React hooks (useX pattern)
|
|
203
|
+
const isFactoryPattern = name.match(/(Factory|Builder|Creator|Generator|Provider|Adapter|Mock)$/);
|
|
204
|
+
const isEventHandler = name.match(/^on[A-Z]/);
|
|
205
|
+
const isDescriptiveLong = name.length > 15; // Reduced from 20 to 15
|
|
206
|
+
const isReactHook = name.match(/^use[A-Z]/); // React hooks
|
|
207
|
+
// Check for descriptive patterns
|
|
208
|
+
const isDescriptivePattern = name.match(/^(default|total|count|sum|avg|max|min|initial|current|previous|next)\w+/) ||
|
|
209
|
+
name.match(/\w+(Count|Total|Sum|Average|List|Map|Set|Config|Settings|Options|Props|Data|Info|Details|State|Status|Response|Result)$/);
|
|
210
|
+
// Helper/utility function patterns
|
|
211
|
+
const isHelperPattern = name.match(/^(to|from|with|without|for|as|into)\w+/) || // toMetadata, withLogger, forPath
|
|
212
|
+
name.match(/^\w+(To|From|With|Without|For|As|Into)\w*$/); // metadataTo, pathFrom
|
|
213
|
+
// Common utility names that are descriptive
|
|
214
|
+
const isUtilityName = ['cn', 'proxy', 'sitemap', 'robots', 'gtag'].includes(name);
|
|
215
|
+
// Count capital letters for compound detection
|
|
216
|
+
const capitalCount = (name.match(/[A-Z]/g) || []).length;
|
|
217
|
+
const isCompoundWord = capitalCount >= 3; // daysSinceLastCommit has 4 capitals
|
|
218
|
+
const hasActionVerb = name.match(/^(get|set|is|has|can|should|create|update|delete|fetch|load|save|process|handle|validate|check|find|search|filter|map|reduce|make|do|run|start|stop|build|parse|format|render|calculate|compute|generate|transform|convert|normalize|sanitize|encode|decode|compress|extract|merge|split|join|sort|compare|test|verify|ensure|apply|execute|invoke|call|emit|dispatch|trigger|listen|subscribe|unsubscribe|add|remove|clear|reset|toggle|enable|disable|open|close|connect|disconnect|send|receive|read|write|import|export|register|unregister|mount|unmount|track|store|persist|upsert|derive|classify|combine|discover|activate|require|assert|expect|mask|escape|sign|put|list|complete|page|safe|mock|pick|pluralize|text)/);
|
|
219
|
+
if (!hasActionVerb && !isFactoryPattern && !isEventHandler && !isDescriptiveLong && !isDescriptivePattern && !isCompoundWord && !isHelperPattern && !isUtilityName && !isReactHook) {
|
|
220
|
+
issues.push({
|
|
221
|
+
file,
|
|
222
|
+
line: lineNumber,
|
|
223
|
+
type: 'unclear',
|
|
224
|
+
identifier: name,
|
|
225
|
+
severity: 'info',
|
|
226
|
+
suggestion: `Function '${name}' should start with an action verb (get, set, create, etc.)`
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
return issues;
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/analyzers/naming.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PatternIssue } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Analyzes code pattern consistency
|
|
4
|
+
*/
|
|
5
|
+
export declare function analyzePatterns(files: string[]): Promise<PatternIssue[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Analyzes API design consistency
|
|
8
|
+
*/
|
|
9
|
+
export declare function analyzeAPIDesign(files: string[]): Promise<PatternIssue[]>;
|
|
10
|
+
//# sourceMappingURL=patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/analyzers/patterns.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAgB9E;AAkMD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAO/E"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { readFileContent } from '@aiready/core';
|
|
2
|
+
/**
|
|
3
|
+
* Analyzes code pattern consistency
|
|
4
|
+
*/
|
|
5
|
+
export async function analyzePatterns(files) {
|
|
6
|
+
const issues = [];
|
|
7
|
+
// Analyze error handling patterns
|
|
8
|
+
const errorHandlingIssues = await analyzeErrorHandling(files);
|
|
9
|
+
issues.push(...errorHandlingIssues);
|
|
10
|
+
// Analyze async/await patterns
|
|
11
|
+
const asyncIssues = await analyzeAsyncPatterns(files);
|
|
12
|
+
issues.push(...asyncIssues);
|
|
13
|
+
// Analyze import styles
|
|
14
|
+
const importIssues = await analyzeImportStyles(files);
|
|
15
|
+
issues.push(...importIssues);
|
|
16
|
+
return issues;
|
|
17
|
+
}
|
|
18
|
+
async function analyzeErrorHandling(files) {
|
|
19
|
+
const patterns = {
|
|
20
|
+
tryCatch: [],
|
|
21
|
+
throwsError: [],
|
|
22
|
+
returnsNull: [],
|
|
23
|
+
returnsError: []
|
|
24
|
+
};
|
|
25
|
+
for (const file of files) {
|
|
26
|
+
const content = await readFileContent(file);
|
|
27
|
+
if (content.includes('try {') || content.includes('} catch')) {
|
|
28
|
+
patterns.tryCatch.push(file);
|
|
29
|
+
}
|
|
30
|
+
if (content.match(/throw new \w*Error/)) {
|
|
31
|
+
patterns.throwsError.push(file);
|
|
32
|
+
}
|
|
33
|
+
if (content.match(/return null/)) {
|
|
34
|
+
patterns.returnsNull.push(file);
|
|
35
|
+
}
|
|
36
|
+
if (content.match(/return \{ error:/)) {
|
|
37
|
+
patterns.returnsError.push(file);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const issues = [];
|
|
41
|
+
// Check for mixed error handling strategies
|
|
42
|
+
const strategiesUsed = Object.values(patterns).filter(p => p.length > 0).length;
|
|
43
|
+
if (strategiesUsed > 2) {
|
|
44
|
+
issues.push({
|
|
45
|
+
files: [...new Set([
|
|
46
|
+
...patterns.tryCatch,
|
|
47
|
+
...patterns.throwsError,
|
|
48
|
+
...patterns.returnsNull,
|
|
49
|
+
...patterns.returnsError
|
|
50
|
+
])],
|
|
51
|
+
type: 'error-handling',
|
|
52
|
+
description: 'Inconsistent error handling strategies across codebase',
|
|
53
|
+
examples: [
|
|
54
|
+
patterns.tryCatch.length > 0 ? `Try-catch used in ${patterns.tryCatch.length} files` : '',
|
|
55
|
+
patterns.throwsError.length > 0 ? `Throws errors in ${patterns.throwsError.length} files` : '',
|
|
56
|
+
patterns.returnsNull.length > 0 ? `Returns null in ${patterns.returnsNull.length} files` : '',
|
|
57
|
+
patterns.returnsError.length > 0 ? `Returns error objects in ${patterns.returnsError.length} files` : ''
|
|
58
|
+
].filter(e => e),
|
|
59
|
+
severity: 'major'
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return issues;
|
|
63
|
+
}
|
|
64
|
+
async function analyzeAsyncPatterns(files) {
|
|
65
|
+
const patterns = {
|
|
66
|
+
asyncAwait: [],
|
|
67
|
+
promises: [],
|
|
68
|
+
callbacks: []
|
|
69
|
+
};
|
|
70
|
+
for (const file of files) {
|
|
71
|
+
const content = await readFileContent(file);
|
|
72
|
+
if (content.match(/async\s+(function|\(|[a-zA-Z])/)) {
|
|
73
|
+
patterns.asyncAwait.push(file);
|
|
74
|
+
}
|
|
75
|
+
if (content.match(/\.then\(/) || content.match(/\.catch\(/)) {
|
|
76
|
+
patterns.promises.push(file);
|
|
77
|
+
}
|
|
78
|
+
if (content.match(/callback\s*\(/) || content.match(/\(\s*err\s*,/)) {
|
|
79
|
+
patterns.callbacks.push(file);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const issues = [];
|
|
83
|
+
// Modern codebases should prefer async/await
|
|
84
|
+
if (patterns.callbacks.length > 0 && patterns.asyncAwait.length > 0) {
|
|
85
|
+
issues.push({
|
|
86
|
+
files: [...patterns.callbacks, ...patterns.asyncAwait],
|
|
87
|
+
type: 'async-style',
|
|
88
|
+
description: 'Mixed async patterns: callbacks and async/await',
|
|
89
|
+
examples: [
|
|
90
|
+
`Callbacks found in: ${patterns.callbacks.slice(0, 3).join(', ')}`,
|
|
91
|
+
`Async/await used in: ${patterns.asyncAwait.slice(0, 3).join(', ')}`
|
|
92
|
+
],
|
|
93
|
+
severity: 'minor'
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// Mixing .then() chains with async/await
|
|
97
|
+
if (patterns.promises.length > patterns.asyncAwait.length * 0.3 && patterns.asyncAwait.length > 0) {
|
|
98
|
+
issues.push({
|
|
99
|
+
files: patterns.promises,
|
|
100
|
+
type: 'async-style',
|
|
101
|
+
description: 'Consider using async/await instead of promise chains for consistency',
|
|
102
|
+
examples: patterns.promises.slice(0, 5),
|
|
103
|
+
severity: 'info'
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return issues;
|
|
107
|
+
}
|
|
108
|
+
async function analyzeImportStyles(files) {
|
|
109
|
+
const patterns = {
|
|
110
|
+
esModules: [],
|
|
111
|
+
commonJS: [],
|
|
112
|
+
mixed: []
|
|
113
|
+
};
|
|
114
|
+
for (const file of files) {
|
|
115
|
+
const content = await readFileContent(file);
|
|
116
|
+
const hasESM = content.match(/^import\s+/m);
|
|
117
|
+
// Check for actual CommonJS require() calls, excluding:
|
|
118
|
+
// - String literals: "require('...') or 'require('...')
|
|
119
|
+
// - Regex patterns: /require\(/
|
|
120
|
+
// - Comments: // require( or /* require( */
|
|
121
|
+
const hasCJS = hasActualRequireCalls(content);
|
|
122
|
+
if (hasESM && hasCJS) {
|
|
123
|
+
patterns.mixed.push(file);
|
|
124
|
+
}
|
|
125
|
+
else if (hasESM) {
|
|
126
|
+
patterns.esModules.push(file);
|
|
127
|
+
}
|
|
128
|
+
else if (hasCJS) {
|
|
129
|
+
patterns.commonJS.push(file);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const issues = [];
|
|
133
|
+
// Check for mixed import styles in same file
|
|
134
|
+
if (patterns.mixed.length > 0) {
|
|
135
|
+
issues.push({
|
|
136
|
+
files: patterns.mixed,
|
|
137
|
+
type: 'import-style',
|
|
138
|
+
description: 'Mixed ES modules and CommonJS imports in same files',
|
|
139
|
+
examples: patterns.mixed.slice(0, 5),
|
|
140
|
+
severity: 'major'
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// Check for inconsistent styles across project
|
|
144
|
+
if (patterns.esModules.length > 0 && patterns.commonJS.length > 0) {
|
|
145
|
+
const ratio = patterns.commonJS.length / (patterns.esModules.length + patterns.commonJS.length);
|
|
146
|
+
if (ratio > 0.2 && ratio < 0.8) {
|
|
147
|
+
issues.push({
|
|
148
|
+
files: [...patterns.esModules, ...patterns.commonJS],
|
|
149
|
+
type: 'import-style',
|
|
150
|
+
description: 'Inconsistent import styles across project',
|
|
151
|
+
examples: [
|
|
152
|
+
`ES modules: ${patterns.esModules.length} files`,
|
|
153
|
+
`CommonJS: ${patterns.commonJS.length} files`
|
|
154
|
+
],
|
|
155
|
+
severity: 'minor'
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return issues;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Detects actual require() calls, excluding false positives
|
|
163
|
+
* Filters out require() in:
|
|
164
|
+
* - String literals (single/double/template quotes)
|
|
165
|
+
* - Regex patterns
|
|
166
|
+
* - Single-line comments (//)
|
|
167
|
+
* - Multi-line comments
|
|
168
|
+
*/
|
|
169
|
+
function hasActualRequireCalls(content) {
|
|
170
|
+
// Simple heuristic: remove obvious false positives
|
|
171
|
+
// 1. Remove single-line comments
|
|
172
|
+
let cleaned = content.replace(/\/\/.*$/gm, '');
|
|
173
|
+
// 2. Remove multi-line comments (non-greedy)
|
|
174
|
+
cleaned = cleaned.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
175
|
+
// 3. Remove string literals - use simpler regex to avoid backtracking
|
|
176
|
+
// Match strings but don't try to be perfect, just remove obvious ones
|
|
177
|
+
cleaned = cleaned.replace(/"[^"\n]*"/g, '""');
|
|
178
|
+
cleaned = cleaned.replace(/'[^'\n]*'/g, "''");
|
|
179
|
+
cleaned = cleaned.replace(/`[^`]*`/g, '``');
|
|
180
|
+
// 4. Simple regex detection: if we see /require in the line, likely a regex pattern
|
|
181
|
+
// Remove lines that look like regex patterns with require
|
|
182
|
+
cleaned = cleaned.replace(/\/[^/\n]*require[^/\n]*\/[gimsuvy]*/g, '');
|
|
183
|
+
// Now check for require( in the cleaned content
|
|
184
|
+
return /require\s*\(/.test(cleaned);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Analyzes API design consistency
|
|
188
|
+
*/
|
|
189
|
+
export async function analyzeAPIDesign(files) {
|
|
190
|
+
// This would analyze:
|
|
191
|
+
// - Function parameter order consistency
|
|
192
|
+
// - Return type patterns
|
|
193
|
+
// - Options object vs individual parameters
|
|
194
|
+
// For now, return empty array
|
|
195
|
+
return [];
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/analyzers/patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACtD,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC,CAAC,uBAAuB;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ToolScoringOutput } from '@aiready/core';
|
|
2
|
+
import type { ConsistencyIssue } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Calculate AI Readiness Score for code consistency (0-100)
|
|
5
|
+
*
|
|
6
|
+
* Based on:
|
|
7
|
+
* - Issue density (issues per file)
|
|
8
|
+
* - Weighted severity (critical: 10pts, major: 3pts, minor: 0.5pts)
|
|
9
|
+
* - Pattern consistency across codebase
|
|
10
|
+
*/
|
|
11
|
+
export declare function calculateConsistencyScore(issues: ConsistencyIssue[], totalFilesAnalyzed: number): ToolScoringOutput;
|
|
12
|
+
//# sourceMappingURL=scoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,SAAS,CAAC;AAEhD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,EAAE,EAC1B,kBAAkB,EAAE,MAAM,GACzB,iBAAiB,CAiHnB"}
|
package/dist/scoring.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate AI Readiness Score for code consistency (0-100)
|
|
3
|
+
*
|
|
4
|
+
* Based on:
|
|
5
|
+
* - Issue density (issues per file)
|
|
6
|
+
* - Weighted severity (critical: 10pts, major: 3pts, minor: 0.5pts)
|
|
7
|
+
* - Pattern consistency across codebase
|
|
8
|
+
*/
|
|
9
|
+
export function calculateConsistencyScore(issues, totalFilesAnalyzed) {
|
|
10
|
+
const criticalIssues = issues.filter(i => i.severity === 'critical').length;
|
|
11
|
+
const majorIssues = issues.filter(i => i.severity === 'major').length;
|
|
12
|
+
const minorIssues = issues.filter(i => i.severity === 'minor').length;
|
|
13
|
+
const totalIssues = issues.length;
|
|
14
|
+
// Issue density penalty (0-50 points)
|
|
15
|
+
// Ideal: 0 issues/file = 0 penalty
|
|
16
|
+
// Acceptable: <1 issue/file = 10 penalty
|
|
17
|
+
// High: 1-3 issues/file = 10-40 penalty
|
|
18
|
+
// Critical: >3 issues/file = 40-50 penalty
|
|
19
|
+
const issuesPerFile = totalFilesAnalyzed > 0 ? totalIssues / totalFilesAnalyzed : 0;
|
|
20
|
+
const densityPenalty = Math.min(50, issuesPerFile * 15);
|
|
21
|
+
// Weighted severity penalty (0-50 points)
|
|
22
|
+
// Each critical: 10 points
|
|
23
|
+
// Each major: 3 points
|
|
24
|
+
// Each minor: 0.5 points
|
|
25
|
+
const weightedCount = (criticalIssues * 10) + (majorIssues * 3) + (minorIssues * 0.5);
|
|
26
|
+
const avgWeightedIssuesPerFile = totalFilesAnalyzed > 0 ? weightedCount / totalFilesAnalyzed : 0;
|
|
27
|
+
const severityPenalty = Math.min(50, avgWeightedIssuesPerFile * 2);
|
|
28
|
+
// Calculate final score
|
|
29
|
+
const rawScore = 100 - densityPenalty - severityPenalty;
|
|
30
|
+
const score = Math.max(0, Math.min(100, Math.round(rawScore)));
|
|
31
|
+
// Build factors array
|
|
32
|
+
const factors = [
|
|
33
|
+
{
|
|
34
|
+
name: 'Issue Density',
|
|
35
|
+
impact: -Math.round(densityPenalty),
|
|
36
|
+
description: `${issuesPerFile.toFixed(2)} issues per file ${issuesPerFile < 1 ? '(excellent)' : issuesPerFile < 3 ? '(acceptable)' : '(high)'}`,
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
if (criticalIssues > 0) {
|
|
40
|
+
const criticalImpact = Math.min(30, criticalIssues * 10);
|
|
41
|
+
factors.push({
|
|
42
|
+
name: 'Critical Issues',
|
|
43
|
+
impact: -criticalImpact,
|
|
44
|
+
description: `${criticalIssues} critical consistency issue${criticalIssues > 1 ? 's' : ''} (high AI confusion risk)`,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (majorIssues > 0) {
|
|
48
|
+
const majorImpact = Math.min(20, Math.round(majorIssues * 3));
|
|
49
|
+
factors.push({
|
|
50
|
+
name: 'Major Issues',
|
|
51
|
+
impact: -majorImpact,
|
|
52
|
+
description: `${majorIssues} major issue${majorIssues > 1 ? 's' : ''} (moderate AI confusion risk)`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (minorIssues > 0 && minorIssues >= totalFilesAnalyzed) {
|
|
56
|
+
const minorImpact = -Math.round(minorIssues * 0.5);
|
|
57
|
+
factors.push({
|
|
58
|
+
name: 'Minor Issues',
|
|
59
|
+
impact: minorImpact,
|
|
60
|
+
description: `${minorIssues} minor issue${minorIssues > 1 ? 's' : ''} (slight AI confusion risk)`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// Generate recommendations
|
|
64
|
+
const recommendations = [];
|
|
65
|
+
if (criticalIssues > 0) {
|
|
66
|
+
const estimatedImpact = Math.min(30, criticalIssues * 10);
|
|
67
|
+
recommendations.push({
|
|
68
|
+
action: 'Fix critical naming/pattern inconsistencies (highest AI confusion risk)',
|
|
69
|
+
estimatedImpact,
|
|
70
|
+
priority: 'high',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (majorIssues > 5) {
|
|
74
|
+
const estimatedImpact = Math.min(15, Math.round(majorIssues / 2));
|
|
75
|
+
recommendations.push({
|
|
76
|
+
action: 'Standardize naming conventions across codebase',
|
|
77
|
+
estimatedImpact,
|
|
78
|
+
priority: 'medium',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (issuesPerFile > 3) {
|
|
82
|
+
recommendations.push({
|
|
83
|
+
action: 'Establish and enforce coding style guide to reduce inconsistencies',
|
|
84
|
+
estimatedImpact: 12,
|
|
85
|
+
priority: 'medium',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (totalIssues > 20 && minorIssues / totalIssues > 0.7) {
|
|
89
|
+
recommendations.push({
|
|
90
|
+
action: 'Enable linter/formatter to automatically fix minor style issues',
|
|
91
|
+
estimatedImpact: 8,
|
|
92
|
+
priority: 'low',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
toolName: 'consistency',
|
|
97
|
+
score,
|
|
98
|
+
rawMetrics: {
|
|
99
|
+
totalIssues,
|
|
100
|
+
criticalIssues,
|
|
101
|
+
majorIssues,
|
|
102
|
+
minorIssues,
|
|
103
|
+
issuesPerFile: Math.round(issuesPerFile * 100) / 100,
|
|
104
|
+
avgWeightedIssuesPerFile: Math.round(avgWeightedIssuesPerFile * 100) / 100,
|
|
105
|
+
},
|
|
106
|
+
factors,
|
|
107
|
+
recommendations,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=scoring.js.map
|