@aiready/consistency 0.8.1 → 0.8.5

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.
Files changed (68) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/.turbo/turbo-test.log +12 -40
  3. package/dist/__tests__/analyzer.test.d.ts +2 -0
  4. package/dist/__tests__/analyzer.test.d.ts.map +1 -0
  5. package/dist/__tests__/analyzer.test.js +157 -0
  6. package/dist/__tests__/analyzer.test.js.map +1 -0
  7. package/dist/__tests__/language-filter.test.d.ts +2 -0
  8. package/dist/__tests__/language-filter.test.d.ts.map +1 -0
  9. package/dist/__tests__/language-filter.test.js +46 -0
  10. package/dist/__tests__/language-filter.test.js.map +1 -0
  11. package/dist/__tests__/scoring.test.d.ts +2 -0
  12. package/dist/__tests__/scoring.test.d.ts.map +1 -0
  13. package/dist/__tests__/scoring.test.js +118 -0
  14. package/dist/__tests__/scoring.test.js.map +1 -0
  15. package/dist/analyzer.d.ts +7 -0
  16. package/dist/analyzer.d.ts.map +1 -0
  17. package/dist/analyzer.js +160 -0
  18. package/dist/analyzer.js.map +1 -0
  19. package/dist/analyzers/naming-ast.d.ts +7 -0
  20. package/dist/analyzers/naming-ast.d.ts.map +1 -0
  21. package/dist/analyzers/naming-ast.js +253 -0
  22. package/dist/analyzers/naming-ast.js.map +1 -0
  23. package/dist/analyzers/naming-constants.d.ts +21 -0
  24. package/dist/analyzers/naming-constants.d.ts.map +1 -0
  25. package/dist/analyzers/naming-constants.js +96 -0
  26. package/dist/analyzers/naming-constants.js.map +1 -0
  27. package/dist/analyzers/naming-python.d.ts +16 -0
  28. package/dist/analyzers/naming-python.d.ts.map +1 -0
  29. package/dist/analyzers/naming-python.js +165 -0
  30. package/dist/analyzers/naming-python.js.map +1 -0
  31. package/dist/analyzers/naming.d.ts +6 -0
  32. package/dist/analyzers/naming.d.ts.map +1 -0
  33. package/dist/analyzers/naming.js +234 -0
  34. package/dist/analyzers/naming.js.map +1 -0
  35. package/dist/analyzers/patterns.d.ts +10 -0
  36. package/dist/analyzers/patterns.d.ts.map +1 -0
  37. package/dist/analyzers/patterns.js +197 -0
  38. package/dist/analyzers/patterns.js.map +1 -0
  39. package/dist/cli.d.ts.map +1 -0
  40. package/dist/cli.js.map +1 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/scoring.d.ts +12 -0
  44. package/dist/scoring.d.ts.map +1 -0
  45. package/dist/scoring.js +110 -0
  46. package/dist/scoring.js.map +1 -0
  47. package/dist/types.d.ts +53 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/utils/ast-parser.d.ts +46 -0
  52. package/dist/utils/ast-parser.d.ts.map +1 -0
  53. package/dist/utils/ast-parser.js +157 -0
  54. package/dist/utils/ast-parser.js.map +1 -0
  55. package/dist/utils/config-loader.d.ts +19 -0
  56. package/dist/utils/config-loader.d.ts.map +1 -0
  57. package/dist/utils/config-loader.js +31 -0
  58. package/dist/utils/config-loader.js.map +1 -0
  59. package/dist/utils/context-detector.d.ts +40 -0
  60. package/dist/utils/context-detector.d.ts.map +1 -0
  61. package/dist/utils/context-detector.js +225 -0
  62. package/dist/utils/context-detector.js.map +1 -0
  63. package/dist/utils/scope-tracker.d.ts +87 -0
  64. package/dist/utils/scope-tracker.d.ts.map +1 -0
  65. package/dist/utils/scope-tracker.js +161 -0
  66. package/dist/utils/scope-tracker.js.map +1 -0
  67. package/package.json +2 -2
  68. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { ScanOptions, AnalysisResult, Issue } from '@aiready/core';
