Skip to content

Restructure plugins list for clarity and trust#6629

Open
jennifer-shehane wants to merge 31 commits into
mainfrom
claude/plugins-list-doc-restructure-3yni0g
Open

Restructure plugins list for clarity and trust#6629
jennifer-shehane wants to merge 31 commits into
mainfrom
claude/plugins-list-doc-restructure-3yni0g

Conversation

@jennifer-shehane

@jennifer-shehane jennifer-shehane commented Jul 2, 2026

Copy link
Copy Markdown
Member

Summary

Restructures the List of Plugins page so users can quickly judge whether a plugin is trustworthy before adopting it: it adds an on-page badge legend and trust framing, surfaces live health signals (npm version, last-published date, Cypress compatibility, downloads, GitHub stars) on every card, auto-flags deprecated plugins, adds search + category/trust-level filters, and reorganizes the flat 12-category list into 17 focused categories.

Why

The plugins list rendered badges (official / verified / community) whose meaning was never explained on the page — a reader had no way to tell a Cypress-vetted plugin from an unvetted community one without digging into CONTRIBUTING.md. There were no freshness or maintenance signals at all, so an abandoned plugin looked identical to a thriving one, and two large catch-all categories ("Development Tools", "Custom Commands") held roughly half the entries. This change makes the trust hierarchy legible and gives users concrete data to decide with. The scope came from a request to restructure the page "for better clarity and to assist users in making trustworthy decisions on the plugins they decide to use." The table of contents was intentionally left untouched pending a separate design pass.

The trust signals immediately surfaced three plugins that have moved or are unmaintained (cypress-testing-library, cypress-drag-drop, cypress-xray-plugin), which are now flagged as deprecated.

Closes #

Notes for reviewers

  • Taxonomy is the most opinionated part. The 17 category names/groupings and the per-plugin assignments are a judgment call — happy to adjust. All 112 plugins are preserved; also fixed the "Secret Managment" typo, two keyword/keyboards field typos, and moved cypress-sql out of Email into a new Databases category.
  • downloads and stars are empty in the committed data because api.npmjs.org and the GitHub API are blocked from the environment this was authored in. scripts/enrich-plugins.mjs fetches them best-effort; running it in CI or locally with network (and a GITHUB_TOKEN to avoid rate limits) will populate them. Version / last-published / Cypress-compat / deprecation are fully populated now (90 plugins resolved, 75 with a Cypress range).
  • Enrichment is a manual/scheduled script, not wired into prebuild, so a network hiccup can never break site builds. It writes src/data/plugins-generated.json, which is committed so the site builds offline. The component merges that generated metadata over the curated plugins.json by plugin name.
  • New dev deps: got (HTTP with timeout + retry) and p-map (concurrency) in the enrichment script. I deliberately did not pull in heavier options (pacote, octokit, parse-github-url) for a maintenance script.
  • Data model: added an optional npm field for entries whose display name differs from the package (official monorepo packages, scoped names); documented the schema and enrichment workflow in CONTRIBUTING.md.
  • Verified with a full production build (npm run build → success) plus browser screenshots of the page, an individual card, and the interactive filters (deprecated filter → 3 results, "accessibility" search → 3).

🤖 Generated with Claude Code


Generated by Claude Code


Note

Medium Risk
Large documentation UX and data-model change affecting a high-traffic page; incorrect enrichment or taxonomy could mislead users about plugin maintenance, though builds stay offline-safe via committed generated JSON.

Overview
Overhauls the List of Plugins experience so readers can judge trust and freshness before adopting a package.

PluginsList now merges curated plugins.json with committed plugins-generated.json: cards show badge tier (with an on-page legend), npm link/version, last publish date, Cypress peer range, deprecation notices, and clickable keyword tags. Search, category, and badge filters sync to ?search= in the URL; categories sort A–Z and plugins within each category sort by badge then recency.

Adds npm run enrich:plugins (scripts/enrich-plugins.mjs using got / p-map) to refresh registry/GitHub metadata offline-safe (transient failures preserve prior fields). CONTRIBUTING.md documents optional npm / badge fields, auto-generated signals, and new sort/deprecation rules.

plugins.json is reorganized into 17 focused categories (new groupings such as AI tooling, test selection, email/SMS), with catalog fixes (e.g. @testing-library/cypress successor, explicit npm for monorepo packages) and removals of stale entries per the PR intent.

plugins-list.mdx gets SEO copy, community-plugin caution, and see-also links. Cypress e2e (plugins_list.cy.ts) exercises legend, search, filters, sorting, hydration, and card signals.

Reviewed by Cursor Bugbot for commit a633897. Bugbot is set up for automated code reviews on this repo. Configure here.

