From 2d646524b5d6b4b7b590f7345c7eb7503e38d718 Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Thu, 20 Aug 2026 22:24:58 -0700 Subject: [PATCH 1/2] Add tests for plugins list heading and always-visible status column --- .../plugins-ui/test/plugins-gallery.test.tsx | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/plugins-ui/test/plugins-gallery.test.tsx b/packages/plugins-ui/test/plugins-gallery.test.tsx index dddafe548..087c80819 100644 --- a/packages/plugins-ui/test/plugins-gallery.test.tsx +++ b/packages/plugins-ui/test/plugins-gallery.test.tsx @@ -190,6 +190,35 @@ describe("PluginsGallery", () => { expect(container.textContent).toContain("Inherited"); }); + test("the plugins tab renders the list heading and directory sub copy (CL-6467)", () => { + const { container } = renderGallery(); + + const heading = container.querySelector("h1"); + expect(heading?.textContent).toBe("Plugins"); + expect(container.textContent).toContain( + "A directory to scan, not tiles to admire — one dense row per connector, grouped by what it does. Click a row's name for the full page.", + ); + }); + + test("a plugin row's status caption is never hidden — it is a core column, not overflow (CL-6467)", () => { + const { container } = renderGallery(); + + expect(container.textContent).toContain("Connected here"); + const captions = [...container.querySelectorAll("span")].filter( + (span) => span.textContent === "Connected · Connected here", + ); + expect(captions.length).toBeGreaterThan(0); + for (const caption of captions) { + expect(caption.className).not.toContain("hidden"); + } + }); + + test("an empty plugin directory renders no group rows", () => { + const { container } = renderGallery([]); + + expect(container.querySelector(".border.border-border")).toBeNull(); + }); + test("search narrows the plugin grid to matches only", () => { const { container } = renderGallery(PLUGINS, "git"); From 77057aa035d99688ba928dd92d7b046b7c35b08a Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Thu, 20 Aug 2026 22:24:59 -0700 Subject: [PATCH 2/2] Plugins list: add directory heading, keep status caption visible on every row Grouped rows already existed per-category (CL-6272.1); this closes the gap against the new mock spec (CL-6467): the list carries its own h1 + verbatim sub copy, and a row's connection/provenance status is core information, not something dropped below the xl breakpoint. --- packages/plugins-ui/src/plugin-card.tsx | 6 +++--- packages/plugins-ui/src/plugins-gallery.tsx | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/plugins-ui/src/plugin-card.tsx b/packages/plugins-ui/src/plugin-card.tsx index 111e297bc..8fcfaffbf 100644 --- a/packages/plugins-ui/src/plugin-card.tsx +++ b/packages/plugins-ui/src/plugin-card.tsx @@ -52,9 +52,9 @@ export function PluginCard({ {pluginOutcome(plugin.descriptor.id, plugin.descriptor.displayName)} - - {caption} - + {/* A dense directory row's status column is core information, not + * an overflow item to drop on narrow viewports (CL-6467). */} + {caption} {plugin.status === "not_connected" ? ( // The same single Connect verb the MCP preset rows use — one // idiom for "not connected yet" across the whole gallery, never diff --git a/packages/plugins-ui/src/plugins-gallery.tsx b/packages/plugins-ui/src/plugins-gallery.tsx index 6d4fa9ee0..cc20a439a 100644 --- a/packages/plugins-ui/src/plugins-gallery.tsx +++ b/packages/plugins-ui/src/plugins-gallery.tsx @@ -236,6 +236,14 @@ export function PluginsGallery({
{active === "plugins" ? ( <> +
+

Plugins

+

+ A directory to scan, not tiles to admire — one dense row + per connector, grouped by what it does. Click a row's + name for the full page. +

+