2
+ export interface ConsistencyOptions extends ScanOptions {
3
+ /** Check naming conventions and quality */
4
+ checkNaming?: boolean;
5
+ /** Check code pattern consistency */
6
+ checkPatterns?: boolean;
7
+ /** Check architectural consistency */
8
+ checkArchitecture?: boolean;
9
+ /** Minimum severity to report */
10
+ minSeverity?: 'info' | 'minor' | 'major' | 'critical';
11
+ }
12
+ export interface ConsistencyIssue extends Issue {
13
+ type: 'naming-inconsistency' | 'naming-quality' | 'pattern-inconsistency' | 'architecture-inconsistency';
14
+ category: 'naming' | 'patterns' | 'architecture';
15
+ /** Examples of the inconsistency found */
16
+ examples?: string[];
17
+ /** Suggested fix or convention to follow */
18
+ suggestion?: string;
19
+ }
20
+ export interface NamingIssue {
21
+ file: string;
22
+ line: number;
23
+ column?: number;
24
+ type: 'poor-naming' | 'convention-mix' | 'abbreviation' | 'unclear';
25
+ identifier: string;
26
+ suggestion?: string;
27
+ severity: 'critical' | 'major' | 'minor' | 'info';
28
+ }
29
+ export interface PatternIssue {
30
+ files: string[];
31
+ type: 'error-handling' | 'async-style' | 'import-style' | 'api-design';
32
+ description: string;
33
+ examples: string[];
34
+ severity: 'critical' | 'major' | 'minor' | 'info';
35
+ }
36
+ export interface ArchitectureIssue {
37
+ type: 'file-organization' | 'module-structure' | 'export-style';
38
+ description: string;
39
+ affectedPaths: string[];
40
+ severity: 'critical' | 'major' | 'minor' | 'info';
41
+ }
42
+ export interface ConsistencyReport {
43
+ summary: {
44
+ totalIssues: number;
45
+ namingIssues: number;
46
+ patternIssues: number;
47
+ architectureIssues: number;
48
+ filesAnalyzed: number;
49
+ };
50
+ results: AnalysisResult[];
51
+ recommendations: string[];
52
+ }
53
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAExE,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qCAAqC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;CACvD;AAED,MAAM,WAAW,gBAAiB,SAAQ,KAAK;IAC7C,IAAI,EACA,sBAAsB,GACtB,gBAAgB,GAChB,uBAAuB,GACvB,4BAA4B,CAAC;IACjC,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,cAAc,CAAC;IACjD,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,GAAG,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAC;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,gBAAgB,GAAG,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,GAAG,cAAc,CAAC;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { TSESTree } from '@typescript-eslint/typescript-estree';
2
+ /**
3
+ * Parse a file into an AST
4
+ * Only supports TypeScript/JavaScript files (.ts, .tsx, .js, .jsx)
5
+ */
6
+ export declare function parseFile(filePath: string, content?: string): TSESTree.Program | null;
7
+ /**
8
+ * Traverse AST nodes with a visitor pattern
9
+ */
10
+ export declare function traverseAST(node: TSESTree.Node, visitor: {
11
+ enter?: (node: TSESTree.Node, parent: TSESTree.Node | null) => void;
12
+ leave?: (node: TSESTree.Node, parent: TSESTree.Node | null) => void;
13
+ }, parent?: TSESTree.Node | null): void;
14
+ /**
15
+ * Check if a node is within a specific type of ancestor
16
+ */
17
+ export declare function hasAncestor(node: TSESTree.Node, ancestorTypes: string[], ancestors: TSESTree.Node[]): boolean;
18
+ /**
19
+ * Get the name of an identifier or pattern
20
+ */
21
+ export declare function getIdentifierName(node: TSESTree.Node): string | null;
22
+ /**
23
+ * Check if a node is a loop
24
+ */
25
+ export declare function isLoopStatement(node: TSESTree.Node): boolean;
26
+ /**
27
+ * Check if a node is an arrow function or callback
28
+ */
29
+ export declare function isCallback(node: TSESTree.Node): boolean;
30
+ /**
31
+ * Extract function/method name from various declaration types
32
+ */
33
+ export declare function getFunctionName(node: TSESTree.Node): string | null;
34
+ /**
35
+ * Check if a variable declaration is in a destructuring pattern
36
+ */
37
+ export declare function isInDestructuring(node: TSESTree.Node): boolean;
38
+ /**
39
+ * Get the line number from a node
40
+ */
41
+ export declare function getLineNumber(node: TSESTree.Node): number;
42
+ /**
43
+ * Check if a node represents a coverage metric context
44
+ */
45
+ export declare function isCoverageContext(node: TSESTree.Node, ancestors: TSESTree.Node[]): boolean;
46
+ //# sourceMappingURL=ast-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-parser.d.ts","sourceRoot":"","sources":["../../src/utils/ast-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAGvE;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,GAAG,IAAI,CAsBrF;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACpE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;CACrE,EACD,MAAM,GAAE,QAAQ,CAAC,IAAI,GAAG,IAAW,GAClC,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,GACzB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,GAAG,IAAI,CAKpE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAQ5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAQvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,GAAG,IAAI,CAgBlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAI9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,OAAO,CA8B1F"}
@@ -0,0 +1,157 @@
1
+ import { parse } from '@typescript-eslint/typescript-estree';
2
+ import { readFileSync } from 'fs';
3
+ /**
4
+ * Parse a file into an AST
5
+ * Only supports TypeScript/JavaScript files (.ts, .tsx, .js, .jsx)
6
+ */
7
+ export function parseFile(filePath, content) {
8
+ try {
9
+ const code = content ?? readFileSync(filePath, 'utf-8');
10
+ const isTypeScript = filePath.match(/\.tsx?$/);
11
+ return parse(code, {
12
+ jsx: filePath.match(/\.[jt]sx$/i) !== null,
13
+ loc: true,
14
+ range: true,
15
+ comment: false,
16
+ tokens: false,
17
+ // Relaxed parsing for JavaScript files
18
+ sourceType: 'module',
19
+ ecmaVersion: 'latest',
20
+ // Only use TypeScript parser features for .ts/.tsx files
21
+ filePath: isTypeScript ? filePath : undefined,
22
+ });
23
+ }
24
+ catch (error) {
25
+ // Silently skip files that fail to parse (likely non-JS/TS or syntax errors)
26
+ // Non-JS/TS files should be filtered before reaching this point
27
+ return null;
28
+ }
29
+ }
30
+ /**
31
+ * Traverse AST nodes with a visitor pattern
32
+ */
33
+ export function traverseAST(node, visitor, parent = null) {
34
+ if (!node)
35
+ return;
36
+ visitor.enter?.(node, parent);
37
+ // Visit children
38
+ for (const key of Object.keys(node)) {
39
+ const value = node[key];
40
+ if (Array.isArray(value)) {
41
+ for (const child of value) {
42
+ if (child && typeof child === 'object' && 'type' in child) {
43
+ traverseAST(child, visitor, node);
44
+ }
45
+ }
46
+ }
47
+ else if (value && typeof value === 'object' && 'type' in value) {
48
+ traverseAST(value, visitor, node);
49
+ }
50
+ }
51
+ visitor.leave?.(node, parent);
52
+ }
53
+ /**
54
+ * Check if a node is within a specific type of ancestor
55
+ */
56
+ export function hasAncestor(node, ancestorTypes, ancestors) {
57
+ return ancestors.some(ancestor => ancestorTypes.includes(ancestor.type));
58
+ }
59
+ /**
60
+ * Get the name of an identifier or pattern
61
+ */
62
+ export function getIdentifierName(node) {
63
+ if (node.type === 'Identifier') {
64
+ return node.name;
65
+ }
66
+ return null;
67
+ }
68
+ /**
69
+ * Check if a node is a loop
70
+ */
71
+ export function isLoopStatement(node) {
72
+ return [
73
+ 'ForStatement',
74
+ 'ForInStatement',
75
+ 'ForOfStatement',
76
+ 'WhileStatement',
77
+ 'DoWhileStatement',
78
+ ].includes(node.type);
79
+ }
80
+ /**
81
+ * Check if a node is an arrow function or callback
82
+ */
83
+ export function isCallback(node) {
84
+ if (node.type === 'ArrowFunctionExpression') {
85
+ return true;
86
+ }
87
+ if (node.type === 'FunctionExpression') {
88
+ return true;
89
+ }
90
+ return false;
91
+ }
92
+ /**
93
+ * Extract function/method name from various declaration types
94
+ */
95
+ export function getFunctionName(node) {
96
+ switch (node.type) {
97
+ case 'FunctionDeclaration':
98
+ return node.id?.name ?? null;
99
+ case 'FunctionExpression':
100
+ return node.id?.name ?? null;
101
+ case 'ArrowFunctionExpression':
102
+ return null; // Arrow functions don't have names directly
103
+ case 'MethodDefinition':
104
+ if (node.key.type === 'Identifier') {
105
+ return node.key.name;
106
+ }
107
+ return null;
108
+ default:
109
+ return null;
110
+ }
111
+ }
112
+ /**
113
+ * Check if a variable declaration is in a destructuring pattern
114
+ */
115
+ export function isInDestructuring(node) {
116
+ if (!node)
117
+ return false;
118
+ return node.type === 'ObjectPattern' || node.type === 'ArrayPattern';
119
+ }
120
+ /**
121
+ * Get the line number from a node
122
+ */
123
+ export function getLineNumber(node) {
124
+ return node.loc?.start.line ?? 0;
125
+ }
126
+ /**
127
+ * Check if a node represents a coverage metric context
128
+ */
129
+ export function isCoverageContext(node, ancestors) {
130
+ // Check if any ancestor or the node itself references coverage-related properties
131
+ const coveragePatterns = /coverage|summary|metrics|pct|percent|statements|branches|functions|lines/i;
132
+ // Check variable name
133
+ if (node.type === 'Identifier' && coveragePatterns.test(node.name)) {
134
+ return true;
135
+ }
136
+ // Check if it's a property of something coverage-related
137
+ for (const ancestor of ancestors.slice(-3)) { // Check last 3 ancestors
138
+ if (ancestor.type === 'MemberExpression') {
139
+ const memberExpr = ancestor;
140
+ if (memberExpr.object.type === 'Identifier' && coveragePatterns.test(memberExpr.object.name)) {
141
+ return true;
142
+ }
143
+ }
144
+ if (ancestor.type === 'ObjectPattern' || ancestor.type === 'ObjectExpression') {
145
+ // Check if parent variable has coverage-related name
146
+ const parent = ancestors[ancestors.indexOf(ancestor) - 1];
147
+ if (parent?.type === 'VariableDeclarator') {
148
+ const varDecl = parent;
149
+ if (varDecl.id.type === 'Identifier' && coveragePatterns.test(varDecl.id.name)) {
150
+ return true;
151
+ }
152
+ }
153
+ }
154
+ }
155
+ return false;
156
+ }
157
+ //# sourceMappingURL=ast-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-parser.js","sourceRoot":"","sources":["../../src/utils/ast-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Configuration for naming analyzers
3
+ */
4
+ export interface NamingConfig {
5
+ customAbbreviations: Set<string>;
6
+ customShortWords: Set<string>;
7
+ disabledChecks: Set<string>;
8
+ allAbbreviations: Set<string>;
9
+ allShortWords: Set<string>;
10
+ }
11
+ /**
12
+ * Loads and merges naming configuration for consistency analyzers
13
+ * Extracts common config loading logic used by both naming.ts and naming-ast.ts
14
+ *
15
+ * @param files - Array of files being analyzed (used to determine project root)
16
+ * @returns Merged configuration with custom and default abbreviations/short words
17
+ */
18
+ export declare function loadNamingConfig(files: string[]): Promise<NamingConfig>;
19
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAsB7E"}
@@ -0,0 +1,31 @@
1
+ import { loadConfig } from '@aiready/core';
2
+ import { dirname } from 'path';
3
+ import { COMMON_SHORT_WORDS, ACCEPTABLE_ABBREVIATIONS, } from '../analyzers/naming-constants';
4
+ /**
5
+ * Loads and merges naming configuration for consistency analyzers
6
+ * Extracts common config loading logic used by both naming.ts and naming-ast.ts
7
+ *
8
+ * @param files - Array of files being analyzed (used to determine project root)
9
+ * @returns Merged configuration with custom and default abbreviations/short words
10
+ */
11
+ export async function loadNamingConfig(files) {
12
+ // Load config from the first file's directory (or project root)
13
+ const rootDir = files.length > 0 ? dirname(files[0]) : process.cwd();
14
+ const config = await loadConfig(rootDir);
15
+ const consistencyConfig = config?.tools?.['consistency'];
16
+ // Extract custom configuration
17
+ const customAbbreviations = new Set(consistencyConfig?.acceptedAbbreviations || []);
18
+ const customShortWords = new Set(consistencyConfig?.shortWords || []);
19
+ const disabledChecks = new Set(consistencyConfig?.disableChecks || []);
20
+ // Merge with defaults
21
+ const allAbbreviations = new Set([...ACCEPTABLE_ABBREVIATIONS, ...customAbbreviations]);
22
+ const allShortWords = new Set([...COMMON_SHORT_WORDS, ...customShortWords]);
23
+ return {
24
+ customAbbreviations,
25
+ customShortWords,
26
+ disabledChecks,
27
+ allAbbreviations,
28
+ allShortWords,
29
+ };
30
+ }
31
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AAavC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe;IACpD,gEAAgE;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,iBAAiB,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,CAAC;IAEzD,+BAA+B;IAC/B,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;IAEvE,sBAAsB;IACtB,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,wBAAwB,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC;IACxF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAE5E,OAAO;QACL,mBAAmB;QACnB,gBAAgB;QAChB,cAAc;QACd,gBAAgB;QAChB,aAAa;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { TSESTree } from '@typescript-eslint/typescript-estree';
2
+ export type FileType = 'test' | 'production' | 'config' | 'types';
3
+ export type CodeLayer = 'api' | 'business' | 'data' | 'utility' | 'unknown';
4
+ export interface CodeContext {
5
+ fileType: FileType;
6
+ codeLayer: CodeLayer;
7
+ complexity: number;
8
+ isTestFile: boolean;
9
+ isTypeDefinition: boolean;
10
+ }
11
+ /**
12
+ * Detect the file type based on file path and content
13
+ */
14
+ export declare function detectFileType(filePath: string, ast: TSESTree.Program): FileType;
15
+ /**
16
+ * Detect the code layer based on imports and exports
17
+ */
18
+ export declare function detectCodeLayer(ast: TSESTree.Program): CodeLayer;
19
+ /**
20
+ * Calculate cyclomatic complexity for a function
21
+ */
22
+ export declare function calculateComplexity(node: TSESTree.Node): number;
23
+ /**
24
+ * Build a complete context for a file
25
+ */
26
+ export declare function buildCodeContext(filePath: string, ast: TSESTree.Program): CodeContext;
27
+ /**
28
+ * Get context-adjusted severity based on code context
29
+ */
30
+ export declare function adjustSeverity(baseSeverity: 'info' | 'minor' | 'major' | 'critical', context: CodeContext, issueType: string): 'info' | 'minor' | 'major' | 'critical';
31
+ /**
32
+ * Check if a short variable name is acceptable in this context
33
+ */
34
+ export declare function isAcceptableInContext(name: string, context: CodeContext, options: {
35
+ isLoopVariable?: boolean;
36
+ isParameter?: boolean;
37
+ isDestructured?: boolean;
38
+ complexity?: number;
39
+ }): boolean;
40
+ //# sourceMappingURL=context-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-detector.d.ts","sourceRoot":"","sources":["../../src/utils/context-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAGhE,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5E,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAmBhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAgFhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CA6B/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,GAAG,WAAW,CA8BrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,EACrD,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CA6BzC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IACP,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAmCT"}
@@ -0,0 +1,225 @@
1
+ import { traverseAST } from './ast-parser';
2
+ /**
3
+ * Detect the file type based on file path and content
4
+ */
5
+ export function detectFileType(filePath, ast) {
6
+ const path = filePath.toLowerCase();
7
+ // Test files
8
+ if (path.match(/\.(test|spec)\.(ts|tsx|js|jsx)$/) || path.includes('__tests__')) {
9
+ return 'test';
10
+ }
11
+ // Type definition files
12
+ if (path.endsWith('.d.ts') || path.includes('types')) {
13
+ return 'types';
14
+ }
15
+ // Config files
16
+ if (path.match(/config|\.config\.|rc\.|setup/) || path.includes('configuration')) {
17
+ return 'config';
18
+ }
19
+ return 'production';
20
+ }
21
+ /**
22
+ * Detect the code layer based on imports and exports
23
+ */
24
+ export function detectCodeLayer(ast) {
25
+ let hasAPIIndicators = 0;
26
+ let hasBusinessIndicators = 0;
27
+ let hasDataIndicators = 0;
28
+ let hasUtilityIndicators = 0;
29
+ traverseAST(ast, {
30
+ enter: (node) => {
31
+ // Check imports
32
+ if (node.type === 'ImportDeclaration') {
33
+ const source = node.source.value;
34
+ if (source.match(/express|fastify|koa|@nestjs|axios|fetch|http/i)) {
35
+ hasAPIIndicators++;
36
+ }
37
+ if (source.match(/database|prisma|typeorm|sequelize|mongoose|pg|mysql/i)) {
38
+ hasDataIndicators++;
39
+ }
40
+ }
41
+ // Check function names for layer indicators
42
+ if (node.type === 'FunctionDeclaration' && node.id) {
43
+ const name = node.id.name;
44
+ // API layer patterns
45
+ if (name.match(/^(get|post|put|delete|patch|handle|api|route|controller)/i)) {
46
+ hasAPIIndicators++;
47
+ }
48
+ // Business logic patterns
49
+ if (name.match(/^(calculate|process|validate|transform|compute|analyze)/i)) {
50
+ hasBusinessIndicators++;
51
+ }
52
+ // Data layer patterns
53
+ if (name.match(/^(find|create|update|delete|save|fetch|query|insert)/i)) {
54
+ hasDataIndicators++;
55
+ }
56
+ // Utility patterns
57
+ if (name.match(/^(format|parse|convert|normalize|sanitize|encode|decode)/i)) {
58
+ hasUtilityIndicators++;
59
+ }
60
+ }
61
+ // Check for exports
62
+ if (node.type === 'ExportNamedDeclaration' || node.type === 'ExportDefaultDeclaration') {
63
+ // Functions exported with "api", "handler", "route" suggest API layer
64
+ if (node.type === 'ExportNamedDeclaration' && node.declaration) {
65
+ if (node.declaration.type === 'FunctionDeclaration' && node.declaration.id) {
66
+ const name = node.declaration.id.name;
67
+ if (name.match(/handler|route|api|controller/i)) {
68
+ hasAPIIndicators += 2; // Stronger signal
69
+ }
70
+ }
71
+ }
72
+ }
73
+ },
74
+ });
75
+ // Determine layer based on indicators
76
+ const scores = {
77
+ api: hasAPIIndicators,
78
+ business: hasBusinessIndicators,
79
+ data: hasDataIndicators,
80
+ utility: hasUtilityIndicators,
81
+ };
82
+ const maxScore = Math.max(...Object.values(scores));
83
+ if (maxScore === 0) {
84
+ return 'unknown';
85
+ }
86
+ // Return the layer with highest score
87
+ if (scores.api === maxScore)
88
+ return 'api';
89
+ if (scores.data === maxScore)
90
+ return 'data';
91
+ if (scores.business === maxScore)
92
+ return 'business';
93
+ if (scores.utility === maxScore)
94
+ return 'utility';
95
+ return 'unknown';
96
+ }
97
+ /**
98
+ * Calculate cyclomatic complexity for a function
99
+ */
100
+ export function calculateComplexity(node) {
101
+ let complexity = 1; // Base complexity
102
+ traverseAST(node, {
103
+ enter: (childNode) => {
104
+ // Each decision point adds 1 to complexity
105
+ switch (childNode.type) {
106
+ case 'IfStatement':
107
+ case 'ConditionalExpression': // ternary
108
+ case 'SwitchCase':
109
+ case 'ForStatement':
110
+ case 'ForInStatement':
111
+ case 'ForOfStatement':
112
+ case 'WhileStatement':
113
+ case 'DoWhileStatement':
114
+ case 'CatchClause':
115
+ complexity++;
116
+ break;
117
+ case 'LogicalExpression':
118
+ // && and || add complexity
119
+ if (childNode.operator === '&&' || childNode.operator === '||') {
120
+ complexity++;
121
+ }
122
+ break;
123
+ }
124
+ },
125
+ });
126
+ return complexity;
127
+ }
128
+ /**
129
+ * Build a complete context for a file
130
+ */
131
+ export function buildCodeContext(filePath, ast) {
132
+ const fileType = detectFileType(filePath, ast);
133
+ const codeLayer = detectCodeLayer(ast);
134
+ // Calculate average complexity of functions in file
135
+ let totalComplexity = 0;
136
+ let functionCount = 0;
137
+ traverseAST(ast, {
138
+ enter: (node) => {
139
+ if (node.type === 'FunctionDeclaration' ||
140
+ node.type === 'FunctionExpression' ||
141
+ node.type === 'ArrowFunctionExpression') {
142
+ totalComplexity += calculateComplexity(node);
143
+ functionCount++;
144
+ }
145
+ },
146
+ });
147
+ const avgComplexity = functionCount > 0 ? totalComplexity / functionCount : 1;
148
+ return {
149
+ fileType,
150
+ codeLayer,
151
+ complexity: Math.round(avgComplexity),
152
+ isTestFile: fileType === 'test',
153
+ isTypeDefinition: fileType === 'types',
154
+ };
155
+ }
156
+ /**
157
+ * Get context-adjusted severity based on code context
158
+ */
159
+ export function adjustSeverity(baseSeverity, context, issueType) {
160
+ // Test files: Be more lenient
161
+ if (context.isTestFile) {
162
+ if (baseSeverity === 'minor')
163
+ return 'info';
164
+ if (baseSeverity === 'major')
165
+ return 'minor';
166
+ }
167
+ // Type definition files: Be more lenient (often use short generic names)
168
+ if (context.isTypeDefinition) {
169
+ if (baseSeverity === 'minor')
170
+ return 'info';
171
+ }
172
+ // API layer: Be stricter (public interface)
173
+ if (context.codeLayer === 'api') {
174
+ if (baseSeverity === 'info' && issueType === 'unclear')
175
+ return 'minor';
176
+ if (baseSeverity === 'minor' && issueType === 'unclear')
177
+ return 'major';
178
+ }
179
+ // High complexity: Be stricter (need clearer names)
180
+ if (context.complexity > 10) {
181
+ if (baseSeverity === 'info')
182
+ return 'minor';
183
+ }
184
+ // Utility/helper layer: Allow shorter names
185
+ if (context.codeLayer === 'utility') {
186
+ if (baseSeverity === 'minor' && issueType === 'abbreviation')
187
+ return 'info';
188
+ }
189
+ return baseSeverity;
190
+ }
191
+ /**
192
+ * Check if a short variable name is acceptable in this context
193
+ */
194
+ export function isAcceptableInContext(name, context, options) {
195
+ // Loop variables always acceptable
196
+ if (options.isLoopVariable && ['i', 'j', 'k', 'l', 'n', 'm'].includes(name)) {
197
+ return true;
198
+ }
199
+ // Test files: More lenient
200
+ if (context.isTestFile) {
201
+ // Common test patterns: a/b for comparison, x/y for coordinates
202
+ if (['a', 'b', 'c', 'x', 'y', 'z'].includes(name) && options.isParameter) {
203
+ return true;
204
+ }
205
+ }
206
+ // Math/graphics context: x, y, z acceptable
207
+ if (context.codeLayer === 'utility' && ['x', 'y', 'z'].includes(name)) {
208
+ return true;
209
+ }
210
+ // Destructured from well-named source: More lenient
211
+ if (options.isDestructured) {
212
+ // Coverage metrics s/b/f/l always acceptable when destructured
213
+ if (['s', 'b', 'f', 'l'].includes(name)) {
214
+ return true;
215
+ }
216
+ }
217
+ // Simple functions (complexity < 3): Allow short parameter names
218
+ if (options.isParameter && (options.complexity ?? context.complexity) < 3) {
219
+ if (name.length >= 2) {
220
+ return true; // Two-letter names OK in simple functions
221
+ }
222
+ }
223
+ return false;
224
+ }
225
+ //# sourceMappingURL=context-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-detector.js","sourceRoot":"","sources":["../../src/utils/context-detector.ts"],"names":[],"mappings":"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"}