claude added 3 commits July 2, 2026 12:24
Rework the plugins list page to help users make trustworthy decisions about
the plugins they adopt.

Trust & clarity:
- Add an on-page badge legend and trust framing that explains that community
  plugins are not vetted by Cypress, plus guidance on how to evaluate a plugin.
- Surface live trust signals on every card: npm package + version, last
  published date (with a "stale" highlight past 18 months), supported Cypress
  version, weekly downloads, and GitHub stars.
- Auto-detect and flag deprecated plugins (unpublished/moved on npm, npm
  deprecation, or archived repo) with a red badge and an explanatory notice.
- Add client-side search and category/trust-level filters.
- Document the review criteria and a freshness/removal policy on the page.

Data & tooling:
- Add scripts/enrich-plugins.mjs (npm run enrich:plugins) to generate trust
  metadata into src/data/plugins-generated.json from the npm registry and
  GitHub, with graceful fallback so a flaky network never corrupts the data.
- Rework the taxonomy: fix the "Secret Managment" typo, break up the
  "Development Tools" and "Custom Commands" catch-alls into focused categories,
  merge single-item categories (e.g. SMS into Email), sort entries by trust
  tier, and fix keyword-field typos.
- Add an optional `npm` field for entries whose display name differs from the
  package; document the schema and enrichment workflow in CONTRIBUTING.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Replace the hand-rolled month-name array with the built-in Intl.DateTimeFormat
(fixed locale + UTC keeps it deterministic across SSR and client). No date
library is warranted for this.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Replace hand-rolled helpers in the enrichment script with well-established
libraries:

- got (with a pre-configured instance) replaces the manual fetch +
  AbortController timeout + JSON parsing in fetchJson, and adds automatic
  retries the previous version lacked.
- p-map replaces the hand-rolled promise pool for bounded concurrency.
- Drop the scoped-name encoding hack; the registry accepts @scope/name paths.

Output of the script is byte-for-byte unchanged. Deliberately kept the small
GitHub-URL regex and the direct registry/downloads/GitHub calls rather than
pulling in heavier deps (pacote, octokit, parse-github-url) for a maintenance
script.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Comment thread scripts/enrich-plugins.mjs
Comment thread scripts/enrich-plugins.mjs Outdated
Comment thread src/components/plugins-list/index.tsx
Replace the emoji glyphs in the plugin cards with the same FontAwesome icon
set the docs already use (npm, clock, gear, download, star, and a warning
triangle for deprecations) for visual consistency.

Also remove the self-explanatory "how to weigh a plugin" list and the
"use the search box below" line from the page intro.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Comment thread scripts/enrich-plugins.mjs Outdated
- Drop the npm brand icon from the npm package trust signal (keep the linked
  package@version text).
- Add cypress/e2e/plugins_list.cy.ts covering the badge legend, default
  listing, search filtering, empty state, category filter, trust-level filter
  with deprecated flagging, per-card trust signals, and safe external links.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Comment thread scripts/enrich-plugins.mjs
claude added 3 commits July 2, 2026 12:53
- enrich-plugins: read prior metadata from the generated file's `plugins`
  key so best-effort merges actually preserve committed fields.
- enrich-plugins: only flag a plugin deprecated on a definitive npm 404, not
  on a transient registry/network failure; recompute the flag from fresh data
  so it can't persist stale.
- enrich-plugins: percent-encode the `/` in scoped package names for the
  downloads API (e.g. @cypress%2Fgrep) so download counts resolve.
- plugins-list: defer the date-based "stale" styling until after mount to
  avoid an SSR/hydration mismatch near the 18-month threshold.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Remove the "How plugins are reviewed" and "Keeping this list current"
sections, keeping only the closing invitation to open a PR or issue for
outdated or missing plugins.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Link to the plugin usage guide, Node Events overview, Preprocessors API, and
configuration reference.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Comment thread scripts/enrich-plugins.mjs Outdated
Comment thread scripts/enrich-plugins.mjs
Comment thread src/data/plugins.json
Drop the three plugins currently auto-flagged as deprecated
(cypress-testing-library, cypress-drag-drop, cypress-xray-plugin) and list
@testing-library/cypress — the maintained successor to cypress-testing-library
— in its place. Regenerate plugins-generated.json (now zero deprecated).

Update the e2e spec: assert the Deprecated trust level yields the empty state
(deprecated plugins are curated out) and that the testing-library successor is
listed while the old package is gone.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Comment thread scripts/enrich-plugins.mjs
Comment thread scripts/enrich-plugins.mjs
@cypress

cypress Bot commented Jul 2, 2026

Copy link
Copy Markdown

cypress-documentation    Run #1613

Run Properties:  status check passed Passed #1613  •  git commit a633897b79: Fix flaky clear-search e2e test with a hydration marker
Project cypress-documentation
Branch Review claude/plugins-list-doc-restructure-3yni0g
Run status status check passed Passed #1613
Run duration 08m 32s
Commit git commit a633897b79: Fix flaky clear-search e2e test with a hydration marker
Committer Claude
View all properties for this run ↗︎

Test results
Tests that failed  Failures 0
Tests that were flaky  Flaky 0
Tests that did not run due to a developer annotating a test with .skip  Pending 0
Tests that did not run due to a failure in a mocha hook  Skipped 0
Tests that passed  Passing 655
View all changes introduced in this branch ↗︎
UI Coverage  43.09%
  Untested elements 412  
  Tested elements 7  
Accessibility  96.85%
  Failed rules  2 critical   4 serious   4 moderate   1 minor
  Failed elements 175  

claude added 5 commits July 2, 2026 15:33
Render each keyword as an anchor link (styled as a link, not a button) that
sets the search filter to that tag on click, reflected in a shareable
`?search=` URL that also seeds the filter on load. Clicking scrolls back to
the controls so the applied search is visible.

Add an e2e test for clicking a tag to filter, and confirm the URL updates.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Audited names/descriptions/keywords against the live npm registry:

- Remove cypress-graphql: its npm name is a security-holding placeholder
  (0.0.1-security), so it is not installable as a real plugin.
- Rename cypress-sql -> @dankieu/cypress-sql: the unscoped cypress-sql has no
  published version; @dankieu/cypress-sql (v2.1.8) is the real package. Also
  tidy its description.
- Fix typos: "gherkin-syntaxed"/"cypress.io" (Cucumber) and "preproccessor"
  (cypress-vite).
- Trim a leading space and grammar in the cypress-env description.
- Drop a duplicate "email" keyword on cypress-mailpit.

Regenerate plugins-generated.json accordingly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Show a clear button inside the search field whenever it has a value; clicking
it empties the search, removes the ?search= URL param, restores the full list,
and refocuses the input. The native webkit search-cancel button is hidden so
the control is consistent across browsers. Adds an e2e test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Lead each description with what distinguishes them: the command-line tool that
converts DevTools Recorder exports vs. the Chrome DevTools extension that
exports directly from the Recorder panel.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Within each category, sort by trust tier (official → verified → community →
deprecated) and then by most recent npm publish date, so fresher plugins
surface first within a tier. Entries without a publish date sort last with an
alphabetical fallback. Done at render time from the generated metadata so it
stays current as enrichment re-runs; the entry order in plugins.json no longer
matters.

Add an e2e test asserting trust-tier order and document the sort in CONTRIBUTING.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Comment thread scripts/enrich-plugins.mjs
- Accessibility: add Cypress Accessibility (links to the docs).
- Code Coverage & Reporting: add UI Coverage (links to the docs).
- New "AI Tools" category with Cypress MCP and the three Cypress AI Toolkit
  skills (cypress-author, cypress-explain, cypress-docs), all marked official
  and linking to their docs / repo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Comment thread package.json Outdated
List the categories (and the category filter dropdown) in alphabetical order at
render time. Add an e2e test and note the ordering in CONTRIBUTING.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Comment thread scripts/enrich-plugins.mjs Outdated
- Add a "User Interactions" category (native events, drag-and-drop, mobile
  gestures, tab) peeled out of the Custom Commands grab-bag.
- Rename Databases -> "Databases & Storage" and move the localStorage/IndexedDB
  command plugins into it.
- Rename "Framework Tooling" -> "App Framework Integrations".
- Rename "Extending Other Testing Frameworks" -> "BDD & Contract Testing".
- Rename "Editor & Developer Tooling" -> "Developer Tooling".
- Rename "AI Tools" -> "AI Tooling" for consistency with the other tooling
  categories.

Custom Commands drops from 20 to 13 genuinely-generic helpers; no category is
thinner than 2 items and all 115 plugins are preserved.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Comment thread src/components/plugins-list/index.tsx
claude added 2 commits July 2, 2026 17:49
Address review feedback on scripts/enrich-plugins.mjs:

- Pin got to ^14 (Node >=20) so `npm run enrich:plugins` runs on the same Node
  version as the site build; got 15 required Node 22.
- Skip GitHub subpath/monorepo links (…/tree/…, …/blob/…) when fetching repo
  stats, so monorepo packages no longer report cypress-io/cypress's star count.
