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
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); `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/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 and the released server vendored from npm under `server/`, which `.mcp.json` and the hook there run with `node` from `${CLAUDE_PLUGIN_ROOT}`, for the Claude directory's 50 MiB archive limit and its holds on `npx` launchers and lockfiles, 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
74 changes: 55 additions & 19 deletions docs/adoption/listings/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,29 +124,65 @@ support.claude.com "Anthropic Software Directory Policy".
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 --profile directory` on the assembled
repository (Claude Code 2.1.311, 2026-10-28, with and without the lockfile below): passes with nothing to report;
the lockfile check is the portal's alone. The portal's first validation (2026-10-28, `main` at e911b25, before the
lockfile) passed with one warning, "Launcher lock missing" on `mcpServers.genclass` in `.mcp.json`: ship a
`package-lock.json` (`npm ci`) or `uv.lock` next to the manifest that declares the server; exact versions,
registry sources and hashes are required for the Verified badge. `package.json` and `package-lock.json` at the
plugin root answer it (lockfileVersion 3; `@genclass/mcp` at the plugin's version with its registry tarball and
sha512 integrity; `packages/mcp/test/manifests.test.ts` keeps them at `package.json`'s version, and the daily sync
carries them to the plugin repository). The portal also held the pinned launchers for a reviewer, "Runs a pinned
npx or uvx package" (2 findings: `.mcp.json` and the hook run `npx -y @genclass/mcp@0.2.1`), whose text prefers
"a package that ships a lockfile" (which it now does) or the package's readable source vendored into the plugin
and run from `${CLAUDE_PLUGIN_ROOT}`; whether the lockfile lifts the hold is the reviewer's call. Possibly also
"MCP server command wasn't read" because the server is not a file inside the plugin folder. An unpinned launcher
would block; the manifests test keeps both pins equal to `package.json`'s version. The way to avoid the hold for
certain is to ship the built server (`dist/cli.js`, 125 KB, no dependencies) inside the plugin folder and run
`node ${CLAUDE_PLUGIN_ROOT}/...`; that means committing a build output, so it is left to the owner. Between a
version bump and its release the lock still names the previous release (npm does not serve the new one yet), and a
daily sync in that window carries that mismatch to the plugin repository until the post-release sync. Claude Code
2.1.311 installs a plugin's lockfile when it installs the plugin (`npm ci --ignore-scripts` in the plugin's cache
folder), so installing the plugin now also fetches `@genclass/mcp` there; the launchers still run `npx`.
repository and on `packages/mcp/plugin` (Claude Code 2.1.311, 2026-10-28): passes with nothing to report; the
launcher checks are the portal's alone. The portal's first validation (2026-10-28, `main` at e911b25) passed with
one warning, "Launcher lock missing" on `mcpServers.genclass` in `.mcp.json` (a `package-lock.json` or `uv.lock`
next to the manifest that declares the server; exact versions, registry sources and hashes are required for the
Verified badge), and held the pinned launchers for a reviewer, "Runs a pinned npx or uvx package" (2 findings:
`.mcp.json` and the hook ran `npx -y @genclass/mcp@0.2.1`). A lockfile at the plugin root (68507fa) turned the
warning into the note "Launcher locked" and added a second hold, "Dependencies install from a lockfile" (the dated
bullets below). The hold text names the way to avoid both: the package's built files inside the plugin, each under
256 KiB, run from `${CLAUDE_PLUGIN_ROOT}`, with no `package.json` or lockfile. That is what the plugin repository
now is: `scripts/plugin-repo.mjs` fetches the released `@genclass/mcp` at the plugin's version from npm and vendors
its `dist/cli.js` (about 150 KB, no dependencies) as `server/cli.mjs` with the package's command next to it, and
`.mcp.json` and the hook run `node ${CLAUDE_PLUGIN_ROOT}/server/genclass-mcp.mjs`; the lockfile is gone. The copy
of the plugin inside GenClass-lib keeps `npx` (nothing built is committed there), and the Agent Plugins `mcp.json`
keeps `npx` everywhere, since that format has no plugin-root variable. An unpinned launcher would block; the
manifests test keeps the `npx` pins equal to `package.json`'s version and checks the assembled tree. Between a
version bump and its release the sync script exits 3 (npm does not serve the new version yet) and the plugin
repository stays at the previous release until the first sync after the publish. Whether a vendored server still
draws a hold is the reviewer's call; "MCP server command wasn't read" has not appeared.

