code-auditor-mcp 3.0.7 → 3.1.0

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 (128) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +245 -0
  3. package/README.md +24 -0
  4. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts +21 -0
  5. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts.map +1 -0
  6. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js +21 -0
  7. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js.map +1 -0
  8. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts +13 -0
  9. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts.map +1 -0
  10. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js +12 -0
  11. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js.map +1 -0
  12. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts +11 -0
  13. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts.map +1 -0
  14. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js +22 -0
  15. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js.map +1 -0
  16. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts +9 -0
  17. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts.map +1 -0
  18. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js +13 -0
  19. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js.map +1 -0
  20. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts +13 -0
  21. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts.map +1 -0
  22. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js +18 -0
  23. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js.map +1 -0
  24. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts +10 -0
  25. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts.map +1 -0
  26. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js +16 -0
  27. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js.map +1 -0
  28. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts +14 -0
  29. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts.map +1 -0
  30. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js +18 -0
  31. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js.map +1 -0
  32. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts +13 -0
  33. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts.map +1 -0
  34. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js +22 -0
  35. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js.map +1 -0
  36. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts +10 -0
  37. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts.map +1 -0
  38. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js +20 -0
  39. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js.map +1 -0
  40. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts +18 -0
  41. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts.map +1 -0
  42. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js +28 -0
  43. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js.map +1 -0
  44. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts +11 -0
  45. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts.map +1 -0
  46. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js +31 -0
  47. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js.map +1 -0
  48. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts +11 -0
  49. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts.map +1 -0
  50. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js +18 -0
  51. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js.map +1 -0
  52. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts +13 -0
  53. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts.map +1 -0
  54. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js +61 -0
  55. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js.map +1 -0
  56. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts +10 -0
  57. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts.map +1 -0
  58. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js +15 -0
  59. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js.map +1 -0
  60. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts +11 -0
  61. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts.map +1 -0
  62. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js +49 -0
  63. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js.map +1 -0
  64. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts +10 -0
  65. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts.map +1 -0
  66. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js +19 -0
  67. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js.map +1 -0
  68. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts +37 -0
  69. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts.map +1 -0
  70. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js +73 -0
  71. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js.map +1 -0
  72. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts +12 -0
  73. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts.map +1 -0
  74. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js +82 -0
  75. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js.map +1 -0
  76. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts +10 -0
  77. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts.map +1 -0
  78. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js +15 -0
  79. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js.map +1 -0
  80. package/dist/analyzers/cross-language/APIContractAnalyzer.js +3 -3
  81. package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
  82. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js +1 -1
  83. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
  84. package/dist/analyzers/cross-language/DependencyGraphBuilder.js +2 -2
  85. package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
  86. package/dist/analyzers/cross-language/SchemaValidator.js +2 -2
  87. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  88. package/dist/analyzers/reactAnalyzer.js +7 -22
  89. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  90. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +40 -2
  91. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  92. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +186 -29
  93. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  94. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +30 -0
  95. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  96. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +164 -11
  97. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  98. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +51 -7
  99. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  100. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +354 -48
  101. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  102. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +8 -4
  103. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  104. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +51 -38
  105. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  106. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +59 -39
  107. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  108. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +412 -153
  109. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  110. package/dist/auditRunner.d.ts.map +1 -1
  111. package/dist/auditRunner.js +26 -2
  112. package/dist/auditRunner.js.map +1 -1
  113. package/dist/cli.js.map +1 -1
  114. package/dist/config/defaults.d.ts +32 -0
  115. package/dist/config/defaults.d.ts.map +1 -1
  116. package/dist/config/defaults.js +62 -4
  117. package/dist/config/defaults.js.map +1 -1
  118. package/dist/index.d.ts +0 -3
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +2 -4
  121. package/dist/index.js.map +1 -1
  122. package/dist/languages/UniversalAnalyzer.d.ts +7 -0
  123. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
  124. package/dist/languages/UniversalAnalyzer.js +16 -1
  125. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  126. package/dist/mcp-tools/whitelistTools.d.ts +1 -1
  127. package/package.json +2 -1
  128. package/plugin/.claude-plugin/plugin.json +1 -1
@@ -1,8 +1,16 @@
1
1
  /**
2
- * Universal Documentation Analyzer
3
- * Works across multiple programming languages using the adapter pattern
2
+ * Universal Documentation Analyzer — Spec 17 R1
3
+ *
4
+ * R1.1: Anonymous/inline callables are skipped entirely (not downgraded).
5
+ * R1.2: Default scope is public API surface only.
6
+ * R1.3: Minimum-size gate (docsMinLines, default 5).
7
+ * R1.4: scope: "all" restores pre-spec-17 behaviour minus R1.1 skips.
8
+ * R1.5: File-header checks default OFF (fileHeaders replaces requireFileDocs).
9
+ * R1.6: Finding messages name the audience reason.
10
+ * R7: All documentation/* severities are "suggestion".
4
11
  */
5
12
  import { UniversalAnalyzer } from '../../languages/UniversalAnalyzer.js';
13
+ import picomatch from 'picomatch';
6
14
  export const DEFAULT_DOCUMENTATION_CONFIG = {
7
15
  requireFunctionDocs: true,
8
16
  requireClassDocs: true,
@@ -12,15 +20,41 @@ export const DEFAULT_DOCUMENTATION_CONFIG = {
12
20
  minDescriptionLength: 10,
13
21
  checkExportedOnly: false,
14
22
  exemptPatterns: [
15
- '\\.test\\.', // files like user.test.ts
16
- '\\.spec\\.', // files like user.spec.ts
17
- '\\.d\\.ts$', // TypeScript declaration files
18
- 'mock', // mock files
19
- 'fixture', // fixture files
20
- '__tests__', // __tests__ directories
21
- '/tests?/', // /test/ or /tests/ directories
22
- ]
23
+ '\\.test\\.',
24
+ '\\.spec\\.',
25
+ '\\.d\\.ts$',
26
+ 'mock',
27
+ 'fixture',
28
+ '__tests__',
29
+ '/tests?/',
30
+ ],
31
+ // Spec-17 defaults
32
+ scope: 'public',
33
+ docsMinLines: 5,
34
+ fileHeaders: false,
35
+ headerSkipGlobs: [
36
+ '**/index.{ts,tsx,js}',
37
+ '**/*.{test,spec}.*',
38
+ '**/__tests__/**',
39
+ '**/migrations/**',
40
+ '**/pages/**',
41
+ '**/api/**',
42
+ '**/routes/**',
43
+ '**/*.config.*',
44
+ '**/*.d.ts',
45
+ ],
23
46
  };
47
+ const HEADER_SKIP_GLOBS_DEFAULT = [
48
+ '**/index.{ts,tsx,js}',
49
+ '**/*.{test,spec}.*',
50
+ '**/__tests__/**',
51
+ '**/migrations/**',
52
+ '**/pages/**',
53
+ '**/api/**',
54
+ '**/routes/**',
55
+ '**/*.config.*',
56
+ '**/*.d.ts',
57
+ ];
24
58
  export class UniversalDocumentationAnalyzer extends UniversalAnalyzer {
25
59
  name = 'documentation';
26
60
  description = 'Analyzes documentation quality across the codebase';
@@ -28,23 +62,60 @@ export class UniversalDocumentationAnalyzer extends UniversalAnalyzer {
28
62
  async analyzeAST(ast, adapter, config, sourceCode) {
29
63
  const violations = [];
30
64
  const finalConfig = { ...DEFAULT_DOCUMENTATION_CONFIG, ...config };
31
- // Check if file is exempt
65
+ // Resolve scope: "public" is post-spec-17 default
66
+ const scope = finalConfig.scope ?? 'public';
67
+ // Resolve fileHeaders: prefer new key, fall back to deprecated requireFileDocs
68
+ const fileHeaders = finalConfig.fileHeaders ?? finalConfig.requireFileDocs ?? false;
69
+ // Check if file is exempt (name-based patterns)
32
70
  if (this.isExempt(ast.filePath, finalConfig.exemptPatterns)) {
33
71
  return violations;
34
72
  }
35
- // Check file-level documentation
36
- if (finalConfig.requireFileDocs) {
37
- const fileDoc = this.getFileDocumentation(ast, adapter);
38
- if (!fileDoc || fileDoc.length < finalConfig.minDescriptionLength) {
39
- violations.push(this.createViolation(ast.filePath, { line: 1, column: 1 }, 'File lacks proper documentation header', 'warning', 'file-documentation'));
73
+ // File-level documentation header check — R1.5 (defaults OFF)
74
+ if (fileHeaders) {
75
+ const skipGlobs = finalConfig.headerSkipGlobs ?? HEADER_SKIP_GLOBS_DEFAULT;
76
+ if (!this.matchesAnyGlob(ast.filePath, skipGlobs)) {
77
+ const fileDoc = this.getFileDocumentation(ast, adapter);
78
+ if (!fileDoc || fileDoc.length < finalConfig.minDescriptionLength) {
79
+ violations.push(this.createViolation(ast.filePath, { line: 1, column: 1 }, 'File lacks proper documentation header', 'suggestion', 'file-documentation'));
80
+ }
40
81
  }
41
82
  }
42
- // Check function documentation
83
+ // Function documentation — R1.1 through R1.4, R1.6
43
84
  if (finalConfig.requireFunctionDocs) {
44
85
  const functions = adapter.extractFunctions(ast);
86
+ const docsMinLines = finalConfig.docsMinLines ?? 5;
45
87
  for (const func of functions) {
46
- // Skip if checking exported only and function is not exported
47
- if (finalConfig.checkExportedOnly && !func.isExported) {
88
+ // Find the AST node for this function
89
+ const node = this.findNodeByLocation(ast.root, func.location.start);
90
+ // R1.1 — Skip anonymous/inline callables
91
+ if (node && this.isAnonymousOrCallback(node, adapter)) {
92
+ continue;
93
+ }
94
+ // R1.2 — Scope filter (public API surface only)
95
+ if (scope === 'public') {
96
+ if (!func.isExported) {
97
+ // If not exported and not a public method of exported class, skip
98
+ if (!func.isMethod) {
99
+ // Named function decl nested inside another function — skip at default scope
100
+ if (node && this.isNestedFunction(node, adapter)) {
101
+ continue;
102
+ }
103
+ // Non-exported top-level function — skip
104
+ continue;
105
+ }
106
+ // It's a method — check visibility
107
+ if (node && this.isNonPublicMethod(node, adapter, sourceCode)) {
108
+ continue;
109
+ }
110
+ // Check if the enclosing class is exported
111
+ if (node && !this.isMethodOfExportedClass(node, adapter, ast)) {
112
+ continue;
113
+ }
114
+ }
115
+ }
116
+ // R1.3 — Minimum-size gate
117
+ const bodyLines = (func.location.end.line - func.location.start.line) + 1;
118
+ if (bodyLines < docsMinLines) {
48
119
  continue;
49
120
  }
50
121
  // Skip if function name matches exempt pattern
@@ -52,48 +123,64 @@ export class UniversalDocumentationAnalyzer extends UniversalAnalyzer {
52
123
  continue;
53
124
  }
54
125
  const doc = func.jsDoc || '';
55
- // Check if documentation exists and is adequate
126
+ // R1.6 Audience-reason message
56
127
  if (!doc || doc.length < finalConfig.minDescriptionLength) {
57
- violations.push(this.createViolation(ast.filePath, func.location.start, `Function '${func.name}' lacks proper documentation`, 'warning', 'function-documentation'));
128
+ const reason = func.isExported
129
+ ? `exported function '${func.name}' lacks proper documentation`
130
+ : func.isMethod && func.className
131
+ ? `public method '${func.className}.${func.name}' lacks proper documentation`
132
+ : `function '${func.name}' lacks proper documentation`;
133
+ violations.push(this.createViolation(ast.filePath, func.location.start, reason, 'suggestion', 'function-documentation'));
58
134
  }
59
- else if (finalConfig.requireParamDocs && func.parameters.length > 0) {
60
- // Check parameter documentation
61
- const missingParamDocs = this.checkParameterDocumentation(doc, func.parameters.map(p => p.name));
62
- for (const param of missingParamDocs) {
63
- violations.push(this.createViolation(ast.filePath, func.location.start, `Function '${func.name}' missing documentation for parameter '${param}'`, 'suggestion', 'parameter-documentation'));
135
+ else {
136
+ // Param docs
137
+ if (finalConfig.requireParamDocs && func.parameters.length > 0) {
138
+ const missingParamDocs = this.checkParameterDocumentation(doc, func.parameters.map(p => p.name));
139
+ for (const param of missingParamDocs) {
140
+ violations.push(this.createViolation(ast.filePath, func.location.start, `Function '${func.name}' missing documentation for parameter '${param}'`, 'suggestion', 'parameter-documentation'));
141
+ }
142
+ }
143
+ // Return docs
144
+ if (finalConfig.requireReturnDocs &&
145
+ func.returnType &&
146
+ func.returnType !== 'void' &&
147
+ !this.hasReturnDocumentation(doc)) {
148
+ violations.push(this.createViolation(ast.filePath, func.location.start, `Function '${func.name}' missing return value documentation`, 'suggestion', 'return-documentation'));
64
149
  }
65
- }
66
- // Check return documentation for non-void functions
67
- if (finalConfig.requireReturnDocs &&
68
- func.returnType &&
69
- func.returnType !== 'void' &&
70
- !this.hasReturnDocumentation(doc)) {
71
- violations.push(this.createViolation(ast.filePath, func.location.start, `Function '${func.name}' missing return value documentation`, 'suggestion', 'return-documentation'));
72
150
  }
73
151
  }
74
152
  }
75
- // Check class documentation
153
+ // Class documentation
76
154
  if (finalConfig.requireClassDocs) {
77
155
  const classes = adapter.extractClasses(ast);
78
156
  for (const cls of classes) {
79
- // Skip if checking exported only and class is not exported
80
- if (finalConfig.checkExportedOnly && !cls.isExported) {
157
+ // Scope filter for classes
158
+ if (scope === 'public' && !cls.isExported) {
81
159
  continue;
82
160
  }
83
- // Skip if class name matches exempt pattern
84
161
  if (this.isExempt(cls.name, finalConfig.exemptPatterns)) {
85
162
  continue;
86
163
  }
87
164
  const doc = cls.jsDoc || '';
88
165
  if (!doc || doc.length < finalConfig.minDescriptionLength) {
89
- violations.push(this.createViolation(ast.filePath, cls.location.start, `Class '${cls.name}' lacks proper documentation`, 'warning', 'class-documentation'));
166
+ violations.push(this.createViolation(ast.filePath, cls.location.start, `Class '${cls.name}' lacks proper documentation`, 'suggestion', 'class-documentation'));
90
167
  }
91
- // Check method documentation
168
+ // Method documentation
92
169
  if (finalConfig.requireFunctionDocs) {
93
170
  for (const method of cls.methods) {
171
+ // Method scope filter
172
+ if (scope === 'public') {
173
+ const methodNode = this.findNodeByLocation(ast.root, method.location.start);
174
+ if (methodNode && this.isNonPublicMethod(methodNode, adapter, sourceCode)) {
175
+ continue;
176
+ }
177
+ }
178
+ if (this.isExempt(method.name, finalConfig.exemptPatterns)) {
179
+ continue;
180
+ }
94
181
  const methodDoc = method.jsDoc || '';
95
182
  if (!methodDoc || methodDoc.length < finalConfig.minDescriptionLength) {
96
- violations.push(this.createViolation(ast.filePath, method.location.start, `Method '${cls.name}.${method.name}' lacks proper documentation`, 'warning', 'method-documentation'));
183
+ violations.push(this.createViolation(ast.filePath, method.location.start, `public method '${cls.name}.${method.name}' lacks proper documentation`, 'suggestion', 'method-documentation'));
97
184
  }
98
185
  }
99
186
  }
@@ -101,8 +188,203 @@ export class UniversalDocumentationAnalyzer extends UniversalAnalyzer {
101
188
  }
102
189
  return violations;
103
190
  }
191
+ // ---------------------------------------------------------------------------
192
+ // R1.1 — Anonymous / inline callable detection
193
+ // ---------------------------------------------------------------------------
104
194
  /**
105
- * Check if a name matches any exempt patterns
195
+ * Returns true if the node is an anonymous arrow/function expression used as:
196
+ * (a) a call argument (any callee — no name whitelist)
197
+ * (b) a JSX attribute value
198
+ * (c) an object-literal property value or array element passed as an argument
199
+ * (d) an IIFE
200
+ */
201
+ isAnonymousOrCallback(node, adapter) {
202
+ const nodeType = adapter.getNodeType(node);
203
+ const parent = adapter.getParent(node);
204
+ if (!parent)
205
+ return false;
206
+ const parentType = adapter.getNodeType(parent);
207
+ // Arrow functions and function expressions
208
+ if (nodeType === 'arrow_function' ||
209
+ nodeType === 'function_expression' ||
210
+ nodeType === 'generator_function_expression') {
211
+ // (a) Call argument — parent is 'arguments' (args to any call expression)
212
+ if (parentType === 'arguments') {
213
+ return true;
214
+ }
215
+ // (b) JSX attribute value (event handlers, render props)
216
+ if (parentType === 'jsx_expression' ||
217
+ parentType === 'jsx_attribute' ||
218
+ parentType === 'jsx_self_closing_element' ||
219
+ parentType === 'jsx_opening_element') {
220
+ return true;
221
+ }
222
+ // (c) Object literal property value in call arguments
223
+ // chain: arrow → pair → object → arguments → call_expression
224
+ if (parentType === 'pair') {
225
+ const gp = adapter.getParent(parent);
226
+ if (gp) {
227
+ const gpType = adapter.getNodeType(gp);
228
+ if (gpType === 'object' || gpType === 'object_pattern') {
229
+ const ggp = adapter.getParent(gp);
230
+ if (ggp && adapter.getNodeType(ggp) === 'arguments') {
231
+ return true;
232
+ }
233
+ }
234
+ }
235
+ }
236
+ // (c) Array element in call arguments
237
+ if (parentType === 'array') {
238
+ const gp = adapter.getParent(parent);
239
+ if (gp && adapter.getNodeType(gp) === 'arguments') {
240
+ return true;
241
+ }
242
+ }
243
+ // (d) IIFE — the function is the callee of a call expression
244
+ if (parentType === 'call_expression') {
245
+ // Check if this node is in the function/callee position (not in arguments)
246
+ const fnChild = this.getFirstChildOfType(parent, [
247
+ 'arrow_function',
248
+ 'function_expression',
249
+ 'function',
250
+ 'identifier',
251
+ 'member_expression',
252
+ 'call_expression',
253
+ ]);
254
+ if (fnChild) {
255
+ // If the first function-ish child is at the same location, this IS the callee
256
+ if (fnChild.location.start.line === node.location.start.line &&
257
+ fnChild.location.start.column === node.location.start.column) {
258
+ return true;
259
+ }
260
+ }
261
+ }
262
+ }
263
+ return false;
264
+ }
265
+ /**
266
+ * Returns true if a function_declaration node is nested inside another function/method
267
+ * (a helper by construction — R1.1).
268
+ */
269
+ isNestedFunction(node, adapter) {
270
+ const nodeType = adapter.getNodeType(node);
271
+ if (nodeType !== 'function_declaration' && nodeType !== 'generator_function_declaration') {
272
+ return false;
273
+ }
274
+ let current = adapter.getParent(node);
275
+ while (current) {
276
+ const type = adapter.getNodeType(current);
277
+ // Skip enclosing blocks/statement blocks
278
+ if (type === 'statement_block' ||
279
+ type === 'block' ||
280
+ type === 'program' ||
281
+ type === 'export_statement') {
282
+ current = adapter.getParent(current);
283
+ continue;
284
+ }
285
+ // Found enclosing function or method → this is nested
286
+ if (adapter.isFunction(current) || adapter.isMethod(current)) {
287
+ return true;
288
+ }
289
+ // Hit something else (class body, module, etc.) → not nested in a function
290
+ break;
291
+ }
292
+ return false;
293
+ }
294
+ // ---------------------------------------------------------------------------
295
+ // R1.2 — Method visibility helpers
296
+ // ---------------------------------------------------------------------------
297
+ /**
298
+ * A method is non-public if it is private, protected, #-named, or _-prefixed.
299
+ */
300
+ isNonPublicMethod(node, adapter, sourceCode) {
301
+ const type = adapter.getNodeType(node);
302
+ if (type !== 'method_definition' && type !== 'public_field_definition') {
303
+ return false;
304
+ }
305
+ // Check for tree-sitter accessibility modifiers in children
306
+ if (node.children) {
307
+ for (const child of node.children) {
308
+ const childType = adapter.getNodeType(child);
309
+ if (childType === 'accessibility_modifier' ||
310
+ childType === 'private' ||
311
+ childType === 'protected') {
312
+ const text = adapter.getNodeText(child, sourceCode).trim();
313
+ if (text === 'private' || text === 'protected') {
314
+ return true;
315
+ }
316
+ }
317
+ }
318
+ }
319
+ // Check property/method name for #-prefix (JS private) or _-prefix (convention)
320
+ const propName = this.getMethodName(node, adapter, sourceCode);
321
+ if (propName && (propName.startsWith('#') || propName.startsWith('_'))) {
322
+ return true;
323
+ }
324
+ return false;
325
+ }
326
+ /**
327
+ * Check if a method's enclosing class is exported.
328
+ */
329
+ isMethodOfExportedClass(node, adapter, ast) {
330
+ let current = adapter.getParent(node);
331
+ while (current) {
332
+ if (adapter.isClass(current)) {
333
+ // Check export by looking at parent of class node
334
+ const classParent = adapter.getParent(current);
335
+ if (classParent) {
336
+ const classParentType = adapter.getNodeType(classParent);
337
+ if (classParentType === 'export_statement') {
338
+ return true;
339
+ }
340
+ // Also check if class declaration itself has export modifier
341
+ const siblings = adapter.getChildren(classParent);
342
+ for (const sib of siblings) {
343
+ if (adapter.getNodeType(sib) === 'export' || adapter.getNodeType(sib) === 'export_statement') {
344
+ // Verify this export wraps our class
345
+ const exportChildren = adapter.getChildren(sib);
346
+ for (const ec of exportChildren) {
347
+ if (adapter.getNodeType(ec) === 'class_declaration' &&
348
+ ec.location.start.line === current.location.start.line) {
349
+ return true;
350
+ }
351
+ }
352
+ }
353
+ }
354
+ }
355
+ // Use extractClasses to check isExported
356
+ break;
357
+ }
358
+ current = adapter.getParent(current);
359
+ }
360
+ // Fallback: check extractClasses for isExported
361
+ const classes = adapter.extractClasses(ast);
362
+ for (const cls of classes) {
363
+ // Find the class containing this method
364
+ if (node.location.start.line >= cls.location.start.line &&
365
+ node.location.start.line <= cls.location.end.line &&
366
+ cls.isExported) {
367
+ return true;
368
+ }
369
+ }
370
+ return false;
371
+ }
372
+ // ---------------------------------------------------------------------------
373
+ // Utility helpers
374
+ // ---------------------------------------------------------------------------
375
+ /**
376
+ * Check if a file path matches any picomatch glob pattern.
377
+ */
378
+ matchesAnyGlob(filePath, globs) {
379
+ for (const glob of globs) {
380
+ if (picomatch.isMatch(filePath, glob)) {
381
+ return true;
382
+ }
383
+ }
384
+ return false;
385
+ }
386
+ /**
387
+ * Check if a name or path matches any exempt regex patterns.
106
388
  */
107
389
  isExempt(name, patterns) {
108
390
  return patterns.some(pattern => {
@@ -111,10 +393,36 @@ export class UniversalDocumentationAnalyzer extends UniversalAnalyzer {
111
393
  });
112
394
  }
113
395
  /**
114
- * Get file-level documentation (usually at the top)
396
+ * Get the name of a method definition node.
397
+ */
398
+ getMethodName(node, adapter, sourceCode) {
399
+ if (node.children) {
400
+ for (const child of node.children) {
401
+ const type = adapter.getNodeType(child);
402
+ if (type === 'property_identifier' || type === 'identifier') {
403
+ return adapter.getNodeText(child, sourceCode).trim();
404
+ }
405
+ }
406
+ }
407
+ return null;
408
+ }
409
+ /**
410
+ * Get the first child node matching one of the given types.
411
+ */
412
+ getFirstChildOfType(node, types) {
413
+ if (!node.children)
414
+ return null;
415
+ for (const child of node.children) {
416
+ if (types.includes(child.type)) {
417
+ return child;
418
+ }
419
+ }
420
+ return null;
421
+ }
422
+ /**
423
+ * Get file-level documentation (usually at the top).
115
424
  */
116
425
  getFileDocumentation(ast, adapter) {
117
- // Look for documentation at the beginning of the file
118
426
  const firstChild = ast.root.children?.[0];
119
427
  if (firstChild) {
120
428
  return adapter.getDocumentation(firstChild);
@@ -122,7 +430,7 @@ export class UniversalDocumentationAnalyzer extends UniversalAnalyzer {
122
430
  return null;
123
431
  }
124
432
  /**
125
- * Find a node by its location
433
+ * Find a node by its location via BFS.
126
434
  */
127
435
  findNodeByLocation(root, location) {
128
436
  const queue = [root];
@@ -139,12 +447,11 @@ export class UniversalDocumentationAnalyzer extends UniversalAnalyzer {
139
447
  return null;
140
448
  }
141
449
  /**
142
- * Check which parameters are missing documentation
450
+ * Check which parameters are missing documentation.
143
451
  */
144
452
  checkParameterDocumentation(doc, paramNames) {
145
453
  const missingParams = [];
146
454
  for (const param of paramNames) {
147
- // Look for @param tags in various formats
148
455
  const paramRegex = new RegExp(`@param\\s+(?:\\{[^}]+\\}\\s+)?${param}\\b`, 'i');
149
456
  if (!paramRegex.test(doc)) {
150
457
  missingParams.push(param);
@@ -153,10 +460,9 @@ export class UniversalDocumentationAnalyzer extends UniversalAnalyzer {
153
460
  return missingParams;
154
461
  }
155
462
  /**
156
- * Check if documentation contains return value documentation
463
+ * Check if documentation contains return value documentation.
157
464
  */
158
465
  hasReturnDocumentation(doc) {
159
- // Look for @return or @returns tags
160
466
  return /@returns?\b/i.test(doc);
161
467
  }
162
468
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UniversalDocumentationAnalyzer.js","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDocumentationAnalyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UniversalDocumentationAnalyzer.js","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDocumentationAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -7,13 +7,21 @@ import type { Violation } from '../../types.js';
7
7
  import type { AST, LanguageAdapter } from '../../languages/types.js';
8
8
  /**
9
9
  * Configuration for SOLID analyzer
10
+ *
11
+ * Spec-17 R5: maxClassComplexity (heuristic) is DEPRECATED — replaced by
12
+ * maxMethodComplexity (per-method cyclomatic complexity, solid/method-complexity)
13
+ * and classAggregateComplexity (class-size aggregation, solid/class-size).
10
14
  */
11
15
  export interface SOLIDAnalyzerConfig {
12
16
  maxMethodsPerClass?: number;
13
17
  maxLinesPerMethod?: number;
14
18
  maxParametersPerMethod?: number;
19
+ /** @deprecated Use maxMethodComplexity instead — this was a heuristic (1 + 2×methods + 5×extends + Σ(lines/10)) */
15
20
  maxClassComplexity?: number;
16
21
  maxInterfaceMembers?: number;
22
+ maxMethodComplexity?: number;
23
+ classMethodsThreshold?: number;
24
+ classAggregateComplexity?: number;
17
25
  checkDependencyInversion?: boolean;
18
26
  checkInterfaceSegregation?: boolean;
19
27
  checkLiskovSubstitution?: boolean;
@@ -37,10 +45,6 @@ export declare class UniversalSOLIDAnalyzer extends UniversalAnalyzer {
37
45
  * Analyze an interface for Interface Segregation Principle
38
46
  */
39
47
  private analyzeInterface;
40
- /**
41
- * Calculate class complexity
42
- */
43
- private calculateClassComplexity;
44
48
  /**
45
49
  * Check for modification patterns (Open/Closed Principle)
46
50
  */
@@ -1 +1 @@
1
- {"version":3,"file":"UniversalSOLIDAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalSOLIDAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAmD,MAAM,0BAA0B,CAAC;AAEtH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,oBAAoB,EAAE,mBAUlC,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,iBAAiB;IAC3D,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,4CAA4C;IAChE,QAAQ,CAAC,QAAQ,kBAAkB;IAEnC,UAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,mBAAmB,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC,CAgCtB;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;IA+DpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmCvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAgChC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA2B/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAuC/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA2DhC;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,OAAO;CAQhB"}
1
+ {"version":3,"file":"UniversalSOLIDAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalSOLIDAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAmD,MAAM,0BAA0B,CAAC;AAEtH;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mHAAmH;IACnH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,oBAAoB,EAAE,mBAelC,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,iBAAiB;IAC3D,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,4CAA4C;IAChE,QAAQ,CAAC,QAAQ,kBAAkB;IAEnC,UAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,mBAAmB,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC,CAgCtB;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;IAwFpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuDvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA2B/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAuC/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA2DhC;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,OAAO;CAQhB"}