Skip to content

feat(marketplace): rebuild as static git-sourced browser in the docs site#218

Open
siracusa5 wants to merge 3 commits into
mainfrom
c/upbeat-stonebraker-2f5ac0
Open

feat(marketplace): rebuild as static git-sourced browser in the docs site#218
siracusa5 wants to merge 3 commits into
mainfrom
c/upbeat-stonebraker-2f5ac0

Conversation

@siracusa5
Copy link
Copy Markdown
Collaborator

Summary

Rebuilds the plugin marketplace to collapse two Next.js apps (and two design systems) into one. The marketplace is now real, browsable pages inside the documentation site, generated from git at build time, with trust signals produced by the existing security scanner. The dormant Supabase marketplace app is retired and its schema archived as the seed of future community/team self-service publishing.

This is the foundation chosen deliberately for where the project is today (16 first-party plugins, no community yet): static-from-git needs no infra and never drifts, while a MarketplaceSource abstraction keeps the door open for a dynamic backend later with no UI rewrite.

Changes

  • packages/marketplace-data/ (new) — build-time generator: reads marketplace.json + each plugin.json + SKILL.md, runs the @harness-kit/core security scanner, derives trust tiers, emits a typed static JSON. Supports --strict (fails the build on a failed scan). Includes vitest coverage asserting the 16-plugin invariant.
  • website/app/marketplace/ — browse page + per-plugin detail pages (generateStaticParams). Client-side search and category/tag/trust filters held in memory (no useSearchParams, so static export stays clean). Detail pages show install command (copy), env requirements, MCP info, a security panel, and inline SKILL.md source.
  • MarketplaceSource seam — the browse layer reads through a source abstraction (one StaticSource today); a future remote source merges into the same UI unchanged.
  • Trust signals — scanner output baked into the static data, rendered as badges + a permissions/findings panel, documented in a new concepts/trust-signals page.
  • Docs search — Fumadocs static index (staticGET route + RootProvider type: 'static'), no backend.
  • Rewired SiteNav (Marketplace link), the explore tile, and the homepage DesktopMock to use real plugin data instead of hardcoded lists.
  • Retired apps/marketplace/ — deleted the dormant Supabase app; archived its 7 migrations + seed to docs/archive/marketplace-supabase/ (history-preserving move); scrubbed references in SECURITY.md, .gitignore, dependabot.yml, CLAUDE.md, and root package.json.
  • CI (deploy-docs.yml) — generates the marketplace data via a filtered root install before the (isolated) website build; paths: broadened so plugin/manifest edits trigger a redeploy. Generated JSON is treated as build output (gitignored).

Test Plan

  • Generator unit tests pass (pnpm -F @harness-kit/marketplace-data test — 12/12)
  • Generator produces 16 plugins; scanner ran on each; --strict exits 0
  • Website builds (static export) — /marketplace, 16 /marketplace/[slug], /api/search, and the trust-signals doc all emit
  • Full CI generate→build chain reproduced locally with a frozen lockfile
  • Browser-verified dark + light mode: index grid (category pills, trust badges, MCP tags, per-card accents) and a detail page (install copy, MCP line, security panel with real findings, SKILL.md viewer)
  • CI checks pass

Notes

  • Deferred by design (seams in place, not built): dynamic/community/team publishing, reviews, ratings, install counts, auth. These need a DB + API + moderation and have no users yet; the archived Supabase schema + the MarketplaceSource abstraction make adding them later additive rather than a rewrite.
  • Out of scope: a live multi-tool compile() playground — compile() uses node:crypto; making it isomorphic (Web Crypto) is an easy follow-up.
  • The website intentionally installs in isolation (its own lockfile, no workspace deps), so it imports the generated JSON directly and mirrors the types locally rather than depending on the generator package.

…site

Collapse the two-app/two-design-system split into one. The marketplace is now
real pages in the website, generated from git at build time, with trust signals
from the existing security scanner. Retire the dormant Supabase app; preserve its
schema as the seed of future community/team publishing.

- packages/marketplace-data: build-time generator (marketplace.json + plugin.json
  + SKILL.md → static JSON), runs the core security scanner, --strict mode, tests
- website/app/marketplace: browse + per-plugin detail pages, in-memory search and
  category/tag/trust filters (no useSearchParams — clean static export)
- MarketplaceSource seam: one StaticSource today; a future dynamic source merges
  into the same UI with no rewrite
- trust signals: scanner output baked in at build time, rendered as badges/panel,
  with a new concepts/trust-signals doc
- docs search: Fumadocs static index (staticGET + provider type: 'static')
- rewire SiteNav, explore tile, and DesktopMock to real data
- retire apps/marketplace; archive its 7 Supabase migrations + seed to
  docs/archive/marketplace-supabase/; scrub references
- CI: deploy-docs generates data via a filtered root install before the website
  build; broaden paths to redeploy on plugin/manifest edits

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@siracusa5 siracusa5 added the enhancement New feature or request label May 22, 2026
siracusa5 and others added 2 commits May 22, 2026 02:25
A declared sensitive env var is info-level, not a warning — the Caution badge
is driven by warning-level findings (external URLs, network, broad filesystem
writes). Clarify the badge table and add an informational-note explanation.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The website imports a gitignored static JSON generated from git. Only
deploy-docs ran the generator; the validate test-all + docs-build jobs and the
build.yml turbo build failed on the missing module. Add the generate step to
each: a direct call in the full-workspace jobs (test-all, build) and the
filtered-install pattern in the isolated docs-build job.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant