@cyanheads/mcp-ts-core 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/CLAUDE.md +1 -1
  2. package/README.md +1 -1
  3. package/changelog/0.8.x/0.8.0.md +17 -15
  4. package/changelog/0.8.x/0.8.1.md +17 -0
  5. package/changelog/0.8.x/0.8.2.md +18 -0
  6. package/changelog/template.md +13 -0
  7. package/dist/logs/combined.log +4 -4
  8. package/dist/logs/error.log +4 -4
  9. package/dist/mcp-server/transports/http/landing-page/assets/copy-script.d.ts +13 -4
  10. package/dist/mcp-server/transports/http/landing-page/assets/copy-script.d.ts.map +1 -1
  11. package/dist/mcp-server/transports/http/landing-page/assets/copy-script.js +99 -25
  12. package/dist/mcp-server/transports/http/landing-page/assets/copy-script.js.map +1 -1
  13. package/dist/mcp-server/transports/http/landing-page/assets/styles.d.ts.map +1 -1
  14. package/dist/mcp-server/transports/http/landing-page/assets/styles.js +318 -8
  15. package/dist/mcp-server/transports/http/landing-page/assets/styles.js.map +1 -1
  16. package/dist/mcp-server/transports/http/landing-page/sections/status-strip.d.ts.map +1 -1
  17. package/dist/mcp-server/transports/http/landing-page/sections/status-strip.js +20 -1
  18. package/dist/mcp-server/transports/http/landing-page/sections/status-strip.js.map +1 -1
  19. package/dist/mcp-server/transports/http/landing-page/sections/tools.d.ts +6 -5
  20. package/dist/mcp-server/transports/http/landing-page/sections/tools.d.ts.map +1 -1
  21. package/dist/mcp-server/transports/http/landing-page/sections/tools.js +114 -69
  22. package/dist/mcp-server/transports/http/landing-page/sections/tools.js.map +1 -1
  23. package/package.json +1 -1
  24. package/skills/add-app-tool/SKILL.md +24 -8
  25. package/skills/add-service/SKILL.md +7 -1
  26. package/skills/add-tool/SKILL.md +3 -1
  27. package/skills/api-errors/SKILL.md +21 -1
  28. package/skills/field-test/SKILL.md +73 -13
  29. package/skills/maintenance/SKILL.md +22 -7
  30. package/templates/changelog/template.md +18 -5
@@ -196,6 +196,23 @@ pre code { background: transparent; padding: 0; border: 0; font-size: inherit; }
196
196
  gap: var(--space-6);
197
197
  }
198
198
 
199
+ /* Page-load choreography — staggered rise on the hero stack. The
200
+ "backwards" animation-fill-mode applies the from-state during the
201
+ delay so the page never flashes the final layout before animating.
202
+ Reduced-motion override at the bottom of this stylesheet collapses
203
+ the animation. */
204
+ @keyframes hero-rise {
205
+ from { opacity: 0; transform: translateY(8px); }
206
+ to { opacity: 1; transform: none; }
207
+ }
208
+ .hero > * { animation: hero-rise 600ms var(--ease-out) backwards; }
209
+ .hero > .hero-eyebrow { animation-delay: 60ms; }
210
+ .hero > .hero-title-row { animation-delay: 140ms; }
211
+ .hero > .hero-tagline { animation-delay: 220ms; }
212
+ .hero > .status-strip { animation-delay: 300ms; }
213
+ .hero > .connect { animation-delay: 380ms; }
214
+ .hero > .hero-badges { animation-delay: 460ms; }
215
+
199
216
  .hero-eyebrow {
200
217
  display: inline-flex;
201
218
  align-items: center;
@@ -270,6 +287,7 @@ pre code { background: transparent; padding: 0; border: 0; font-size: inherit; }
270
287
  font-size: 0.75rem;
271
288
  font-weight: 600;
272
289
  letter-spacing: -0.01em;
290
+ font-variant-numeric: tabular-nums;
273
291
  color: var(--accent);
274
292
  background: var(--accent-softer);
275
293
  border: 1px solid var(--accent-edge);
@@ -344,6 +362,7 @@ pre code { background: transparent; padding: 0; border: 0; font-size: inherit; }
344
362
  .status-value {
345
363
  color: var(--fg);
346
364
  font-weight: 500;
365
+ font-variant-numeric: tabular-nums;
347
366
  }
348
367
  .status-value-accent {
349
368
  color: var(--accent);
@@ -444,7 +463,14 @@ pre code { background: transparent; padding: 0; border: 0; font-size: inherit; }
444
463
  border-radius: 50%;
445
464
  background: color-mix(in oklab, var(--fg-subtle), transparent 60%);
446
465
  display: inline-block;
447
- }
466
+ transition: background var(--duration-base) var(--ease-out);
467
+ }
468
+ /* Hovering the dot cluster colors them like real OS window controls.
469
+ Pure delight — fits the terminal-chrome metaphor without adding
470
+ anything to the meaningful surface. */
471
+ .connect-chrome-dots:hover .connect-chrome-dot:nth-child(1) { background: #ff5f57; }
472
+ .connect-chrome-dots:hover .connect-chrome-dot:nth-child(2) { background: #febc2e; }
473
+ .connect-chrome-dots:hover .connect-chrome-dot:nth-child(3) { background: #28c840; }
448
474
  .connect-chrome-endpoint {
449
475
  margin-left: auto;
450
476
  font-family: var(--font-mono);
@@ -622,10 +648,164 @@ section { padding: var(--space-12) 0 0; }
622
648
  font-family: var(--font-mono);
623
649
  font-size: 0.6875rem;
624
650
  font-weight: 600;
625
- text-transform: uppercase;
626
- letter-spacing: 0.12em;
651
+ text-transform: lowercase;
652
+ letter-spacing: 0.06em;
653
+ display: flex;
654
+ align-items: baseline;
655
+ gap: var(--space-2);
656
+ position: relative;
657
+ padding-left: var(--space-3);
658
+ }
659
+ .group-heading::before {
660
+ content: "";
661
+ position: absolute;
662
+ left: 0;
663
+ top: 50%;
664
+ transform: translateY(-50%);
665
+ width: 2px;
666
+ height: 0.85em;
667
+ background: var(--accent);
668
+ border-radius: 1px;
627
669
  }
628
670
  .group-heading:first-child { margin-top: 0; }
671
+ .group-heading[data-group="read"]::before { background: #16a34a; }
672
+ .group-heading[data-group="destructive"]::before { background: #dc2626; }
673
+ .group-count {
674
+ color: var(--fg-subtle);
675
+ font-weight: 500;
676
+ font-variant-numeric: tabular-nums;
677
+ }
678
+
679
+ /* -------------------- Tool filter bar -------------------- */
680
+
681
+ .tool-filter-bar {
682
+ display: flex;
683
+ flex-wrap: wrap;
684
+ align-items: center;
685
+ gap: var(--space-3) var(--space-4);
686
+ margin-bottom: var(--space-5);
687
+ }
688
+ .tool-chips {
689
+ display: inline-flex;
690
+ flex-wrap: wrap;
691
+ gap: 4px;
692
+ }
693
+ .tool-chip {
694
+ appearance: none;
695
+ border: 1px solid var(--border);
696
+ background: var(--bg-elevated);
697
+ color: var(--fg-muted);
698
+ font-family: var(--font-mono);
699
+ font-size: 0.75rem;
700
+ font-weight: 500;
701
+ padding: 4px 10px;
702
+ border-radius: var(--radius-pill);
703
+ cursor: pointer;
704
+ letter-spacing: 0.01em;
705
+ transition:
706
+ color var(--duration-fast) var(--ease-out),
707
+ border-color var(--duration-fast) var(--ease-out),
708
+ background var(--duration-fast) var(--ease-out);
709
+ }
710
+ .tool-chip:hover { color: var(--fg); border-color: var(--border-strong); }
711
+ .tool-chip:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
712
+ .tool-chip[aria-pressed="true"] {
713
+ color: var(--accent);
714
+ background: var(--accent-softer);
715
+ border-color: var(--accent-edge);
716
+ }
717
+ .tool-chip--read[aria-pressed="true"] {
718
+ color: #16a34a;
719
+ background: color-mix(in oklab, #16a34a, transparent 92%);
720
+ border-color: color-mix(in oklab, #16a34a, transparent 72%);
721
+ }
722
+ .tool-chip--destructive[aria-pressed="true"] {
723
+ color: #dc2626;
724
+ background: color-mix(in oklab, #dc2626, transparent 92%);
725
+ border-color: color-mix(in oklab, #dc2626, transparent 72%);
726
+ }
727
+ @media (prefers-color-scheme: dark) {
728
+ .tool-chip--read[aria-pressed="true"] { color: #4ade80; }
729
+ .tool-chip--destructive[aria-pressed="true"] { color: #f87171; }
730
+ }
731
+
732
+ .tool-search {
733
+ flex: 1 1 200px;
734
+ min-width: 0;
735
+ max-width: 360px;
736
+ margin-left: auto;
737
+ display: flex;
738
+ align-items: center;
739
+ position: relative;
740
+ }
741
+ .tool-search input {
742
+ width: 100%;
743
+ font-family: var(--font-mono);
744
+ font-size: var(--text-sm);
745
+ padding: 6px 12px 6px 30px;
746
+ border: 1px solid var(--border);
747
+ border-radius: var(--radius-sm);
748
+ background: var(--bg-elevated);
749
+ color: var(--fg);
750
+ transition:
751
+ border-color var(--duration-fast) var(--ease-out),
752
+ box-shadow var(--duration-fast) var(--ease-out);
753
+ }
754
+ .tool-search input::placeholder { color: var(--fg-subtle); }
755
+ .tool-search input:focus {
756
+ outline: none;
757
+ border-color: var(--accent);
758
+ box-shadow: 0 0 0 3px var(--accent-softer);
759
+ }
760
+ .tool-search::before {
761
+ /* Search glyph — no icon font, just a styled box. */
762
+ content: "";
763
+ position: absolute;
764
+ left: 10px;
765
+ top: 50%;
766
+ width: 12px;
767
+ height: 12px;
768
+ border: 1.5px solid var(--fg-subtle);
769
+ border-radius: 50%;
770
+ transform: translateY(-50%);
771
+ pointer-events: none;
772
+ }
773
+ .tool-search::after {
774
+ content: "";
775
+ position: absolute;
776
+ left: 19px;
777
+ top: calc(50% + 4px);
778
+ width: 5px;
779
+ height: 1.5px;
780
+ background: var(--fg-subtle);
781
+ transform: rotate(45deg);
782
+ pointer-events: none;
783
+ border-radius: 1px;
784
+ }
785
+
786
+ .visually-hidden {
787
+ position: absolute;
788
+ width: 1px;
789
+ height: 1px;
790
+ padding: 0;
791
+ margin: -1px;
792
+ overflow: hidden;
793
+ clip: rect(0, 0, 0, 0);
794
+ white-space: nowrap;
795
+ border: 0;
796
+ }
797
+
798
+ .tools-empty {
799
+ margin: var(--space-6) 0;
800
+ padding: var(--space-8) var(--space-6);
801
+ text-align: center;
802
+ color: var(--fg-muted);
803
+ border: 1px dashed var(--border);
804
+ border-radius: var(--radius-md);
805
+ background: var(--bg-subtle);
806
+ font-size: var(--text-sm);
807
+ font-family: var(--font-mono);
808
+ }
629
809
 
630
810
  /* -------------------- Cards -------------------- */
631
811
 
@@ -633,7 +813,7 @@ section { padding: var(--space-12) 0 0; }
633
813
  display: grid;
634
814
  grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
635
815
  gap: var(--space-3);
636
- align-items: start;
816
+ align-items: stretch;
637
817
  }
638
818
  .card {
639
819
  border: 1px solid var(--border-subtle);
@@ -647,6 +827,30 @@ section { padding: var(--space-12) 0 0; }
647
827
  transform var(--duration-fast) var(--ease-out),
648
828
  box-shadow var(--duration-fast) var(--ease-out);
649
829
  position: relative;
830
+ height: 100%;
831
+ }
832
+
833
+ /* Mutability spine — 3px tonal strip down the left edge of each tool
834
+ card. Bird's-eye scannability: a row of cards reads as a row of
835
+ colored bars before the eye lands on any title. */
836
+ .tool-card { padding-left: calc(var(--space-5) + 3px); }
837
+ .tool-card::before {
838
+ content: "";
839
+ position: absolute;
840
+ left: 0;
841
+ top: var(--space-2);
842
+ bottom: var(--space-2);
843
+ width: 3px;
844
+ border-radius: 0 2px 2px 0;
845
+ background: var(--card-spine, var(--border-strong));
846
+ transition: background var(--duration-fast) var(--ease-out);
847
+ }
848
+ .tool-card[data-mutability="read"] { --card-spine: #16a34a; }
849
+ .tool-card[data-mutability="write"] { --card-spine: var(--border-strong); }
850
+ .tool-card[data-mutability="destructive"] { --card-spine: #dc2626; }
851
+ @media (prefers-color-scheme: dark) {
852
+ .tool-card[data-mutability="read"] { --card-spine: #4ade80; }
853
+ .tool-card[data-mutability="destructive"] { --card-spine: #f87171; }
650
854
  }
651
855
  .card:hover {
652
856
  border-color: var(--accent-edge);
@@ -674,6 +878,15 @@ section { padding: var(--space-12) 0 0; }
674
878
  color: var(--fg-muted);
675
879
  font-size: var(--text-sm);
676
880
  line-height: 1.5;
881
+ /* 3-line preview clamp keeps cards uniform; full text stays in DOM
882
+ for screen readers and view-source. Non-WebKit engines fall back
883
+ to the natural height — overflow:hidden truncates to 3 lines via
884
+ max-height as a graceful degradation. */
885
+ display: -webkit-box;
886
+ -webkit-line-clamp: 3;
887
+ -webkit-box-orient: vertical;
888
+ overflow: hidden;
889
+ max-height: calc(1.5em * 3);
677
890
  }
678
891
  .card-meta {
679
892
  display: flex;
@@ -684,7 +897,12 @@ section { padding: var(--space-12) 0 0; }
684
897
  font-family: var(--font-mono);
685
898
  align-items: center;
686
899
  }
687
- .card-meta-label { color: var(--fg-subtle); }
900
+ .card-meta-label {
901
+ color: var(--fg-subtle);
902
+ text-transform: lowercase;
903
+ letter-spacing: 0.04em;
904
+ font-size: 0.65rem;
905
+ }
688
906
  .card-meta code {
689
907
  font-size: 1em;
690
908
  color: var(--fg);
@@ -693,6 +911,96 @@ section { padding: var(--space-12) 0 0; }
693
911
  padding: 0;
694
912
  }
695
913
 
914
+ /* Card footer — pinned to the bottom so cards align across a row even
915
+ when descriptions vary in length. Carries the scope chip on the left
916
+ and the invocation/schema action triggers on the right. */
917
+ .card-foot {
918
+ margin-top: auto;
919
+ padding-top: var(--space-3);
920
+ border-top: 1px solid var(--border-subtle);
921
+ display: flex;
922
+ flex-wrap: wrap;
923
+ align-items: center;
924
+ justify-content: space-between;
925
+ gap: var(--space-2) var(--space-3);
926
+ }
927
+ .card-scope {
928
+ display: inline-flex;
929
+ align-items: center;
930
+ flex-wrap: wrap;
931
+ gap: 4px;
932
+ font-family: var(--font-mono);
933
+ font-size: var(--text-xs);
934
+ color: var(--fg-muted);
935
+ }
936
+ .scope-chip {
937
+ display: inline-flex;
938
+ align-items: center;
939
+ font-family: var(--font-mono);
940
+ font-size: 0.65rem;
941
+ font-weight: 500;
942
+ padding: 1px 6px;
943
+ border-radius: var(--radius-xs);
944
+ background: var(--bg-subtle);
945
+ color: var(--fg);
946
+ border: 1px solid var(--border-subtle);
947
+ letter-spacing: 0.02em;
948
+ }
949
+ .card-actions {
950
+ display: inline-flex;
951
+ align-items: center;
952
+ gap: var(--space-3);
953
+ margin-left: auto;
954
+ }
955
+ .card-detail { margin: 0; }
956
+ .card-detail > summary {
957
+ display: inline-flex;
958
+ align-items: center;
959
+ gap: 3px;
960
+ padding: 0;
961
+ font-family: var(--font-mono);
962
+ font-size: var(--text-xs);
963
+ color: var(--fg-muted);
964
+ cursor: pointer;
965
+ transition: color var(--duration-fast);
966
+ }
967
+ .card-detail > summary::before {
968
+ content: "▸";
969
+ display: inline-block;
970
+ font-size: 0.6rem;
971
+ transition: transform var(--duration-fast);
972
+ color: var(--fg-subtle);
973
+ }
974
+ .card-detail[open] > summary::before {
975
+ transform: rotate(90deg);
976
+ color: var(--accent);
977
+ }
978
+ .card-detail > summary:hover { color: var(--accent); }
979
+ .card-detail[open] > summary { color: var(--accent); }
980
+ /* When a detail opens, push its content full-width below the footer. The
981
+ negative side margins recover the card's horizontal padding so the
982
+ panel spans edge-to-edge. */
983
+ .card-detail[open] {
984
+ width: 100%;
985
+ margin: var(--space-3) calc(var(--space-5) * -1) calc(var(--space-4) * -1);
986
+ padding: 0 var(--space-5) var(--space-4);
987
+ background: var(--bg-subtle);
988
+ border-top: 1px solid var(--border-subtle);
989
+ }
990
+ .card-detail[open] > summary { padding-top: var(--space-3); }
991
+ /* When any detail is open the actions row needs to wrap so the open
992
+ panel can claim full width. The :has() selector handles this in
993
+ modern engines; older browsers tolerate the actions row stacking
994
+ inline-flex without the layout flip. */
995
+ .card-foot:has(.card-detail[open]) {
996
+ flex-direction: column;
997
+ align-items: stretch;
998
+ }
999
+ .card-foot:has(.card-detail[open]) .card-actions {
1000
+ width: 100%;
1001
+ margin-left: 0;
1002
+ }
1003
+
696
1004
  /* Annotation pills — dot-chip style */
697
1005
  .pill-row { display: inline-flex; flex-wrap: wrap; gap: 5px; align-items: center; }
698
1006
  .pill {
@@ -717,8 +1025,10 @@ section { padding: var(--space-12) 0 0; }
717
1025
  background: currentColor;
718
1026
  flex-shrink: 0;
719
1027
  }
720
- .pill-readonly { color: #16a34a; background: color-mix(in oklab, #16a34a, transparent 92%); border-color: color-mix(in oklab, #16a34a, transparent 72%); }
721
- .pill-destructive { color: #dc2626; background: color-mix(in oklab, #dc2626, transparent 92%); border-color: color-mix(in oklab, #dc2626, transparent 72%); }
1028
+ /* Mutability badges primary safety signal, sized to pass a squint test. */
1029
+ .pill-read { color: #16a34a; background: color-mix(in oklab, #16a34a, transparent 88%); border-color: color-mix(in oklab, #16a34a, transparent 65%); }
1030
+ .pill-write { color: var(--fg-muted); background: var(--bg-subtle); border-color: var(--border); }
1031
+ .pill-destructive { color: #dc2626; background: color-mix(in oklab, #dc2626, transparent 88%); border-color: color-mix(in oklab, #dc2626, transparent 65%); font-weight: 600; }
722
1032
  .pill-openworld { color: #2563eb; background: color-mix(in oklab, #2563eb, transparent 92%); border-color: color-mix(in oklab, #2563eb, transparent 72%); }
723
1033
  .pill-task { color: var(--accent); background: var(--accent-softer); border-color: var(--accent-edge); }
724
1034
  .pill-app { color: #9333ea; background: color-mix(in oklab, #9333ea, transparent 92%); border-color: color-mix(in oklab, #9333ea, transparent 72%); }
@@ -726,7 +1036,7 @@ section { padding: var(--space-12) 0 0; }
726
1036
  .pill-auth::before { display: none; }
727
1037
 
728
1038
  @media (prefers-color-scheme: dark) {
729
- .pill-readonly { color: #4ade80; }
1039
+ .pill-read { color: #4ade80; }
730
1040
  .pill-destructive { color: #f87171; }
731
1041
  .pill-openworld { color: #60a5fa; }
732
1042
  .pill-app { color: #c084fc; }
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/assets/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEtE,2EAA2E;AAC3E,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;IACpE,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;cAoBA,UAAU;wCACgB,UAAU;uCACX,UAAU;uCACV,UAAU;yCACR,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAq2BlD,CAAC;IACA,OAAO,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/assets/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEtE,2EAA2E;AAC3E,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;IACpE,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;cAoBA,UAAU;wCACgB,UAAU;uCACX,UAAU;uCACV,UAAU;yCACR,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2pClD,CAAC;IACA,OAAO,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;AAC5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"status-strip.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/status-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAgB,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEjE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAuCvF"}
1
+ {"version":3,"file":"status-strip.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/status-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAgB,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEjE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,GAAG,QAAQ,CA2DvF"}
@@ -14,7 +14,7 @@
14
14
  */
15
15
  import { html } from '../../../../../utils/formatting/html.js';
16
16
  export function renderStatusStrip(manifest, degraded) {
17
- const { auth, definitionCounts, protocol } = manifest;
17
+ const { auth, definitionCounts, protocol, landing } = manifest;
18
18
  const authMeta = describeAuth(auth);
19
19
  // Counts hidden in degraded mode to avoid leaking inventory shape.
20
20
  const counts = degraded
@@ -27,6 +27,24 @@ export function renderStatusStrip(manifest, degraded) {
27
27
  const signin = auth.mode === 'oauth' && auth.oauthIssuer
28
28
  ? html ` <a class="status-signin" href="${auth.oauthIssuer}" rel="noopener">sign in ↗</a>`
29
29
  : html ``;
30
+ // Repo link — same dim treatment as the count + protocol items so the
31
+ // strip stays information-dense without a flashy CTA. The "Source"
32
+ // footer entry stays for users who scroll to the bottom.
33
+ const repo = landing.repoRoot;
34
+ const repoLink = repo
35
+ ? html `
36
+ <a
37
+ class="status-item status-link"
38
+ href="${repo.url}"
39
+ rel="noopener"
40
+ title="View ${repo.owner}/${repo.repo} on GitHub"
41
+ >
42
+ <span>github</span>
43
+ <span class="status-value">${repo.owner}/${repo.repo}</span>
44
+ <span aria-hidden="true">↗</span>
45
+ </a>
46
+ `
47
+ : html ``;
30
48
  return html `
31
49
  <div class="status-strip" aria-label="${authMeta.ariaLabel}">
32
50
  <span class="status-item" title="${authMeta.ariaLabel}">
@@ -43,6 +61,7 @@ export function renderStatusStrip(manifest, degraded) {
43
61
  <span>protocol</span>
44
62
  <span class="status-value status-value-accent">${protocol.latestVersion}</span>
45
63
  </span>
64
+ ${repoLink}
46
65
  </div>
47
66
  `;
48
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status-strip.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/status-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,IAAI,EAAiB,MAAM,4BAA4B,CAAC;AAEjE,MAAM,UAAU,iBAAiB,CAAC,QAAwB,EAAE,QAAiB;IAC3E,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IAEtD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEpC,mEAAmE;IACnE,MAAM,MAAM,GAAG,QAAQ;QACrB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACE,EAAE,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;YAC7C,EAAE,CAAC,EAAE,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;YACrD,EAAE,CAAC,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;SAClD,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7B,MAAM,MAAM,GACV,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW;QACvC,CAAC,CAAC,IAAI,CAAA,mCAAmC,IAAI,CAAC,WAAW,gCAAgC;QACzF,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;IAEb,OAAO,IAAI,CAAA;4CAC+B,QAAQ,CAAC,SAAS;yCACrB,QAAQ,CAAC,SAAS;kCACzB,QAAQ,CAAC,QAAQ;qCACd,QAAQ,CAAC,KAAK,UAAU,MAAM;;QAE3D,MAAM,CAAC,GAAG,CACV,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;8DAC2C,CAAC,CAAC,KAAK;yCAC5B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChC,CAAC,CAAC,KAAK;;SAElB,CACF;8DACuD,QAAQ,CAAC,aAAa;;yDAE3B,QAAQ,CAAC,aAAa;;;GAG5E,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,SAAS,YAAY,CAAC,IAAkB;IAKtC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EAAE,4CAA4C;SACxD,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,kBAAkB;YAC5B,SAAS,EAAE,yBAAyB;SACrC,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,kBAAkB;QAC5B,SAAS,EAAE,gBAAgB;KAC5B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"status-strip.js","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/status-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,IAAI,EAAiB,MAAM,4BAA4B,CAAC;AAEjE,MAAM,UAAU,iBAAiB,CAAC,QAAwB,EAAE,QAAiB;IAC3E,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IAE/D,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEpC,mEAAmE;IACnE,MAAM,MAAM,GAAG,QAAQ;QACrB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACE,EAAE,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;YAC7C,EAAE,CAAC,EAAE,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;YACrD,EAAE,CAAC,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;SAClD,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7B,MAAM,MAAM,GACV,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW;QACvC,CAAC,CAAC,IAAI,CAAA,mCAAmC,IAAI,CAAC,WAAW,gCAAgC;QACzF,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;IAEb,sEAAsE;IACtE,mEAAmE;IACnE,yDAAyD;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI;QACnB,CAAC,CAAC,IAAI,CAAA;;;kBAGQ,IAAI,CAAC,GAAG;;wBAEF,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI;;;uCAGR,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI;;;OAGvD;QACH,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;IAEX,OAAO,IAAI,CAAA;4CAC+B,QAAQ,CAAC,SAAS;yCACrB,QAAQ,CAAC,SAAS;kCACzB,QAAQ,CAAC,QAAQ;qCACd,QAAQ,CAAC,KAAK,UAAU,MAAM;;QAE3D,MAAM,CAAC,GAAG,CACV,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;8DAC2C,CAAC,CAAC,KAAK;yCAC5B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChC,CAAC,CAAC,KAAK;;SAElB,CACF;8DACuD,QAAQ,CAAC,aAAa;;yDAE3B,QAAQ,CAAC,aAAa;;QAEvE,QAAQ;;GAEb,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,SAAS,YAAY,CAAC,IAAkB;IAKtC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EAAE,4CAA4C;SACxD,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,kBAAkB;YAC5B,SAAS,EAAE,yBAAyB;SACrC,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,kBAAkB;QAC5B,SAAS,EAAE,gBAAgB;KAC5B,CAAC;AACJ,CAAC"}
@@ -1,9 +1,10 @@
1
1
  /**
2
- * @fileoverview Tools section — responsive 2-column card grid, optionally
3
- * prefix-grouped when ≥2 tools share a common `snake_case` prefix. Each card
4
- * carries annotation pills (read-only / destructive / open-world / task /
5
- * app), auth scope chips, a JSON-RPC invocation snippet, and a collapsible
6
- * input-schema preview.
2
+ * @fileoverview Tools section — responsive card grid grouped by safety
3
+ * mutability (read / write / destructive). Each card carries annotation
4
+ * pills, a scope chip, a JSON-RPC invocation snippet, and a collapsible
5
+ * input-schema preview. A filter bar above the grid wires chip + search
6
+ * filtering through `data-mutability` / `data-name` attributes consumed
7
+ * by the inline filter script.
7
8
  *
8
9
  * @module src/mcp-server/transports/http/landing-page/sections/tools
9
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAIjE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,QAAQ,CAkBlE"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../../../src/mcp-server/transports/http/landing-page/sections/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAYjE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,QAAQ,CA0BlE"}