@aiready/context-analyzer 0.21.22 → 0.21.24
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.
- package/.turbo/turbo-build.log +26 -25
- package/.turbo/turbo-lint.log +5 -5
- package/.turbo/turbo-test.log +91 -41
- package/coverage/clover.xml +2615 -1242
- package/coverage/coverage-final.json +30 -13
- package/coverage/dist/chunk-64U3PNO3.mjs.html +367 -0
- package/coverage/dist/chunk-J3MUOWHC.mjs.html +5326 -0
- package/coverage/dist/index.html +146 -0
- package/coverage/{classifier.ts.html → dist/index.mjs.html} +537 -912
- package/coverage/index.html +84 -189
- package/coverage/src/analyzer.ts.html +88 -0
- package/coverage/src/analyzers/index.html +116 -0
- package/coverage/src/analyzers/python-context.ts.html +910 -0
- package/coverage/{ast-utils.ts.html → src/ast-utils.ts.html} +84 -54
- package/coverage/src/classifier.ts.html +892 -0
- package/coverage/src/classify/classification-patterns.ts.html +307 -0
- package/coverage/src/classify/file-classifiers.ts.html +973 -0
- package/coverage/src/classify/index.html +131 -0
- package/coverage/{cluster-detector.ts.html → src/cluster-detector.ts.html} +154 -91
- package/coverage/{defaults.ts.html → src/defaults.ts.html} +74 -65
- package/coverage/{graph-builder.ts.html → src/graph-builder.ts.html} +268 -229
- package/coverage/src/index.html +341 -0
- package/coverage/{index.ts.html → src/index.ts.html} +70 -13
- package/coverage/{scoring.ts.html → src/issue-analyzer.ts.html} +201 -261
- package/coverage/src/mapper.ts.html +439 -0
- package/coverage/{metrics.ts.html → src/metrics.ts.html} +201 -132
- package/coverage/src/orchestrator.ts.html +493 -0
- package/coverage/{provider.ts.html → src/provider.ts.html} +21 -21
- package/coverage/{remediation.ts.html → src/remediation.ts.html} +112 -52
- package/coverage/src/report/console-report.ts.html +415 -0
- package/coverage/src/report/html-report.ts.html +361 -0
- package/coverage/src/report/index.html +146 -0
- package/coverage/src/report/interactive-setup.ts.html +373 -0
- package/coverage/src/scoring.ts.html +895 -0
- package/coverage/src/semantic/co-usage.ts.html +340 -0
- package/coverage/src/semantic/consolidation.ts.html +223 -0
- package/coverage/src/semantic/domain-inference.ts.html +859 -0
- package/coverage/src/semantic/index.html +161 -0
- package/coverage/src/semantic/type-graph.ts.html +163 -0
- package/coverage/{summary.ts.html → src/summary.ts.html} +155 -275
- package/coverage/{types.ts.html → src/types.ts.html} +133 -31
- package/coverage/src/utils/dependency-graph-utils.ts.html +463 -0
- package/coverage/src/utils/index.html +131 -0
- package/coverage/src/utils/string-utils.ts.html +148 -0
- package/dist/chunk-AMPK6SWS.mjs +1754 -0
- package/dist/chunk-BHCRDEE4.mjs +1745 -0
- package/dist/chunk-IKRP7ECY.mjs +1754 -0
- package/dist/chunk-J3MUOWHC.mjs +1747 -0
- package/dist/chunk-TWWPY7FD.mjs +1754 -0
- package/dist/chunk-Z5WY6A4P.mjs +1754 -0
- package/dist/cli.js +77 -185
- package/dist/cli.mjs +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +73 -181
- package/dist/index.mjs +1 -1
- package/dist/python-context-BWDC4E5Z.mjs +162 -0
- package/package.json +3 -3
- package/src/__tests__/analyzer.test.ts +14 -14
- package/src/__tests__/auto-detection.test.ts +16 -16
- package/src/__tests__/consolidation.test.ts +247 -0
- package/src/__tests__/defaults.test.ts +121 -0
- package/src/__tests__/domain-inference.test.ts +420 -0
- package/src/__tests__/fragmentation-coupling.test.ts +4 -4
- package/src/__tests__/issue-analyzer.test.ts +155 -0
- package/src/__tests__/orchestrator.test.ts +143 -0
- package/src/__tests__/python-context.test.ts +100 -0
- package/src/__tests__/report/console-report.test.ts +292 -0
- package/src/__tests__/report/html-report.test.ts +243 -0
- package/src/__tests__/scoring.test.ts +17 -11
- package/src/analyzers/python-context.ts +2 -2
- package/src/ast-utils.ts +3 -3
- package/src/graph-builder.ts +4 -4
- package/src/mapper.ts +6 -0
- package/src/orchestrator.ts +1 -1
- package/src/report/html-report.ts +73 -181
- package/coverage/analyzer.ts.html +0 -1369
- 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
|
|
6
|
+
<title>Code coverage report for dist/index.mjs</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>
|
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">dist</a> index.mjs</h1>
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">18.75% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>21/112</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>0/75</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>0/12</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">19.62% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>21/107</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
|
|
64
|
+
<div class='status-line low'></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>
|
|
@@ -500,137 +500,11 @@
|
|
|
500
500
|
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
501
|
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
502
|
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
-
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
-
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
-
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
-
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
-
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
-
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
-
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
-
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
-
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
-
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
-
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
-
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
-
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
-
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
-
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
-
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
-
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
-
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
-
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
-
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
-
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
-
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
-
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
-
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
-
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
-
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
-
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
-
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
-
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
-
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
-
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
-
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
-
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
-
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
-
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
-
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
-
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
-
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
-
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
-
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
-
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
-
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
-
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
-
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
-
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
-
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
-
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
-
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
-
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
-
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
-
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
-
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
-
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
-
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
-
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
-
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
-
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
-
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
-
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
-
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
-
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
-
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
-
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
-
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
-
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
-
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
-
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
-
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
-
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
-
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
-
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
-
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
-
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
-
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
-
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
-
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
-
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
-
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
-
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
-
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
-
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
-
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
-
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
-
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
-
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
-
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
-
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
-
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
-
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
-
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
-
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
-
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
-
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
-
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
-
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
-
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
-
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
-
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
-
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
-
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
-
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
-
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
-
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
-
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
-
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
-
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
-
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
-
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
-
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
-
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
-
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
-
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
-
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
-
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
-
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
-
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
-
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
-
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
-
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
-
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
-
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
-
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
-
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
-
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
-
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
-
<a name='L563'></a><a href='#L563'>563</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
629
504
|
<span class="cline-any cline-neutral"> </span>
|
|
630
505
|
<span class="cline-any cline-neutral"> </span>
|
|
631
506
|
<span class="cline-any cline-neutral"> </span>
|
|
632
507
|
<span class="cline-any cline-neutral"> </span>
|
|
633
|
-
<span class="cline-any cline-yes">10x</span>
|
|
634
508
|
<span class="cline-any cline-neutral"> </span>
|
|
635
509
|
<span class="cline-any cline-neutral"> </span>
|
|
636
510
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -658,158 +532,33 @@
|
|
|
658
532
|
<span class="cline-any cline-neutral"> </span>
|
|
659
533
|
<span class="cline-any cline-neutral"> </span>
|
|
660
534
|
<span class="cline-any cline-neutral"> </span>
|
|
661
|
-
<span class="cline-any cline-yes">36x</span>
|
|
662
|
-
<span class="cline-any cline-yes">2x</span>
|
|
663
535
|
<span class="cline-any cline-neutral"> </span>
|
|
664
536
|
<span class="cline-any cline-neutral"> </span>
|
|
665
537
|
<span class="cline-any cline-neutral"> </span>
|
|
666
|
-
<span class="cline-any cline-yes">34x</span>
|
|
667
|
-
<span class="cline-any cline-yes">4x</span>
|
|
668
538
|
<span class="cline-any cline-neutral"> </span>
|
|
669
539
|
<span class="cline-any cline-neutral"> </span>
|
|
670
540
|
<span class="cline-any cline-neutral"> </span>
|
|
671
|
-
<span class="cline-any cline-yes">30x</span>
|
|
672
|
-
<span class="cline-any cline-yes">3x</span>
|
|
673
541
|
<span class="cline-any cline-neutral"> </span>
|
|
674
542
|
<span class="cline-any cline-neutral"> </span>
|
|
675
543
|
<span class="cline-any cline-neutral"> </span>
|
|
676
|
-
<span class="cline-any cline-yes">27x</span>
|
|
677
|
-
<span class="cline-any cline-yes">4x</span>
|
|
678
544
|
<span class="cline-any cline-neutral"> </span>
|
|
679
545
|
<span class="cline-any cline-neutral"> </span>
|
|
680
546
|
<span class="cline-any cline-neutral"> </span>
|
|
681
|
-
<span class="cline-any cline-yes">23x</span>
|
|
682
|
-
<span class="cline-any cline-yes">3x</span>
|
|
683
547
|
<span class="cline-any cline-neutral"> </span>
|
|
684
548
|
<span class="cline-any cline-neutral"> </span>
|
|
685
549
|
<span class="cline-any cline-neutral"> </span>
|
|
686
|
-
<span class="cline-any cline-yes">20x</span>
|
|
687
|
-
<span class="cline-any cline-yes">3x</span>
|
|
688
550
|
<span class="cline-any cline-neutral"> </span>
|
|
689
551
|
<span class="cline-any cline-neutral"> </span>
|
|
690
552
|
<span class="cline-any cline-neutral"> </span>
|
|
691
|
-
<span class="cline-any cline-yes">17x</span>
|
|
692
|
-
<span class="cline-any cline-yes">3x</span>
|
|
693
553
|
<span class="cline-any cline-neutral"> </span>
|
|
694
554
|
<span class="cline-any cline-neutral"> </span>
|
|
695
555
|
<span class="cline-any cline-neutral"> </span>
|
|
696
|
-
<span class="cline-any cline-yes">14x</span>
|
|
697
556
|
<span class="cline-any cline-neutral"> </span>
|
|
698
|
-
<span class="cline-any cline-yes">1x</span>
|
|
699
|
-
<span class="cline-any cline-yes">1x</span>
|
|
700
|
-
<span class="cline-any cline-no"> </span>
|
|
701
|
-
<span class="cline-any cline-neutral"> </span>
|
|
702
|
-
<span class="cline-any cline-neutral"> </span>
|
|
703
|
-
<span class="cline-any cline-neutral"> </span>
|
|
704
|
-
<span class="cline-any cline-yes">13x</span>
|
|
705
|
-
<span class="cline-any cline-yes">4x</span>
|
|
706
|
-
<span class="cline-any cline-neutral"> </span>
|
|
707
|
-
<span class="cline-any cline-neutral"> </span>
|
|
708
|
-
<span class="cline-any cline-neutral"> </span>
|
|
709
|
-
<span class="cline-any cline-yes">9x</span>
|
|
710
|
-
<span class="cline-any cline-yes">1x</span>
|
|
711
|
-
<span class="cline-any cline-neutral"> </span>
|
|
712
|
-
<span class="cline-any cline-neutral"> </span>
|
|
713
|
-
<span class="cline-any cline-neutral"> </span>
|
|
714
|
-
<span class="cline-any cline-yes">8x</span>
|
|
715
|
-
<span class="cline-any cline-yes">6x</span>
|
|
716
|
-
<span class="cline-any cline-neutral"> </span>
|
|
717
|
-
<span class="cline-any cline-neutral"> </span>
|
|
718
|
-
<span class="cline-any cline-yes">2x</span>
|
|
719
|
-
<span class="cline-any cline-yes">2x</span>
|
|
720
|
-
<span class="cline-any cline-neutral"> </span>
|
|
721
|
-
<span class="cline-any cline-neutral"> </span>
|
|
722
|
-
<span class="cline-any cline-no"> </span>
|
|
723
|
-
<span class="cline-any cline-no"> </span>
|
|
724
|
-
<span class="cline-any cline-neutral"> </span>
|
|
725
|
-
<span class="cline-any cline-neutral"> </span>
|
|
726
|
-
<span class="cline-any cline-no"> </span>
|
|
727
|
-
<span class="cline-any cline-neutral"> </span>
|
|
728
|
-
<span class="cline-any cline-neutral"> </span>
|
|
729
|
-
<span class="cline-any cline-neutral"> </span>
|
|
730
|
-
<span class="cline-any cline-neutral"> </span>
|
|
731
|
-
<span class="cline-any cline-neutral"> </span>
|
|
732
|
-
<span class="cline-any cline-neutral"> </span>
|
|
733
|
-
<span class="cline-any cline-neutral"> </span>
|
|
734
|
-
<span class="cline-any cline-neutral"> </span>
|
|
735
|
-
<span class="cline-any cline-neutral"> </span>
|
|
736
|
-
<span class="cline-any cline-yes">36x</span>
|
|
737
|
-
<span class="cline-any cline-yes">36x</span>
|
|
738
|
-
<span class="cline-any cline-neutral"> </span>
|
|
739
|
-
<span class="cline-any cline-neutral"> </span>
|
|
740
|
-
<span class="cline-any cline-yes">36x</span>
|
|
741
|
-
<span class="cline-any cline-neutral"> </span>
|
|
742
|
-
<span class="cline-any cline-neutral"> </span>
|
|
743
|
-
<span class="cline-any cline-neutral"> </span>
|
|
744
|
-
<span class="cline-any cline-yes">36x</span>
|
|
745
|
-
<span class="cline-any cline-neutral"> </span>
|
|
746
|
-
<span class="cline-any cline-neutral"> </span>
|
|
747
|
-
<span class="cline-any cline-yes">36x</span>
|
|
748
|
-
<span class="cline-any cline-neutral"> </span>
|
|
749
|
-
<span class="cline-any cline-neutral"> </span>
|
|
750
|
-
<span class="cline-any cline-neutral"> </span>
|
|
751
|
-
<span class="cline-any cline-yes">5x</span>
|
|
752
|
-
<span class="cline-any cline-neutral"> </span>
|
|
753
|
-
<span class="cline-any cline-neutral"> </span>
|
|
754
|
-
<span class="cline-any cline-neutral"> </span>
|
|
755
|
-
<span class="cline-any cline-neutral"> </span>
|
|
756
|
-
<span class="cline-any cline-neutral"> </span>
|
|
757
|
-
<span class="cline-any cline-yes">36x</span>
|
|
758
|
-
<span class="cline-any cline-neutral"> </span>
|
|
759
|
-
<span class="cline-any cline-neutral"> </span>
|
|
760
|
-
<span class="cline-any cline-neutral"> </span>
|
|
761
|
-
<span class="cline-any cline-neutral"> </span>
|
|
762
|
-
<span class="cline-any cline-neutral"> </span>
|
|
763
|
-
<span class="cline-any cline-neutral"> </span>
|
|
764
|
-
<span class="cline-any cline-neutral"> </span>
|
|
765
|
-
<span class="cline-any cline-neutral"> </span>
|
|
766
|
-
<span class="cline-any cline-neutral"> </span>
|
|
767
|
-
<span class="cline-any cline-yes">34x</span>
|
|
768
|
-
<span class="cline-any cline-neutral"> </span>
|
|
769
|
-
<span class="cline-any cline-neutral"> </span>
|
|
770
|
-
<span class="cline-any cline-yes">34x</span>
|
|
771
|
-
<span class="cline-any cline-neutral"> </span>
|
|
772
|
-
<span class="cline-any cline-neutral"> </span>
|
|
773
|
-
<span class="cline-any cline-yes">34x</span>
|
|
774
|
-
<span class="cline-any cline-yes">34x</span>
|
|
775
|
-
<span class="cline-any cline-neutral"> </span>
|
|
776
|
-
<span class="cline-any cline-yes">34x</span>
|
|
777
|
-
<span class="cline-any cline-yes">41x</span>
|
|
778
|
-
<span class="cline-any cline-yes">34x</span>
|
|
779
|
-
<span class="cline-any cline-neutral"> </span>
|
|
780
|
-
<span class="cline-any cline-neutral"> </span>
|
|
781
|
-
<span class="cline-any cline-neutral"> </span>
|
|
782
|
-
<span class="cline-any cline-yes">34x</span>
|
|
783
|
-
<span class="cline-any cline-neutral"> </span>
|
|
784
|
-
<span class="cline-any cline-neutral"> </span>
|
|
785
|
-
<span class="cline-any cline-neutral"> </span>
|
|
786
|
-
<span class="cline-any cline-yes">34x</span>
|
|
787
|
-
<span class="cline-any cline-neutral"> </span>
|
|
788
|
-
<span class="cline-any cline-neutral"> </span>
|
|
789
|
-
<span class="cline-any cline-neutral"> </span>
|
|
790
|
-
<span class="cline-any cline-neutral"> </span>
|
|
791
|
-
<span class="cline-any cline-neutral"> </span>
|
|
792
|
-
<span class="cline-any cline-neutral"> </span>
|
|
793
|
-
<span class="cline-any cline-neutral"> </span>
|
|
794
|
-
<span class="cline-any cline-neutral"> </span>
|
|
795
|
-
<span class="cline-any cline-neutral"> </span>
|
|
796
|
-
<span class="cline-any cline-yes">13x</span>
|
|
797
|
-
<span class="cline-any cline-neutral"> </span>
|
|
798
|
-
<span class="cline-any cline-neutral"> </span>
|
|
799
|
-
<span class="cline-any cline-neutral"> </span>
|
|
800
|
-
<span class="cline-any cline-yes">13x</span>
|
|
801
|
-
<span class="cline-any cline-neutral"> </span>
|
|
802
|
-
<span class="cline-any cline-neutral"> </span>
|
|
803
|
-
<span class="cline-any cline-neutral"> </span>
|
|
804
|
-
<span class="cline-any cline-neutral"> </span>
|
|
805
|
-
<span class="cline-any cline-yes">13x</span>
|
|
806
557
|
<span class="cline-any cline-neutral"> </span>
|
|
807
|
-
<span class="cline-any cline-yes">13x</span>
|
|
808
558
|
<span class="cline-any cline-neutral"> </span>
|
|
809
559
|
<span class="cline-any cline-neutral"> </span>
|
|
810
560
|
<span class="cline-any cline-neutral"> </span>
|
|
811
561
|
<span class="cline-any cline-neutral"> </span>
|
|
812
|
-
<span class="cline-any cline-yes">13x</span>
|
|
813
562
|
<span class="cline-any cline-neutral"> </span>
|
|
814
563
|
<span class="cline-any cline-neutral"> </span>
|
|
815
564
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -819,62 +568,75 @@
|
|
|
819
568
|
<span class="cline-any cline-neutral"> </span>
|
|
820
569
|
<span class="cline-any cline-neutral"> </span>
|
|
821
570
|
<span class="cline-any cline-neutral"> </span>
|
|
822
|
-
<span class="cline-any cline-yes">27x</span>
|
|
823
|
-
<span class="cline-any cline-yes">27x</span>
|
|
824
571
|
<span class="cline-any cline-neutral"> </span>
|
|
825
|
-
<span class="cline-any cline-yes">27x</span>
|
|
826
572
|
<span class="cline-any cline-neutral"> </span>
|
|
827
573
|
<span class="cline-any cline-neutral"> </span>
|
|
828
574
|
<span class="cline-any cline-neutral"> </span>
|
|
829
575
|
<span class="cline-any cline-neutral"> </span>
|
|
830
576
|
<span class="cline-any cline-neutral"> </span>
|
|
831
577
|
<span class="cline-any cline-neutral"> </span>
|
|
832
|
-
<span class="cline-any cline-
|
|
833
|
-
<span class="cline-any cline-yes">
|
|
834
|
-
<span class="cline-any cline-yes">
|
|
578
|
+
<span class="cline-any cline-yes">1x</span>
|
|
579
|
+
<span class="cline-any cline-yes">1x</span>
|
|
580
|
+
<span class="cline-any cline-yes">1x</span>
|
|
581
|
+
<span class="cline-any cline-yes">1x</span>
|
|
582
|
+
<span class="cline-any cline-yes">1x</span>
|
|
583
|
+
<span class="cline-any cline-yes">1x</span>
|
|
584
|
+
<span class="cline-any cline-yes">1x</span>
|
|
585
|
+
<span class="cline-any cline-yes">1x</span>
|
|
586
|
+
<span class="cline-any cline-yes">1x</span>
|
|
587
|
+
<span class="cline-any cline-yes">1x</span>
|
|
588
|
+
<span class="cline-any cline-yes">1x</span>
|
|
589
|
+
<span class="cline-any cline-yes">1x</span>
|
|
590
|
+
<span class="cline-any cline-yes">1x</span>
|
|
591
|
+
<span class="cline-any cline-yes">1x</span>
|
|
592
|
+
<span class="cline-any cline-yes">1x</span>
|
|
593
|
+
<span class="cline-any cline-yes">1x</span>
|
|
594
|
+
<span class="cline-any cline-yes">1x</span>
|
|
595
|
+
<span class="cline-any cline-yes">1x</span>
|
|
596
|
+
<span class="cline-any cline-yes">1x</span>
|
|
835
597
|
<span class="cline-any cline-neutral"> </span>
|
|
836
598
|
<span class="cline-any cline-neutral"> </span>
|
|
837
599
|
<span class="cline-any cline-neutral"> </span>
|
|
838
|
-
<span class="cline-any cline-yes">27x</span>
|
|
839
600
|
<span class="cline-any cline-neutral"> </span>
|
|
840
601
|
<span class="cline-any cline-neutral"> </span>
|
|
841
602
|
<span class="cline-any cline-neutral"> </span>
|
|
842
603
|
<span class="cline-any cline-neutral"> </span>
|
|
843
|
-
<span class="cline-any cline-yes">27x</span>
|
|
844
604
|
<span class="cline-any cline-neutral"> </span>
|
|
845
|
-
<span class="cline-any cline-yes">48x</span>
|
|
846
605
|
<span class="cline-any cline-neutral"> </span>
|
|
847
606
|
<span class="cline-any cline-neutral"> </span>
|
|
607
|
+
<span class="cline-any cline-no"> </span>
|
|
608
|
+
<span class="cline-any cline-no"> </span>
|
|
848
609
|
<span class="cline-any cline-neutral"> </span>
|
|
849
610
|
<span class="cline-any cline-neutral"> </span>
|
|
850
611
|
<span class="cline-any cline-neutral"> </span>
|
|
851
|
-
<span class="cline-any cline-
|
|
612
|
+
<span class="cline-any cline-no"> </span>
|
|
852
613
|
<span class="cline-any cline-neutral"> </span>
|
|
853
614
|
<span class="cline-any cline-neutral"> </span>
|
|
854
615
|
<span class="cline-any cline-neutral"> </span>
|
|
616
|
+
<span class="cline-any cline-no"> </span>
|
|
855
617
|
<span class="cline-any cline-neutral"> </span>
|
|
856
618
|
<span class="cline-any cline-neutral"> </span>
|
|
857
619
|
<span class="cline-any cline-neutral"> </span>
|
|
620
|
+
<span class="cline-any cline-no"> </span>
|
|
858
621
|
<span class="cline-any cline-neutral"> </span>
|
|
859
622
|
<span class="cline-any cline-neutral"> </span>
|
|
860
623
|
<span class="cline-any cline-neutral"> </span>
|
|
861
|
-
<span class="cline-any cline-
|
|
862
|
-
<span class="cline-any cline-yes">23x</span>
|
|
624
|
+
<span class="cline-any cline-no"> </span>
|
|
863
625
|
<span class="cline-any cline-neutral"> </span>
|
|
864
|
-
<span class="cline-any cline-yes">23x</span>
|
|
865
|
-
<span class="cline-any cline-yes">23x</span>
|
|
866
|
-
<span class="cline-any cline-yes">86x</span>
|
|
867
626
|
<span class="cline-any cline-neutral"> </span>
|
|
868
|
-
<span class="cline-any cline-yes">23x</span>
|
|
869
|
-
<span class="cline-any cline-yes">23x</span>
|
|
870
627
|
<span class="cline-any cline-neutral"> </span>
|
|
871
|
-
<span class="cline-any cline-
|
|
628
|
+
<span class="cline-any cline-no"> </span>
|
|
872
629
|
<span class="cline-any cline-neutral"> </span>
|
|
873
630
|
<span class="cline-any cline-neutral"> </span>
|
|
874
|
-
<span class="cline-any cline-yes">42x</span>
|
|
875
631
|
<span class="cline-any cline-neutral"> </span>
|
|
876
|
-
<span class="cline-any cline-
|
|
632
|
+
<span class="cline-any cline-no"> </span>
|
|
633
|
+
<span class="cline-any cline-no"> </span>
|
|
634
|
+
<span class="cline-any cline-no"> </span>
|
|
877
635
|
<span class="cline-any cline-neutral"> </span>
|
|
636
|
+
<span class="cline-any cline-no"> </span>
|
|
637
|
+
<span class="cline-any cline-no"> </span>
|
|
638
|
+
<span class="cline-any cline-no"> </span>
|
|
639
|
+
<span class="cline-any cline-no"> </span>
|
|
878
640
|
<span class="cline-any cline-neutral"> </span>
|
|
879
641
|
<span class="cline-any cline-neutral"> </span>
|
|
880
642
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -887,104 +649,102 @@
|
|
|
887
649
|
<span class="cline-any cline-neutral"> </span>
|
|
888
650
|
<span class="cline-any cline-neutral"> </span>
|
|
889
651
|
<span class="cline-any cline-neutral"> </span>
|
|
890
|
-
<span class="cline-any cline-yes">20x</span>
|
|
891
|
-
<span class="cline-any cline-yes">20x</span>
|
|
892
652
|
<span class="cline-any cline-neutral"> </span>
|
|
893
|
-
<span class="cline-any cline-yes">20x</span>
|
|
894
653
|
<span class="cline-any cline-neutral"> </span>
|
|
895
654
|
<span class="cline-any cline-neutral"> </span>
|
|
896
655
|
<span class="cline-any cline-neutral"> </span>
|
|
897
656
|
<span class="cline-any cline-neutral"> </span>
|
|
898
657
|
<span class="cline-any cline-neutral"> </span>
|
|
658
|
+
<span class="cline-any cline-no"> </span>
|
|
659
|
+
<span class="cline-any cline-no"> </span>
|
|
899
660
|
<span class="cline-any cline-neutral"> </span>
|
|
900
661
|
<span class="cline-any cline-neutral"> </span>
|
|
901
662
|
<span class="cline-any cline-neutral"> </span>
|
|
902
663
|
<span class="cline-any cline-neutral"> </span>
|
|
903
|
-
<span class="cline-any cline-yes">20x</span>
|
|
904
|
-
<span class="cline-any cline-yes">156x</span>
|
|
905
664
|
<span class="cline-any cline-neutral"> </span>
|
|
665
|
+
<span class="cline-any cline-no"> </span>
|
|
666
|
+
<span class="cline-any cline-no"> </span>
|
|
906
667
|
<span class="cline-any cline-neutral"> </span>
|
|
907
|
-
<span class="cline-any cline-yes">20x</span>
|
|
908
668
|
<span class="cline-any cline-neutral"> </span>
|
|
909
669
|
<span class="cline-any cline-neutral"> </span>
|
|
910
670
|
<span class="cline-any cline-neutral"> </span>
|
|
911
|
-
<span class="cline-any cline-yes">20x</span>
|
|
912
671
|
<span class="cline-any cline-neutral"> </span>
|
|
913
|
-
<span class="cline-any cline-
|
|
672
|
+
<span class="cline-any cline-no"> </span>
|
|
673
|
+
<span class="cline-any cline-no"> </span>
|
|
914
674
|
<span class="cline-any cline-neutral"> </span>
|
|
915
675
|
<span class="cline-any cline-neutral"> </span>
|
|
916
676
|
<span class="cline-any cline-neutral"> </span>
|
|
917
677
|
<span class="cline-any cline-neutral"> </span>
|
|
918
678
|
<span class="cline-any cline-neutral"> </span>
|
|
679
|
+
<span class="cline-any cline-no"> </span>
|
|
680
|
+
<span class="cline-any cline-no"> </span>
|
|
919
681
|
<span class="cline-any cline-neutral"> </span>
|
|
920
|
-
<span class="cline-any cline-yes">20x</span>
|
|
921
682
|
<span class="cline-any cline-neutral"> </span>
|
|
922
683
|
<span class="cline-any cline-neutral"> </span>
|
|
923
684
|
<span class="cline-any cline-neutral"> </span>
|
|
924
685
|
<span class="cline-any cline-neutral"> </span>
|
|
686
|
+
<span class="cline-any cline-no"> </span>
|
|
687
|
+
<span class="cline-any cline-no"> </span>
|
|
688
|
+
<span class="cline-any cline-no"> </span>
|
|
925
689
|
<span class="cline-any cline-neutral"> </span>
|
|
926
690
|
<span class="cline-any cline-neutral"> </span>
|
|
927
691
|
<span class="cline-any cline-neutral"> </span>
|
|
692
|
+
<span class="cline-any cline-no"> </span>
|
|
928
693
|
<span class="cline-any cline-neutral"> </span>
|
|
929
694
|
<span class="cline-any cline-neutral"> </span>
|
|
930
|
-
<span class="cline-any cline-yes">17x</span>
|
|
931
|
-
<span class="cline-any cline-yes">17x</span>
|
|
932
695
|
<span class="cline-any cline-neutral"> </span>
|
|
933
|
-
<span class="cline-any cline-yes">17x</span>
|
|
934
696
|
<span class="cline-any cline-neutral"> </span>
|
|
935
697
|
<span class="cline-any cline-neutral"> </span>
|
|
698
|
+
<span class="cline-any cline-no"> </span>
|
|
699
|
+
<span class="cline-any cline-no"> </span>
|
|
936
700
|
<span class="cline-any cline-neutral"> </span>
|
|
937
701
|
<span class="cline-any cline-neutral"> </span>
|
|
938
702
|
<span class="cline-any cline-neutral"> </span>
|
|
703
|
+
<span class="cline-any cline-no"> </span>
|
|
939
704
|
<span class="cline-any cline-neutral"> </span>
|
|
940
705
|
<span class="cline-any cline-neutral"> </span>
|
|
941
706
|
<span class="cline-any cline-neutral"> </span>
|
|
942
707
|
<span class="cline-any cline-neutral"> </span>
|
|
943
708
|
<span class="cline-any cline-neutral"> </span>
|
|
944
|
-
<span class="cline-any cline-
|
|
945
|
-
<span class="cline-any cline-
|
|
709
|
+
<span class="cline-any cline-no"> </span>
|
|
710
|
+
<span class="cline-any cline-no"> </span>
|
|
946
711
|
<span class="cline-any cline-neutral"> </span>
|
|
947
712
|
<span class="cline-any cline-neutral"> </span>
|
|
948
|
-
<span class="cline-any cline-yes">17x</span>
|
|
949
713
|
<span class="cline-any cline-neutral"> </span>
|
|
714
|
+
<span class="cline-any cline-no"> </span>
|
|
950
715
|
<span class="cline-any cline-neutral"> </span>
|
|
951
|
-
<span class="cline-any cline-yes">17x</span>
|
|
952
716
|
<span class="cline-any cline-neutral"> </span>
|
|
953
|
-
<span class="cline-any cline-yes">35x</span>
|
|
954
717
|
<span class="cline-any cline-neutral"> </span>
|
|
955
718
|
<span class="cline-any cline-neutral"> </span>
|
|
956
719
|
<span class="cline-any cline-neutral"> </span>
|
|
720
|
+
<span class="cline-any cline-no"> </span>
|
|
721
|
+
<span class="cline-any cline-no"> </span>
|
|
957
722
|
<span class="cline-any cline-neutral"> </span>
|
|
958
723
|
<span class="cline-any cline-neutral"> </span>
|
|
959
|
-
<span class="cline-any cline-yes">17x</span>
|
|
960
724
|
<span class="cline-any cline-neutral"> </span>
|
|
961
725
|
<span class="cline-any cline-neutral"> </span>
|
|
962
726
|
<span class="cline-any cline-neutral"> </span>
|
|
727
|
+
<span class="cline-any cline-no"> </span>
|
|
728
|
+
<span class="cline-any cline-no"> </span>
|
|
963
729
|
<span class="cline-any cline-neutral"> </span>
|
|
964
730
|
<span class="cline-any cline-neutral"> </span>
|
|
965
731
|
<span class="cline-any cline-neutral"> </span>
|
|
732
|
+
<span class="cline-any cline-no"> </span>
|
|
966
733
|
<span class="cline-any cline-neutral"> </span>
|
|
967
734
|
<span class="cline-any cline-neutral"> </span>
|
|
968
735
|
<span class="cline-any cline-neutral"> </span>
|
|
969
|
-
<span class="cline-any cline-
|
|
970
|
-
<span class="cline-any cline-
|
|
736
|
+
<span class="cline-any cline-no"> </span>
|
|
737
|
+
<span class="cline-any cline-no"> </span>
|
|
971
738
|
<span class="cline-any cline-neutral"> </span>
|
|
972
|
-
<span class="cline-any cline-yes">14x</span>
|
|
973
|
-
<span class="cline-any cline-yes">14x</span>
|
|
974
|
-
<span class="cline-any cline-yes">53x</span>
|
|
975
739
|
<span class="cline-any cline-neutral"> </span>
|
|
976
740
|
<span class="cline-any cline-neutral"> </span>
|
|
977
|
-
<span class="cline-any cline-yes">14x</span>
|
|
978
741
|
<span class="cline-any cline-neutral"> </span>
|
|
979
742
|
<span class="cline-any cline-neutral"> </span>
|
|
980
|
-
<span class="cline-any cline-yes">14x</span>
|
|
981
743
|
<span class="cline-any cline-neutral"> </span>
|
|
982
|
-
<span class="cline-any cline-yes">29x</span>
|
|
983
744
|
<span class="cline-any cline-neutral"> </span>
|
|
984
745
|
<span class="cline-any cline-neutral"> </span>
|
|
985
746
|
<span class="cline-any cline-neutral"> </span>
|
|
986
747
|
<span class="cline-any cline-neutral"> </span>
|
|
987
|
-
<span class="cline-any cline-yes">14x</span>
|
|
988
748
|
<span class="cline-any cline-neutral"> </span>
|
|
989
749
|
<span class="cline-any cline-neutral"> </span>
|
|
990
750
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -993,35 +753,34 @@
|
|
|
993
753
|
<span class="cline-any cline-neutral"> </span>
|
|
994
754
|
<span class="cline-any cline-neutral"> </span>
|
|
995
755
|
<span class="cline-any cline-neutral"> </span>
|
|
756
|
+
<span class="cline-any cline-no"> </span>
|
|
996
757
|
<span class="cline-any cline-neutral"> </span>
|
|
997
|
-
<span class="cline-any cline-yes">9x</span>
|
|
998
|
-
<span class="cline-any cline-yes">9x</span>
|
|
999
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1000
758
|
<span class="cline-any cline-neutral"> </span>
|
|
1001
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1002
759
|
<span class="cline-any cline-neutral"> </span>
|
|
760
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1003
761
|
<span class="cline-any cline-neutral"> </span>
|
|
1004
762
|
<span class="cline-any cline-neutral"> </span>
|
|
1005
763
|
<span class="cline-any cline-neutral"> </span>
|
|
764
|
+
<span class="cline-any cline-no"> </span>
|
|
765
|
+
<span class="cline-any cline-no"> </span>
|
|
766
|
+
<span class="cline-any cline-no"> </span>
|
|
767
|
+
<span class="cline-any cline-no"> </span>
|
|
1006
768
|
<span class="cline-any cline-neutral"> </span>
|
|
769
|
+
<span class="cline-any cline-no"> </span>
|
|
1007
770
|
<span class="cline-any cline-neutral"> </span>
|
|
1008
771
|
<span class="cline-any cline-neutral"> </span>
|
|
1009
772
|
<span class="cline-any cline-neutral"> </span>
|
|
1010
|
-
<span class="cline-any cline-yes">63x</span>
|
|
1011
773
|
<span class="cline-any cline-neutral"> </span>
|
|
1012
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1013
774
|
<span class="cline-any cline-neutral"> </span>
|
|
1014
775
|
<span class="cline-any cline-neutral"> </span>
|
|
1015
776
|
<span class="cline-any cline-neutral"> </span>
|
|
1016
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1017
777
|
<span class="cline-any cline-neutral"> </span>
|
|
1018
|
-
<span class="cline-any cline-yes">17x</span>
|
|
1019
778
|
<span class="cline-any cline-neutral"> </span>
|
|
1020
779
|
<span class="cline-any cline-neutral"> </span>
|
|
1021
780
|
<span class="cline-any cline-neutral"> </span>
|
|
1022
781
|
<span class="cline-any cline-neutral"> </span>
|
|
1023
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1024
782
|
<span class="cline-any cline-neutral"> </span>
|
|
783
|
+
<span class="cline-any cline-no"> </span>
|
|
1025
784
|
<span class="cline-any cline-neutral"> </span>
|
|
1026
785
|
<span class="cline-any cline-neutral"> </span>
|
|
1027
786
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1030,79 +789,94 @@
|
|
|
1030
789
|
<span class="cline-any cline-neutral"> </span>
|
|
1031
790
|
<span class="cline-any cline-neutral"> </span>
|
|
1032
791
|
<span class="cline-any cline-neutral"> </span>
|
|
1033
|
-
<span class="cline-any cline-yes">30x</span>
|
|
1034
|
-
<span class="cline-any cline-yes">30x</span>
|
|
1035
|
-
<span class="cline-any cline-yes">30x</span>
|
|
1036
792
|
<span class="cline-any cline-neutral"> </span>
|
|
1037
793
|
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
-
<span class="cline-any cline-yes">30x</span>
|
|
1039
|
-
<span class="cline-any cline-yes">30x</span>
|
|
1040
794
|
<span class="cline-any cline-neutral"> </span>
|
|
1041
|
-
<span class="cline-any cline-yes">30x</span>
|
|
1042
795
|
<span class="cline-any cline-neutral"> </span>
|
|
1043
|
-
<span class="cline-any cline-
|
|
1044
|
-
<span class="cline-any cline-
|
|
796
|
+
<span class="cline-any cline-no"> </span>
|
|
797
|
+
<span class="cline-any cline-no"> </span>
|
|
1045
798
|
<span class="cline-any cline-neutral"> </span>
|
|
1046
799
|
<span class="cline-any cline-neutral"> </span>
|
|
1047
800
|
<span class="cline-any cline-neutral"> </span>
|
|
1048
801
|
<span class="cline-any cline-neutral"> </span>
|
|
1049
802
|
<span class="cline-any cline-neutral"> </span>
|
|
1050
803
|
<span class="cline-any cline-neutral"> </span>
|
|
1051
|
-
<span class="cline-any cline-yes">30x</span>
|
|
1052
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1053
804
|
<span class="cline-any cline-neutral"> </span>
|
|
805
|
+
<span class="cline-any cline-no"> </span>
|
|
1054
806
|
<span class="cline-any cline-neutral"> </span>
|
|
1055
|
-
<span class="cline-any cline-yes">30x</span>
|
|
1056
807
|
<span class="cline-any cline-neutral"> </span>
|
|
1057
808
|
<span class="cline-any cline-neutral"> </span>
|
|
1058
809
|
<span class="cline-any cline-neutral"> </span>
|
|
810
|
+
<span class="cline-any cline-no"> </span>
|
|
1059
811
|
<span class="cline-any cline-neutral"> </span>
|
|
1060
812
|
<span class="cline-any cline-neutral"> </span>
|
|
1061
813
|
<span class="cline-any cline-neutral"> </span>
|
|
1062
814
|
<span class="cline-any cline-neutral"> </span>
|
|
815
|
+
<span class="cline-any cline-no"> </span>
|
|
816
|
+
<span class="cline-any cline-no"> </span>
|
|
817
|
+
<span class="cline-any cline-no"> </span>
|
|
818
|
+
<span class="cline-any cline-no"> </span>
|
|
819
|
+
<span class="cline-any cline-no"> </span>
|
|
820
|
+
<span class="cline-any cline-no"> </span>
|
|
821
|
+
<span class="cline-any cline-no"> </span>
|
|
822
|
+
<span class="cline-any cline-no"> </span>
|
|
823
|
+
<span class="cline-any cline-no"> </span>
|
|
824
|
+
<span class="cline-any cline-no"> </span>
|
|
825
|
+
<span class="cline-any cline-no"> </span>
|
|
826
|
+
<span class="cline-any cline-no"> </span>
|
|
827
|
+
<span class="cline-any cline-no"> </span>
|
|
828
|
+
<span class="cline-any cline-no"> </span>
|
|
829
|
+
<span class="cline-any cline-no"> </span>
|
|
1063
830
|
<span class="cline-any cline-neutral"> </span>
|
|
831
|
+
<span class="cline-any cline-no"> </span>
|
|
832
|
+
<span class="cline-any cline-no"> </span>
|
|
833
|
+
<span class="cline-any cline-no"> </span>
|
|
834
|
+
<span class="cline-any cline-no"> </span>
|
|
1064
835
|
<span class="cline-any cline-neutral"> </span>
|
|
836
|
+
<span class="cline-any cline-no"> </span>
|
|
1065
837
|
<span class="cline-any cline-neutral"> </span>
|
|
1066
838
|
<span class="cline-any cline-neutral"> </span>
|
|
1067
839
|
<span class="cline-any cline-neutral"> </span>
|
|
1068
840
|
<span class="cline-any cline-neutral"> </span>
|
|
1069
841
|
<span class="cline-any cline-neutral"> </span>
|
|
1070
842
|
<span class="cline-any cline-neutral"> </span>
|
|
1071
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1072
843
|
<span class="cline-any cline-neutral"> </span>
|
|
1073
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1074
844
|
<span class="cline-any cline-neutral"> </span>
|
|
1075
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1076
845
|
<span class="cline-any cline-neutral"> </span>
|
|
1077
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1078
846
|
<span class="cline-any cline-neutral"> </span>
|
|
1079
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1080
847
|
<span class="cline-any cline-neutral"> </span>
|
|
1081
848
|
<span class="cline-any cline-neutral"> </span>
|
|
1082
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1083
849
|
<span class="cline-any cline-neutral"> </span>
|
|
1084
850
|
<span class="cline-any cline-neutral"> </span>
|
|
1085
|
-
<span class="cline-any cline-
|
|
851
|
+
<span class="cline-any cline-no"> </span>
|
|
852
|
+
<span class="cline-any cline-no"> </span>
|
|
853
|
+
<span class="cline-any cline-no"> </span>
|
|
854
|
+
<span class="cline-any cline-no"> </span>
|
|
855
|
+
<span class="cline-any cline-no"> </span>
|
|
856
|
+
<span class="cline-any cline-no"> </span>
|
|
857
|
+
<span class="cline-any cline-no"> </span>
|
|
858
|
+
<span class="cline-any cline-no"> </span>
|
|
859
|
+
<span class="cline-any cline-no"> </span>
|
|
860
|
+
<span class="cline-any cline-no"> </span>
|
|
1086
861
|
<span class="cline-any cline-neutral"> </span>
|
|
1087
|
-
<span class="cline-any cline-
|
|
862
|
+
<span class="cline-any cline-no"> </span>
|
|
863
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
864
|
<span class="cline-any cline-neutral"> </span>
|
|
865
|
+
<span class="cline-any cline-no"> </span>
|
|
866
|
+
<span class="cline-any cline-no"> </span>
|
|
867
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
868
|
<span class="cline-any cline-neutral"> </span>
|
|
1090
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1091
869
|
<span class="cline-any cline-neutral"> </span>
|
|
1092
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1093
870
|
<span class="cline-any cline-neutral"> </span>
|
|
1094
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1095
871
|
<span class="cline-any cline-neutral"> </span>
|
|
1096
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1097
872
|
<span class="cline-any cline-neutral"> </span>
|
|
1098
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1099
873
|
<span class="cline-any cline-neutral"> </span>
|
|
1100
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1101
874
|
<span class="cline-any cline-neutral"> </span>
|
|
1102
875
|
<span class="cline-any cline-no"> </span>
|
|
1103
876
|
<span class="cline-any cline-neutral"> </span>
|
|
1104
877
|
<span class="cline-any cline-neutral"> </span>
|
|
1105
878
|
<span class="cline-any cline-neutral"> </span>
|
|
879
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1106
880
|
<span class="cline-any cline-neutral"> </span>
|
|
1107
881
|
<span class="cline-any cline-neutral"> </span>
|
|
1108
882
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1110,14 +884,6 @@
|
|
|
1110
884
|
<span class="cline-any cline-neutral"> </span>
|
|
1111
885
|
<span class="cline-any cline-neutral"> </span>
|
|
1112
886
|
<span class="cline-any cline-neutral"> </span>
|
|
1113
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1114
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1115
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1116
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1117
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1118
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1119
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1120
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1121
887
|
<span class="cline-any cline-neutral"> </span>
|
|
1122
888
|
<span class="cline-any cline-neutral"> </span>
|
|
1123
889
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1128,7 +894,6 @@
|
|
|
1128
894
|
<span class="cline-any cline-neutral"> </span>
|
|
1129
895
|
<span class="cline-any cline-neutral"> </span>
|
|
1130
896
|
<span class="cline-any cline-neutral"> </span>
|
|
1131
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1132
897
|
<span class="cline-any cline-neutral"> </span>
|
|
1133
898
|
<span class="cline-any cline-neutral"> </span>
|
|
1134
899
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1140,20 +905,12 @@
|
|
|
1140
905
|
<span class="cline-any cline-neutral"> </span>
|
|
1141
906
|
<span class="cline-any cline-neutral"> </span>
|
|
1142
907
|
<span class="cline-any cline-neutral"> </span>
|
|
1143
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1144
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1145
|
-
<span class="cline-any cline-yes">33x</span>
|
|
1146
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1147
908
|
<span class="cline-any cline-neutral"> </span>
|
|
1148
909
|
<span class="cline-any cline-neutral"> </span>
|
|
1149
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1150
|
-
<span class="cline-any cline-yes">27x</span>
|
|
1151
910
|
<span class="cline-any cline-neutral"> </span>
|
|
1152
911
|
<span class="cline-any cline-neutral"> </span>
|
|
1153
912
|
<span class="cline-any cline-neutral"> </span>
|
|
1154
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1155
913
|
<span class="cline-any cline-neutral"> </span>
|
|
1156
|
-
<span class="cline-any cline-no"> </span>
|
|
1157
914
|
<span class="cline-any cline-neutral"> </span>
|
|
1158
915
|
<span class="cline-any cline-neutral"> </span>
|
|
1159
916
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1167,588 +924,456 @@
|
|
|
1167
924
|
<span class="cline-any cline-neutral"> </span>
|
|
1168
925
|
<span class="cline-any cline-neutral"> </span>
|
|
1169
926
|
<span class="cline-any cline-neutral"> </span>
|
|
1170
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1171
927
|
<span class="cline-any cline-neutral"> </span>
|
|
1172
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1173
928
|
<span class="cline-any cline-neutral"> </span>
|
|
1174
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1175
929
|
<span class="cline-any cline-neutral"> </span>
|
|
1176
930
|
<span class="cline-any cline-neutral"> </span>
|
|
1177
931
|
<span class="cline-any cline-neutral"> </span>
|
|
1178
932
|
<span class="cline-any cline-neutral"> </span>
|
|
1179
933
|
<span class="cline-any cline-neutral"> </span>
|
|
1180
934
|
<span class="cline-any cline-neutral"> </span>
|
|
1181
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1182
935
|
<span class="cline-any cline-neutral"> </span>
|
|
1183
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1184
936
|
<span class="cline-any cline-neutral"> </span>
|
|
1185
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1186
937
|
<span class="cline-any cline-neutral"> </span>
|
|
1187
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1188
938
|
<span class="cline-any cline-neutral"> </span>
|
|
1189
939
|
<span class="cline-any cline-neutral"> </span>
|
|
1190
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import
|
|
940
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import {
|
|
941
|
+
BARREL_EXPORT_MIN_EXPORTS,
|
|
942
|
+
BARREL_EXPORT_TOKEN_LIMIT,
|
|
943
|
+
CONFIG_NAME_PATTERNS,
|
|
944
|
+
Classification,
|
|
945
|
+
EMAIL_NAME_PATTERNS,
|
|
946
|
+
HANDLER_NAME_PATTERNS,
|
|
947
|
+
NEXTJS_METADATA_EXPORTS,
|
|
948
|
+
PARSER_NAME_PATTERNS,
|
|
949
|
+
SERVICE_NAME_PATTERNS,
|
|
950
|
+
SESSION_NAME_PATTERNS,
|
|
951
|
+
adjustCohesionForClassification,
|
|
952
|
+
adjustFragmentationForClassification,
|
|
953
|
+
analyzeContext,
|
|
954
|
+
buildCoUsageMatrix,
|
|
955
|
+
buildDependencyGraph,
|
|
956
|
+
buildTypeGraph,
|
|
957
|
+
calculateCohesion,
|
|
958
|
+
calculateContextBudget,
|
|
959
|
+
calculateDirectoryDistance,
|
|
960
|
+
calculateDomainConfidence,
|
|
961
|
+
calculateEnhancedCohesion,
|
|
962
|
+
calculateFragmentation,
|
|
963
|
+
calculateImportDepth,
|
|
964
|
+
calculatePathEntropy,
|
|
965
|
+
calculateStructuralCohesionFromCoUsage,
|
|
966
|
+
classifyFile,
|
|
967
|
+
detectCircularDependencies,
|
|
968
|
+
detectModuleClusters,
|
|
969
|
+
displayConsoleReport,
|
|
970
|
+
extractDomainKeywordsFromPaths,
|
|
971
|
+
extractExports,
|
|
972
|
+
findSemanticClusters,
|
|
973
|
+
generateHTMLReport,
|
|
974
|
+
generateSummary,
|
|
975
|
+
getClassificationRecommendations,
|
|
976
|
+
getCoUsageData,
|
|
977
|
+
getGeneralRecommendations,
|
|
978
|
+
getTransitiveDependencies,
|
|
979
|
+
inferDomain,
|
|
980
|
+
inferDomainFromSemantics,
|
|
981
|
+
isBarrelExport,
|
|
982
|
+
isBoilerplateBarrel,
|
|
983
|
+
isConfigFile,
|
|
984
|
+
isEmailTemplate,
|
|
985
|
+
isHubAndSpokeFile,
|
|
986
|
+
isLambdaHandler,
|
|
987
|
+
isNextJsPage,
|
|
988
|
+
isParserFile,
|
|
989
|
+
isServiceFile,
|
|
990
|
+
isSessionFile,
|
|
991
|
+
isTypeDefinition,
|
|
992
|
+
isUtilityModule,
|
|
993
|
+
runInteractiveSetup
|
|
994
|
+
} from "./chunk-J3MUOWHC.mjs";
|
|
995
|
+
import "./chunk-64U3PNO3.mjs";
|
|
1191
996
|
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
*/
|
|
1195
|
-
export const Classification = {
|
|
1196
|
-
BARREL: 'barrel-export' as const,
|
|
1197
|
-
TYPE_DEFINITION: 'type-definition' as const,
|
|
1198
|
-
NEXTJS_PAGE: 'nextjs-page' as const,
|
|
1199
|
-
LAMBDA_HANDLER: 'lambda-handler' as const,
|
|
1200
|
-
SERVICE: 'service-file' as const,
|
|
1201
|
-
EMAIL_TEMPLATE: 'email-template' as const,
|
|
1202
|
-
PARSER: 'parser-file' as const,
|
|
1203
|
-
COHESIVE_MODULE: 'cohesive-module' as const,
|
|
1204
|
-
UTILITY_MODULE: 'utility-module' as const,
|
|
1205
|
-
MIXED_CONCERNS: 'mixed-concerns' as const,
|
|
1206
|
-
UNKNOWN: 'unknown' as const,
|
|
1207
|
-
};
|
|
997
|
+
// src/index.ts
|
|
998
|
+
import { ToolRegistry } from "@aiready/core";
|
|
1208
999
|
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
* @returns The determined file classification
|
|
1216
|
-
*/
|
|
1217
|
-
export function classifyFile(
|
|
1218
|
-
node: DependencyNode,
|
|
1219
|
-
cohesionScore: number = 1,
|
|
1220
|
-
domains: string[] = []
|
|
1221
|
-
): FileClassification {
|
|
1222
|
-
// 1. Detect barrel exports (primarily re-exports)
|
|
1223
|
-
if (isBarrelExport(node)) {
|
|
1224
|
-
return Classification.BARREL;
|
|
1225
|
-
}
|
|
1226
|
-
|
|
1227
|
-
// 2. Detect type definition files
|
|
1228
|
-
if (isTypeDefinition(node)) {
|
|
1229
|
-
return Classification.TYPE_DEFINITION;
|
|
1230
|
-
}
|
|
1231
|
-
|
|
1232
|
-
// 3. Detect Next.js App Router pages
|
|
1233
|
-
if (isNextJsPage(node)) {
|
|
1234
|
-
return Classification.NEXTJS_PAGE;
|
|
1235
|
-
}
|
|
1000
|
+
// src/provider.ts
|
|
1001
|
+
import {
|
|
1002
|
+
ToolName as ToolName2,
|
|
1003
|
+
IssueType,
|
|
1004
|
+
SpokeOutputSchema
|
|
1005
|
+
} from "@aiready/core";
|
|
1236
1006
|
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1007
|
+
// src/scoring.ts
|
|
1008
|
+
import {
|
|
1009
|
+
calculateMonthlyCost,
|
|
1010
|
+
calculateProductivityImpact,
|
|
1011
|
+
DEFAULT_COST_CONFIG,
|
|
1012
|
+
ToolName,
|
|
1013
|
+
getRatingSlug
|
|
1014
|
+
} from "@aiready/core";
|
|
1015
|
+
var BUDGET_EXCELLENT_THRESHOLD = 8e3;
|
|
1016
|
+
var BUDGET_PENALTY_RATE = 200;
|
|
1017
|
+
var DEPTH_EXCELLENT_THRESHOLD = 8;
|
|
1018
|
+
var DEPTH_PENALTY_WEIGHT = 5;
|
|
1019
|
+
var FRAGMENTATION_EXCELLENT_THRESHOLD = 0.5;
|
|
1020
|
+
var FRAGMENTATION_PENALTY_WEIGHT = 100;
|
|
1021
|
+
var MAX_CRITICAL_PENALTY = 20;
|
|
1022
|
+
var CRITICAL_ISSUE_WEIGHT = 3;
|
|
1023
|
+
var MAX_MAJOR_PENALTY = 15;
|
|
1024
|
+
var MAJOR_ISSUE_WEIGHT = 1;
|
|
1025
|
+
var EXTREME_FILE_THRESHOLD = 15e3;
|
|
1026
|
+
var MAX_EXTREME_PENALTY = 20;
|
|
1027
|
+
var EXTREME_PENALTY_DIVISOR = 500;
|
|
1028
|
+
var FRAGMENTATION_BONUS_THRESHOLD = 0.2;
|
|
1029
|
+
var ORGANIZATION_BONUS = 5;
|
|
1030
|
+
var MAX_TOTAL_PENALTY = 30;
|
|
1031
|
+
var WEIGHT_BUDGET = 0.35;
|
|
1032
|
+
var WEIGHT_DEPTH = 0.25;
|
|
1033
|
+
var WEIGHT_FRAGMENTATION = 0.25;
|
|
1034
|
+
function <span class="fstat-no" title="function not covered" >calculateContextScore(</span>summary, costConfig) {
|
|
1035
|
+
const {
|
|
1036
|
+
avgContextBudget,
|
|
1037
|
+
maxContextBudget,
|
|
1038
|
+
avgImportDepth,
|
|
1039
|
+
maxImportDepth,
|
|
1040
|
+
avgFragmentation,
|
|
1041
|
+
criticalIssues,
|
|
1042
|
+
majorIssues,
|
|
1043
|
+
totalFiles
|
|
1044
|
+
} = <span class="cstat-no" title="statement not covered" >summary;</span>
|
|
1045
|
+
const budgetScore = <span class="cstat-no" title="statement not covered" >avgContextBudget < BUDGET_EXCELLENT_THRESHOLD ? 100 : Math.max(</span>
|
|
1046
|
+
0,
|
|
1047
|
+
100 - (avgContextBudget - BUDGET_EXCELLENT_THRESHOLD) / BUDGET_PENALTY_RATE
|
|
1048
|
+
);
|
|
1049
|
+
const depthScore = <span class="cstat-no" title="statement not covered" >avgImportDepth < DEPTH_EXCELLENT_THRESHOLD ? 100 : Math.max(</span>
|
|
1050
|
+
0,
|
|
1051
|
+
100 - (avgImportDepth - DEPTH_EXCELLENT_THRESHOLD) * DEPTH_PENALTY_WEIGHT
|
|
1052
|
+
);
|
|
1053
|
+
const fragmentationScore = <span class="cstat-no" title="statement not covered" >avgFragmentation < FRAGMENTATION_EXCELLENT_THRESHOLD ? 100 : Math.max(</span>
|
|
1054
|
+
0,
|
|
1055
|
+
100 - (avgFragmentation - FRAGMENTATION_EXCELLENT_THRESHOLD) * FRAGMENTATION_PENALTY_WEIGHT
|
|
1056
|
+
);
|
|
1057
|
+
const criticalPenalty = <span class="cstat-no" title="statement not covered" >Math.min(</span>
|
|
1058
|
+
MAX_CRITICAL_PENALTY,
|
|
1059
|
+
criticalIssues * CRITICAL_ISSUE_WEIGHT
|
|
1060
|
+
);
|
|
1061
|
+
const majorPenalty = <span class="cstat-no" title="statement not covered" >Math.min(</span>
|
|
1062
|
+
MAX_MAJOR_PENALTY,
|
|
1063
|
+
majorIssues * MAJOR_ISSUE_WEIGHT
|
|
1064
|
+
);
|
|
1065
|
+
const maxBudgetPenalty = <span class="cstat-no" title="statement not covered" >maxContextBudget > EXTREME_FILE_THRESHOLD ? Math.min(</span>
|
|
1066
|
+
MAX_EXTREME_PENALTY,
|
|
1067
|
+
(maxContextBudget - EXTREME_FILE_THRESHOLD) / EXTREME_PENALTY_DIVISOR
|
|
1068
|
+
) : 0;
|
|
1069
|
+
let bonus = <span class="cstat-no" title="statement not covered" >0;</span>
|
|
1070
|
+
<span class="cstat-no" title="statement not covered" > if (criticalIssues === 0 && majorIssues === 0 && avgFragmentation < FRAGMENTATION_BONUS_THRESHOLD) {</span>
|
|
1071
|
+
<span class="cstat-no" title="statement not covered" > bonus = ORGANIZATION_BONUS;</span>
|
|
1245
1072
|
}
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1073
|
+
const rawScore = <span class="cstat-no" title="statement not covered" >budgetScore * WEIGHT_BUDGET + depthScore * WEIGHT_DEPTH + fragmentationScore * WEIGHT_FRAGMENTATION + bonus;</span>
|
|
1074
|
+
const finalScore = <span class="cstat-no" title="statement not covered" >rawScore - Math.min(MAX_TOTAL_PENALTY, criticalPenalty + majorPenalty) - maxBudgetPenalty;</span>
|
|
1075
|
+
const score = <span class="cstat-no" title="statement not covered" >Math.max(0, Math.min(100, Math.round(finalScore)));</span>
|
|
1076
|
+
const factors = <span class="cstat-no" title="statement not covered" >[</span>
|
|
1077
|
+
{
|
|
1078
|
+
name: "Context Budget",
|
|
1079
|
+
impact: Math.round(budgetScore * WEIGHT_BUDGET - WEIGHT_BUDGET * 100),
|
|
1080
|
+
description: `Avg ${Math.round(avgContextBudget)} tokens per file ${avgContextBudget < BUDGET_EXCELLENT_THRESHOLD ? "(excellent)" : avgContextBudget < 12e3 ? "(acceptable)" : "(high)"}`
|
|
1081
|
+
},
|
|
1082
|
+
{
|
|
1083
|
+
name: "Import Depth",
|
|
1084
|
+
impact: Math.round(depthScore * WEIGHT_DEPTH - WEIGHT_DEPTH * 100),
|
|
1085
|
+
description: `Avg ${avgImportDepth.toFixed(1)} levels ${avgImportDepth < DEPTH_EXCELLENT_THRESHOLD ? "(excellent)" : avgImportDepth < 12 ? "(acceptable)" : "(deep)"}`
|
|
1086
|
+
},
|
|
1087
|
+
{
|
|
1088
|
+
name: "Fragmentation",
|
|
1089
|
+
impact: Math.round(
|
|
1090
|
+
fragmentationScore * WEIGHT_FRAGMENTATION - WEIGHT_FRAGMENTATION * 100
|
|
1091
|
+
),
|
|
1092
|
+
description: `${(avgFragmentation * 100).toFixed(0)}% fragmentation ${avgFragmentation < 0.3 ? "(well-organized)" : avgFragmentation < 0.5 ? "(moderate)" : "(high)"}`
|
|
1093
|
+
}
|
|
1094
|
+
];
|
|
1095
|
+
<span class="cstat-no" title="statement not covered" > if (bonus > 0) {</span>
|
|
1096
|
+
<span class="cstat-no" title="statement not covered" > factors.push({</span>
|
|
1097
|
+
name: "Well-Organized Codebase",
|
|
1098
|
+
impact: bonus,
|
|
1099
|
+
description: "No critical/major issues and low fragmentation"
|
|
1100
|
+
});
|
|
1250
1101
|
}
|
|
1251
|
-
&
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1102
|
+
<span class="cstat-no" title="statement not covered" > if (criticalIssues > 0) {</span>
|
|
1103
|
+
<span class="cstat-no" title="statement not covered" > factors.push({</span>
|
|
1104
|
+
name: "Critical Issues",
|
|
1105
|
+
impact: -criticalPenalty,
|
|
1106
|
+
description: `${criticalIssues} critical context issue${criticalIssues > 1 ? "s" : ""}`
|
|
1107
|
+
});
|
|
1255
1108
|
}
|
|
1256
|
-
&
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
<span class="cstat-no" title="statement not covered" > return Classification.UTILITY_MODULE; // Group with utility for now</span>
|
|
1109
|
+
<span class="cstat-no" title="statement not covered" > if (majorIssues > 0) {</span>
|
|
1110
|
+
<span class="cstat-no" title="statement not covered" > factors.push({</span>
|
|
1111
|
+
name: "Major Issues",
|
|
1112
|
+
impact: -majorPenalty,
|
|
1113
|
+
description: `${majorIssues} major context issue${majorIssues > 1 ? "s" : ""}`
|
|
1114
|
+
});
|
|
1263
1115
|
}
|
|
1264
|
-
&
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1116
|
+
<span class="cstat-no" title="statement not covered" > if (maxBudgetPenalty > 0) {</span>
|
|
1117
|
+
<span class="cstat-no" title="statement not covered" > factors.push({</span>
|
|
1118
|
+
name: "Extreme File Detected",
|
|
1119
|
+
impact: -Math.round(maxBudgetPenalty),
|
|
1120
|
+
description: `One file requires ${Math.round(maxContextBudget)} tokens (very high)`
|
|
1121
|
+
});
|
|
1268
1122
|
}
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1123
|
+
const recommendations = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
1124
|
+
<span class="cstat-no" title="statement not covered" > if (avgContextBudget > 12e3) {</span>
|
|
1125
|
+
const estimatedImpact = <span class="cstat-no" title="statement not covered" >Math.min(</span>
|
|
1126
|
+
15,
|
|
1127
|
+
Math.round((avgContextBudget - 12e3) / 1e3)
|
|
1128
|
+
);
|
|
1129
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push({</span>
|
|
1130
|
+
action: "Reduce file dependencies to lower context requirements",
|
|
1131
|
+
estimatedImpact,
|
|
1132
|
+
priority: "high"
|
|
1133
|
+
});
|
|
1273
1134
|
}
|
|
1274
|
-
&
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1135
|
+
<span class="cstat-no" title="statement not covered" > if (avgImportDepth > 10) {</span>
|
|
1136
|
+
const estimatedImpact = <span class="cstat-no" title="statement not covered" >Math.min(</span>
|
|
1137
|
+
10,
|
|
1138
|
+
Math.round((avgImportDepth - 10) * 1.5)
|
|
1139
|
+
);
|
|
1140
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push({</span>
|
|
1141
|
+
action: "Flatten import chains to reduce depth",
|
|
1142
|
+
estimatedImpact,
|
|
1143
|
+
priority: avgImportDepth > 15 ? "high" : "medium"
|
|
1144
|
+
});
|
|
1278
1145
|
}
|
|
1279
|
-
&
|
|
1280
|
-
|
|
1281
|
-
|
|
1146
|
+
<span class="cstat-no" title="statement not covered" > if (avgFragmentation > 0.5) {</span>
|
|
1147
|
+
const estimatedImpact = <span class="cstat-no" title="statement not covered" >Math.min(</span>
|
|
1148
|
+
12,
|
|
1149
|
+
Math.round((avgFragmentation - 0.5) * 40)
|
|
1150
|
+
);
|
|
1151
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push({</span>
|
|
1152
|
+
action: "Consolidate related code into cohesive modules",
|
|
1153
|
+
estimatedImpact,
|
|
1154
|
+
priority: "medium"
|
|
1155
|
+
});
|
|
1282
1156
|
}
|
|
1283
|
-
&
|
|
1284
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1285
|
-
|
|
1157
|
+
<span class="cstat-no" title="statement not covered" > if (maxContextBudget > 2e4) {</span>
|
|
1158
|
+
<span class="cstat-no" title="statement not covered" > recommendations.push({</span>
|
|
1159
|
+
action: `Split large file (${Math.round(maxContextBudget)} tokens) into smaller modules`,
|
|
1160
|
+
estimatedImpact: 8,
|
|
1161
|
+
priority: "high"
|
|
1162
|
+
});
|
|
1286
1163
|
}
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
/**
|
|
1292
|
-
* Detect if a file is a barrel export (index.ts)
|
|
1293
|
-
*
|
|
1294
|
-
* @param node The dependency node to check
|
|
1295
|
-
* @returns True if the file appears to be a barrel export
|
|
1296
|
-
*/
|
|
1297
|
-
export function isBarrelExport(node: DependencyNode): boolean {
|
|
1298
|
-
const { file, exports } = node;
|
|
1299
|
-
const fileName = file.split('/').pop()?.toLowerCase();
|
|
1300
|
-
|
|
1301
|
-
// Barrel files are typically named index.ts or index.js
|
|
1302
|
-
const isIndexFile = fileName === 'index.ts' || fileName === 'index.js';
|
|
1303
|
-
|
|
1304
|
-
// Small file with many exports is likely a barrel
|
|
1305
|
-
const isSmallAndManyExports =
|
|
1306
|
-
node.tokenCost < 1000 && (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).l</span>ength > 5;
|
|
1307
|
-
|
|
1308
|
-
// RE-EXPORT HEURISTIC for non-index files
|
|
1309
|
-
const isReexportPattern =
|
|
1310
|
-
(exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).l</span>ength >= 5 &&
|
|
1311
|
-
(exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).e</span>very(
|
|
1312
|
-
(e) =>
|
|
1313
|
-
e.type === 'const' ||
|
|
1314
|
-
e.type === 'function' ||
|
|
1315
|
-
<span class="branch-2 cbranch-no" title="branch not covered" > e.type === 'type' ||</span>
|
|
1316
|
-
<span class="branch-3 cbranch-no" title="branch not covered" > e.type === 'interface'</span>
|
|
1317
|
-
);
|
|
1318
|
-
|
|
1319
|
-
return !!isIndexFile || !!isSmallAndManyExports || !!isReexportPattern;
|
|
1320
|
-
}
|
|
1321
|
-
|
|
1322
|
-
/**
|
|
1323
|
-
* Detect if a file is primarily type definitions
|
|
1324
|
-
*
|
|
1325
|
-
* @param node The dependency node to check
|
|
1326
|
-
* @returns True if the file appears to be primarily types
|
|
1327
|
-
*/
|
|
1328
|
-
export function isTypeDefinition(node: DependencyNode): boolean {
|
|
1329
|
-
const { file } = node;
|
|
1330
|
-
|
|
1331
|
-
// Check file extension
|
|
1332
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (file.endsWith('.d.ts')) <span class="cstat-no" title="statement not covered" >return true;</span>
|
|
1333
|
-
|
|
1334
|
-
// Check if all exports are types or interfaces
|
|
1335
|
-
const nodeExports = node.exports || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
|
|
1336
|
-
const hasExports = nodeExports.length > 0;
|
|
1337
|
-
const areAllTypes =
|
|
1338
|
-
hasExports &&
|
|
1339
|
-
nodeExports.every((e) => e.type === 'type' || e.type === 'interface');
|
|
1340
|
-
const allTypes: boolean = !!areAllTypes;
|
|
1341
|
-
|
|
1342
|
-
// Check if path includes 'types' or 'interfaces'
|
|
1343
|
-
const isTypePath =
|
|
1344
|
-
file.toLowerCase().includes('/types/') ||
|
|
1345
|
-
file.toLowerCase().includes('/interfaces/') ||
|
|
1346
|
-
file.toLowerCase().includes('/models/');
|
|
1347
|
-
|
|
1348
|
-
return allTypes || (isTypePath && <span class="branch-2 cbranch-no" title="branch not covered" >hasExports);</span>
|
|
1349
|
-
}
|
|
1350
|
-
|
|
1351
|
-
/**
|
|
1352
|
-
* Detect if a file is a utility module
|
|
1353
|
-
*
|
|
1354
|
-
* @param node The dependency node to check
|
|
1355
|
-
* @returns True if the file appears to be a utility module
|
|
1356
|
-
*/
|
|
1357
|
-
export function isUtilityModule(node: DependencyNode): boolean {
|
|
1358
|
-
const { file } = node;
|
|
1359
|
-
|
|
1360
|
-
// Check if path includes 'utils', 'helpers', etc.
|
|
1361
|
-
const isUtilPath =
|
|
1362
|
-
file.toLowerCase().includes('/utils/') ||
|
|
1363
|
-
file.toLowerCase().includes('/helpers/') ||
|
|
1364
|
-
file.toLowerCase().includes('/util/') ||
|
|
1365
|
-
file.toLowerCase().includes('/helper/');
|
|
1366
|
-
|
|
1367
|
-
const fileName = file.split('/').pop()?.toLowerCase();
|
|
1368
|
-
const isUtilName =
|
|
1369
|
-
fileName?.includes('utils.') ||
|
|
1370
|
-
fileName?.includes('helpers.') ||
|
|
1371
|
-
fileName?.includes('util.') ||
|
|
1372
|
-
fileName?.includes('helper.');
|
|
1373
|
-
|
|
1374
|
-
return !!isUtilPath || !!isUtilName;
|
|
1375
|
-
}
|
|
1376
|
-
|
|
1377
|
-
/**
|
|
1378
|
-
* Detect if a file is a Lambda/API handler
|
|
1379
|
-
*
|
|
1380
|
-
* @param node The dependency node to check
|
|
1381
|
-
* @returns True if the file appears to be a Lambda handler
|
|
1382
|
-
*/
|
|
1383
|
-
export function isLambdaHandler(node: DependencyNode): boolean {
|
|
1384
|
-
const { file, exports } = node;
|
|
1385
|
-
const fileName = file.split('/').pop()?.toLowerCase();
|
|
1386
|
-
|
|
1387
|
-
const handlerPatterns = [
|
|
1388
|
-
'handler',
|
|
1389
|
-
'.handler.',
|
|
1390
|
-
'-handler.',
|
|
1391
|
-
'lambda',
|
|
1392
|
-
'.lambda.',
|
|
1393
|
-
'-lambda.',
|
|
1394
|
-
];
|
|
1395
|
-
const isHandlerName = handlerPatterns.some((pattern) =>
|
|
1396
|
-
fileName?.includes(pattern)
|
|
1397
|
-
);
|
|
1398
|
-
|
|
1399
|
-
const isHandlerPath =
|
|
1400
|
-
file.toLowerCase().includes('/handlers/') ||
|
|
1401
|
-
file.toLowerCase().includes('/lambdas/') ||
|
|
1402
|
-
file.toLowerCase().includes('/lambda/') ||
|
|
1403
|
-
file.toLowerCase().includes('/functions/');
|
|
1404
|
-
|
|
1405
|
-
const hasHandlerExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome(
|
|
1406
|
-
(e) =>
|
|
1407
|
-
e.name.toLowerCase() === 'handler' ||
|
|
1408
|
-
e.name.toLowerCase() === 'main' ||
|
|
1409
|
-
e.name.toLowerCase() === 'lambdahandler' ||
|
|
1410
|
-
e.name.toLowerCase().endsWith('handler')
|
|
1164
|
+
const cfg = <span class="cstat-no" title="statement not covered" >{ ...DEFAULT_COST_CONFIG, ...costConfig };</span>
|
|
1165
|
+
const estimatedMonthlyCost =<span class="cstat-no" title="statement not covered" > calculateMonthlyCost(</span>
|
|
1166
|
+
avgContextBudget * (totalFiles || 1),
|
|
1167
|
+
cfg
|
|
1411
1168
|
);
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
}
|
|
1415
|
-
|
|
1416
|
-
/**
|
|
1417
|
-
* Detect if a file is a service file
|
|
1418
|
-
*
|
|
1419
|
-
* @param node The dependency node to check
|
|
1420
|
-
* @returns True if the file appears to be a service file
|
|
1421
|
-
*/
|
|
1422
|
-
export function isServiceFile(node: DependencyNode): boolean {
|
|
1423
|
-
const { file, exports } = node;
|
|
1424
|
-
const fileName = file.split('/').pop()?.toLowerCase();
|
|
1425
|
-
|
|
1426
|
-
const servicePatterns = ['service', '.service.', '-service.', '_service.'];
|
|
1427
|
-
const isServiceName = servicePatterns.some((pattern) =>
|
|
1428
|
-
fileName?.includes(pattern)
|
|
1429
|
-
);
|
|
1430
|
-
const isServicePath = file.toLowerCase().includes('/services/');
|
|
1431
|
-
const hasServiceNamedExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome(
|
|
1432
|
-
(e) =>
|
|
1433
|
-
e.name.toLowerCase().includes('service') ||
|
|
1434
|
-
e.name.toLowerCase().endsWith('service')
|
|
1435
|
-
);
|
|
1436
|
-
const hasClassExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome((e) => e.type === 'class');
|
|
1437
|
-
|
|
1438
|
-
return (
|
|
1439
|
-
!!isServiceName ||
|
|
1440
|
-
!!isServicePath ||
|
|
1441
|
-
(!!hasServiceNamedExport && <span class="branch-3 cbranch-no" title="branch not covered" >!!hasClassExport)</span>
|
|
1442
|
-
);
|
|
1443
|
-
}
|
|
1444
|
-
|
|
1445
|
-
/**
|
|
1446
|
-
* Detect if a file is an email template/layout
|
|
1447
|
-
*
|
|
1448
|
-
* @param node The dependency node to check
|
|
1449
|
-
* @returns True if the file appears to be an email template
|
|
1450
|
-
*/
|
|
1451
|
-
export function isEmailTemplate(node: DependencyNode): boolean {
|
|
1452
|
-
const { file, exports } = node;
|
|
1453
|
-
const fileName = file.split('/').pop()?.toLowerCase();
|
|
1454
|
-
|
|
1455
|
-
const emailTemplatePatterns = [
|
|
1456
|
-
'-email-',
|
|
1457
|
-
'.email.',
|
|
1458
|
-
'_email_',
|
|
1459
|
-
'-template',
|
|
1460
|
-
'.template.',
|
|
1461
|
-
'_template',
|
|
1462
|
-
'-mail.',
|
|
1463
|
-
'.mail.',
|
|
1169
|
+
const issues = <span class="cstat-no" title="statement not covered" >[</span>
|
|
1170
|
+
...Array(criticalIssues).fill({ severity: "critical" }),
|
|
1171
|
+
...Array(majorIssues).fill({ severity: "major" })
|
|
1464
1172
|
];
|
|
1465
|
-
const
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1173
|
+
const productivityImpact =<span class="cstat-no" title="statement not covered" > calculateProductivityImpact(issues);</span>
|
|
1174
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1175
|
+
toolName: ToolName.ContextAnalyzer,
|
|
1176
|
+
score,
|
|
1177
|
+
rawMetrics: {
|
|
1178
|
+
avgContextBudget: Math.round(avgContextBudget),
|
|
1179
|
+
maxContextBudget: Math.round(maxContextBudget),
|
|
1180
|
+
avgImportDepth: Math.round(avgImportDepth * 10) / 10,
|
|
1181
|
+
maxImportDepth,
|
|
1182
|
+
avgFragmentation: Math.round(avgFragmentation * 100) / 100,
|
|
1183
|
+
criticalIssues,
|
|
1184
|
+
majorIssues,
|
|
1185
|
+
estimatedMonthlyCost,
|
|
1186
|
+
estimatedDeveloperHours: productivityImpact.totalHours
|
|
1187
|
+
},
|
|
1188
|
+
factors,
|
|
1189
|
+
recommendations
|
|
1190
|
+
};
|
|
1483
1191
|
}
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
* Detect if a file is a parser/transformer
|
|
1487
|
-
*
|
|
1488
|
-
* @param node The dependency node to check
|
|
1489
|
-
* @returns True if the file appears to be a parser
|
|
1490
|
-
*/
|
|
1491
|
-
export function isParserFile(node: DependencyNode): boolean {
|
|
1492
|
-
const { file, exports } = node;
|
|
1493
|
-
const fileName = file.split('/').pop()?.toLowerCase();
|
|
1494
|
-
|
|
1495
|
-
const parserPatterns = [
|
|
1496
|
-
'parser',
|
|
1497
|
-
'.parser.',
|
|
1498
|
-
'-parser.',
|
|
1499
|
-
'_parser.',
|
|
1500
|
-
'transform',
|
|
1501
|
-
'.transform.',
|
|
1502
|
-
'converter',
|
|
1503
|
-
'mapper',
|
|
1504
|
-
'serializer',
|
|
1505
|
-
];
|
|
1506
|
-
const isParserName = parserPatterns.some((pattern) =>
|
|
1507
|
-
fileName?.includes(pattern)
|
|
1508
|
-
);
|
|
1509
|
-
const isParserPath =
|
|
1510
|
-
file.toLowerCase().includes('/parsers/') ||
|
|
1511
|
-
file.toLowerCase().includes('/transformers/');
|
|
1512
|
-
|
|
1513
|
-
const hasParseFunction = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome(
|
|
1514
|
-
(e) =>
|
|
1515
|
-
e.type === 'function' &&
|
|
1516
|
-
(e.name.toLowerCase().startsWith('parse') ||
|
|
1517
|
-
e.name.toLowerCase().startsWith('transform') ||
|
|
1518
|
-
e.name.toLowerCase().startsWith('extract'))
|
|
1519
|
-
);
|
|
1520
|
-
|
|
1521
|
-
return !!isParserName || !!isParserPath || !!hasParseFunction;
|
|
1522
|
-
}
|
|
1523
|
-
|
|
1524
|
-
/**
|
|
1525
|
-
* Detect if a file is a session/state management file
|
|
1526
|
-
*
|
|
1527
|
-
* @param node The dependency node to check
|
|
1528
|
-
* @returns True if the file appears to be a session/state file
|
|
1529
|
-
*/
|
|
1530
|
-
export function isSessionFile(node: DependencyNode): boolean {
|
|
1531
|
-
const { file, exports } = node;
|
|
1532
|
-
const fileName = file.split('/').pop()?.toLowerCase();
|
|
1533
|
-
|
|
1534
|
-
const sessionPatterns = ['session', 'state', 'context', 'store'];
|
|
1535
|
-
const isSessionName = sessionPatterns.some((pattern) =>
|
|
1536
|
-
fileName?.includes(pattern)
|
|
1537
|
-
);
|
|
1538
|
-
const isSessionPath =
|
|
1539
|
-
file.toLowerCase().includes('/sessions/') ||
|
|
1540
|
-
file.toLowerCase().includes('/state/');
|
|
1541
|
-
|
|
1542
|
-
const hasSessionExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome(
|
|
1543
|
-
(e) =>
|
|
1544
|
-
e.name.toLowerCase().includes('session') ||
|
|
1545
|
-
e.name.toLowerCase().includes('state') ||
|
|
1546
|
-
e.name.toLowerCase().includes('store')
|
|
1547
|
-
);
|
|
1548
|
-
|
|
1549
|
-
return !!isSessionName || !!isSessionPath || !!hasSessionExport;
|
|
1550
|
-
}
|
|
1551
|
-
|
|
1552
|
-
/**
|
|
1553
|
-
* Detect if a file is a configuration or schema file
|
|
1554
|
-
*
|
|
1555
|
-
* @param node The dependency node to check
|
|
1556
|
-
* @returns True if the file appears to be a config file
|
|
1557
|
-
*/
|
|
1558
|
-
export function isConfigFile(node: DependencyNode): boolean {
|
|
1559
|
-
const { file, exports } = node;
|
|
1560
|
-
const lowerPath = file.toLowerCase();
|
|
1561
|
-
const fileName = file.split('/').pop()?.toLowerCase();
|
|
1562
|
-
|
|
1563
|
-
const configPatterns = [
|
|
1564
|
-
'.config.',
|
|
1565
|
-
'tsconfig',
|
|
1566
|
-
'jest.config',
|
|
1567
|
-
'package.json',
|
|
1568
|
-
'aiready.json',
|
|
1569
|
-
'next.config',
|
|
1570
|
-
'sst.config',
|
|
1571
|
-
];
|
|
1572
|
-
const isConfigName = configPatterns.some((p) => fileName?.includes(p));
|
|
1573
|
-
const isConfigPath =
|
|
1574
|
-
lowerPath.includes('/config/') ||
|
|
1575
|
-
lowerPath.includes('/settings/') ||
|
|
1576
|
-
lowerPath.includes('/schemas/');
|
|
1577
|
-
|
|
1578
|
-
const hasSchemaExports = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome(
|
|
1579
|
-
(e) =>
|
|
1580
|
-
e.name.toLowerCase().includes('schema') ||
|
|
1581
|
-
e.name.toLowerCase().includes('config') ||
|
|
1582
|
-
e.name.toLowerCase().includes('setting')
|
|
1583
|
-
);
|
|
1584
|
-
|
|
1585
|
-
return !!isConfigName || !!isConfigPath || !!hasSchemaExports;
|
|
1586
|
-
}
|
|
1587
|
-
|
|
1588
|
-
/**
|
|
1589
|
-
* Detect if a file is a Next.js App Router page
|
|
1590
|
-
*
|
|
1591
|
-
* @param node The dependency node to check
|
|
1592
|
-
* @returns True if the file appears to be a Next.js page
|
|
1593
|
-
*/
|
|
1594
|
-
export function isNextJsPage(node: DependencyNode): boolean {
|
|
1595
|
-
const { file, exports } = node;
|
|
1596
|
-
const lowerPath = file.toLowerCase();
|
|
1597
|
-
const fileName = file.split('/').pop()?.toLowerCase();
|
|
1598
|
-
|
|
1599
|
-
const isInAppDir =
|
|
1600
|
-
lowerPath.includes('/app/') || lowerPath.startsWith('app/');
|
|
1601
|
-
const isPageFile = fileName === 'page.tsx' || fileName === 'page.ts';
|
|
1602
|
-
|
|
1603
|
-
if (!isInAppDir || !isPageFile) return false;
|
|
1604
|
-
|
|
1605
|
-
const hasDefaultExport = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome((e) => e.type === 'default');
|
|
1606
|
-
const nextJsExports = [
|
|
1607
|
-
'metadata',
|
|
1608
|
-
'generatemetadata',
|
|
1609
|
-
'faqjsonld',
|
|
1610
|
-
'jsonld',
|
|
1611
|
-
'icon',
|
|
1612
|
-
];
|
|
1613
|
-
const hasNextJsExports = (exports || <span class="branch-1 cbranch-no" title="branch not covered" >[]).s</span>ome((e) =>
|
|
1614
|
-
nextJsExports.includes(e.name.toLowerCase())
|
|
1615
|
-
);
|
|
1616
|
-
|
|
1617
|
-
return !!hasDefaultExport || <span class="branch-1 cbranch-no" title="branch not covered" >!!hasNextJsExports;</span>
|
|
1192
|
+
function <span class="fstat-no" title="function not covered" >mapScoreToRating(</span>score) {
|
|
1193
|
+
<span class="cstat-no" title="statement not covered" > return getRatingSlug(score).replace("-", " ");</span>
|
|
1618
1194
|
}
|
|
1619
1195
|
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1196
|
+
// src/provider.ts
|
|
1197
|
+
var ContextAnalyzerProvider = {
|
|
1198
|
+
id: ToolName2.ContextAnalyzer,
|
|
1199
|
+
alias: ["context", "fragmentation", "budget"],
|
|
1200
|
+
async <span class="fstat-no" title="function not covered" >analyze(</span>options) {
|
|
1201
|
+
const results = <span class="cstat-no" title="statement not covered" >await analyzeContext(options);</span>
|
|
1202
|
+
const summary =<span class="cstat-no" title="statement not covered" > generateSummary(results, options);</span>
|
|
1203
|
+
const normalizedResults = <span class="cstat-no" title="statement not covered" >results.map(</span>
|
|
1204
|
+
<span class="fstat-no" title="function not covered" > (r</span>) => (<span class="cstat-no" title="statement not covered" >{</span>
|
|
1205
|
+
fileName: r.file,
|
|
1206
|
+
issues: r.issues.map(<span class="fstat-no" title="function not covered" >(m</span>sg) => (<span class="cstat-no" title="statement not covered" >{</span>
|
|
1207
|
+
type: IssueType.ContextFragmentation,
|
|
1208
|
+
severity: r.severity,
|
|
1209
|
+
message: msg,
|
|
1210
|
+
location: { file: r.file, line: 1 },
|
|
1211
|
+
suggestion: r.recommendations[0]
|
|
1212
|
+
})),
|
|
1213
|
+
metrics: {
|
|
1214
|
+
tokenCost: r.tokenCost,
|
|
1215
|
+
complexityScore: r.importDepth
|
|
1216
|
+
// Map other context-specific metrics if needed
|
|
1217
|
+
}
|
|
1218
|
+
})
|
|
1219
|
+
);
|
|
1220
|
+
<span class="cstat-no" title="statement not covered" > return SpokeOutputSchema.parse({</span>
|
|
1221
|
+
results: normalizedResults,
|
|
1222
|
+
summary: {
|
|
1223
|
+
...summary
|
|
1224
|
+
},
|
|
1225
|
+
metadata: {
|
|
1226
|
+
toolName: ToolName2.ContextAnalyzer,
|
|
1227
|
+
version: "0.17.5",
|
|
1228
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1648
1229
|
}
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1230
|
+
});
|
|
1231
|
+
},
|
|
1232
|
+
<span class="fstat-no" title="function not covered" > score(</span>output, options) {
|
|
1233
|
+
const summary = <span class="cstat-no" title="statement not covered" >output.summary;</span>
|
|
1234
|
+
<span class="cstat-no" title="statement not covered" > return calculateContextScore(summary, options.costConfig);</span>
|
|
1235
|
+
},
|
|
1236
|
+
defaultWeight: 19
|
|
1237
|
+
};
|
|
1238
|
+
|
|
1239
|
+
// src/defaults.ts
|
|
1240
|
+
import { scanFiles } from "@aiready/core";
|
|
1241
|
+
async function <span class="fstat-no" title="function not covered" >getSmartDefaults(</span>directory, userOptions) {
|
|
1242
|
+
const files = <span class="cstat-no" title="statement not covered" >await scanFiles({</span>
|
|
1243
|
+
rootDir: directory,
|
|
1244
|
+
include: userOptions.include,
|
|
1245
|
+
exclude: userOptions.exclude
|
|
1246
|
+
});
|
|
1247
|
+
const estimatedBlocks = <span class="cstat-no" title="statement not covered" >files.length;</span>
|
|
1248
|
+
let maxDepth;
|
|
1249
|
+
let maxContextBudget;
|
|
1250
|
+
let minCohesion;
|
|
1251
|
+
let maxFragmentation;
|
|
1252
|
+
<span class="cstat-no" title="statement not covered" > if (estimatedBlocks < 100) {</span>
|
|
1253
|
+
<span class="cstat-no" title="statement not covered" > maxDepth = 5;</span>
|
|
1254
|
+
<span class="cstat-no" title="statement not covered" > maxContextBudget = 8e3;</span>
|
|
1255
|
+
<span class="cstat-no" title="statement not covered" > minCohesion = 0.5;</span>
|
|
1256
|
+
<span class="cstat-no" title="statement not covered" > maxFragmentation = 0.5;</span>
|
|
1257
|
+
} else <span class="cstat-no" title="statement not covered" >if (estimatedBlocks < 500) {</span>
|
|
1258
|
+
<span class="cstat-no" title="statement not covered" > maxDepth = 6;</span>
|
|
1259
|
+
<span class="cstat-no" title="statement not covered" > maxContextBudget = 15e3;</span>
|
|
1260
|
+
<span class="cstat-no" title="statement not covered" > minCohesion = 0.45;</span>
|
|
1261
|
+
<span class="cstat-no" title="statement not covered" > maxFragmentation = 0.6;</span>
|
|
1262
|
+
} else <span class="cstat-no" title="statement not covered" >if (estimatedBlocks < 2e3) {</span>
|
|
1263
|
+
<span class="cstat-no" title="statement not covered" > maxDepth = 8;</span>
|
|
1264
|
+
<span class="cstat-no" title="statement not covered" > maxContextBudget = 25e3;</span>
|
|
1265
|
+
<span class="cstat-no" title="statement not covered" > minCohesion = 0.4;</span>
|
|
1266
|
+
<span class="cstat-no" title="statement not covered" > maxFragmentation = 0.7;</span>
|
|
1267
|
+
} else {
|
|
1268
|
+
<span class="cstat-no" title="statement not covered" > maxDepth = 12;</span>
|
|
1269
|
+
<span class="cstat-no" title="statement not covered" > maxContextBudget = 4e4;</span>
|
|
1270
|
+
<span class="cstat-no" title="statement not covered" > minCohesion = 0.35;</span>
|
|
1271
|
+
<span class="cstat-no" title="statement not covered" > maxFragmentation = 0.8;</span>
|
|
1665
1272
|
}
|
|
1273
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1274
|
+
maxDepth,
|
|
1275
|
+
maxContextBudget,
|
|
1276
|
+
minCohesion,
|
|
1277
|
+
maxFragmentation,
|
|
1278
|
+
focus: "all",
|
|
1279
|
+
includeNodeModules: false,
|
|
1280
|
+
rootDir: userOptions.rootDir || directory,
|
|
1281
|
+
include: userOptions.include,
|
|
1282
|
+
exclude: userOptions.exclude
|
|
1283
|
+
};
|
|
1666
1284
|
}
|
|
1667
1285
|
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
'validate',
|
|
1692
|
-
];
|
|
1693
|
-
const domainPatterns = [
|
|
1694
|
-
'user',
|
|
1695
|
-
'order',
|
|
1696
|
-
'product',
|
|
1697
|
-
'session',
|
|
1698
|
-
'email',
|
|
1699
|
-
'file',
|
|
1700
|
-
'db',
|
|
1701
|
-
'api',
|
|
1702
|
-
'config',
|
|
1703
|
-
];
|
|
1704
|
-
|
|
1705
|
-
for (const name of exportNames) {
|
|
1706
|
-
for (const verb of verbs) {
|
|
1707
|
-
if (name.startsWith(verb) && name.length > verb.length) {
|
|
1708
|
-
stems.add(name.slice(verb.length).toLowerCase());
|
|
1286
|
+
// src/semantic/consolidation.ts
|
|
1287
|
+
function <span class="fstat-no" title="function not covered" >findConsolidationCandidates(</span>graph, coUsageMatrix, typeGraph, minCoUsage = <span class="branch-0 cbranch-no" title="branch not covered" >5,</span> minSharedTypes = <span class="branch-0 cbranch-no" title="branch not covered" >2)</span> {
|
|
1288
|
+
const candidates = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
1289
|
+
<span class="cstat-no" title="statement not covered" > for (const [fileA, coUsages] of coUsageMatrix) {</span>
|
|
1290
|
+
const nodeA = <span class="cstat-no" title="statement not covered" >graph.nodes.get(fileA);</span>
|
|
1291
|
+
<span class="cstat-no" title="statement not covered" > if (!nodeA) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
1292
|
+
<span class="cstat-no" title="statement not covered" > for (const [fileB, count] of coUsages) {</span>
|
|
1293
|
+
<span class="cstat-no" title="statement not covered" > if (fileB <= fileA || count < minCoUsage) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
1294
|
+
const nodeB = <span class="cstat-no" title="statement not covered" >graph.nodes.get(fileB);</span>
|
|
1295
|
+
<span class="cstat-no" title="statement not covered" > if (!nodeB) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
1296
|
+
const typesA = <span class="cstat-no" title="statement not covered" >new Set(</span>
|
|
1297
|
+
nodeA.exports.flatMap(<span class="fstat-no" title="function not covered" >(e</span>) => <span class="cstat-no" title="statement not covered" >e.typeReferences || [])</span>
|
|
1298
|
+
);
|
|
1299
|
+
const typesB = <span class="cstat-no" title="statement not covered" >new Set(</span>
|
|
1300
|
+
nodeB.exports.flatMap(<span class="fstat-no" title="function not covered" >(e</span>) => <span class="cstat-no" title="statement not covered" >e.typeReferences || [])</span>
|
|
1301
|
+
);
|
|
1302
|
+
const sharedTypes = <span class="cstat-no" title="statement not covered" >Array.from(typesA).filter(<span class="fstat-no" title="function not covered" >(t</span>) => <span class="cstat-no" title="statement not covered" >typesB.has(t))</span>;</span>
|
|
1303
|
+
<span class="cstat-no" title="statement not covered" > if (sharedTypes.length >= minSharedTypes || count >= minCoUsage * 2) {</span>
|
|
1304
|
+
<span class="cstat-no" title="statement not covered" > candidates.push({</span>
|
|
1305
|
+
files: [fileA, fileB],
|
|
1306
|
+
reason: `High co-usage (${count}x)`,
|
|
1307
|
+
strength: count / 10
|
|
1308
|
+
});
|
|
1709
1309
|
}
|
|
1710
1310
|
}
|
|
1711
|
-
for (const domain of domainPatterns) {
|
|
1712
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (name.includes(domain)) <span class="cstat-no" title="statement not covered" >domains.add(domain);</span>
|
|
1713
|
-
}
|
|
1714
1311
|
}
|
|
1715
|
-
|
|
1716
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (stems.size === 1 || <span class="branch-1 cbranch-no" title="branch not covered" >domains.size === 1) r</span>eturn true;
|
|
1717
|
-
|
|
1718
|
-
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
1312
|
+
<span class="cstat-no" title="statement not covered" > return candidates.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) => <span class="cstat-no" title="statement not covered" >b.strength - a.strength)</span>;</span>
|
|
1719
1313
|
}
|
|
1720
1314
|
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1315
|
+
// src/index.ts
|
|
1316
|
+
ToolRegistry.register(ContextAnalyzerProvider);
|
|
1317
|
+
export {
|
|
1318
|
+
BARREL_EXPORT_MIN_EXPORTS,
|
|
1319
|
+
BARREL_EXPORT_TOKEN_LIMIT,
|
|
1320
|
+
CONFIG_NAME_PATTERNS,
|
|
1321
|
+
Classification,
|
|
1322
|
+
ContextAnalyzerProvider,
|
|
1323
|
+
EMAIL_NAME_PATTERNS,
|
|
1324
|
+
HANDLER_NAME_PATTERNS,
|
|
1325
|
+
NEXTJS_METADATA_EXPORTS,
|
|
1326
|
+
PARSER_NAME_PATTERNS,
|
|
1327
|
+
SERVICE_NAME_PATTERNS,
|
|
1328
|
+
SESSION_NAME_PATTERNS,
|
|
1329
|
+
adjustCohesionForClassification,
|
|
1330
|
+
adjustFragmentationForClassification,
|
|
1331
|
+
analyzeContext,
|
|
1332
|
+
buildCoUsageMatrix,
|
|
1333
|
+
buildDependencyGraph,
|
|
1334
|
+
buildTypeGraph,
|
|
1335
|
+
calculateCohesion,
|
|
1336
|
+
calculateContextBudget,
|
|
1337
|
+
calculateContextScore,
|
|
1338
|
+
calculateDirectoryDistance,
|
|
1339
|
+
calculateDomainConfidence,
|
|
1340
|
+
calculateEnhancedCohesion,
|
|
1341
|
+
calculateFragmentation,
|
|
1342
|
+
calculateImportDepth,
|
|
1343
|
+
calculatePathEntropy,
|
|
1344
|
+
calculateStructuralCohesionFromCoUsage,
|
|
1345
|
+
classifyFile,
|
|
1346
|
+
detectCircularDependencies,
|
|
1347
|
+
detectModuleClusters,
|
|
1348
|
+
displayConsoleReport,
|
|
1349
|
+
extractDomainKeywordsFromPaths,
|
|
1350
|
+
extractExports,
|
|
1351
|
+
findConsolidationCandidates,
|
|
1352
|
+
findSemanticClusters,
|
|
1353
|
+
generateHTMLReport,
|
|
1354
|
+
generateSummary,
|
|
1355
|
+
getClassificationRecommendations,
|
|
1356
|
+
getCoUsageData,
|
|
1357
|
+
getGeneralRecommendations,
|
|
1358
|
+
getSmartDefaults,
|
|
1359
|
+
getTransitiveDependencies,
|
|
1360
|
+
inferDomain,
|
|
1361
|
+
inferDomainFromSemantics,
|
|
1362
|
+
isBarrelExport,
|
|
1363
|
+
isBoilerplateBarrel,
|
|
1364
|
+
isConfigFile,
|
|
1365
|
+
isEmailTemplate,
|
|
1366
|
+
isHubAndSpokeFile,
|
|
1367
|
+
isLambdaHandler,
|
|
1368
|
+
isNextJsPage,
|
|
1369
|
+
isParserFile,
|
|
1370
|
+
isServiceFile,
|
|
1371
|
+
isSessionFile,
|
|
1372
|
+
isTypeDefinition,
|
|
1373
|
+
isUtilityModule,
|
|
1374
|
+
mapScoreToRating,
|
|
1375
|
+
runInteractiveSetup
|
|
1376
|
+
};
|
|
1752
1377
|
</pre></td></tr></table></pre>
|
|
1753
1378
|
|
|
1754
1379
|
<div class='push'></div><!-- for sticky footer -->
|
|
@@ -1756,16 +1381,16 @@ export function adjustFragmentationForClassification(
|
|
|
1756
1381
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
1757
1382
|
Code coverage generated by
|
|
1758
1383
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1759
|
-
at 2026-03-
|
|
1384
|
+
at 2026-03-21T12:52:37.698Z
|
|
1760
1385
|
</div>
|
|
1761
|
-
<script src="prettify.js"></script>
|
|
1386
|
+
<script src="../prettify.js"></script>
|
|
1762
1387
|
<script>
|
|
1763
1388
|
window.onload = function () {
|
|
1764
1389
|
prettyPrint();
|
|
1765
1390
|
};
|
|
1766
1391
|
</script>
|
|
1767
|
-
<script src="sorter.js"></script>
|
|
1768
|
-
<script src="block-navigation.js"></script>
|
|
1392
|
+
<script src="../sorter.js"></script>
|
|
1393
|
+
<script src="../block-navigation.js"></script>
|
|
1769
1394
|
</body>
|
|
1770
1395
|
</html>
|
|
1771
1396
|
|