- Detect npm "security holding" placeholders (0.0.x-security) and flag them
  deprecated instead of presenting them as maintained.
- Rebuild metadata from scratch each run: a fresh manifest recomputes every npm
  signal (so a stale cypressVersion/version can't linger), a definitive 404
  drops prior freshness signals, and prior values are preserved only on a
  transient failure — including an archived flag when the GitHub call fails.
- Fall back to the display name as an npm candidate even when an explicit `npm`
  value is set, so a wrong/removed `npm` can still resolve.

Output of the script is unchanged for the current data.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
The badge legend rendered by the PluginsList component already labels and
defines each trust level, so drop the bulleted definitions from the page intro
and point readers to that key.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
@jennifer-shehane jennifer-shehane self-assigned this Jul 2, 2026
claude added 2 commits July 2, 2026 18:32
- Frontmatter: keyword-rich title ("Cypress Plugins: Official & Community
  Extensions") and a compelling ~157-char meta description.
- Intro: lead with the value plugins provide (what they add and that they're
  versioned npm modules with trust signals) instead of a generic one-liner.
- Replace em dashes with plain punctuation across the page copy, plugin/category
  descriptions, and the "stale" tooltip.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Comment thread scripts/enrich-plugins.mjs
claude added 5 commits July 2, 2026 18:38
- Filter control now reads "All badges" / "Filter by badge"; drop "trust"/
  "trust tier"/"trust signals" wording throughout the component, tests,
  CONTRIBUTING, and the enrichment script (badge-classification wording becomes
  "badge", the live npm metadata becomes "signals").
- Intro: "typically published as versioned npm modules" (not every entry is an
  npm package).
- Remove the "Choosing the right plugin" heading and its sentence; the badge
  legend and caution already cover it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Add accurate discovery tags (frameworks, use cases, synonyms) to 47 plugins
that had one or two keywords, so the clickable tag links and search surface
them more reliably. No entry is left with fewer than three tags.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Add 10 maintained plugins that declare recent Cypress compatibility and weren't
listed:

- Official Component Testing dev servers: @cypress/vite-dev-server,
  @cypress/webpack-dev-server.
- Community: cypress-split (CI parallelization), @chromatic-com/cypress (visual),
  cypress-accessibility-checker (IBM Equal Access), @reportportal/agent-js-cypress
  (reporter), cypress-each, cypress-data-session, cypress-network-idle,
  cypress-html-validate.

Maintenance fixes:
- Point "Cypress Image Snapshot" at the maintained @simonsmith/cypress-image-snapshot.
- Resolve "Nx" to the @nx/cypress package for accurate signals.

Regenerate plugins-generated.json (125 plugins, all resolve, 0 deprecated).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
cypress-solid tests apps built on the Solid Protocol (solidproject.org), not
the SolidJS framework. Drop the misleading "solidjs" tag and add "solidproject".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f573392. Configure here.

Comment thread src/components/plugins-list/index.tsx
claude added 5 commits July 2, 2026 22:59
Remove the hydration-wait comment and the redundant "@cypress/grep exists"
assertion (implicit in the count check).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
These two card signals were never populated: the npm downloads and GitHub APIs
aren't reachable where enrichment runs, and enrichment isn't part of CI, so the
committed data always left them empty. Drop them entirely:

- Component: remove the downloads and stars rendering (and the now-unused
  formatDownloads helper and faDownload/faStar imports).
- enrich-plugins: remove the weeklyDownloads fetch; reduce the GitHub call to an
  archived-repo check (still used to flag deprecation) instead of collecting
  stars/pushedAt; drop the unused downloads endpoint constant.
- Regenerate plugins-generated.json (now only npm/version/lastPublished/
  cypressVersion) and update the CONTRIBUTING description.

Cards still show the npm package, last published date, and Cypress compatibility.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Cypress Accessibility flagged color-contrast failures on the plugins list view:
- npm signal link rendered in the theme link color (4.4:1 on the chip),
- the amber "Updated" stale text (2.24:1),
- muted result-count / empty-state / tag text (4.28:1).

Darken these to clear the 4.5:1 threshold: use emphasis-700 for muted text and
the npm link, and give the stale indicator accessible amber values with a
dark-mode variant.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Cypress Cloud flagged "clears the search with the clear button" as flaky: the
first attempt could type into the search box before React hydrated, so the
keystrokes were dropped and the conditionally-rendered clear button never
appeared.

Expose a `data-hydrated` flag on the component root (flips to true after mount)
and have the test's beforeEach wait for it, so interactions never race
hydration. Also tidy a garbled comment in the deprecated-filter test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R61G5uKm2a7UFnjNC97LTj
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants