@aiready/context-analyzer 0.21.22 → 0.21.23

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 (61) hide show
  1. package/.turbo/turbo-build.log +26 -25
  2. package/.turbo/turbo-lint.log +5 -5
  3. package/.turbo/turbo-test.log +104 -41
  4. package/coverage/clover.xml +2615 -1242
  5. package/coverage/coverage-final.json +30 -13
  6. package/coverage/dist/chunk-64U3PNO3.mjs.html +367 -0
  7. package/coverage/dist/chunk-J3MUOWHC.mjs.html +5326 -0
  8. package/coverage/dist/index.html +146 -0
  9. package/coverage/{classifier.ts.html → dist/index.mjs.html} +537 -912
  10. package/coverage/index.html +84 -189
  11. package/coverage/src/analyzer.ts.html +88 -0
  12. package/coverage/src/analyzers/index.html +116 -0
  13. package/coverage/src/analyzers/python-context.ts.html +910 -0
  14. package/coverage/{ast-utils.ts.html → src/ast-utils.ts.html} +84 -54
  15. package/coverage/src/classifier.ts.html +892 -0
  16. package/coverage/src/classify/classification-patterns.ts.html +307 -0
  17. package/coverage/src/classify/file-classifiers.ts.html +973 -0
  18. package/coverage/src/classify/index.html +131 -0
  19. package/coverage/{cluster-detector.ts.html → src/cluster-detector.ts.html} +154 -91
  20. package/coverage/{defaults.ts.html → src/defaults.ts.html} +74 -65
  21. package/coverage/{graph-builder.ts.html → src/graph-builder.ts.html} +268 -229
  22. package/coverage/src/index.html +341 -0
  23. package/coverage/{index.ts.html → src/index.ts.html} +70 -13
  24. package/coverage/{scoring.ts.html → src/issue-analyzer.ts.html} +201 -261
  25. package/coverage/src/mapper.ts.html +439 -0
  26. package/coverage/{metrics.ts.html → src/metrics.ts.html} +201 -132
  27. package/coverage/src/orchestrator.ts.html +493 -0
  28. package/coverage/{provider.ts.html → src/provider.ts.html} +21 -21
  29. package/coverage/{remediation.ts.html → src/remediation.ts.html} +112 -52
  30. package/coverage/src/report/console-report.ts.html +415 -0
  31. package/coverage/src/report/html-report.ts.html +361 -0
  32. package/coverage/src/report/index.html +146 -0
  33. package/coverage/src/report/interactive-setup.ts.html +373 -0
  34. package/coverage/src/scoring.ts.html +895 -0
  35. package/coverage/src/semantic/co-usage.ts.html +340 -0
  36. package/coverage/src/semantic/consolidation.ts.html +223 -0
  37. package/coverage/src/semantic/domain-inference.ts.html +859 -0
  38. package/coverage/src/semantic/index.html +161 -0
  39. package/coverage/src/semantic/type-graph.ts.html +163 -0
  40. package/coverage/{summary.ts.html → src/summary.ts.html} +155 -275
  41. package/coverage/{types.ts.html → src/types.ts.html} +133 -31
  42. package/coverage/src/utils/dependency-graph-utils.ts.html +463 -0
  43. package/coverage/src/utils/index.html +131 -0
  44. package/coverage/src/utils/string-utils.ts.html +148 -0
  45. package/dist/chunk-J3MUOWHC.mjs +1747 -0
  46. package/dist/cli.js +59 -171
  47. package/dist/cli.mjs +1 -1
  48. package/dist/index.js +55 -167
  49. package/dist/index.mjs +1 -1
  50. package/package.json +2 -2
  51. package/src/__tests__/consolidation.test.ts +247 -0
  52. package/src/__tests__/defaults.test.ts +121 -0
  53. package/src/__tests__/domain-inference.test.ts +420 -0
  54. package/src/__tests__/issue-analyzer.test.ts +155 -0
  55. package/src/__tests__/orchestrator.test.ts +143 -0
  56. package/src/__tests__/python-context.test.ts +98 -0
  57. package/src/__tests__/report/console-report.test.ts +292 -0
  58. package/src/__tests__/report/html-report.test.ts +232 -0
  59. package/src/report/html-report.ts +58 -174
  60. package/coverage/analyzer.ts.html +0 -1369
  61. package/coverage/semantic-analysis.ts.html +0 -1201
@@ -3,15 +3,15 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for metrics.ts</title>
6
+ <title>Code coverage report for src/metrics.ts</title>
7
7
  <meta charset="utf-8" />
8
- <link rel="stylesheet" href="prettify.css" />
9
- <link rel="stylesheet" href="base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
8
+ <link rel="stylesheet" href="../prettify.css" />
9
+ <link rel="stylesheet" href="../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
11
  <meta name="viewport" content="width=device-width, initial-scale=1" />
12
12
  <style type='text/css'>
13
13
  .coverage-summary .sorter {
14
- background-image: url(sort-arrow-sprite.png);
14
+ background-image: url(../sort-arrow-sprite.png);
15
15
  }
16
16
  </style>
17
17
  </head>
@@ -19,34 +19,34 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="index.html">All files</a> metrics.ts</h1>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> metrics.ts</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">90.67% </span>
26
+ <span class="strong">94.42% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>107/118</span>
28
+ <span class='fraction'>220/233</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">68.75% </span>
33
+ <span class="strong">76.31% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>66/96</span>
35
+ <span class='fraction'>145/190</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>11/11</span>
42
+ <span class='fraction'>22/22</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">96.8% </span>
47
+ <span class="strong">98.11% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>91/94</span>
49
+ <span class='fraction'>156/159</span>
50
50
  </div>
51
51
 
52
52
 
@@ -284,7 +284,30 @@
284
284
  <a name='L219'></a><a href='#L219'>219</a>
285
285
  <a name='L220'></a><a href='#L220'>220</a>
286
286
  <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
288
311
  <span class="cline-any cline-neutral">&nbsp;</span>
289
312
  <span class="cline-any cline-neutral">&nbsp;</span>
290
313
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -310,82 +333,82 @@
310
333
  <span class="cline-any cline-neutral">&nbsp;</span>
311
334
  <span class="cline-any cline-neutral">&nbsp;</span>
312
335
  <span class="cline-any cline-yes">8x</span>
313
- <span class="cline-any cline-yes">4x</span>
336
+ <span class="cline-any cline-yes">40x</span>
314
337
  <span class="cline-any cline-yes">8x</span>
315
338
  <span class="cline-any cline-neutral">&nbsp;</span>
316
- <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-yes">13x</span>
317
340
  <span class="cline-any cline-yes">4x</span>
318
341
  <span class="cline-any cline-no">&nbsp;</span>
342
+ <span class="cline-any cline-yes">25x</span>
343
+ <span class="cline-any cline-yes">9x</span>
344
+ <span class="cline-any cline-yes">13x</span>
345
+ <span class="cline-any cline-yes">29x</span>
319
346
  <span class="cline-any cline-neutral">&nbsp;</span>
320
- <span class="cline-any cline-neutral">&nbsp;</span>
321
- <span class="cline-any cline-yes">4x</span>
322
- <span class="cline-any cline-yes">8x</span>
323
- <span class="cline-any cline-neutral">&nbsp;</span>
324
- <span class="cline-any cline-yes">4x</span>
325
347
  <span class="cline-any cline-yes">4x</span>
326
- <span class="cline-any cline-yes">8x</span>
348
+ <span class="cline-any cline-yes">13x</span>
349
+ <span class="cline-any cline-yes">10x</span>
327
350
  <span class="cline-any cline-neutral">&nbsp;</span>
328
351
  <span class="cline-any cline-neutral">&nbsp;</span>
329
- <span class="cline-any cline-yes">4x</span>
330
- <span class="cline-any cline-yes">4x</span>
331
- <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-yes">11x</span>
353
+ <span class="cline-any cline-yes">20x</span>
332
354
  <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-yes">4x</span>
334
- <span class="cline-any cline-yes">4x</span>
335
- <span class="cline-any cline-yes">4x</span>
355
+ <span class="cline-any cline-yes">7x</span>
356
+ <span class="cline-any cline-yes">11x</span>
357
+ <span class="cline-any cline-yes">20x</span>
358
+ <span class="cline-any cline-yes">11x</span>
336
359
  <span class="cline-any cline-neutral">&nbsp;</span>
337
- <span class="cline-any cline-yes">4x</span>
338
- <span class="cline-any cline-yes">8x</span>
360
+ <span class="cline-any cline-yes">11x</span>
361
+ <span class="cline-any cline-yes">15x</span>
339
362
  <span class="cline-any cline-yes">4x</span>
340
363
  <span class="cline-any cline-yes">4x</span>
341
- <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-yes">4x</span>
364
+ <span class="cline-any cline-yes">15x</span>
365
+ <span class="cline-any cline-yes">11x</span>
366
+ <span class="cline-any cline-yes">11x</span>
343
367
  <span class="cline-any cline-yes">4x</span>
368
+ <span class="cline-any cline-yes">11x</span>
369
+ <span class="cline-any cline-yes">20x</span>
370
+ <span class="cline-any cline-yes">15x</span>
371
+ <span class="cline-any cline-yes">20x</span>
372
+ <span class="cline-any cline-yes">20x</span>
373
+ <span class="cline-any cline-yes">11x</span>
374
+ <span class="cline-any cline-yes">12x</span>
344
375
  <span class="cline-any cline-yes">4x</span>
345
376
  <span class="cline-any cline-neutral">&nbsp;</span>
346
377
  <span class="cline-any cline-neutral">&nbsp;</span>
347
- <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-yes">8x</span>
348
379
  <span class="cline-any cline-yes">4x</span>
349
380
  <span class="cline-any cline-yes">4x</span>
381
+ <span class="cline-any cline-yes">23x</span>
350
382
  <span class="cline-any cline-neutral">&nbsp;</span>
351
383
  <span class="cline-any cline-neutral">&nbsp;</span>
352
384
  <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-yes">4x</span>
356
- <span class="cline-any cline-neutral">&nbsp;</span>
357
- <span class="cline-any cline-neutral">&nbsp;</span>
358
385
  <span class="cline-any cline-yes">16x</span>
386
+ <span class="cline-any cline-yes">9x</span>
359
387
  <span class="cline-any cline-neutral">&nbsp;</span>
360
388
  <span class="cline-any cline-neutral">&nbsp;</span>
361
- <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-yes">16x</span>
363
- <span class="cline-any cline-yes">2x</span>
364
- <span class="cline-any cline-neutral">&nbsp;</span>
365
- <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-neutral">&nbsp;</span>
367
- <span class="cline-any cline-yes">4x</span>
389
+ <span class="cline-any cline-yes">36x</span>
390
+ <span class="cline-any cline-yes">40x</span>
368
391
  <span class="cline-any cline-yes">4x</span>
369
392
  <span class="cline-any cline-yes">8x</span>
370
- <span class="cline-any cline-no">&nbsp;</span>
371
- <span class="cline-any cline-neutral">&nbsp;</span>
393
+ <span class="cline-any cline-yes">40x</span>
394
+ <span class="cline-any cline-yes">10x</span>
372
395
  <span class="cline-any cline-neutral">&nbsp;</span>
373
396
  <span class="cline-any cline-yes">4x</span>
374
397
  <span class="cline-any cline-no">&nbsp;</span>
398
+ <span class="cline-any cline-yes">11x</span>
399
+ <span class="cline-any cline-yes">7x</span>
400
+ <span class="cline-any cline-yes">16x</span>
401
+ <span class="cline-any cline-yes">20x</span>
375
402
  <span class="cline-any cline-neutral">&nbsp;</span>
376
- <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-yes">4x</span>
379
- <span class="cline-any cline-neutral">&nbsp;</span>
380
- <span class="cline-any cline-yes">4x</span>
381
- <span class="cline-any cline-neutral">&nbsp;</span>
382
- <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-neutral">&nbsp;</span>
384
- <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-yes">11x</span>
404
+ <span class="cline-any cline-yes">7x</span>
405
+ <span class="cline-any cline-no">&nbsp;</span>
385
406
  <span class="cline-any cline-neutral">&nbsp;</span>
386
407
  <span class="cline-any cline-neutral">&nbsp;</span>
387
408
  <span class="cline-any cline-neutral">&nbsp;</span>
409
+ <span class="cline-any cline-yes">7x</span>
388
410
  <span class="cline-any cline-neutral">&nbsp;</span>
411
+ <span class="cline-any cline-yes">7x</span>
389
412
  <span class="cline-any cline-neutral">&nbsp;</span>
390
413
  <span class="cline-any cline-yes">4x</span>
391
414
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -399,6 +422,18 @@
399
422
  <span class="cline-any cline-yes">3x</span>
400
423
  <span class="cline-any cline-yes">3x</span>
401
424
  <span class="cline-any cline-yes">5x</span>
425
+ <span class="cline-any cline-yes">7x</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-yes">6x</span>
428
+ <span class="cline-any cline-yes">3x</span>
429
+ <span class="cline-any cline-yes">2x</span>
430
+ <span class="cline-any cline-yes">5x</span>
431
+ <span class="cline-any cline-yes">9x</span>
432
+ <span class="cline-any cline-yes">5x</span>
433
+ <span class="cline-any cline-neutral">&nbsp;</span>
434
+ <span class="cline-any cline-yes">3x</span>
435
+ <span class="cline-any cline-yes">5x</span>
436
+ <span class="cline-any cline-yes">5x</span>
402
437
  <span class="cline-any cline-neutral">&nbsp;</span>
403
438
  <span class="cline-any cline-neutral">&nbsp;</span>
404
439
  <span class="cline-any cline-yes">3x</span>
@@ -413,18 +448,6 @@
413
448
  <span class="cline-any cline-neutral">&nbsp;</span>
414
449
  <span class="cline-any cline-neutral">&nbsp;</span>
415
450
  <span class="cline-any cline-neutral">&nbsp;</span>
416
- <span class="cline-any cline-neutral">&nbsp;</span>
417
- <span class="cline-any cline-neutral">&nbsp;</span>
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-neutral">&nbsp;</span>
422
- <span class="cline-any cline-neutral">&nbsp;</span>
423
- <span class="cline-any cline-neutral">&nbsp;</span>
424
- <span class="cline-any cline-neutral">&nbsp;</span>
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>
428
451
  <span class="cline-any cline-yes">14x</span>
429
452
  <span class="cline-any cline-neutral">&nbsp;</span>
430
453
  <span class="cline-any cline-yes">11x</span>
@@ -442,28 +465,28 @@
442
465
  <span class="cline-any cline-neutral">&nbsp;</span>
443
466
  <span class="cline-any cline-neutral">&nbsp;</span>
444
467
  <span class="cline-any cline-yes">14x</span>
468
+ <span class="cline-any cline-yes">28x</span>
445
469
  <span class="cline-any cline-yes">2x</span>
446
- <span class="cline-any cline-yes">2x</span>
447
- <span class="cline-any cline-neutral">&nbsp;</span>
448
- <span class="cline-any cline-neutral">&nbsp;</span>
470
+ <span class="cline-any cline-yes">11x</span>
471
+ <span class="cline-any cline-yes">33x</span>
472
+ <span class="cline-any cline-yes">22x</span>
449
473
  <span class="cline-any cline-yes">11x</span>
450
474
  <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-yes">11x</span>
451
476
  <span class="cline-any cline-neutral">&nbsp;</span>
452
477
  <span class="cline-any cline-neutral">&nbsp;</span>
453
478
  <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-yes">13x</span>
454
480
  <span class="cline-any cline-neutral">&nbsp;</span>
455
- <span class="cline-any cline-neutral">&nbsp;</span>
456
- <span class="cline-any cline-yes">2x</span>
457
- <span class="cline-any cline-neutral">&nbsp;</span>
481
+ <span class="cline-any cline-yes">13x</span>
458
482
  <span class="cline-any cline-yes">2x</span>
459
- <span class="cline-any cline-yes">2x</span>
460
- <span class="cline-any cline-yes">15x</span>
461
483
  <span class="cline-any cline-yes">15x</span>
462
- <span class="cline-any cline-neutral">&nbsp;</span>
463
- <span class="cline-any cline-neutral">&nbsp;</span>
484
+ <span class="cline-any cline-yes">29x</span>
485
+ <span class="cline-any cline-yes">4x</span>
464
486
  <span class="cline-any cline-yes">2x</span>
487
+ <span class="cline-any cline-yes">16x</span>
465
488
  <span class="cline-any cline-yes">2x</span>
466
- <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-yes">11x</span>
467
490
  <span class="cline-any cline-yes">7x</span>
468
491
  <span class="cline-any cline-yes">2x</span>
469
492
  <span class="cline-any cline-yes">2x</span>
@@ -473,14 +496,37 @@
473
496
  <span class="cline-any cline-neutral">&nbsp;</span>
474
497
  <span class="cline-any cline-yes">2x</span>
475
498
  <span class="cline-any cline-yes">2x</span>
499
+ <span class="cline-any cline-yes">3x</span>
476
500
  <span class="cline-any cline-neutral">&nbsp;</span>
501
+ <span class="cline-any cline-yes">3x</span>
502
+ <span class="cline-any cline-yes">3x</span>
503
+ <span class="cline-any cline-yes">16x</span>
504
+ <span class="cline-any cline-yes">16x</span>
505
+ <span class="cline-any cline-yes">5x</span>
477
506
  <span class="cline-any cline-neutral">&nbsp;</span>
478
- <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-yes">15x</span>
508
+ <span class="cline-any cline-yes">3x</span>
509
+ <span class="cline-any cline-yes">6x</span>
510
+ <span class="cline-any cline-yes">9x</span>
511
+ <span class="cline-any cline-yes">12x</span>
512
+ <span class="cline-any cline-yes">8x</span>
513
+ <span class="cline-any cline-yes">7x</span>
514
+ <span class="cline-any cline-yes">7x</span>
515
+ <span class="cline-any cline-yes">4x</span>
516
+ <span class="cline-any cline-yes">2x</span>
517
+ <span class="cline-any cline-yes">2x</span>
518
+ <span class="cline-any cline-yes">4x</span>
519
+ <span class="cline-any cline-yes">6x</span>
520
+ <span class="cline-any cline-yes">6x</span>
521
+ <span class="cline-any cline-yes">6x</span>
522
+ <span class="cline-any cline-yes">6x</span>
523
+ <span class="cline-any cline-yes">6x</span>
524
+ <span class="cline-any cline-yes">6x</span>
525
+ <span class="cline-any cline-yes">6x</span>
480
526
  <span class="cline-any cline-neutral">&nbsp;</span>
481
527
  <span class="cline-any cline-neutral">&nbsp;</span>
482
528
  <span class="cline-any cline-yes">2x</span>
483
- <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-yes">2x</span>
484
530
  <span class="cline-any cline-yes">12x</span>
485
531
  <span class="cline-any cline-yes">2x</span>
486
532
  <span class="cline-any cline-yes">6x</span>
@@ -510,7 +556,14 @@ import type { ExportInfo } from './types';
510
556
  import { isTestFile } from './ast-utils';
511
557
  &nbsp;
512
558
  /**
513
- * Calculate cohesion score (how related are exports in a file)
559
+ * Calculates a cohesion score (0-1) for a module based on its exports,
560
+ * shared imports, and internal structure. High cohesion indicates
561
+ * a well-focused module that is easy for AI models to reason about.
562
+ *
563
+ * @param exports - Exported symbols and their metadata.
564
+ * @param filePath - Optional file path for context.
565
+ * @param options - Optional configuration for weights and co-usage context.
566
+ * @returns Cohesion score between 0 and 1.
514
567
  */
515
568
  export function calculateEnhancedCohesion(
516
569
  exports: ExportInfo[],
@@ -520,31 +573,32 @@ export function calculateEnhancedCohesion(
520
573
  weights?: {
521
574
  importBased?: number;
522
575
  structural?: number;
523
- domainBased?: number;
576
+ <span class="missing-if-branch" title="if path not taken" >I</span> domainBa<span class="branch-1 cbranch-no" title="branch not covered" >sed?: number;<span class="cstat-no" title="statement not covered" ></span></span>
524
577
  };
525
578
  }
526
- ): number {
579
+ ): number {<span class="branch-1 cbranch-no" title="branch not covered" ></span>
527
580
  if (exports.length &lt;= 1) return 1;
528
581
  &nbsp;
529
582
  // Test files always have perfect cohesion by design
530
- <span class="missing-if-branch" title="if path not taken" >I</span>if (<span class="branch-1 cbranch-no" title="branch not covered" >filePath &amp;&amp; isTestFile(filePath)) <span class="cstat-no" title="statement not covered" >r</span>eturn 1;</span>
531
- &nbsp;
532
- // 1. Domain-based cohesion using entropy
533
- const domains = exports.map((e) =&gt; e.inferredDomain || <span class="branch-1 cbranch-no" title="branch not covered" >'unknown')</span>;
583
+ if (filePath &amp;&amp; isTestFile(filePath)) return 1;
584
+ <span class="branch-1 cbranch-no" title="branch not covered" ><span class="missing-if-branch" title="if path not taken" >I</span></span>
585
+ //<span class="cstat-no" title="statement not covered" > 1. Domain-based cohesi<span class="cstat-no" title="statement not covered" >on using entropy</span></span>
586
+ const domains = exports.map((e) =&gt; e.inferredDomain || 'unknown');
534
587
  const domainCounts = new Map&lt;string, number&gt;();
535
- for (const d of domains) domainCounts.set(d, (domainCounts.get(d) || 0) + 1);
588
+ for (const domain of domains)
589
+ domainCounts.set(domain, (domainCounts.get(domain) || 0) + 1);
536
590
  &nbsp;
537
591
  // IF ALL DOMAINS MATCH, RETURN 1.0 IMMEDIATELY (Legacy test compatibility)
538
- <span class="missing-if-branch" title="if path not taken" >I</span>if (domainCounts.size === 1 &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >domains[0] !== 'unknown') {</span>
539
- <span class="cstat-no" title="statement not covered" > if (!options?.weights) <span class="cstat-no" title="statement not covered" >return 1;</span></span>
592
+ if (domainCounts.size === 1 &amp;&amp; domains[0] !== 'unknown') {
593
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!options?.weights) return 1;
540
594
  }
541
595
  &nbsp;
542
596
  const probs = Array.from(domainCounts.values()).map(
543
- (c) =&gt; c / exports.length
597
+ (count) =&gt; count / exports.length
544
598
  );
545
599
  let domainEntropy = 0;
546
- for (const p of probs) {
547
- <span class="missing-if-branch" title="else path not taken" >E</span>if (p &gt; 0) domainEntropy -= p * Math.log2(p);
600
+ for (const prob of probs) {
601
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (prob &gt; 0) domainEntropy -= prob * Math.log2(prob);
548
602
  }
549
603
  &nbsp;
550
604
  const maxEntropy = Math.log2(Math.max(2, domainCounts.size));
@@ -552,15 +606,15 @@ export function calculateEnhancedCohesion(
552
606
  &nbsp;
553
607
  // 2. Import-based cohesion
554
608
  let importScoreTotal = 0;
555
- let pairsWithData = 0;
609
+ let <span class="missing-if-branch" title="else path not taken" >E</span>pairsWithData = 0;<span class="branch-1 cbranch-no" title="branch not covered" ></span>
556
610
  let anyImportData = false;
557
611
  &nbsp;
558
- for (let i = 0; i &lt; exports.length; i++) {
612
+ for (let i = 0; i &lt; exports.length; i++) {<span class="branch-1 cbranch-no" title="branch not covered" ></span>
559
613
  for (let j = i + 1; j &lt; exports.length; j++) {
560
614
  const exp1Imports = exports[i].imports;
561
615
  const exp2Imports = exports[j].imports;
562
616
  &nbsp;
563
- <span class="missing-if-branch" title="else path not taken" >E</span>if (exp1Imports || <span class="branch-1 cbranch-no" title="branch not covered" >exp2Imports) {</span>
617
+ if (exp1Imports || exp2Imports) {
564
618
  anyImportData = true;
565
619
  const sim = calculateImportSimilarity(
566
620
  { ...exports[i], imports: exp1Imports || <span class="branch-1 cbranch-no" title="branch not covered" >[] }</span> as any,
@@ -570,25 +624,25 @@ export function calculateEnhancedCohesion(
570
624
  pairsWithData++;
571
625
  }
572
626
  }
573
- }
627
+ }<span class="branch-1 cbranch-no" title="branch not covered" ></span>
574
628
  &nbsp;
575
629
  const avgImportScore =
576
- pairsWithData &gt; 0 ? importScoreTotal / pairsWithData : <span class="branch-1 cbranch-no" title="branch not covered" >0;</span>
630
+ pairsWithData &gt; 0 ? importScoreTotal / pairsWithData : 0;
577
631
  &nbsp;
578
632
  // Weighted average
579
633
  let score = anyImportData
580
634
  ? domainScore * 0.4 + avgImportScore * 0.6
581
- : <span class="branch-1 cbranch-no" title="branch not covered" >domainScore;</span>
582
- &nbsp;
635
+ : domainScore;
636
+ <span class="branch-1 cbranch-no" title="branch not covered" ><span class="missing-if-branch" title="if path not taken" >I</span></span>
583
637
  if (anyImportData &amp;&amp; score === 0 &amp;&amp; domainScore === 0) {
584
638
  score = 0.1;
585
639
  }
586
- &nbsp;
587
- // Structural boost
640
+ <span class="missing-if-branch" title="if path not taken" >I</span>
641
+ //<span class="cstat-no" title="statement not covered" > Structural boost</span>
588
642
  let structuralScore = 0;
589
643
  for (const exp of exports) {
590
644
  <span class="missing-if-branch" title="if path not taken" >I</span>if (exp.dependencies &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >exp.dependencies.length &gt; 0) {</span>
591
- <span class="cstat-no" title="statement not covered" > structuralScore += 1;</span>
645
+ <span class="missing-if-branch" title="if path not taken" >I</span> structuralScore += 1;<span class="cstat-no" title="statement not covered" ><span class="branch-2 cbranch-no" title="branch not covered" ></span></span>
592
646
  }
593
647
  }
594
648
  <span class="missing-if-branch" title="if path not taken" >I</span>if (structuralScore &gt; 0) {
@@ -596,18 +650,22 @@ export function calculateEnhancedCohesion(
596
650
  }
597
651
  &nbsp;
598
652
  // Legacy fallback if no imports and domain Score was 1.0
599
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!options?.weights &amp;&amp; !anyImportData &amp;&amp; <span class="branch-2 cbranch-no" title="branch not covered" >domainCounts.size === 1) <span class="cstat-no" title="statement not covered" >r</span>eturn 1;</span>
653
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!options?.weights &amp;&amp; !anyImportData &amp;&amp; domainCounts.size === 1) <span class="cstat-no" title="statement not covered" >return 1;</span>
600
654
  &nbsp;
601
655
  return score;
602
656
  }
603
657
  &nbsp;
604
658
  /**
605
659
  * Calculate structural cohesion for a file based on co-usage patterns.
606
- */
660
+ *<span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span></span>
661
+ * @param file - The file path to analyze.
662
+ * @param coUsageMatrix - Matrix of files frequently imported together.
663
+ * @returns Cohesion score between 0 and 1 based on co-usage distribution.
664
+ *<span class="missing-if-branch" title="if path not taken" >I</span>/<span class="cstat-no" title="statement not covered" ></span>
607
665
  export function calculateStructuralCohesionFromCoUsage(
608
666
  file: string,
609
667
  coUsageMatrix?: Map&lt;string, Map&lt;string, number&gt;&gt;
610
- ): number {
668
+ ): n<span class="missing-if-branch" title="else path not taken" >E</span>umber {
611
669
  if (!coUsageMatrix) return 1;
612
670
  &nbsp;
613
671
  const coUsages = coUsageMatrix.get(file);
@@ -615,10 +673,10 @@ export function calculateStructuralCohesionFromCoUsage(
615
673
  &nbsp;
616
674
  let total = 0;
617
675
  for (const count of coUsages.values()) total += count;
618
- <span class="missing-if-branch" title="if path not taken" >I</span>if (total === 0) <span class="cstat-no" title="statement not covered" >return 1;</span>
676
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (total === 0) return 1;
619
677
  &nbsp;
620
678
  const probs: number[] = [];
621
- for (const count of coUsages.values()) {
679
+ for (const count of coUsages.values()) {<span class="branch-1 cbranch-no" title="branch not covered" ></span>
622
680
  <span class="missing-if-branch" title="else path not taken" >E</span>if (count &gt; 0) probs.push(count / total);
623
681
  }
624
682
  &nbsp;
@@ -635,10 +693,15 @@ export function calculateStructuralCohesionFromCoUsage(
635
693
  &nbsp;
636
694
  /**
637
695
  * Calculate fragmentation score (how scattered is a domain)
696
+ *
697
+ * @param files - List of files belonging to the domain.
698
+ * @param domain - The domain identifier.
699
+ * @param options - Optional calculation parameters (log scale, thresholds).
700
+ * @returns Fragmentation score from 0 (perfect) to 1 (highly scattered).
638
701
  */
639
702
  export function calculateFragmentation(
640
703
  files: string[],
641
- domain: string,
704
+ domain<span class="branch-0 cbranch-no" title="branch not covered" >: string,</span>
642
705
  options?: {
643
706
  useLogScale?: boolean;
644
707
  logBase?: number;
@@ -649,7 +712,7 @@ export function calculateFragmentation(
649
712
  if (files.length &lt;= 1) return 0;
650
713
  &nbsp;
651
714
  const directories = new Set(
652
- files.map((f) =&gt; f.split('/').slice(0, -1).join('/'))
715
+ files.map((file) =&gt; file.split('/').slice(0, -1).join('/'))
653
716
  );
654
717
  const uniqueDirs = directories.size;
655
718
  &nbsp;
@@ -657,35 +720,38 @@ export function calculateFragmentation(
657
720
  ? uniqueDirs &lt;= 1
658
721
  ? <span class="branch-0 cbranch-no" title="branch not covered" >0</span>
659
722
  : Math.log(uniqueDirs) /
660
- Math.log(options.logBase || Math.E) /
723
+ <span class="missing-if-branch" title="if path not taken" >I</span> Math.log(options.logBase || Math.E) /
661
724
  (Math.log(files.length) / Math.log(options.logBase || Math.E))
662
725
  : (uniqueDirs - 1) / (files.length - 1);
663
726
  &nbsp;
664
- // Coupling Discount
727
+ // Coupling Discount<span class="branch-1 cbranch-no" title="branch not covered" ></span>
665
728
  if (options?.sharedImportRatio &amp;&amp; options.sharedImportRatio &gt; 0.5) {
666
729
  const discount = (options.sharedImportRatio - 0.5) * 0.4;
667
730
  score = score * (1 - discount);
668
731
  }
669
- &nbsp;
732
+ <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span></span>
670
733
  return score;
671
734
  }
672
735
  &nbsp;
673
736
  /**
674
- * Calculate path entropy for a set of files
737
+ * Calculate path entropy for a set of files to measure directory distribution.
738
+ *
739
+ * @param files - Array of file paths.
740
+ * @returns Entropy score representing the spread across directories.
675
741
  */
676
- export function calculatePathEntropy(files: string[]): number {
742
+ export function calculatePathEntropy(files: strin<span class="branch-1 cbranch-no" title="branch not covered" >g[</span>]): number {
677
743
  <span class="missing-if-branch" title="if path not taken" >I</span>if (!files || files.length === 0) <span class="cstat-no" title="statement not covered" >return 0;</span>
678
744
  &nbsp;
679
745
  const dirCounts = new Map&lt;string, number&gt;();
680
- for (const f of files) {
681
- const dir = f.split('/').slice(0, -1).join('/') || <span class="branch-1 cbranch-no" title="branch not covered" >'.';</span>
746
+ for (const file of files) {
747
+ const dir = file.split('/').slice(0, -1).join('/') || '.';
682
748
  dirCounts.set(dir, (dirCounts.get(dir) || 0) + 1);
683
- }
749
+ <span class="missing-if-branch" title="if path not taken" >I</span>}
684
750
  &nbsp;
685
751
  const counts = Array.from(dirCounts.values());
686
- <span class="missing-if-branch" title="if path not taken" >I</span>if (counts.length &lt;= 1) <span class="cstat-no" title="statement not covered" >return 0;</span>
752
+ if (counts.length &lt;= 1) return 0;
687
753
  &nbsp;
688
- const total = counts.reduce((s, v) =&gt; s + v, 0);
754
+ const total = counts.reduce((sum, value) =&gt; sum + value, 0);
689
755
  let entropy = 0;
690
756
  for (const count of counts) {
691
757
  const prob = count / total;
@@ -697,16 +763,19 @@ export function calculatePathEntropy(files: string[]): number {
697
763
  }
698
764
  &nbsp;
699
765
  /**
700
- * Calculate directory-distance metric based on common ancestor depth
766
+ * Calculate directory-distance metric based on common ancestor depth.
767
+ *
768
+ * @param files - Array of file paths to compare.<span class="branch-1 cbranch-no" title="branch not covered" ></span>
769
+ * @returns Normalized distance metric (0-1).
701
770
  */
702
771
  export function calculateDirectoryDistance(files: string[]): number {
703
772
  <span class="missing-if-branch" title="if path not taken" >I</span>if (!files || files.length &lt;= 1) <span class="cstat-no" title="statement not covered" >return 0;</span>
704
- &nbsp;
705
- const pathSegments = (p: string) =&gt; p.split('/').filter(Boolean);
706
- const commonAncestorDepth = (a: string[], b: string[]) =&gt; {
707
- const minLen = Math.min(a.length, b.length);
773
+ <span class="branch-1 cbranch-no" title="branch not covered" ></span>
774
+ const pathSegments = (pathStr: string) =&gt; pathStr.split('/').filter(Boolean);
775
+ const commonAncestorDepth = (pathA: string[], pathB: string[]) =&gt; {
776
+ const minLen = Math.min(pathA.length, pathB.length);
708
777
  let i = 0;
709
- while (i &lt; minLen &amp;&amp; a[i] === b[i]) i++;
778
+ while (i &lt; minLen &amp;&amp; pathA[i] === pathB[i]) i++;
710
779
  return i;
711
780
  };
712
781
  &nbsp;
@@ -733,16 +802,16 @@ export function calculateDirectoryDistance(files: string[]): number {
733
802
  <div class='footer quiet pad2 space-top1 center small'>
734
803
  Code coverage generated by
735
804
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
736
- at 2026-03-09T02:34:18.551Z
805
+ at 2026-03-21T12:52:37.698Z
737
806
  </div>
738
- <script src="prettify.js"></script>
807
+ <script src="../prettify.js"></script>
739
808
  <script>
740
809
  window.onload = function () {
741
810
  prettyPrint();
742
811
  };
743
812
  </script>
744
- <script src="sorter.js"></script>
745
- <script src="block-navigation.js"></script>
813
+ <script src="../sorter.js"></script>
814
+ <script src="../block-navigation.js"></script>
746
815
  </body>
747
816
  </html>
748
817