- **Policy items.** Privacy policy URL: `privacyPolicyUrl` in `plugin.json` (the plugin README's Privacy section).
Support: `supportUrl` (GitHub issues). Tool annotations: every tool has `title`, `readOnlyHint`, `destructiveHint`
and `openWorldHint`. Test account: none needed (no account exists); for a reviewer's page to test against, the
end-to-end app is `packages/mcp/test/e2e/app`. Example prompts: the three above.
- **Submitted (2026-10-28).** From Karanvir's Max account (the browser pane's sign-in; the listing belongs to that
account's organization), repository `genclass-dev/genclass-plugin`, `main` at e911b25, plugin page
`claude.ai/directory/manage/plugins/20878d40-42c5-4300-a1d6-f09b9cc291eb`. The portal's validation: 7 checks
passed, 4 warnings, 2 policy holds. The warnings: `documentationUrl`, `supportUrl` and `privacyPolicyUrl` in
`plugin.json` ("the directory reads them, Claude Code ignores them, no action needed") and "Launcher lock missing"
(above). Notes, not warnings: the server is local, so not on claude.ai; the agent-plugins `plugin.json` is ignored;
the icon passed without a code check. "MCP server command wasn't read" did not appear. The holds: "Runs a pinned npx
or uvx package", one for `.mcp.json` and one for the hook. Listed on Claude Code and Cowork; the Claude apps surface
was unticked because the skill says the chat app cannot run the server. Data handling: no personal data, no skill
sends data elsewhere, nothing retained, not for under-18s. Contact: mehar@daybot.ca. Auto-publish was switched on,
but the page says it does not apply until an Anthropic reviewer has published a version. Updates: the push webhook
("Set up push updates" on the plugin's page gives the payload URL and a secret shown once; "Rotate secret" on its
Settings tab replaces it) was added to the repository the same day with
`gh api -X POST repos/genclass-dev/genclass-plugin/hooks` (content type JSON, the push event only, active);
GitHub's ping delivery returned 200 and the page shows "Webhook connected". State: the security scan passed within
4 minutes of submitting; since then "In review" ("Held for: Content policy review", reason "Runs a pinned npx or
uvx package"); "Live" needs a reviewer, and the first version always does.
- **Lockfile re-validation (2026-10-28).** PR #125 (merged as d15192a) reached the plugin repository through the sync
workflow as 68507fa (`package.json` and `package-lock.json` added, the README updated). The webhook's push delivery
returned 200 and the page showed "last push just now", and "Check for new commits" was pressed, but the directory
took the new version "via scheduled check" about 9 minutes after the push (the page says its own check runs about
every 6 hours with or without a webhook). It fetched 17 files (177.7 kB); validation "Passed with warnings: 4
notes", and "Launcher lock missing" became the note "Launcher locked"; the scan passed in 2 minutes; compared with
e911b25, "2 new findings, 1 fixed". The version is held for a reviewer with two reasons now: "Runs a pinned npx or
uvx package" (2 findings, as before) and the new "Dependencies install from a lockfile" on `package-lock.json`:
"No action needed: a reviewer clears this hold. Keep a lockfile that pins an npx-launched server; to avoid the
install entirely, bundle the dependencies into built files of under 256 KiB each and remove both package.json and
the lockfile." So the lockfile earns the lock note, not fewer holds; only the vendored server (above) avoids both.
The three `plugin.json` URL fields, "Uses hooks" and "Runs a local program for an MCP server" are listed as
warnings for information only. The tracked branch cannot change while the plugin is under review.
- **Vendored server (2026-10-28).** After the second hold, the plugin repository was changed to what the hold text
asks for (the layout above): `.mcp.json` and the hook run the released server vendored under `server/` with `node`
from `${CLAUDE_PLUGIN_ROOT}`, and the plugin ships no `package.json` or lockfile. Locally, the assembled repository
passes `claude plugin validate --profile directory`, the vendored server answers `--version` and an MCP
`initialize`, and the hook exits silently without a bridge. The directory reads the result at its next check after
the sync pushes it; what it says is recorded here then.

## 4. punkpeye/awesome-mcp-servers

Expand Down
34 changes: 20 additions & 14 deletions packages/mcp/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,26 @@

## Unreleased

- **The plugin ships the launcher's lockfile.** `plugin/package.json` (private; its one dependency is `@genclass/mcp`
at this version) and `plugin/package-lock.json` (lockfileVersion 3: the version, its registry tarball and sha512
integrity) sit next to `.mcp.json`. Anthropic's directory asked for them on the plugin's first validation
(2026-10-28, the warning "Launcher lock missing": a lockfile with exact versions, registry sources and hashes is
required for the Verified badge), and its policy hold on pinned `npx` launchers prefers "a package that ships a
lockfile". Both files reach [genclass-dev/genclass-plugin](https://github.com/genclass-dev/genclass-plugin) through
its daily sync. Claude Code (2.1.311) installs what a plugin's lockfile lists when it installs the plugin
(`npm ci --ignore-scripts --workspaces=false --no-audit --no-fund` in the plugin's cache folder, so
`node_modules/@genclass/mcp` appears there); the launchers still run `npx -y @genclass/mcp@<version>`.
`test/manifests.test.ts` keeps both files at `package.json`'s version and requires the integrity. Only
`npm install --package-lock-only --ignore-scripts` in `plugin/` writes the lock, and only once npm serves the
version, so a release is: bump, `npm run sync -w @genclass/mcp`, tag; after the publish, the same sync again (it
regenerates the lock from npm) and a commit. In between, the test accepts the previous release's lock while npm
does not serve the new version (it asks `npm view` in that state only).
- **The plugin's repository vendors the server, and the lockfile is gone.** In
[genclass-dev/genclass-plugin](https://github.com/genclass-dev/genclass-plugin), `.mcp.json` and the hook run
`node ${CLAUDE_PLUGIN_ROOT}/server/genclass-mcp.mjs` instead of `npx -y @genclass/mcp@<version>`: `server/cli.mjs`
is the published package's `dist/cli.js` at the plugin's version, byte for byte (`scripts/plugin-repo.mjs` fetches
it from npm with `npm install --ignore-scripts` into a temporary prefix; `--server <package dir>` takes a local
build instead), and `server/genclass-mcp.mjs` is the package's `bin/genclass-mcp.mjs` importing it. Why: Anthropic's
directory holds a plugin whose launcher runs `npx <package>` for a reviewer ("Runs a pinned npx or uvx package"),
and the lockfile this line had added for its "Launcher lock missing" warning (`plugin/package.json` and
`plugin/package-lock.json`) earned the note "Launcher locked" but a second hold, "Dependencies install from a
lockfile" (2026-10-28). The directory's own text names the way out: the package's built files inside the plugin,
each under 256 KiB, run from `${CLAUDE_PLUGIN_ROOT}`, with no `package.json` or lockfile; so both files are removed
again. The plugin folder in GenClass-lib keeps the `npx` launchers (nothing built is committed here, and the
marketplace in GenClass-lib still lists it), and the Agent Plugins `mcp.json` keeps `npx` everywhere, because that
format has no plugin-root variable (Codex and Cursor read it). The daily sync vendors the release of `package.json`'s
version; between a bump and its release the script exits 3 and the repository stays as it is (its workflow treats
that as nothing to do), so a release is: bump, `npm run sync -w @genclass/mcp`, tag, publish; the next sync vendors
the new build. `test/manifests.test.ts` checks the assembled tree (the plugin folder byte for byte except the two
launchers, the server byte for byte, no `package.json`, lockfile or `node_modules`, every file under 256 KiB) and
that the vendored server runs.

- **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
Expand Down
Loading
Loading