superacli 1.1.13 → 1.1.14
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/.agents/skills/humanenv-usage/SKILL.md +19 -0
- package/AGENTS.md +62 -0
- package/CONTRIBUTING.md +6 -2
- package/cli/plugin-install-guidance.js +25 -11
- package/cli/plugins-registry.js +25 -6
- package/cli/skills-catalog.js +85 -10
- package/coverage/clover.xml +1073 -965
- package/coverage/lcov-report/cli/adapter-schema.js.html +32 -32
- package/coverage/lcov-report/cli/adapters/builtin.js.html +1 -1
- package/coverage/lcov-report/cli/adapters/http.js.html +1 -1
- package/coverage/lcov-report/cli/adapters/index.html +1 -1
- package/coverage/lcov-report/cli/adapters/mcp.js.html +1 -1
- package/coverage/lcov-report/cli/adapters/openapi.js.html +1 -1
- package/coverage/lcov-report/cli/adapters/process.js.html +1 -1
- package/coverage/lcov-report/cli/adapters/shell.js.html +1 -1
- package/coverage/lcov-report/cli/ask.js.html +1 -1
- package/coverage/lcov-report/cli/config.js.html +109 -109
- package/coverage/lcov-report/cli/discover.js.html +1 -1
- package/coverage/lcov-report/cli/executor.js.html +1 -1
- package/coverage/lcov-report/cli/help-json.js.html +1 -1
- package/coverage/lcov-report/cli/index.html +92 -92
- package/coverage/lcov-report/cli/mcp-diagnostics.js.html +1 -1
- package/coverage/lcov-report/cli/mcp-discovery.js.html +1 -1
- package/coverage/lcov-report/cli/mcp-local.js.html +1 -1
- package/coverage/lcov-report/cli/mcp-stdio-jsonrpc.js.html +1 -1
- package/coverage/lcov-report/cli/namespace-passthrough.js.html +1 -1
- package/coverage/lcov-report/cli/plan-runtime.js.html +1 -1
- package/coverage/lcov-report/cli/planner.js.html +1 -1
- package/coverage/lcov-report/cli/plugin-install-guidance.js.html +919 -877
- package/coverage/lcov-report/cli/plugins-command.js.html +452 -452
- package/coverage/lcov-report/cli/plugins-learn.js.html +60 -60
- package/coverage/lcov-report/cli/plugins-manager.js.html +133 -133
- package/coverage/lcov-report/cli/plugins-registry.js.html +105 -48
- package/coverage/lcov-report/cli/plugins-store.js.html +106 -106
- package/coverage/lcov-report/cli/skills-catalog.js.html +366 -141
- package/coverage/lcov-report/cli/skills-mcp.js.html +1 -1
- package/coverage/lcov-report/cli/skills.js.html +1 -1
- package/coverage/lcov-report/index.html +19 -19
- package/coverage/lcov-report/server/app.js.html +1 -1
- package/coverage/lcov-report/server/index.html +1 -1
- package/coverage/lcov-report/server/routes/ask.js.html +1 -1
- package/coverage/lcov-report/server/routes/commands.js.html +1 -1
- package/coverage/lcov-report/server/routes/config.js.html +1 -1
- package/coverage/lcov-report/server/routes/index.html +1 -1
- package/coverage/lcov-report/server/routes/jobs.js.html +1 -1
- package/coverage/lcov-report/server/routes/mcp.js.html +1 -1
- package/coverage/lcov-report/server/routes/plans.js.html +1 -1
- package/coverage/lcov-report/server/routes/plugins.js.html +1 -1
- package/coverage/lcov-report/server/routes/specs.js.html +1 -1
- package/coverage/lcov-report/server/services/configService.js.html +1 -1
- package/coverage/lcov-report/server/services/index.html +1 -1
- package/coverage/lcov-report/server/services/pluginsService.js.html +1 -1
- package/coverage/lcov-report/server/storage/adapter.js.html +1 -1
- package/coverage/lcov-report/server/storage/file.js.html +1 -1
- package/coverage/lcov-report/server/storage/index.html +1 -1
- package/coverage/lcov-report/server/storage/mongo.js.html +1 -1
- package/coverage/lcov.info +1423 -1120
- package/package.json +1 -1
- package/plugins/beads/install-guidance.json +10 -0
- package/plugins/beads/meta.json +5 -0
- package/plugins/codedb/meta.json +5 -0
- package/plugins/codedb/plugin.json +169 -0
- package/plugins/codedb/skills/quickstart/SKILL.md +65 -0
- package/plugins/humanenv/.agents/skills/humanenv-sdk-python-usage/SKILL.md +37 -0
- package/plugins/humanenv/.agents/skills/humanenv-usage/SKILL.md +32 -0
- package/plugins/humanenv/plugin.json +65 -0
- package/plugins/humanenv/skills/quickstart/SKILL.md +95 -0
- package/plugins/mmx/install-guidance.json +10 -0
- package/plugins/mmx/meta.json +5 -0
- package/plugins/mmx/plugin.json +413 -0
- package/plugins/mmx/skills/quickstart/SKILL.md +234 -0
- package/plugins/plugins.json +21 -9
- package/plugins/rtk/README.md +63 -0
- package/plugins/rtk/plugin.json +79 -0
- package/plugins/rtk/skills/quickstart/SKILL.md +78 -0
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">8.55% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>39/456</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">100% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>0/
|
|
35
|
+
<span class='fraction'>0/0</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
40
|
<span class="strong">0% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>0/
|
|
42
|
+
<span class='fraction'>0/23</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">8.55% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>39/456</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -519,42 +519,27 @@
|
|
|
519
519
|
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
520
|
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
521
|
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
-
<a name='L457'></a><a href='#L457'>457</a></td><td class="line-coverage quiet"><span class="cline-any cline-
|
|
523
|
-
<span class="cline-any cline-
|
|
524
|
-
<span class="cline-any cline-
|
|
525
|
-
<span class="cline-any cline-
|
|
526
|
-
<span class="cline-any cline-
|
|
527
|
-
<span class="cline-any cline-
|
|
528
|
-
<span class="cline-any cline-
|
|
529
|
-
<span class="cline-any cline-
|
|
530
|
-
<span class="cline-any cline-
|
|
531
|
-
<span class="cline-any cline-
|
|
532
|
-
<span class="cline-any cline-
|
|
533
|
-
<span class="cline-any cline-
|
|
534
|
-
<span class="cline-any cline-
|
|
535
|
-
<span class="cline-any cline-
|
|
536
|
-
<span class="cline-any cline-
|
|
537
|
-
<span class="cline-any cline-no"> </span>
|
|
538
|
-
<span class="cline-any cline-no"> </span>
|
|
539
|
-
<span class="cline-any cline-no"> </span>
|
|
540
|
-
<span class="cline-any cline-no"> </span>
|
|
541
|
-
<span class="cline-any cline-no"> </span>
|
|
542
|
-
<span class="cline-any cline-no"> </span>
|
|
543
|
-
<span class="cline-any cline-no"> </span>
|
|
544
|
-
<span class="cline-any cline-no"> </span>
|
|
545
|
-
<span class="cline-any cline-no"> </span>
|
|
546
|
-
<span class="cline-any cline-no"> </span>
|
|
547
|
-
<span class="cline-any cline-no"> </span>
|
|
548
|
-
<span class="cline-any cline-no"> </span>
|
|
549
|
-
<span class="cline-any cline-no"> </span>
|
|
550
|
-
<span class="cline-any cline-no"> </span>
|
|
551
|
-
<span class="cline-any cline-no"> </span>
|
|
552
|
-
<span class="cline-any cline-no"> </span>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
523
|
+
<span class="cline-any cline-yes">1x</span>
|
|
524
|
+
<span class="cline-any cline-yes">1x</span>
|
|
525
|
+
<span class="cline-any cline-yes">1x</span>
|
|
526
|
+
<span class="cline-any cline-yes">1x</span>
|
|
527
|
+
<span class="cline-any cline-yes">1x</span>
|
|
528
|
+
<span class="cline-any cline-yes">1x</span>
|
|
529
|
+
<span class="cline-any cline-yes">1x</span>
|
|
530
|
+
<span class="cline-any cline-yes">1x</span>
|
|
531
|
+
<span class="cline-any cline-yes">1x</span>
|
|
532
|
+
<span class="cline-any cline-yes">1x</span>
|
|
533
|
+
<span class="cline-any cline-yes">1x</span>
|
|
534
|
+
<span class="cline-any cline-yes">1x</span>
|
|
535
|
+
<span class="cline-any cline-yes">1x</span>
|
|
536
|
+
<span class="cline-any cline-yes">1x</span>
|
|
553
537
|
<span class="cline-any cline-no"> </span>
|
|
554
538
|
<span class="cline-any cline-no"> </span>
|
|
555
539
|
<span class="cline-any cline-no"> </span>
|
|
556
540
|
<span class="cline-any cline-no"> </span>
|
|
557
541
|
<span class="cline-any cline-no"> </span>
|
|
542
|
+
<span class="cline-any cline-yes">1x</span>
|
|
558
543
|
<span class="cline-any cline-no"> </span>
|
|
559
544
|
<span class="cline-any cline-no"> </span>
|
|
560
545
|
<span class="cline-any cline-no"> </span>
|
|
@@ -567,6 +552,7 @@
|
|
|
567
552
|
<span class="cline-any cline-no"> </span>
|
|
568
553
|
<span class="cline-any cline-no"> </span>
|
|
569
554
|
<span class="cline-any cline-no"> </span>
|
|
555
|
+
<span class="cline-any cline-yes">1x</span>
|
|
570
556
|
<span class="cline-any cline-no"> </span>
|
|
571
557
|
<span class="cline-any cline-no"> </span>
|
|
572
558
|
<span class="cline-any cline-no"> </span>
|
|
@@ -584,6 +570,7 @@
|
|
|
584
570
|
<span class="cline-any cline-no"> </span>
|
|
585
571
|
<span class="cline-any cline-no"> </span>
|
|
586
572
|
<span class="cline-any cline-no"> </span>
|
|
573
|
+
<span class="cline-any cline-yes">1x</span>
|
|
587
574
|
<span class="cline-any cline-no"> </span>
|
|
588
575
|
<span class="cline-any cline-no"> </span>
|
|
589
576
|
<span class="cline-any cline-no"> </span>
|
|
@@ -607,6 +594,7 @@
|
|
|
607
594
|
<span class="cline-any cline-no"> </span>
|
|
608
595
|
<span class="cline-any cline-no"> </span>
|
|
609
596
|
<span class="cline-any cline-no"> </span>
|
|
597
|
+
<span class="cline-any cline-yes">1x</span>
|
|
610
598
|
<span class="cline-any cline-no"> </span>
|
|
611
599
|
<span class="cline-any cline-no"> </span>
|
|
612
600
|
<span class="cline-any cline-no"> </span>
|
|
@@ -614,6 +602,7 @@
|
|
|
614
602
|
<span class="cline-any cline-no"> </span>
|
|
615
603
|
<span class="cline-any cline-no"> </span>
|
|
616
604
|
<span class="cline-any cline-no"> </span>
|
|
605
|
+
<span class="cline-any cline-yes">1x</span>
|
|
617
606
|
<span class="cline-any cline-no"> </span>
|
|
618
607
|
<span class="cline-any cline-no"> </span>
|
|
619
608
|
<span class="cline-any cline-no"> </span>
|
|
@@ -623,6 +612,7 @@
|
|
|
623
612
|
<span class="cline-any cline-no"> </span>
|
|
624
613
|
<span class="cline-any cline-no"> </span>
|
|
625
614
|
<span class="cline-any cline-no"> </span>
|
|
615
|
+
<span class="cline-any cline-yes">1x</span>
|
|
626
616
|
<span class="cline-any cline-no"> </span>
|
|
627
617
|
<span class="cline-any cline-no"> </span>
|
|
628
618
|
<span class="cline-any cline-no"> </span>
|
|
@@ -630,6 +620,7 @@
|
|
|
630
620
|
<span class="cline-any cline-no"> </span>
|
|
631
621
|
<span class="cline-any cline-no"> </span>
|
|
632
622
|
<span class="cline-any cline-no"> </span>
|
|
623
|
+
<span class="cline-any cline-yes">1x</span>
|
|
633
624
|
<span class="cline-any cline-no"> </span>
|
|
634
625
|
<span class="cline-any cline-no"> </span>
|
|
635
626
|
<span class="cline-any cline-no"> </span>
|
|
@@ -639,6 +630,7 @@
|
|
|
639
630
|
<span class="cline-any cline-no"> </span>
|
|
640
631
|
<span class="cline-any cline-no"> </span>
|
|
641
632
|
<span class="cline-any cline-no"> </span>
|
|
633
|
+
<span class="cline-any cline-yes">1x</span>
|
|
642
634
|
<span class="cline-any cline-no"> </span>
|
|
643
635
|
<span class="cline-any cline-no"> </span>
|
|
644
636
|
<span class="cline-any cline-no"> </span>
|
|
@@ -649,18 +641,22 @@
|
|
|
649
641
|
<span class="cline-any cline-no"> </span>
|
|
650
642
|
<span class="cline-any cline-no"> </span>
|
|
651
643
|
<span class="cline-any cline-no"> </span>
|
|
644
|
+
<span class="cline-any cline-yes">1x</span>
|
|
652
645
|
<span class="cline-any cline-no"> </span>
|
|
653
646
|
<span class="cline-any cline-no"> </span>
|
|
654
647
|
<span class="cline-any cline-no"> </span>
|
|
648
|
+
<span class="cline-any cline-yes">1x</span>
|
|
655
649
|
<span class="cline-any cline-no"> </span>
|
|
656
650
|
<span class="cline-any cline-no"> </span>
|
|
657
651
|
<span class="cline-any cline-no"> </span>
|
|
658
652
|
<span class="cline-any cline-no"> </span>
|
|
653
|
+
<span class="cline-any cline-yes">1x</span>
|
|
659
654
|
<span class="cline-any cline-no"> </span>
|
|
660
655
|
<span class="cline-any cline-no"> </span>
|
|
661
656
|
<span class="cline-any cline-no"> </span>
|
|
662
657
|
<span class="cline-any cline-no"> </span>
|
|
663
658
|
<span class="cline-any cline-no"> </span>
|
|
659
|
+
<span class="cline-any cline-yes">1x</span>
|
|
664
660
|
<span class="cline-any cline-no"> </span>
|
|
665
661
|
<span class="cline-any cline-no"> </span>
|
|
666
662
|
<span class="cline-any cline-no"> </span>
|
|
@@ -700,11 +696,13 @@
|
|
|
700
696
|
<span class="cline-any cline-no"> </span>
|
|
701
697
|
<span class="cline-any cline-no"> </span>
|
|
702
698
|
<span class="cline-any cline-no"> </span>
|
|
699
|
+
<span class="cline-any cline-yes">1x</span>
|
|
703
700
|
<span class="cline-any cline-no"> </span>
|
|
704
701
|
<span class="cline-any cline-no"> </span>
|
|
705
702
|
<span class="cline-any cline-no"> </span>
|
|
706
703
|
<span class="cline-any cline-no"> </span>
|
|
707
704
|
<span class="cline-any cline-no"> </span>
|
|
705
|
+
<span class="cline-any cline-yes">1x</span>
|
|
708
706
|
<span class="cline-any cline-no"> </span>
|
|
709
707
|
<span class="cline-any cline-no"> </span>
|
|
710
708
|
<span class="cline-any cline-no"> </span>
|
|
@@ -729,6 +727,7 @@
|
|
|
729
727
|
<span class="cline-any cline-no"> </span>
|
|
730
728
|
<span class="cline-any cline-no"> </span>
|
|
731
729
|
<span class="cline-any cline-no"> </span>
|
|
730
|
+
<span class="cline-any cline-yes">1x</span>
|
|
732
731
|
<span class="cline-any cline-no"> </span>
|
|
733
732
|
<span class="cline-any cline-no"> </span>
|
|
734
733
|
<span class="cline-any cline-no"> </span>
|
|
@@ -851,6 +850,7 @@
|
|
|
851
850
|
<span class="cline-any cline-no"> </span>
|
|
852
851
|
<span class="cline-any cline-no"> </span>
|
|
853
852
|
<span class="cline-any cline-no"> </span>
|
|
853
|
+
<span class="cline-any cline-yes">1x</span>
|
|
854
854
|
<span class="cline-any cline-no"> </span>
|
|
855
855
|
<span class="cline-any cline-no"> </span>
|
|
856
856
|
<span class="cline-any cline-no"> </span>
|
|
@@ -895,6 +895,7 @@
|
|
|
895
895
|
<span class="cline-any cline-no"> </span>
|
|
896
896
|
<span class="cline-any cline-no"> </span>
|
|
897
897
|
<span class="cline-any cline-no"> </span>
|
|
898
|
+
<span class="cline-any cline-yes">1x</span>
|
|
898
899
|
<span class="cline-any cline-no"> </span>
|
|
899
900
|
<span class="cline-any cline-no"> </span>
|
|
900
901
|
<span class="cline-any cline-no"> </span>
|
|
@@ -913,6 +914,7 @@
|
|
|
913
914
|
<span class="cline-any cline-no"> </span>
|
|
914
915
|
<span class="cline-any cline-no"> </span>
|
|
915
916
|
<span class="cline-any cline-no"> </span>
|
|
917
|
+
<span class="cline-any cline-yes">1x</span>
|
|
916
918
|
<span class="cline-any cline-no"> </span>
|
|
917
919
|
<span class="cline-any cline-no"> </span>
|
|
918
920
|
<span class="cline-any cline-no"> </span>
|
|
@@ -922,10 +924,12 @@
|
|
|
922
924
|
<span class="cline-any cline-no"> </span>
|
|
923
925
|
<span class="cline-any cline-no"> </span>
|
|
924
926
|
<span class="cline-any cline-no"> </span>
|
|
927
|
+
<span class="cline-any cline-yes">1x</span>
|
|
925
928
|
<span class="cline-any cline-no"> </span>
|
|
926
929
|
<span class="cline-any cline-no"> </span>
|
|
927
930
|
<span class="cline-any cline-no"> </span>
|
|
928
931
|
<span class="cline-any cline-no"> </span>
|
|
932
|
+
<span class="cline-any cline-yes">1x</span>
|
|
929
933
|
<span class="cline-any cline-no"> </span>
|
|
930
934
|
<span class="cline-any cline-no"> </span>
|
|
931
935
|
<span class="cline-any cline-no"> </span>
|
|
@@ -941,6 +945,7 @@
|
|
|
941
945
|
<span class="cline-any cline-no"> </span>
|
|
942
946
|
<span class="cline-any cline-no"> </span>
|
|
943
947
|
<span class="cline-any cline-no"> </span>
|
|
948
|
+
<span class="cline-any cline-yes">1x</span>
|
|
944
949
|
<span class="cline-any cline-no"> </span>
|
|
945
950
|
<span class="cline-any cline-no"> </span>
|
|
946
951
|
<span class="cline-any cline-no"> </span>
|
|
@@ -950,6 +955,7 @@
|
|
|
950
955
|
<span class="cline-any cline-no"> </span>
|
|
951
956
|
<span class="cline-any cline-no"> </span>
|
|
952
957
|
<span class="cline-any cline-no"> </span>
|
|
958
|
+
<span class="cline-any cline-yes">1x</span>
|
|
953
959
|
<span class="cline-any cline-no"> </span>
|
|
954
960
|
<span class="cline-any cline-no"> </span>
|
|
955
961
|
<span class="cline-any cline-no"> </span>
|
|
@@ -967,36 +973,30 @@
|
|
|
967
973
|
<span class="cline-any cline-no"> </span>
|
|
968
974
|
<span class="cline-any cline-no"> </span>
|
|
969
975
|
<span class="cline-any cline-no"> </span>
|
|
970
|
-
<span class="cline-any cline-
|
|
971
|
-
<span class="cline-any cline-
|
|
972
|
-
<span class="cline-any cline-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
<span class="cstat-no" title="statement not covered"
|
|
988
|
-
<span class="cstat-no" title="statement not covered" >const { spawnSync } = require("child_process")</span>
|
|
989
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
990
|
-
<span class="cstat-no" title="statement not covered" >const CACHE_DIR = path.join(os.homedir(), ".supercli")</span>
|
|
991
|
-
<span class="cstat-no" title="statement not covered" >const CACHE_FILE = path.join(CACHE_DIR, "config.json")</span>
|
|
992
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
993
|
-
<span class="cstat-no" title="statement not covered" >function ensureCacheDir() {</span>
|
|
976
|
+
<span class="cline-any cline-yes">1x</span>
|
|
977
|
+
<span class="cline-any cline-yes">1x</span>
|
|
978
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">const fs = require("fs")
|
|
979
|
+
const path = require("path")
|
|
980
|
+
const os = require("os")
|
|
981
|
+
const {
|
|
982
|
+
getEffectivePluginCommands,
|
|
983
|
+
listInstalledPlugins,
|
|
984
|
+
readServerPluginsLock,
|
|
985
|
+
writeServerPluginsLock,
|
|
986
|
+
SUPERCLI_PLUGINS_DIR,
|
|
987
|
+
} = require("./plugins-store")
|
|
988
|
+
const { spawnSync } = require("child_process")
|
|
989
|
+
|
|
990
|
+
const CACHE_DIR = path.join(os.homedir(), ".supercli")
|
|
991
|
+
const CACHE_FILE = path.join(CACHE_DIR, "config.json")
|
|
992
|
+
|
|
993
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function ensureCacheDir() {</span></span>
|
|
994
994
|
<span class="cstat-no" title="statement not covered" > if (!fs.existsSync(CACHE_DIR)) {</span>
|
|
995
995
|
<span class="cstat-no" title="statement not covered" > fs.mkdirSync(CACHE_DIR, { recursive: true })</span>
|
|
996
996
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
997
997
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
998
|
-
|
|
999
|
-
<span class="cstat-no" title="statement not covered" >function readCache() {</span>
|
|
998
|
+
|
|
999
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function readCache() {</span></span>
|
|
1000
1000
|
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1001
1001
|
<span class="cstat-no" title="statement not covered" > if (fs.existsSync(CACHE_FILE)) {</span>
|
|
1002
1002
|
<span class="cstat-no" title="statement not covered" > const raw = fs.readFileSync(CACHE_FILE, "utf-8")</span>
|
|
@@ -1008,8 +1008,8 @@
|
|
|
1008
1008
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1009
1009
|
<span class="cstat-no" title="statement not covered" > return null</span>
|
|
1010
1010
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1011
|
-
|
|
1012
|
-
<span class="cstat-no" title="statement not covered" >function normalizeMcpServerEntry(name, entry) {</span>
|
|
1011
|
+
|
|
1012
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function normalizeMcpServerEntry(name, entry) {</span></span>
|
|
1013
1013
|
<span class="cstat-no" title="statement not covered" > if (!name || typeof name !== "string") return null</span>
|
|
1014
1014
|
<span class="cstat-no" title="statement not covered" > if (!entry || typeof entry !== "object" || Array.isArray(entry)) return null</span>
|
|
1015
1015
|
<span class="cstat-no" title="statement not covered" > const out = { name }</span>
|
|
@@ -1026,8 +1026,8 @@
|
|
|
1026
1026
|
<span class="cstat-no" title="statement not covered" > if (typeof entry.timeout_ms === "number" && entry.timeout_ms > 0) out.timeout_ms = entry.timeout_ms</span>
|
|
1027
1027
|
<span class="cstat-no" title="statement not covered" > return out</span>
|
|
1028
1028
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1029
|
-
|
|
1030
|
-
<span class="cstat-no" title="statement not covered" >function normalizeMcpServers(config) {</span>
|
|
1029
|
+
|
|
1030
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function normalizeMcpServers(config) {</span></span>
|
|
1031
1031
|
<span class="cstat-no" title="statement not covered" > const out = []</span>
|
|
1032
1032
|
<span class="cstat-no" title="statement not covered" > const byName = new Map()</span>
|
|
1033
1033
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
@@ -1050,16 +1050,16 @@
|
|
|
1050
1050
|
<span class="cstat-no" title="statement not covered" > out.sort((a, b) => a.name.localeCompare(b.name))</span>
|
|
1051
1051
|
<span class="cstat-no" title="statement not covered" > return out</span>
|
|
1052
1052
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1053
|
-
|
|
1054
|
-
<span class="cstat-no" title="statement not covered" >function normalizeConfig(config) {</span>
|
|
1053
|
+
|
|
1054
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function normalizeConfig(config) {</span></span>
|
|
1055
1055
|
<span class="cstat-no" title="statement not covered" > const base = config && typeof config === "object" ? { ...config } : emptyConfig()</span>
|
|
1056
1056
|
<span class="cstat-no" title="statement not covered" > base.mcp_servers = normalizeMcpServers(base)</span>
|
|
1057
1057
|
<span class="cstat-no" title="statement not covered" > if (!Array.isArray(base.specs)) base.specs = []</span>
|
|
1058
1058
|
<span class="cstat-no" title="statement not covered" > if (!Array.isArray(base.commands)) base.commands = []</span>
|
|
1059
1059
|
<span class="cstat-no" title="statement not covered" > return base</span>
|
|
1060
1060
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1061
|
-
|
|
1062
|
-
<span class="cstat-no" title="statement not covered" >function writeCache(config) {</span>
|
|
1061
|
+
|
|
1062
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function writeCache(config) {</span></span>
|
|
1063
1063
|
<span class="cstat-no" title="statement not covered" > ensureCacheDir()</span>
|
|
1064
1064
|
<span class="cstat-no" title="statement not covered" > const data = {</span>
|
|
1065
1065
|
<span class="cstat-no" title="statement not covered" > ...normalizeConfig(config),</span>
|
|
@@ -1068,16 +1068,16 @@
|
|
|
1068
1068
|
<span class="cstat-no" title="statement not covered" > fs.writeFileSync(CACHE_FILE, JSON.stringify(data, null, 2))</span>
|
|
1069
1069
|
<span class="cstat-no" title="statement not covered" > return data</span>
|
|
1070
1070
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1071
|
-
|
|
1072
|
-
<span class="cstat-no" title="statement not covered" >async function fetchRemoteConfig(server) {</span>
|
|
1071
|
+
|
|
1072
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function fetchRemoteConfig(server) {</span></span>
|
|
1073
1073
|
<span class="cstat-no" title="statement not covered" > if (!server) throw new Error("SUPERCLI_SERVER is not configured")</span>
|
|
1074
1074
|
<span class="cstat-no" title="statement not covered" > const url = `${server}/api/config`</span>
|
|
1075
1075
|
<span class="cstat-no" title="statement not covered" > const r = await fetch(url)</span>
|
|
1076
1076
|
<span class="cstat-no" title="statement not covered" > if (!r.ok) throw new Error(`Failed to fetch config: ${r.status} ${r.statusText}`)</span>
|
|
1077
1077
|
<span class="cstat-no" title="statement not covered" > return r.json()</span>
|
|
1078
1078
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1079
|
-
|
|
1080
|
-
<span class="cstat-no" title="statement not covered" >function emptyConfig() {</span>
|
|
1079
|
+
|
|
1080
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function emptyConfig() {</span></span>
|
|
1081
1081
|
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1082
1082
|
<span class="cstat-no" title="statement not covered" > version: "1",</span>
|
|
1083
1083
|
<span class="cstat-no" title="statement not covered" > ttl: 3600,</span>
|
|
@@ -1086,8 +1086,8 @@
|
|
|
1086
1086
|
<span class="cstat-no" title="statement not covered" > commands: []</span>
|
|
1087
1087
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1088
1088
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1089
|
-
|
|
1090
|
-
<span class="cstat-no" title="statement not covered" >async function loadConfig() {</span>
|
|
1089
|
+
|
|
1090
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function loadConfig() {</span></span>
|
|
1091
1091
|
<span class="cstat-no" title="statement not covered" > const cache = readCache()</span>
|
|
1092
1092
|
<span class="cstat-no" title="statement not covered" > const base = cache || emptyConfig()</span>
|
|
1093
1093
|
<span class="cstat-no" title="statement not covered" > const pluginCommands = getEffectivePluginCommands()</span>
|
|
@@ -1097,23 +1097,23 @@
|
|
|
1097
1097
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1098
1098
|
<span class="cstat-no" title="statement not covered" > return merged</span>
|
|
1099
1099
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1100
|
-
|
|
1101
|
-
<span class="cstat-no" title="statement not covered" >function safePluginName(name) {</span>
|
|
1100
|
+
|
|
1101
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function safePluginName(name) {</span></span>
|
|
1102
1102
|
<span class="cstat-no" title="statement not covered" > return String(name || "").replace(/[^a-zA-Z0-9._-]/g, "-")</span>
|
|
1103
1103
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1104
|
-
|
|
1105
|
-
<span class="cstat-no" title="statement not covered" >function safePluginVersion(version) {</span>
|
|
1104
|
+
|
|
1105
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function safePluginVersion(version) {</span></span>
|
|
1106
1106
|
<span class="cstat-no" title="statement not covered" > const value = String(version || "0.0.0").replace(/[^a-zA-Z0-9._-]/g, "-")</span>
|
|
1107
1107
|
<span class="cstat-no" title="statement not covered" > return value || "0.0.0"</span>
|
|
1108
1108
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1109
|
-
|
|
1110
|
-
<span class="cstat-no" title="statement not covered" >function resolveHooksPolicy(plugin, settings) {</span>
|
|
1109
|
+
|
|
1110
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function resolveHooksPolicy(plugin, settings) {</span></span>
|
|
1111
1111
|
<span class="cstat-no" title="statement not covered" > const pluginPolicy = String(plugin.hooks_policy || "inherit")</span>
|
|
1112
1112
|
<span class="cstat-no" title="statement not covered" > if (pluginPolicy === "allow" || pluginPolicy === "deny") return pluginPolicy</span>
|
|
1113
1113
|
<span class="cstat-no" title="statement not covered" > return String(settings.default_hooks_policy || "deny")</span>
|
|
1114
1114
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1115
|
-
|
|
1116
|
-
<span class="cstat-no" title="statement not covered" >function runServerPluginPostInstall(pluginDir, plugin, hookPolicy) {</span>
|
|
1115
|
+
|
|
1116
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function runServerPluginPostInstall(pluginDir, plugin, hookPolicy) {</span></span>
|
|
1117
1117
|
<span class="cstat-no" title="statement not covered" > const manifest = plugin.manifest || {}</span>
|
|
1118
1118
|
<span class="cstat-no" title="statement not covered" > if (!manifest.post_install || hookPolicy !== "allow") {</span>
|
|
1119
1119
|
<span class="cstat-no" title="statement not covered" > return { policy: hookPolicy, executed: false, reason: hookPolicy !== "allow" ? "policy_denied" : "hook_missing" }</span>
|
|
@@ -1152,14 +1152,14 @@
|
|
|
1152
1152
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1153
1153
|
<span class="cstat-no" title="statement not covered" > return { policy: hookPolicy, executed: true, ok: true }</span>
|
|
1154
1154
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1155
|
-
|
|
1156
|
-
<span class="cstat-no" title="statement not covered" >function ensurePluginDir(rootDir, pluginName, pluginVersion) {</span>
|
|
1155
|
+
|
|
1156
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function ensurePluginDir(rootDir, pluginName, pluginVersion) {</span></span>
|
|
1157
1157
|
<span class="cstat-no" title="statement not covered" > const dir = path.join(rootDir, safePluginName(pluginName), safePluginVersion(pluginVersion))</span>
|
|
1158
1158
|
<span class="cstat-no" title="statement not covered" > fs.mkdirSync(dir, { recursive: true })</span>
|
|
1159
1159
|
<span class="cstat-no" title="statement not covered" > return dir</span>
|
|
1160
1160
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1161
|
-
|
|
1162
|
-
<span class="cstat-no" title="statement not covered" >function extractZipToDir(archivePath, targetDir) {</span>
|
|
1161
|
+
|
|
1162
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function extractZipToDir(archivePath, targetDir) {</span></span>
|
|
1163
1163
|
<span class="cstat-no" title="statement not covered" > const extract = spawnSync("unzip", ["-o", archivePath, "-d", targetDir], {</span>
|
|
1164
1164
|
<span class="cstat-no" title="statement not covered" > encoding: "utf-8",</span>
|
|
1165
1165
|
<span class="cstat-no" title="statement not covered" > timeout: 15000,</span>
|
|
@@ -1183,8 +1183,8 @@
|
|
|
1183
1183
|
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1184
1184
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1185
1185
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1186
|
-
|
|
1187
|
-
<span class="cstat-no" title="statement not covered" >async function syncServerPlugins(server) {</span>
|
|
1186
|
+
|
|
1187
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function syncServerPlugins(server) {</span></span>
|
|
1188
1188
|
<span class="cstat-no" title="statement not covered" > const lock = readServerPluginsLock()</span>
|
|
1189
1189
|
<span class="cstat-no" title="statement not covered" > const installed = lock.installed || {}</span>
|
|
1190
1190
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
@@ -1306,8 +1306,8 @@
|
|
|
1306
1306
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
1307
1307
|
<span class="cstat-no" title="statement not covered" > return diagnostics</span>
|
|
1308
1308
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1309
|
-
|
|
1310
|
-
<span class="cstat-no" title="statement not covered" >async function syncConfig(server) {</span>
|
|
1309
|
+
|
|
1310
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function syncConfig(server) {</span></span>
|
|
1311
1311
|
<span class="cstat-no" title="statement not covered" > const config = await fetchRemoteConfig(server)</span>
|
|
1312
1312
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
1313
1313
|
<span class="cstat-no" title="statement not covered" > if (!Array.isArray(config.mcp_servers)) {</span>
|
|
@@ -1351,8 +1351,8 @@
|
|
|
1351
1351
|
<span class="cstat-no" title="statement not covered" > server_plugins: serverPlugins,</span>
|
|
1352
1352
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1353
1353
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1354
|
-
|
|
1355
|
-
<span class="cstat-no" title="statement not covered" >async function setMcpServer(name, value) {</span>
|
|
1354
|
+
|
|
1355
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function setMcpServer(name, value) {</span></span>
|
|
1356
1356
|
<span class="cstat-no" title="statement not covered" > const cfg = readCache() || emptyConfig()</span>
|
|
1357
1357
|
<span class="cstat-no" title="statement not covered" > const servers = Array.isArray(cfg.mcp_servers) ? cfg.mcp_servers.slice() : []</span>
|
|
1358
1358
|
<span class="cstat-no" title="statement not covered" > const idx = servers.findIndex(s => s && s.name === name)</span>
|
|
@@ -1370,8 +1370,8 @@
|
|
|
1370
1370
|
<span class="cstat-no" title="statement not covered" > cfg.mcp_servers = normalizeMcpServers({ mcp_servers: servers })</span>
|
|
1371
1371
|
<span class="cstat-no" title="statement not covered" > return writeCache(cfg)</span>
|
|
1372
1372
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1373
|
-
|
|
1374
|
-
<span class="cstat-no" title="statement not covered" >async function removeMcpServer(name) {</span>
|
|
1373
|
+
|
|
1374
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function removeMcpServer(name) {</span></span>
|
|
1375
1375
|
<span class="cstat-no" title="statement not covered" > const cfg = readCache() || emptyConfig()</span>
|
|
1376
1376
|
<span class="cstat-no" title="statement not covered" > const servers = Array.isArray(cfg.mcp_servers) ? cfg.mcp_servers : []</span>
|
|
1377
1377
|
<span class="cstat-no" title="statement not covered" > const next = servers.filter(s => s && s.name !== name)</span>
|
|
@@ -1380,13 +1380,13 @@
|
|
|
1380
1380
|
<span class="cstat-no" title="statement not covered" > writeCache(cfg)</span>
|
|
1381
1381
|
<span class="cstat-no" title="statement not covered" > return removed</span>
|
|
1382
1382
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1383
|
-
|
|
1384
|
-
<span class="cstat-no" title="statement not covered" >async function listMcpServers() {</span>
|
|
1383
|
+
|
|
1384
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function listMcpServers() {</span></span>
|
|
1385
1385
|
<span class="cstat-no" title="statement not covered" > const cfg = await loadConfig()</span>
|
|
1386
1386
|
<span class="cstat-no" title="statement not covered" > return Array.isArray(cfg.mcp_servers) ? cfg.mcp_servers : []</span>
|
|
1387
1387
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1388
|
-
|
|
1389
|
-
<span class="cstat-no" title="statement not covered" >async function upsertCommand(commandDef) {</span>
|
|
1388
|
+
|
|
1389
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function upsertCommand(commandDef) {</span></span>
|
|
1390
1390
|
<span class="cstat-no" title="statement not covered" > const cfg = readCache() || emptyConfig()</span>
|
|
1391
1391
|
<span class="cstat-no" title="statement not covered" > const commands = Array.isArray(cfg.commands) ? cfg.commands.slice() : []</span>
|
|
1392
1392
|
<span class="cstat-no" title="statement not covered" > const idx = commands.findIndex(c =></span>
|
|
@@ -1401,8 +1401,8 @@
|
|
|
1401
1401
|
<span class="cstat-no" title="statement not covered" > writeCache(cfg)</span>
|
|
1402
1402
|
<span class="cstat-no" title="statement not covered" > return commandDef</span>
|
|
1403
1403
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1404
|
-
|
|
1405
|
-
<span class="cstat-no" title="statement not covered" >async function removeCommandsByNamespace(namespace) {</span>
|
|
1404
|
+
|
|
1405
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function removeCommandsByNamespace(namespace) {</span></span>
|
|
1406
1406
|
<span class="cstat-no" title="statement not covered" > const cfg = readCache() || emptyConfig()</span>
|
|
1407
1407
|
<span class="cstat-no" title="statement not covered" > const commands = Array.isArray(cfg.commands) ? cfg.commands : []</span>
|
|
1408
1408
|
<span class="cstat-no" title="statement not covered" > const next = commands.filter(c => !(c && c.namespace === namespace))</span>
|
|
@@ -1411,8 +1411,8 @@
|
|
|
1411
1411
|
<span class="cstat-no" title="statement not covered" > writeCache(cfg)</span>
|
|
1412
1412
|
<span class="cstat-no" title="statement not covered" > return removed</span>
|
|
1413
1413
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1414
|
-
|
|
1415
|
-
<span class="cstat-no" title="statement not covered" >async function showConfig() {</span>
|
|
1414
|
+
|
|
1415
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function showConfig() {</span></span>
|
|
1416
1416
|
<span class="cstat-no" title="statement not covered" > const cache = readCache()</span>
|
|
1417
1417
|
<span class="cstat-no" title="statement not covered" > if (!cache) {</span>
|
|
1418
1418
|
<span class="cstat-no" title="statement not covered" > return { cached: false, message: "No config cached. Set SUPERCLI_SERVER and run: supercli sync" }</span>
|
|
@@ -1429,8 +1429,8 @@
|
|
|
1429
1429
|
<span class="cstat-no" title="statement not covered" > cacheFile: CACHE_FILE</span>
|
|
1430
1430
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1431
1431
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1432
|
-
|
|
1433
|
-
|
|
1432
|
+
|
|
1433
|
+
module.exports = { loadConfig, syncConfig, showConfig, setMcpServer, removeMcpServer, listMcpServers, upsertCommand, removeCommandsByNamespace }
|
|
1434
1434
|
</pre></td></tr></table></pre>
|
|
1435
1435
|
|
|
1436
1436
|
<div class='push'></div><!-- for sticky footer -->
|
|
@@ -1438,7 +1438,7 @@
|
|
|
1438
1438
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
1439
1439
|
Code coverage generated by
|
|
1440
1440
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1441
|
-
at 2026-
|
|
1441
|
+
at 2026-04-10T17:55:25.401Z
|
|
1442
1442
|
</div>
|
|
1443
1443
|
<script src="../prettify.js"></script>
|
|
1444
1444
|
<script>
|
|
@@ -541,7 +541,7 @@
|
|
|
541
541
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
542
542
|
Code coverage generated by
|
|
543
543
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
544
|
-
at 2026-
|
|
544
|
+
at 2026-04-10T17:55:25.401Z
|
|
545
545
|
</div>
|
|
546
546
|
<script src="../prettify.js"></script>
|
|
547
547
|
<script>
|
|
@@ -436,7 +436,7 @@
|
|
|
436
436
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
437
437
|
Code coverage generated by
|
|
438
438
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
439
|
-
at 2026-
|
|
439
|
+
at 2026-04-10T17:55:25.401Z
|
|
440
440
|
</div>
|
|
441
441
|
<script src="../prettify.js"></script>
|
|
442
442
|
<script>
|
|
@@ -259,7 +259,7 @@
|
|
|
259
259
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
260
260
|
Code coverage generated by
|
|
261
261
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
262
|
-
at 2026-
|
|
262
|
+
at 2026-04-10T17:55:25.401Z
|
|
263
263
|
</div>
|
|
264
264
|
<script src="../prettify.js"></script>
|
|
265
265
|
<script>
|