Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "genclass",
"interface": { "displayName": "GenClass" },
"plugins": [
{
"name": "genclass",
"source": { "source": "local", "path": "./packages/mcp/plugin" },
"policy": { "installation": "AVAILABLE", "authentication": "ON_USE" },
"category": "Developer Tools"
}
]
}
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Default mode is `observe` (report only); `guard` is opt-in; `heal` is experiment
| `realapps/` | 128 real apps run in headless Chromium with the real runtime: training rows and the never-worse sweep |
| `training/` | vocabulary pruning, curriculum (`curriculum/rt.py` mirrors the runtime's situation renderer), Azure training, ONNX export, `EVAL.md` |
| `demos/` | six demo apps with a chaos backend and Playwright trials; `bench/heal/` runs them per mode |
| `packages/mcp/` | `@genclass/mcp`: the MCP server for coding agents (bridge on 127.0.0.1:47357, store, explore verdicts, replays, regression-test generation, 9 tools incl. `genclass_scan`, which runs the runtime CLI's `scan`); no runtime deps; `test/e2e/race.e2e.mjs` is the real-browser check (not in CI's main job). `plugin/` is the Claude Code plugin (also an Agent Plugins package); `server.json`, the plugin, `.claude-plugin/`, `.cursor-plugin/`, `gemini-extension.json`, `llms-install.md` and the READMEs pin its version (`npm run sync -w @genclass/mcp` after a version bump; `test/manifests.test.ts` fails otherwise) |
| `packages/mcp/` | `@genclass/mcp`: the MCP server for coding agents (bridge on 127.0.0.1:47357, store, explore verdicts, replays, regression-test generation, 9 tools incl. `genclass_scan`, which runs the runtime CLI's `scan`); no runtime deps; `test/e2e/race.e2e.mjs` is the real-browser check (not in CI's main job). `plugin/` is the Claude Code plugin (also an Agent Plugins package); `server.json`, the plugin, `.claude-plugin/`, `.cursor-plugin/`, `gemini-extension.json`, `llms-install.md` and the READMEs pin its version (`npm run sync -w @genclass/mcp` after a version bump; `test/manifests.test.ts` fails otherwise); `scripts/plugin-repo.mjs` assembles genclass-dev/genclass-plugin (the plugin at a repository root with its marketplace files, for the Claude directory's 50 MiB archive limit, Codex, Gemini CLI, `gh skill`; that repository re-syncs daily from main and is never edited by hand) |
| `packages/sv/` | `@genclass/sv`: the Svelte CLI community add-on (`npx sv add @genclass`): adds the runtime, the `/auto` import first in `src/hooks.client`, the dev-only overlay and (default) the telemetry opt-out meta in `src/app.html`, all with the `genclass:init` marker so `remove` undoes it; bundles `@sveltejs/sv-utils`, `sv` is a peer; `test/e2e/` runs sv's add-on harness (pnpm, Chromium) |
| `packages/playwright/` | `@genclass/playwright`: the fixture (`src/fixture.ts`, `install.ts`, `page.ts`, `chaos.ts`, `races.ts`: puts the runtime's script-tag build on every `page` in observe mode with telemetry off, seeded chaos on fetch/XHR responses with `page.route`, witnesses through the agent entry with every hold off, one `genclass-races/1` file per test in `test-results/genclass/`) and the reporter + pure summariser that read those files and write `genclass-report.md` for the PR; peer deps only (`@playwright/test`, `@genclass/runtime`); `test/e2e/run.mjs` is the real-browser check (its own workflow) |
| `packages/nuxt/`, `packages/astro/` | `@genclass/nuxt` (a Nuxt module, `@nuxt/kit`, built with `@nuxt/module-builder`) and `@genclass/astro` (an Astro integration, `injectScript("page", ...)`): from options `{ mode, token?, telemetry?, devtools? }` they generate the runtime's own one line (`/auto` or `/auto/guard`) plus a `window.GENCLASS_CONFIG` module imported before it; browser only, nothing on the server; `@genclass/runtime` is a peer dependency. The generated code is pure (`src/source.ts`, `src/index.ts`) and the tests check it exactly, then build one fixture app. Workflow: `integrations.yml` (Node 24) |
Expand Down
57 changes: 46 additions & 11 deletions docs/adoption/listings/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ submitted.
`GENCLASS_DASHBOARD`.
- **Repository.** Public URL: https://github.com/genclass-dev/GenClass-lib (`daybot-solutions-inc/GenClass-lib` is a
mirror; submit the `genclass-dev` one everywhere). Server: `packages/mcp`. Claude Code plugin: `packages/mcp/plugin`.
Registry name: `io.github.genclass-dev/genclass`.
Registry name: `io.github.genclass-dev/genclass`. The plugin at a repository root, with its marketplace files:
https://github.com/genclass-dev/genclass-plugin (assembled from `packages/mcp/plugin` by
`packages/mcp/scripts/plugin-repo.mjs`, re-synced daily by its own workflow, never edited by hand). Submit that
one to plugin and skill directories, and GenClass-lib to MCP server directories.

### Texts to reuse

Expand All @@ -41,12 +44,15 @@ submitted.

### Assets the owner supplies

- **Logo.** There is none in this repository. Cline wants a 400x400 PNG; the Anthropic directory a square PNG of 512 to
2048 px under 2 MB at `packages/mcp/plugin/.claude-plugin/icon.png` (it becomes the listing icon only the first time
the plugin is saved in the portal; `claude plugin validate --profile directory` warns `ICON_MISSING` until then);
Cursor a logo committed to the repository.
- **Logo.** `packages/mcp/plugin/.claude-plugin/icon.png` (the genclass.dev mark, 512 by 512, also at the root of
genclass-plugin) is what the Anthropic directory reads the first time the plugin is saved in the portal. Cline
wants a 400x400 PNG; Cursor a logo committed to the repository.
- **Contact email** for the forms that ask (Anthropic, mcpservers.org). PRIVACY.md names mehar@daybot.ca.
- **GitHub topic** `gemini-cli-extension` on the repository (Gemini gallery).
- **GitHub topics.** `gemini-cli-extension` (Gemini gallery), `agent-skills` (`gh skill`), `claude-code-plugin`,
`claude-plugin` and `codex-plugin` are set on genclass-plugin; GenClass-lib carries `gemini-cli-extension`,
`claude-code-plugin` and `mcp-server`. Gemini CLI and `gh skill` read the latest GitHub release before the default
branch, and GenClass-lib's latest release (v0.2.1, 2026-10-11) predates the plugin, so only genclass-plugin installs
through them.

## Order

Expand Down Expand Up @@ -109,14 +115,16 @@ support.claude.com "Anthropic Software Directory Policy".
- **Who.** A Pro, Max, Team or Enterprise plan (Team or Enterprise: an Owner, or a member with the Directory
permission), with GitHub connected on claude.ai and push access to the repository. The first organization to
submit a repository folder holds that listing.
- **Steps.** claude.ai/directory/manage, Submit new, Plugin bundle. Source: repository `genclass-dev/GenClass-lib`,
plugin path `packages/mcp/plugin`, branch `main`; Validate. Listing details are read from
`packages/mcp/plugin/.claude-plugin/plugin.json` and `packages/mcp/plugin/README.md`. Data handling: the plugin
- **Steps.** claude.ai/directory/manage, Submit new, Plugin bundle. Source: repository
`genclass-dev/genclass-plugin`, no plugin path (the plugin is the repository root), branch `main`; Validate.
GenClass-lib itself cannot be submitted: the portal stops validating a repository whose GitHub archive is over
50 MiB (pre-submission checklist), and GenClass-lib's is 51 MiB. Listing details are read from
`.claude-plugin/plugin.json` and `README.md` at that root (the same files as `packages/mcp/plugin/`). Data handling: the plugin
collects and sends nothing; it reads and writes `.genclass/agent/` in the project and `~/.genclass/` (the bridge
token); the optional dashboard read is the only network request off the machine. Compliance: contact email and
the four acknowledgements. Updates: GitHub push webhook.
- **What the checks will say.** Local run of `claude plugin validate packages/mcp/plugin --profile directory`
(Claude Code 2.1.310): passes; one warning, `ICON_MISSING`. The portal also holds pinned launchers for a reviewer:
- **What the checks will say.** Local run of `claude plugin validate --profile directory` on the assembled
repository (Claude Code 2.1.309, 2026-10-28): passes with nothing to report. The portal also holds pinned launchers for a reviewer:
expect "Runs a pinned npx or uvx package" (both `.mcp.json` and the hook run `npx -y @genclass/mcp@0.2.1`), and
possibly "MCP server command wasn't read" because the server is not a file inside the plugin folder. An unpinned
launcher would block; `packages/mcp/test/manifests.test.ts` keeps both pins equal to `package.json`'s version. The
Expand Down Expand Up @@ -301,3 +309,30 @@ Source: mxschmitt/awesome-playwright `README.md` (section "AI & Agents", alphabe

`@genclass/playwright` (the race-file reporter) would go under `## Reporters` in the same format once it is
released.

## Skill and plugin directories (2026-10-28)

The skill is `skills/genclass/SKILL.md`, at the root of both repositories; the plugin is the root of genclass-plugin.
Verified on this machine on 2026-10-28 from the pushed repository: `claude plugin marketplace add`, `codex plugin
marketplace add` and `codex plugin add genclass@genclass`, `gemini extensions install`, `gh skill install` (gh 2.103)
and `npx skills add` all install from `genclass-dev/genclass-plugin`.

- **skills.sh** (Vercel's directory, what `npx skills add` reads): automatic, ranked by anonymous install counts; the
skill is listed at https://www.skills.sh/genclass-dev/genclass-lib/genclass (installs of the monorepo copy), and the
install lines now name genclass-plugin, which gets its own page the same way. Nothing to submit.
- **Smithery skills** (smithery.ai/skills): mirrors the skills CLI's index; nothing to submit.
- **Gemini CLI gallery** (geminicli.com/extensions): a daily crawl of repositories with the topic
`gemini-cli-extension` and a root `gemini-extension.json`; genclass-plugin has both. Nothing to submit.
- **Codex**: OpenAI's public plugin directory takes local servers only from approved partners
(developers.openai.com/plugins/deploy/desktop-only), so the path is `codex plugin marketplace add
genclass-dev/genclass-plugin` (Codex reads `.agents/plugins/marketplace.json`, and the Claude one as a fallback) and,
by hand, one README line in hashgraph-online/awesome-codex-plugins.
- **Claude**: the directory (section 3 above); the owner submits from the paid claude.ai account with GitHub
connected. Also claude-plugins.dev indexes public plugin repositories by topic.
- **Cursor**: cursor.com/marketplace/publish (manual review of an open-source repository) and
cursor.directory/plugins/new (sign in, paste the repository URL; it detects `skills/`, `.mcp.json` and
`hooks/hooks.json` at the root). Both by hand.
- **GitHub Copilot**: `gh skill install genclass-dev/genclass-plugin genclass` works today; the community registry is
github/awesome-copilot (a pull request adding the skill folder). By hand.
- **Tessl registry** (`tessl skill publish --public`, after approval) and VoltAgent/awesome-agent-skills ("real
community usage" required): later, once installs exist.
18 changes: 18 additions & 0 deletions packages/mcp/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
# Changelog

## Unreleased

- **The plugin has a repository of its own, [genclass-dev/genclass-plugin](https://github.com/genclass-dev/genclass-plugin)**:
the plugin folder at the root, with marketplace files for Claude Code (`.claude-plugin/marketplace.json`), Codex
(`.agents/plugins/marketplace.json`) and Cursor, the Gemini CLI manifest and the licence, assembled by
`node packages/mcp/scripts/plugin-repo.mjs` (`npm run plugin-repo -w @genclass/mcp`) and re-synced there daily by
its own workflow. Anthropic's directory stops validating a repository whose GitHub archive is over 50 MiB
(GenClass-lib's is 51), and Codex, Gemini CLI, `gh skill` and the skills CLI clone or read a whole repository for
one plugin (Gemini CLI and `gh skill` read the latest GitHub release first, which in GenClass-lib predates the
plugin), so the small repository is what the install lines name: `/plugin marketplace add genclass-dev/genclass-plugin`,
`codex plugin marketplace add genclass-dev/genclass-plugin` then `codex plugin add genclass@genclass`,
`gemini extensions install https://github.com/genclass-dev/genclass-plugin`, `npx skills add genclass-dev/genclass-plugin`,
`gh skill install genclass-dev/genclass-plugin genclass`. The marketplace in GenClass-lib still lists the plugin.
- **A Codex marketplace file at the repository root**, `.agents/plugins/marketplace.json` (Codex's own format; Codex
already read `.claude-plugin/marketplace.json`).
- **The skill's frontmatter names its licence** (`license: Apache-2.0`, the Agent Skills field `gh skill publish`
recommends).

## 0.2.1 (2026-10-27)

- **The plugin has an icon** (`plugin/.claude-plugin/icon.png`, the genclass.dev mark, 512 by 512), which the Anthropic directory reads on the first save.
Expand Down
27 changes: 23 additions & 4 deletions packages/mcp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ client it runs in.
As a plugin (the server, a prompt hook that brings new findings to each prompt, and the `genclass` skill with the procedure):

```
/plugin marketplace add genclass-dev/GenClass-lib
/plugin marketplace add genclass-dev/genclass-plugin
/plugin install genclass@genclass
```

Expand All @@ -43,7 +43,7 @@ claude mcp add --scope project genclass -- npx -y @genclass/mcp@0.2.1
# or: npx -y @genclass/mcp@0.2.1 init --hook (.mcp.json and the skill, plus the prompt hook in .claude/settings.json)
```

Or just the skill (no server; `skills/genclass/SKILL.md` at the repository root, for skill directories): `npx skills add genclass-dev/GenClass-lib`
Or just the skill (no server): `npx skills add genclass-dev/genclass-plugin`. (`genclass-dev/genclass-plugin` is this plugin at a repository root, assembled from this package; the marketplace in `genclass-dev/GenClass-lib` lists the same plugin.)

### Claude Desktop

Expand Down Expand Up @@ -109,6 +109,15 @@ Or `.mcp.json` at the workspace root (the portable format; `.vscode/mcp.json` ta

### Codex CLI

As a plugin (the server and the `genclass` skill):

```bash
codex plugin marketplace add genclass-dev/genclass-plugin
codex plugin add genclass@genclass
```

Or the server alone:

```bash
codex mcp add genclass -- npx -y @genclass/mcp@0.2.1
```
Expand All @@ -124,6 +133,14 @@ startup_timeout_sec = 30

### Gemini CLI

As an extension (the server and the `genclass` skill):

```bash
gemini extensions install https://github.com/genclass-dev/genclass-plugin
```

Or the server alone:

```bash
gemini mcp add genclass npx -- -y @genclass/mcp@0.2.1 # -s user: for all projects
```
Expand Down Expand Up @@ -282,8 +299,10 @@ read a report, what to say when done, what to do when the tools are missing) is
- `npx -y @genclass/mcp@0.2.1 init` writes it to `.claude/skills/genclass/SKILL.md` in the project (`--no-skill`
leaves it out). The written file carries a `genclass:init` marker line: a rerun replaces a file with the marker and
leaves one without it (yours, or edited), and says which;
- `npx skills add genclass-dev/GenClass-lib` installs the repository-root copy, `skills/genclass/SKILL.md`, through a
skill directory, with no server (the skill then says how to add one).
- `npx skills add genclass-dev/genclass-plugin` (the skills CLI: Codex, Cursor, Copilot, Gemini CLI, Claude Code and
others) or `gh skill install genclass-dev/genclass-plugin genclass` (GitHub CLI 2.90 or later, for Copilot) installs
the skill alone, with no server (the skill then says how to add one). `npx skills add genclass-dev/GenClass-lib`
installs the same file from this repository's root copy, `skills/genclass/SKILL.md`.

To remove it: delete `.claude/skills/genclass/` (or the directory the skill tool wrote to); with the plugin,
`/plugin uninstall genclass@genclass`.
Expand Down
3 changes: 2 additions & 1 deletion packages/mcp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@
"typecheck": "tsc -p tsconfig.json --noEmit",
"test": "vitest run",
"sync": "GENCLASS_SYNC=1 vitest run test/manifests.test.ts",
"bundle": "node scripts/mcpb.mjs"
"bundle": "node scripts/mcpb.mjs",
"plugin-repo": "node scripts/plugin-repo.mjs"
},
"devDependencies": {
"@anthropic-ai/mcpb": "2.1.2",
Expand Down
20 changes: 17 additions & 3 deletions packages/mcp/plugin/README.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
# GenClass plugin for Claude Code
# GenClass plugin

GenClass lets Claude see what happens inside the pages of your web app running on your machine (each click, request
For Claude Code, Codex, Cursor, Gemini CLI and other agents that read plugins or skills. GenClass lets the agent see what happens inside the pages of your web app running on your machine (each click, request
and response, the order the responses were delivered, what each response wrote into the app's state, uncaught
errors), find race conditions by re-running a page with the network answering in different orders, replay one exact
order to prove a fix, and write a Playwright test that fails while the bug is there.

## Install

Claude Code (the server, a prompt hook that brings new findings to each prompt, and the `genclass` skill):

```
/plugin marketplace add genclass-dev/GenClass-lib
/plugin marketplace add genclass-dev/genclass-plugin
/plugin install genclass@genclass
```

Codex (the server and the skill): `codex plugin marketplace add genclass-dev/genclass-plugin`, then
`codex plugin add genclass@genclass`. Gemini CLI (the same): `gemini extensions install https://github.com/genclass-dev/genclass-plugin`.
The skill alone, in any agent the skills CLI knows: `npx skills add genclass-dev/genclass-plugin`; for GitHub Copilot,
`gh skill install genclass-dev/genclass-plugin genclass`.

Then connect your app's development build (two lines; `genclass_setup` prints them for your framework) and load a
page of the dev server. The page side needs `@genclass/runtime` 0.3.0-beta.1 or later. See the
[package README](https://github.com/genclass-dev/GenClass-lib/blob/main/packages/mcp/README.md).
Expand Down Expand Up @@ -59,6 +66,13 @@ diagnostics, which `GenClass.init({ telemetry: false })` turns off ([PRIVACY.md]
turns off every hook.
- In the app: remove the `connectAgent(rt)` line; the page then never talks to the bridge.

## Where this comes from

This folder is `packages/mcp/plugin` in [genclass-dev/GenClass-lib](https://github.com/genclass-dev/GenClass-lib).
The repository [genclass-dev/genclass-plugin](https://github.com/genclass-dev/genclass-plugin) is this folder at a
repository root with the marketplace files, assembled by `node packages/mcp/scripts/plugin-repo.mjs` and re-synced
daily, so issues and pull requests go to GenClass-lib.

## License

Apache-2.0. Source: [packages/mcp](https://github.com/genclass-dev/GenClass-lib/tree/main/packages/mcp).
1 change: 1 addition & 0 deletions packages/mcp/plugin/skills/genclass/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
name: genclass
license: Apache-2.0
description: Find, reproduce and prove fixes for web-app bugs that depend on timing or layout with the GenClass MCP tools. Use when the user says something happens "sometimes", "randomly", "only in production" or "on slow connections", when a value "flips back", and for stale or old results, lost edits, double submits or a page that scrolls sideways on a phone; also after you change code that fetches, submits, autosaves, polls, debounces, paginates or listens to a socket, and before you call a page or UI change done.
---

Expand Down
Loading
Loading