@aiready/context-analyzer 0.21.26 → 0.21.27

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 (78) hide show
  1. package/.turbo/turbo-build.log +32 -25
  2. package/.turbo/turbo-test.log +51 -87
  3. package/coverage/clover.xml +392 -1878
  4. package/coverage/coverage-final.json +15 -19
  5. package/coverage/index.html +48 -63
  6. package/coverage/src/analyzers/index.html +21 -21
  7. package/coverage/src/analyzers/python-context.ts.html +96 -96
  8. package/coverage/src/ast-utils.ts.html +34 -109
  9. package/coverage/src/classifier.ts.html +104 -104
  10. package/coverage/src/classify/classification-patterns.ts.html +1 -1
  11. package/coverage/src/classify/file-classifiers.ts.html +1 -1
  12. package/coverage/src/classify/index.html +1 -1
  13. package/coverage/src/cluster-detector.ts.html +72 -72
  14. package/coverage/src/defaults.ts.html +1 -1
  15. package/coverage/src/graph-builder.ts.html +131 -131
  16. package/coverage/src/index.html +101 -116
  17. package/coverage/src/index.ts.html +2 -2
  18. package/coverage/src/issue-analyzer.ts.html +32 -83
  19. package/coverage/src/mapper.ts.html +20 -2
  20. package/coverage/src/metrics.ts.html +127 -130
  21. package/coverage/src/orchestrator.ts.html +13 -13
  22. package/coverage/src/provider.ts.html +19 -19
  23. package/coverage/src/remediation.ts.html +59 -59
  24. package/coverage/src/report/console-report.ts.html +2 -2
  25. package/coverage/src/report/html-report.ts.html +60 -84
  26. package/coverage/src/report/index.html +7 -7
  27. package/coverage/src/report/interactive-setup.ts.html +1 -1
  28. package/coverage/src/scoring.ts.html +62 -62
  29. package/coverage/src/semantic/co-usage.ts.html +1 -1
  30. package/coverage/src/semantic/consolidation.ts.html +1 -1
  31. package/coverage/src/semantic/domain-inference.ts.html +1 -1
  32. package/coverage/src/semantic/index.html +1 -1
  33. package/coverage/src/semantic/type-graph.ts.html +1 -1
  34. package/coverage/src/summary.ts.html +67 -67
  35. package/coverage/src/types.ts.html +1 -1
  36. package/coverage/src/utils/dependency-graph-utils.ts.html +41 -41
  37. package/coverage/src/utils/index.html +21 -21
  38. package/coverage/src/utils/string-utils.ts.html +1 -1
  39. package/dist/chunk-22ZO4EKZ.mjs +1297 -0
  40. package/dist/chunk-4U4LDWGF.mjs +360 -0
  41. package/dist/chunk-BA7QGUHN.mjs +1722 -0
  42. package/dist/chunk-BCEZGRXI.mjs +1297 -0
  43. package/dist/chunk-BQCISA2F.mjs +91 -0
  44. package/dist/chunk-EMYD7NS6.mjs +137 -0
  45. package/dist/chunk-EWFR366Y.mjs +1740 -0
  46. package/dist/chunk-FO6YT6RG.mjs +1751 -0
  47. package/dist/chunk-J3SZQZNU.mjs +221 -0
  48. package/dist/chunk-OZE3FVZT.mjs +1089 -0
  49. package/dist/chunk-WHB7QI7N.mjs +91 -0
  50. package/dist/cli-action-CXIHOVAC.mjs +95 -0
  51. package/dist/cli-action-SA7SCYNV.mjs +95 -0
  52. package/dist/cli-action-YAJOJCXJ.mjs +95 -0
  53. package/dist/cli.js +688 -566
  54. package/dist/cli.mjs +4 -88
  55. package/dist/index.js +889 -773
  56. package/dist/index.mjs +21 -14
  57. package/dist/orchestrator-3L3NAZYP.mjs +10 -0
  58. package/dist/orchestrator-MONOZHVW.mjs +10 -0
  59. package/dist/orchestrator-ZR7JSKWI.mjs +10 -0
  60. package/dist/summary-7PZVW72O.mjs +7 -0
  61. package/dist/summary-LKUCJAIS.mjs +7 -0
  62. package/package.json +2 -2
  63. package/src/__tests__/analyzer.test.ts +1 -1
  64. package/src/__tests__/enhanced-cohesion.test.ts +4 -1
  65. package/src/__tests__/orchestrator.test.ts +19 -4
  66. package/src/__tests__/python-context.test.ts +6 -0
  67. package/src/__tests__/report/html-report.test.ts +8 -2
  68. package/src/ast-utils.ts +1 -26
  69. package/src/cli-definition.ts +4 -2
  70. package/src/issue-analyzer.ts +4 -19
  71. package/src/metrics.ts +1 -2
  72. package/src/provider.ts +4 -4
  73. package/src/report/html-report.ts +43 -59
  74. package/coverage/dist/chunk-64U3PNO3.mjs.html +0 -367
  75. package/coverage/dist/chunk-J3MUOWHC.mjs.html +0 -5326
  76. package/coverage/dist/index.html +0 -146
  77. package/coverage/dist/index.mjs.html +0 -1396
  78. package/coverage/src/analyzer.ts.html +0 -88
@@ -181,7 +181,19 @@
181
181
  <a name='L116'></a><a href='#L116'>116</a>
182
182
  <a name='L117'></a><a href='#L117'>117</a>
183
183
  <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
191
+ <span class="cline-any cline-neutral">&nbsp;</span>
192
+ <span class="cline-any cline-neutral">&nbsp;</span>
193
+ <span class="cline-any cline-neutral">&nbsp;</span>
194
+ <span class="cline-any cline-neutral">&nbsp;</span>
195
+ <span class="cline-any cline-neutral">&nbsp;</span>
196
+ <span class="cline-any cline-neutral">&nbsp;</span>
185
197
  <span class="cline-any cline-neutral">&nbsp;</span>
186
198
  <span class="cline-any cline-neutral">&nbsp;</span>
187
199
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -328,6 +340,12 @@ export interface MappingOptions {
328
340
  &nbsp;
329
341
  /**
330
342
  * Maps a single dependency node to a comprehensive ContextAnalysisResult.
343
+ *
344
+ * @param node - The dependency node to map
345
+ * @param graph - The full dependency graph
346
+ * @param clusters - All identified module clusters
347
+ * @param allCircularDeps - All identified circular dependencies
348
+ * @param options - Mapping options for detailed analysis
331
349
  */
332
350
  export function mapNodeToResult(
333
351
  node: DependencyNode,
@@ -424,7 +442,7 @@ export function mapNodeToResult(
424
442
  <div class='footer quiet pad2 space-top1 center small'>
425
443
  Code coverage generated by
426
444
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
427
- at 2026-03-21T12:52:37.698Z
445
+ at 2026-03-24T11:20:59.666Z
428
446
  </div>
429
447
  <script src="../prettify.js"></script>
430
448
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">94.42% </span>
26
+ <span class="strong">94.06% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>220/233</span>
28
+ <span class='fraction'>111/118</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">76.31% </span>
33
+ <span class="strong">81.25% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>145/190</span>
35
+ <span class='fraction'>78/96</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'>22/22</span>
42
+ <span class='fraction'>11/11</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">98.11% </span>
47
+ <span class="strong">97.89% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>156/159</span>
49
+ <span class='fraction'>93/95</span>
50
50
  </div>
51
51
 
52
52
 
@@ -306,8 +306,8 @@
306
306
  <a name='L241'></a><a href='#L241'>241</a>
307
307
  <a name='L242'></a><a href='#L242'>242</a>
308
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>
309
+ <a name='L244'></a><a href='#L244'>244</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
310
+ <span class="cline-any cline-neutral">&nbsp;</span>
311
311
  <span class="cline-any cline-neutral">&nbsp;</span>
312
312
  <span class="cline-any cline-neutral">&nbsp;</span>
313
313
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -326,81 +326,79 @@
326
326
  <span class="cline-any cline-neutral">&nbsp;</span>
327
327
  <span class="cline-any cline-neutral">&nbsp;</span>
328
328
  <span class="cline-any cline-neutral">&nbsp;</span>
329
- <span class="cline-any cline-yes">16x</span>
330
329
  <span class="cline-any cline-neutral">&nbsp;</span>
331
330
  <span class="cline-any cline-neutral">&nbsp;</span>
332
- <span class="cline-any cline-yes">4x</span>
333
331
  <span class="cline-any cline-neutral">&nbsp;</span>
334
332
  <span class="cline-any cline-neutral">&nbsp;</span>
335
- <span class="cline-any cline-yes">8x</span>
336
- <span class="cline-any cline-yes">40x</span>
337
- <span class="cline-any cline-yes">8x</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-yes">36x</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
336
  <span class="cline-any cline-neutral">&nbsp;</span>
339
337
  <span class="cline-any cline-yes">13x</span>
340
- <span class="cline-any cline-yes">4x</span>
341
- <span class="cline-any cline-no">&nbsp;</span>
342
- <span class="cline-any cline-yes">25x</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-yes">21x</span>
343
341
  <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>
342
+ <span class="cline-any cline-yes">9x</span>
343
+ <span class="cline-any cline-yes">21x</span>
346
344
  <span class="cline-any cline-neutral">&nbsp;</span>
347
- <span class="cline-any cline-yes">4x</span>
348
- <span class="cline-any cline-yes">13x</span>
349
- <span class="cline-any cline-yes">10x</span>
350
345
  <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-yes">9x</span>
347
+ <span class="cline-any cline-yes">2x</span>
351
348
  <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>
354
349
  <span class="cline-any cline-neutral">&nbsp;</span>
355
350
  <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>
351
+ <span class="cline-any cline-yes">16x</span>
359
352
  <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-yes">7x</span>
354
+ <span class="cline-any cline-yes">7x</span>
355
+ <span class="cline-any cline-yes">16x</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-yes">7x</span>
359
+ <span class="cline-any cline-yes">7x</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-yes">7x</span>
363
+ <span class="cline-any cline-yes">7x</span>
364
+ <span class="cline-any cline-yes">7x</span>
365
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-yes">7x</span>
367
+ <span class="cline-any cline-yes">16x</span>
360
368
  <span class="cline-any cline-yes">11x</span>
361
- <span class="cline-any cline-yes">15x</span>
362
- <span class="cline-any cline-yes">4x</span>
363
- <span class="cline-any cline-yes">4x</span>
364
- <span class="cline-any cline-yes">15x</span>
365
369
  <span class="cline-any cline-yes">11x</span>
370
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
371
  <span class="cline-any cline-yes">11x</span>
367
372
  <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>
375
373
  <span class="cline-any cline-yes">4x</span>
376
374
  <span class="cline-any cline-neutral">&nbsp;</span>
377
375
  <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-yes">8x</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
379
377
  <span class="cline-any cline-yes">4x</span>
380
378
  <span class="cline-any cline-yes">4x</span>
381
- <span class="cline-any cline-yes">23x</span>
382
379
  <span class="cline-any cline-neutral">&nbsp;</span>
383
380
  <span class="cline-any cline-neutral">&nbsp;</span>
384
381
  <span class="cline-any cline-neutral">&nbsp;</span>
385
- <span class="cline-any cline-yes">16x</span>
386
- <span class="cline-any cline-yes">9x</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-yes">7x</span>
387
385
  <span class="cline-any cline-neutral">&nbsp;</span>
388
386
  <span class="cline-any cline-neutral">&nbsp;</span>
389
387
  <span class="cline-any cline-yes">36x</span>
390
- <span class="cline-any cline-yes">40x</span>
391
- <span class="cline-any cline-yes">4x</span>
392
- <span class="cline-any cline-yes">8x</span>
393
- <span class="cline-any cline-yes">40x</span>
394
- <span class="cline-any cline-yes">10x</span>
395
388
  <span class="cline-any cline-neutral">&nbsp;</span>
396
- <span class="cline-any cline-yes">4x</span>
397
- <span class="cline-any cline-no">&nbsp;</span>
398
- <span class="cline-any cline-yes">11x</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-yes">36x</span>
392
+ <span class="cline-any cline-yes">2x</span>
393
+ <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-yes">7x</span>
399
397
  <span class="cline-any cline-yes">7x</span>
400
398
  <span class="cline-any cline-yes">16x</span>
401
- <span class="cline-any cline-yes">20x</span>
399
+ <span class="cline-any cline-no">&nbsp;</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
401
  <span class="cline-any cline-neutral">&nbsp;</span>
403
- <span class="cline-any cline-yes">11x</span>
404
402
  <span class="cline-any cline-yes">7x</span>
405
403
  <span class="cline-any cline-no">&nbsp;</span>
406
404
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -410,6 +408,18 @@
410
408
  <span class="cline-any cline-neutral">&nbsp;</span>
411
409
  <span class="cline-any cline-yes">7x</span>
412
410
  <span class="cline-any cline-neutral">&nbsp;</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-neutral">&nbsp;</span>
415
+ <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>
413
423
  <span class="cline-any cline-yes">4x</span>
414
424
  <span class="cline-any cline-neutral">&nbsp;</span>
415
425
  <span class="cline-any cline-yes">3x</span>
@@ -422,18 +432,6 @@
422
432
  <span class="cline-any cline-yes">3x</span>
423
433
  <span class="cline-any cline-yes">3x</span>
424
434
  <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>
437
435
  <span class="cline-any cline-neutral">&nbsp;</span>
438
436
  <span class="cline-any cline-neutral">&nbsp;</span>
439
437
  <span class="cline-any cline-yes">3x</span>
@@ -448,14 +446,15 @@
448
446
  <span class="cline-any cline-neutral">&nbsp;</span>
449
447
  <span class="cline-any cline-neutral">&nbsp;</span>
450
448
  <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-yes">14x</span>
452
449
  <span class="cline-any cline-neutral">&nbsp;</span>
453
- <span class="cline-any cline-yes">11x</span>
454
- <span class="cline-any cline-yes">33x</span>
455
450
  <span class="cline-any cline-neutral">&nbsp;</span>
456
- <span class="cline-any cline-yes">11x</span>
457
451
  <span class="cline-any cline-neutral">&nbsp;</span>
458
- <span class="cline-any cline-yes">11x</span>
452
+ <span class="cline-any cline-neutral">&nbsp;</span>
453
+ <span class="cline-any cline-neutral">&nbsp;</span>
454
+ <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-neutral">&nbsp;</span>
456
+ <span class="cline-any cline-neutral">&nbsp;</span>
457
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
458
  <span class="cline-any cline-neutral">&nbsp;</span>
460
459
  <span class="cline-any cline-neutral">&nbsp;</span>
461
460
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -465,68 +464,67 @@
465
464
  <span class="cline-any cline-neutral">&nbsp;</span>
466
465
  <span class="cline-any cline-neutral">&nbsp;</span>
467
466
  <span class="cline-any cline-yes">14x</span>
468
- <span class="cline-any cline-yes">28x</span>
469
- <span class="cline-any cline-yes">2x</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
470
468
  <span class="cline-any cline-yes">11x</span>
471
469
  <span class="cline-any cline-yes">33x</span>
472
- <span class="cline-any cline-yes">22x</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
473
471
  <span class="cline-any cline-yes">11x</span>
474
472
  <span class="cline-any cline-neutral">&nbsp;</span>
475
473
  <span class="cline-any cline-yes">11x</span>
476
474
  <span class="cline-any cline-neutral">&nbsp;</span>
477
475
  <span class="cline-any cline-neutral">&nbsp;</span>
478
476
  <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-yes">13x</span>
480
477
  <span class="cline-any cline-neutral">&nbsp;</span>
481
- <span class="cline-any cline-yes">13x</span>
482
- <span class="cline-any cline-yes">2x</span>
483
- <span class="cline-any cline-yes">15x</span>
484
- <span class="cline-any cline-yes">29x</span>
485
- <span class="cline-any cline-yes">4x</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-neutral">&nbsp;</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-yes">14x</span>
486
483
  <span class="cline-any cline-yes">2x</span>
487
- <span class="cline-any cline-yes">16x</span>
488
484
  <span class="cline-any cline-yes">2x</span>
485
+ <span class="cline-any cline-neutral">&nbsp;</span>
486
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
487
  <span class="cline-any cline-yes">11x</span>
490
- <span class="cline-any cline-yes">7x</span>
491
- <span class="cline-any cline-yes">2x</span>
492
- <span class="cline-any cline-yes">2x</span>
493
- <span class="cline-any cline-yes">7x</span>
494
- <span class="cline-any cline-yes">7x</span>
495
488
  <span class="cline-any cline-neutral">&nbsp;</span>
496
489
  <span class="cline-any cline-neutral">&nbsp;</span>
497
- <span class="cline-any cline-yes">2x</span>
498
- <span class="cline-any cline-yes">2x</span>
490
+ <span class="cline-any cline-neutral">&nbsp;</span>
491
+ <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-neutral">&nbsp;</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-neutral">&nbsp;</span>
495
+ <span class="cline-any cline-neutral">&nbsp;</span>
496
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
497
  <span class="cline-any cline-yes">3x</span>
500
498
  <span class="cline-any cline-neutral">&nbsp;</span>
501
499
  <span class="cline-any cline-yes">3x</span>
502
500
  <span class="cline-any cline-yes">3x</span>
503
501
  <span class="cline-any cline-yes">16x</span>
504
502
  <span class="cline-any cline-yes">16x</span>
505
- <span class="cline-any cline-yes">5x</span>
506
503
  <span class="cline-any cline-neutral">&nbsp;</span>
507
- <span class="cline-any cline-yes">15x</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
505
  <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>
506
+ <span class="cline-any cline-yes">3x</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
514
508
  <span class="cline-any cline-yes">7x</span>
515
- <span class="cline-any cline-yes">4x</span>
516
509
  <span class="cline-any cline-yes">2x</span>
517
510
  <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>
511
+ <span class="cline-any cline-yes">7x</span>
512
+ <span class="cline-any cline-yes">7x</span>
526
513
  <span class="cline-any cline-neutral">&nbsp;</span>
527
514
  <span class="cline-any cline-neutral">&nbsp;</span>
528
515
  <span class="cline-any cline-yes">2x</span>
529
516
  <span class="cline-any cline-yes">2x</span>
517
+ <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-neutral">&nbsp;</span>
521
+ <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-neutral">&nbsp;</span>
524
+ <span class="cline-any cline-neutral">&nbsp;</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-yes">2x</span>
527
+ <span class="cline-any cline-neutral">&nbsp;</span>
530
528
  <span class="cline-any cline-yes">12x</span>
531
529
  <span class="cline-any cline-yes">2x</span>
532
530
  <span class="cline-any cline-yes">6x</span>
@@ -551,9 +549,8 @@
551
549
  <span class="cline-any cline-neutral">&nbsp;</span>
552
550
  <span class="cline-any cline-yes">2x</span>
553
551
  <span class="cline-any cline-neutral">&nbsp;</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { calculateImportSimilarity } from '@aiready/core';
552
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { calculateImportSimilarity, isTestFile } from '@aiready/core';
555
553
  import type { ExportInfo } from './types';
556
- import { isTestFile } from './ast-utils';
557
554
  &nbsp;
558
555
  /**
559
556
  * Calculates a cohesion score (0-1) for a module based on its exports,
@@ -573,17 +570,17 @@ export function calculateEnhancedCohesion(
573
570
  weights?: {
574
571
  importBased?: number;
575
572
  structural?: 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>
573
+ domainBased?: number;
577
574
  };
578
575
  }
579
- ): number {<span class="branch-1 cbranch-no" title="branch not covered" ></span>
576
+ ): number {
580
577
  if (exports.length &lt;= 1) return 1;
581
578
  &nbsp;
582
579
  // Test files always have perfect cohesion by design
583
580
  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');
581
+ &nbsp;
582
+ // 1. Domain-based cohesion using entropy
583
+ const domains = exports.map((e) =&gt; e.inferredDomain || <span class="branch-1 cbranch-no" title="branch not covered" >'unknown')</span>;
587
584
  const domainCounts = new Map&lt;string, number&gt;();
588
585
  for (const domain of domains)
589
586
  domainCounts.set(domain, (domainCounts.get(domain) || 0) + 1);
@@ -606,10 +603,10 @@ export function calculateEnhancedCohesion(
606
603
  &nbsp;
607
604
  // 2. Import-based cohesion
608
605
  let importScoreTotal = 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>
606
+ let pairsWithData = 0;
610
607
  let anyImportData = false;
611
608
  &nbsp;
612
- for (let i = 0; i &lt; exports.length; i++) {<span class="branch-1 cbranch-no" title="branch not covered" ></span>
609
+ for (let i = 0; i &lt; exports.length; i++) {
613
610
  for (let j = i + 1; j &lt; exports.length; j++) {
614
611
  const exp1Imports = exports[i].imports;
615
612
  const exp2Imports = exports[j].imports;
@@ -624,7 +621,7 @@ export function calculateEnhancedCohesion(
624
621
  pairsWithData++;
625
622
  }
626
623
  }
627
- }<span class="branch-1 cbranch-no" title="branch not covered" ></span>
624
+ }
628
625
  &nbsp;
629
626
  const avgImportScore =
630
627
  pairsWithData &gt; 0 ? importScoreTotal / pairsWithData : 0;
@@ -633,16 +630,16 @@ export function calculateEnhancedCohesion(
633
630
  let score = anyImportData
634
631
  ? domainScore * 0.4 + avgImportScore * 0.6
635
632
  : 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>
633
+ &nbsp;
637
634
  if (anyImportData &amp;&amp; score === 0 &amp;&amp; domainScore === 0) {
638
635
  score = 0.1;
639
636
  }
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>
637
+ &nbsp;
638
+ // Structural boost
642
639
  let structuralScore = 0;
643
640
  for (const exp of exports) {
644
641
  <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>
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>
642
+ <span class="cstat-no" title="statement not covered" > structuralScore += 1;</span>
646
643
  }
647
644
  }
648
645
  <span class="missing-if-branch" title="if path not taken" >I</span>if (structuralScore &gt; 0) {
@@ -657,15 +654,15 @@ export function calculateEnhancedCohesion(
657
654
  &nbsp;
658
655
  /**
659
656
  * Calculate structural cohesion for a file based on co-usage patterns.
660
- *<span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span></span>
657
+ *
661
658
  * @param file - The file path to analyze.
662
659
  * @param coUsageMatrix - Matrix of files frequently imported together.
663
660
  * @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>
661
+ */
665
662
  export function calculateStructuralCohesionFromCoUsage(
666
663
  file: string,
667
664
  coUsageMatrix?: Map&lt;string, Map&lt;string, number&gt;&gt;
668
- ): n<span class="missing-if-branch" title="else path not taken" >E</span>umber {
665
+ ): number {
669
666
  if (!coUsageMatrix) return 1;
670
667
  &nbsp;
671
668
  const coUsages = coUsageMatrix.get(file);
@@ -673,10 +670,10 @@ export function calculateStructuralCohesionFromCoUsage(
673
670
  &nbsp;
674
671
  let total = 0;
675
672
  for (const count of coUsages.values()) total += count;
676
- <span class="missing-if-branch" title="if path not taken" >I</span>if (total === 0) return 1;
673
+ <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>
677
674
  &nbsp;
678
675
  const probs: number[] = [];
679
- for (const count of coUsages.values()) {<span class="branch-1 cbranch-no" title="branch not covered" ></span>
676
+ for (const count of coUsages.values()) {
680
677
  <span class="missing-if-branch" title="else path not taken" >E</span>if (count &gt; 0) probs.push(count / total);
681
678
  }
682
679
  &nbsp;
@@ -701,7 +698,7 @@ export function calculateStructuralCohesionFromCoUsage(
701
698
  */
702
699
  export function calculateFragmentation(
703
700
  files: string[],
704
- domain<span class="branch-0 cbranch-no" title="branch not covered" >: string,</span>
701
+ domain: string,
705
702
  options?: {
706
703
  useLogScale?: boolean;
707
704
  logBase?: number;
@@ -720,16 +717,16 @@ export function calculateFragmentation(
720
717
  ? uniqueDirs &lt;= 1
721
718
  ? <span class="branch-0 cbranch-no" title="branch not covered" >0</span>
722
719
  : Math.log(uniqueDirs) /
723
- <span class="missing-if-branch" title="if path not taken" >I</span> Math.log(options.logBase || Math.E) /
720
+ Math.log(options.logBase || Math.E) /
724
721
  (Math.log(files.length) / Math.log(options.logBase || Math.E))
725
722
  : (uniqueDirs - 1) / (files.length - 1);
726
723
  &nbsp;
727
- // Coupling Discount<span class="branch-1 cbranch-no" title="branch not covered" ></span>
724
+ // Coupling Discount
728
725
  if (options?.sharedImportRatio &amp;&amp; options.sharedImportRatio &gt; 0.5) {
729
726
  const discount = (options.sharedImportRatio - 0.5) * 0.4;
730
727
  score = score * (1 - discount);
731
728
  }
732
- <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span></span>
729
+ &nbsp;
733
730
  return score;
734
731
  }
735
732
  &nbsp;
@@ -739,14 +736,14 @@ export function calculateFragmentation(
739
736
  * @param files - Array of file paths.
740
737
  * @returns Entropy score representing the spread across directories.
741
738
  */
742
- export function calculatePathEntropy(files: strin<span class="branch-1 cbranch-no" title="branch not covered" >g[</span>]): number {
739
+ export function calculatePathEntropy(files: string[]): number {
743
740
  <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>
744
741
  &nbsp;
745
742
  const dirCounts = new Map&lt;string, number&gt;();
746
743
  for (const file of files) {
747
744
  const dir = file.split('/').slice(0, -1).join('/') || '.';
748
745
  dirCounts.set(dir, (dirCounts.get(dir) || 0) + 1);
749
- <span class="missing-if-branch" title="if path not taken" >I</span>}
746
+ }
750
747
  &nbsp;
751
748
  const counts = Array.from(dirCounts.values());
752
749
  if (counts.length &lt;= 1) return 0;
@@ -765,12 +762,12 @@ export function calculatePathEntropy(files: strin<span class="branch-1 cbranch-n
765
762
  /**
766
763
  * Calculate directory-distance metric based on common ancestor depth.
767
764
  *
768
- * @param files - Array of file paths to compare.<span class="branch-1 cbranch-no" title="branch not covered" ></span>
765
+ * @param files - Array of file paths to compare.
769
766
  * @returns Normalized distance metric (0-1).
770
767
  */
771
768
  export function calculateDirectoryDistance(files: string[]): number {
772
769
  <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>
773
- <span class="branch-1 cbranch-no" title="branch not covered" ></span>
770
+ &nbsp;
774
771
  const pathSegments = (pathStr: string) =&gt; pathStr.split('/').filter(Boolean);
775
772
  const commonAncestorDepth = (pathA: string[], pathB: string[]) =&gt; {
776
773
  const minLen = Math.min(pathA.length, pathB.length);
@@ -802,7 +799,7 @@ export function calculateDirectoryDistance(files: string[]): number {
802
799
  <div class='footer quiet pad2 space-top1 center small'>
803
800
  Code coverage generated by
804
801
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
805
- at 2026-03-21T12:52:37.698Z
802
+ at 2026-03-24T11:20:59.666Z
806
803
  </div>
807
804
  <script src="../prettify.js"></script>
808
805
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">90.9% </span>
26
+ <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>20/22</span>
28
+ <span class='fraction'>22/22</span>
29
29
  </div>
30
30
 
31
31
 
@@ -37,16 +37,16 @@
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">87.5% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>7/8</span>
42
+ <span class='fraction'>8/8</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">90.47% </span>
47
+ <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>19/21</span>
49
+ <span class='fraction'>21/21</span>
50
50
  </div>
51
51
 
52
52
 
@@ -283,7 +283,7 @@
283
283
  <span class="cline-any cline-neutral">&nbsp;</span>
284
284
  <span class="cline-any cline-neutral">&nbsp;</span>
285
285
  <span class="cline-any cline-yes">1x</span>
286
- <span class="cline-any cline-no">&nbsp;</span>
286
+ <span class="cline-any cline-yes">1x</span>
287
287
  <span class="cline-any cline-neutral">&nbsp;</span>
288
288
  <span class="cline-any cline-neutral">&nbsp;</span>
289
289
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -297,7 +297,7 @@
297
297
  <span class="cline-any cline-neutral">&nbsp;</span>
298
298
  <span class="cline-any cline-neutral">&nbsp;</span>
299
299
  <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-no">&nbsp;</span>
300
+ <span class="cline-any cline-yes">1x</span>
301
301
  <span class="cline-any cline-neutral">&nbsp;</span>
302
302
  <span class="cline-any cline-neutral">&nbsp;</span>
303
303
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -406,7 +406,7 @@ export async function analyzeContext(
406
406
  }))
407
407
  );
408
408
  &nbsp;
409
- const graph = buildDependencyGraph(
409
+ const graph = await buildDependencyGraph(
410
410
  fileContents.filter((f) =&gt; !f.file.toLowerCase().endsWith('.py'))
411
411
  );
412
412
  &nbsp;
@@ -418,8 +418,8 @@ export async function analyzeContext(
418
418
  scanOptions.rootDir || <span class="branch-1 cbranch-no" title="branch not covered" >options.rootDir || <span class="branch-2 cbranch-no" title="branch not covered" >'</span>.'</span>
419
419
  );
420
420
  &nbsp;
421
- pythonResults = pythonMetrics.map(<span class="fstat-no" title="function not covered" >(m</span>etric) =&gt; {
422
- const { severity, issues, recommendations, potentialSavings <span class="cstat-no" title="statement not covered" >} =</span>
421
+ pythonResults = pythonMetrics.map((metric) =&gt; {
422
+ const { severity, issues, recommendations, potentialSavings } =
423
423
  analyzeIssues({
424
424
  file: metric.file,
425
425
  importDepth: metric.importDepth,
@@ -433,7 +433,7 @@ export async function analyzeContext(
433
433
  circularDeps: [],
434
434
  });
435
435
  &nbsp;
436
- <span class="cstat-no" title="statement not covered" > return {</span>
436
+ return {
437
437
  file: metric.file,
438
438
  tokenCost: 0,
439
439
  linesOfCode: 0,
@@ -478,7 +478,7 @@ export async function analyzeContext(
478
478
  <div class='footer quiet pad2 space-top1 center small'>
479
479
  Code coverage generated by
480
480
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
481
- at 2026-03-21T12:52:37.698Z
481
+ at 2026-03-24T11:20:59.666Z
482
482
  </div>
483
483
  <script src="../prettify.js"></script>
484
484
  <script>