@aiready/consistency 0.20.18 → 0.20.20

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 (34) hide show
  1. package/.turbo/turbo-build.log +24 -23
  2. package/.turbo/turbo-lint.log +5 -24
  3. package/.turbo/turbo-test.log +35 -28
  4. package/coverage/clover.xml +562 -565
  5. package/coverage/coverage-final.json +12 -12
  6. package/coverage/index.html +36 -36
  7. package/coverage/src/analyzer.ts.html +263 -368
  8. package/coverage/src/analyzers/index.html +55 -55
  9. package/coverage/src/analyzers/naming-ast.ts.html +305 -164
  10. package/coverage/src/analyzers/naming-constants.ts.html +42 -36
  11. package/coverage/src/analyzers/naming-generalized.ts.html +312 -33
  12. package/coverage/src/analyzers/naming.ts.html +58 -52
  13. package/coverage/src/analyzers/patterns.ts.html +43 -52
  14. package/coverage/src/index.html +22 -22
  15. package/coverage/src/index.ts.html +1 -1
  16. package/coverage/src/provider.ts.html +22 -49
  17. package/coverage/src/scoring.ts.html +39 -45
  18. package/coverage/src/utils/ast-parser.ts.html +33 -33
  19. package/coverage/src/utils/config-loader.ts.html +1 -1
  20. package/coverage/src/utils/context-detector.ts.html +92 -92
  21. package/coverage/src/utils/index.html +14 -14
  22. package/coverage/src/utils/scope-tracker.ts.html +52 -52
  23. package/dist/chunk-KWQVBF7K.mjs +831 -0
  24. package/dist/chunk-P6NVKUBB.mjs +831 -0
  25. package/dist/cli.js +6 -7
  26. package/dist/cli.mjs +1 -1
  27. package/dist/index.js +6 -7
  28. package/dist/index.mjs +1 -1
  29. package/package.json +2 -2
  30. package/src/__tests__/naming.test.ts +88 -0
  31. package/src/__tests__/scope-tracker.test.ts +184 -0
  32. package/src/__tests__/scoring.test.ts +9 -9
  33. package/src/analyzers/naming-ast.ts +10 -8
  34. package/src/analyzers/naming-generalized.ts +1 -1
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">96.55% </span>
26
+ <span class="strong">78.43% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>28/29</span>
28
+ <span class='fraction'>40/51</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">85.71% </span>
33
+ <span class="strong">67.14% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>24/28</span>
35
+ <span class='fraction'>47/70</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">100% </span>
47
+ <span class="strong">90.69% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>27/27</span>
49
+ <span class='fraction'>39/43</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line high'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -152,7 +152,140 @@
152
152
  <a name='L87'></a><a href='#L87'>87</a>
153
153
  <a name='L88'></a><a href='#L88'>88</a>
154
154
  <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-neutral">&nbsp;</span>
256
+ <span class="cline-any cline-neutral">&nbsp;</span>
257
+ <span class="cline-any cline-neutral">&nbsp;</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-neutral">&nbsp;</span>
260
+ <span class="cline-any cline-yes">2x</span>
261
+ <span class="cline-any cline-neutral">&nbsp;</span>
262
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-neutral">&nbsp;</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
+ <span class="cline-any cline-neutral">&nbsp;</span>
270
+ <span class="cline-any cline-neutral">&nbsp;</span>
271
+ <span class="cline-any cline-neutral">&nbsp;</span>
272
+ <span class="cline-any cline-neutral">&nbsp;</span>
273
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span>
275
+ <span class="cline-any cline-neutral">&nbsp;</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-neutral">&nbsp;</span>
280
+ <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-neutral">&nbsp;</span>
156
289
  <span class="cline-any cline-neutral">&nbsp;</span>
157
290
  <span class="cline-any cline-neutral">&nbsp;</span>
158
291
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -177,28 +310,68 @@
177
310
  <span class="cline-any cline-neutral">&nbsp;</span>
178
311
  <span class="cline-any cline-yes">46x</span>
179
312
  <span class="cline-any cline-yes">46x</span>
180
- <span class="cline-any cline-neutral">&nbsp;</span>
181
313
  <span class="cline-any cline-yes">46x</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-yes">45x</span>
317
+ <span class="cline-any cline-yes">45x</span>
182
318
  <span class="cline-any cline-yes">45x</span>
183
319
  <span class="cline-any cline-yes">45x</span>
184
320
  <span class="cline-any cline-neutral">&nbsp;</span>
185
321
  <span class="cline-any cline-neutral">&nbsp;</span>
186
- <span class="cline-any cline-yes">45x</span>
322
+ <span class="cline-any cline-yes">46x</span>
323
+ <span class="cline-any cline-yes">126x</span>
324
+ <span class="cline-any cline-yes">126x</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
187
326
  <span class="cline-any cline-neutral">&nbsp;</span>
188
327
  <span class="cline-any cline-yes">126x</span>
189
328
  <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
190
331
  <span class="cline-any cline-yes">126x</span>
191
332
  <span class="cline-any cline-yes">3x</span>
192
333
  <span class="cline-any cline-yes">123x</span>
334
+ <span class="cline-any cline-yes">30x</span>
335
+ <span class="cline-any cline-yes">93x</span>
336
+ <span class="cline-any cline-yes">9x</span>
337
+ <span class="cline-any cline-yes">84x</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
193
339
  <span class="cline-any cline-yes">75x</span>
194
- <span class="cline-any cline-yes">48x</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-no">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-yes">75x</span>
346
+ <span class="cline-any cline-yes">9x</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-yes">9x</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
356
+ <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-neutral">&nbsp;</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-no">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
195
365
  <span class="cline-any cline-yes">9x</span>
196
366
  <span class="cline-any cline-neutral">&nbsp;</span>
197
- <span class="cline-any cline-yes">39x</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-no">&nbsp;</span>
198
370
  <span class="cline-any cline-neutral">&nbsp;</span>
199
371
  <span class="cline-any cline-neutral">&nbsp;</span>
200
372
  <span class="cline-any cline-yes">126x</span>
201
- <span class="cline-any cline-yes">42x</span>
373
+ <span class="cline-any cline-yes">9x</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
202
375
  <span class="cline-any cline-neutral">&nbsp;</span>
203
376
  <span class="cline-any cline-neutral">&nbsp;</span>
204
377
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -214,14 +387,22 @@
214
387
  <span class="cline-any cline-neutral">&nbsp;</span>
215
388
  <span class="cline-any cline-yes">45x</span>
216
389
  <span class="cline-any cline-yes">138x</span>
217
- <span class="cline-any cline-yes">240x</span>
390
+ <span class="cline-any cline-yes">222x</span>
391
+ <span class="cline-any cline-yes">219x</span>
392
+ <span class="cline-any cline-yes">219x</span>
218
393
  <span class="cline-any cline-neutral">&nbsp;</span>
219
- <span class="cline-any cline-yes">237x</span>
394
+ <span class="cline-any cline-yes">219x</span>
220
395
  <span class="cline-any cline-neutral">&nbsp;</span>
221
396
  <span class="cline-any cline-neutral">&nbsp;</span>
222
397
  <span class="cline-any cline-neutral">&nbsp;</span>
223
398
  <span class="cline-any cline-neutral">&nbsp;</span>
224
- <span class="cline-any cline-yes">9x</span>
399
+ <span class="cline-any cline-neutral">&nbsp;</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-no">&nbsp;</span>
225
406
  <span class="cline-any cline-neutral">&nbsp;</span>
226
407
  <span class="cline-any cline-neutral">&nbsp;</span>
227
408
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -235,10 +416,15 @@
235
416
  <span class="cline-any cline-neutral">&nbsp;</span>
236
417
  <span class="cline-any cline-neutral">&nbsp;</span>
237
418
  <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-yes">1x</span>
238
422
  <span class="cline-any cline-yes">1x</span>
239
423
  <span class="cline-any cline-neutral">&nbsp;</span>
240
424
  <span class="cline-any cline-neutral">&nbsp;</span>
241
425
  <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-neutral">&nbsp;</span>
242
428
  <span class="cline-any cline-yes">4x</span>
243
429
  <span class="cline-any cline-neutral">&nbsp;</span>
244
430
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
@@ -248,10 +434,50 @@
248
434
  * naming conventions across all supported languages.
249
435
  */
250
436
  &nbsp;
251
- import { getParser, Severity, IssueType } from '@aiready/core';
437
+ import { getParser, Severity } from '@aiready/core';
252
438
  import type { NamingIssue } from '../types';
253
439
  import { readFileSync } from 'fs';
254
440
  &nbsp;
441
+ // Common abbreviations to whitelist
442
+ const COMMON_ABBREVIATIONS = new Set([
443
+ 'id',
444
+ 'db',
445
+ 'fs',
446
+ 'os',
447
+ 'ip',
448
+ 'ui',
449
+ 'ux',
450
+ 'api',
451
+ 'env',
452
+ 'url',
453
+ 'req',
454
+ 'res',
455
+ 'err',
456
+ 'ctx',
457
+ 'cb',
458
+ 'idx',
459
+ 'src',
460
+ 'dir',
461
+ 'app',
462
+ 'dev',
463
+ 'qa',
464
+ 'dto',
465
+ 'dao',
466
+ 'ref',
467
+ 'ast',
468
+ 'dom',
469
+ 'log',
470
+ 'msg',
471
+ 'pkg',
472
+ 'css',
473
+ 'html',
474
+ 'xml',
475
+ 'jsx',
476
+ 'tsx',
477
+ 'ts',
478
+ 'js',
479
+ ]);
480
+ &nbsp;
255
481
  /**
256
482
  * Analyzes naming conventions using generalized LanguageParser metadata
257
483
  */
@@ -266,34 +492,74 @@ export async function analyzeNamingGeneralized(
266
492
  &nbsp;
267
493
  try {
268
494
  const code = readFileSync(file, 'utf-8');
495
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!code.trim()) <span class="cstat-no" title="statement not covered" >continue; // Skip empty files</span>
496
+ &nbsp;
269
497
  // Ensure parser is initialized (e.g. WASM loaded)
270
498
  await parser.initialize();
271
499
  const result = parser.parse(code, file);
272
500
  const conventions = parser.getNamingConventions();
501
+ const exceptions = new Set(conventions.exceptions || []);
273
502
  &nbsp;
274
503
  // 1. Check Exports
275
504
  for (const exp of result.exports) {
505
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!exp.name || exp.name === 'default') <span class="cstat-no" title="statement not covered" >continue;</span>
506
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (exceptions.has(exp.name)) <span class="cstat-no" title="statement not covered" >continue;</span>
507
+ &nbsp;
508
+ // Skip common abbreviations
509
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (COMMON_ABBREVIATIONS.has(exp.name.toLowerCase())) <span class="cstat-no" title="statement not covered" >continue;</span>
510
+ &nbsp;
276
511
  let pattern: RegExp | undefined;
277
- let typeName = exp.type;
278
512
  &nbsp;
279
513
  if (exp.type === 'class') {
280
514
  pattern = conventions.classPattern;
515
+ } else if (exp.type === 'interface' &amp;&amp; conventions.interfacePattern) {
516
+ pattern = conventions.interfacePattern;
517
+ } else if (exp.type === 'type' &amp;&amp; conventions.typePattern) {
518
+ pattern = conventions.typePattern;
281
519
  } else if (exp.type === 'function') {
520
+ // Allow PascalCase (React components) or UPPER_CASE (HTTP methods) for exported functions
521
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
522
+ /^[A-Z][a-zA-Z0-9]*$/.test(exp.name) ||
523
+ /^[A-Z][A-Z0-9_]*$/.test(exp.name)
524
+ ) {
525
+ <span class="cstat-no" title="statement not covered" > continue;</span>
526
+ }
282
527
  pattern = conventions.functionPattern;
283
528
  } else if (exp.type === 'const') {
284
- pattern = conventions.constantPattern;
285
- } else {
286
- pattern = conventions.variablePattern;
529
+ // Exempt standard Next.js / API names
530
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
531
+ [
532
+ 'handler',
533
+ 'GET',
534
+ 'POST',
535
+ 'PUT',
536
+ 'DELETE',
537
+ 'PATCH',
538
+ 'OPTIONS',
539
+ 'HEAD',
540
+ ].includes(exp.name)
541
+ )
542
+ <span class="cstat-no" title="statement not covered" > continue;</span>
543
+ &nbsp;
544
+ // Only enforce SCREAMING_SNAKE_CASE for primitive constants (strings, numbers,
545
+ // booleans). Object literals, class instances, and tool definitions are
546
+ // camelCase by convention (e.g. `logger`, `githubTools`, `RemediationSwarm`).
547
+ pattern = exp.isPrimitive
548
+ ? <span class="branch-0 cbranch-no" title="branch not covered" >conventions.constantPattern</span>
549
+ : conventions.variablePattern;
550
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>{
551
+ <span class="cstat-no" title="statement not covered" > pattern = conventions.variablePattern;</span>
287
552
  }
288
553
  &nbsp;
289
554
  if (pattern &amp;&amp; !pattern.test(exp.name)) {
290
555
  issues.push({
291
- type: 'poor-naming',
556
+ type: 'naming-inconsistency',
292
557
  identifier: exp.name,
293
558
  file,
294
559
  line: exp.loc?.start.line || <span class="branch-1 cbranch-no" title="branch not covered" >1,</span>
295
- column: exp.loc?.start.column || <span class="branch-1 cbranch-no" title="branch not covered" >0,</span>
296
- severity: Severity.Major,
560
+ column: exp.loc?.start.column || 0,
561
+ // Recalibrate naming issues to Minor to differentiate from structural/architectural issues
562
+ severity: Severity.Minor,
297
563
  category: 'naming',
298
564
  suggestion: `Follow ${parser.language} ${exp.type} naming convention: ${pattern.toString()}`,
299
565
  });
@@ -303,20 +569,28 @@ export async function analyzeNamingGeneralized(
303
569
  // 2. Check Imports (basic check for specifier consistency)
304
570
  for (const imp of result.imports) {
305
571
  for (const spec of imp.specifiers) {
306
- if (spec === '*' || spec === 'default') continue;
572
+ if (!spec || spec === '*' || spec === 'default') continue;
573
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (exceptions.has(spec)) <span class="cstat-no" title="statement not covered" >continue;</span>
574
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (COMMON_ABBREVIATIONS.has(spec.toLowerCase())) <span class="cstat-no" title="statement not covered" >continue;</span>
307
575
  &nbsp;
308
- if (
576
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
309
577
  !conventions.variablePattern.test(spec) &amp;&amp;
310
- !conventions.classPattern.test(spec)
578
+ !conventions.classPattern.test(spec) &amp;&amp;
579
+ (!conventions.constantPattern ||
580
+ !conventions.constantPattern.test(spec)) &amp;&amp;
581
+ (<span class="branch-4 cbranch-no" title="branch not covered" >!conventions.typePattern || <span class="branch-5 cbranch-no" title="branch not covered" >!</span>conventions.typePattern.test(spec)) &amp;&amp;</span>
582
+ (<span class="branch-6 cbranch-no" title="branch not covered" >!conventions.interfacePattern ||</span>
583
+ <span class="branch-7 cbranch-no" title="branch not covered" > !conventions.interfacePattern.test(spec)) &amp;&amp;</span>
584
+ <span class="branch-8 cbranch-no" title="branch not covered" > !/^[A-Z][A-Z0-9_]*$/.test(spec)</span>
311
585
  ) {
312
586
  // This is often a 'convention-mix' issue (e.g. importing snake_case into camelCase project)
313
- issues.push({
314
- type: 'convention-mix',
587
+ <span class="cstat-no" title="statement not covered" > issues.push({</span>
588
+ type: 'naming-inconsistency',
315
589
  identifier: spec,
316
590
  file,
317
- line: imp.loc?.start.line || <span class="branch-1 cbranch-no" title="branch not covered" >1,</span>
591
+ line: imp.loc?.start.line || 1,
318
592
  column: imp.loc?.start.column || 0,
319
- severity: Severity.Minor,
593
+ severity: Severity.Info, // Reduced from Minor to Info for imports
320
594
  category: 'naming',
321
595
  suggestion: `Imported identifier '${spec}' may not follow standard conventions for this language.`,
322
596
  });
@@ -324,7 +598,12 @@ export async function analyzeNamingGeneralized(
324
598
  }
325
599
  }
326
600
  } catch (error) {
327
- console.warn(`Consistency: Failed to analyze ${file}: ${error}`);
601
+ // Improved error handling
602
+ const errorMessage =
603
+ error instanceof Error ? error.message : <span class="branch-1 cbranch-no" title="branch not covered" >String(error);</span>
604
+ console.debug(
605
+ `Consistency: Skipping unparseable file ${file}: ${errorMessage.split('\\n')[0]}`
606
+ );
328
607
  }
329
608
  }
330
609
  &nbsp;
@@ -337,7 +616,7 @@ export async function analyzeNamingGeneralized(
337
616
  <div class='footer quiet pad2 space-top1 center small'>
338
617
  Code coverage generated by
339
618
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
340
- at 2026-03-09T03:06:05.217Z
619
+ at 2026-03-21T12:56:00.785Z
341
620
  </div>
342
621
  <script src="../../prettify.js"></script>
343
622
  <script>