We ship one plugin to Cursor and Claude Code. Both validators pass, bad repo fails 11/11.
We shipped one plugin to Cursor and Claude Code from a single marketplace repo. Both validators passed, and its sd-audit MCP server failed our bad fixture on 11 of 11 checks.
By David Discua
Measured in the lab
- 12/12
- good fixture checks passed
- 11/11
- bad fixture checks failed
- 14/14
- lab repo checks passed
- Cursor schemas and validate-plugins.mjs passed
- claude plugin validate passed (plugin + marketplace)
- sd-audit refused bad-repo (ok false)
- bun test 7 pass, 0 fail
- bun audit clean across 97 packages
From reports/sd-audit.json · run on October 14, 2026. cursor/plugins schemas fetched at 837067b7, never vendored; claude plugin validate via claude-code 2.1.299; sd-audit on good, bad and self
How it is wired
01/03One plugin folder holds the skills, the rule and the MCP server.
cursor/plugins holds Cursor's plugin specification, its JSON schemas and its official plugins. We built one marketplace repo that ships the same plugin, sd-minilab-standard, to both Cursor and Claude Code, and checked it against Cursor's schemas and validator at a pinned commit and against claude plugin validate. Both passed. The plugin carries an MCP server, sd-audit, that failed our bad fixture on 11 of 11 checks and passed the good one on 12 of 12. The catch is that nothing in CI clicks Install inside either app.
The catch
CI proves the manifests, the schemas and the MCP server. Installing into the Cursor and Claude Code apps is still a manual step, written up in docs/manual-install.md, and we have no headless way to drive either UI in CI.
cursor/plugins has no root LICENSE file at our pin, even though its README says MIT. So we fetch the schemas and scripts/validate-plugins.mjs into a temp directory at run time and never copy upstream files into our repo. That script also assumes a marketplace-root layout, so the lab stages our plugin into a temp tree before it runs.
On the Claude side, claude plugin validate --strict can warn on fields the runtime strips. Our script falls back to the non-strict check and records why, so read its output before you assume strict mode passed. The MCP server starts with bun, so any machine that installs the plugin needs Bun.
What we ran (keyless)
bun install
bun run check:skills
bun run typecheck
bun test
bun run validate:cursor
bun run validate:claude
bun run node:smoke
bun audit --registry=https://registry.npmjs.org
bun run report
From reports/sd-audit.json, run on October 14, 2026:
| Target | Result | Checks |
|---|---|---|
fixtures/good-repo | ok | 12 of 12 passed |
fixtures/bad-repo | refused | 0 of 11 passed |
| this lab repo | ok | 14 of 14 passed |
The bad fixture fails on all six .gitignore patterns (.env, node_modules, .venv, target/, coverage, *.log), on a missing gitleaks hook and a missing gitleaks CI step, on a missing .env.example and SECURITY.md, and with a warning for having no SKILL.md at all.
From the README's local green run on October 14, 2026, bun test passed 7 and failed 0 with 15 expect calls in 42.97 s. validate:cursor printed "All plugins validated successfully." against pin 837067b7, validate:claude passed for plugin and marketplace with @anthropic-ai/claude-code@2.1.299, and bun audit found no vulnerabilities across 97 packages.
How it is wired
.cursor-plugin/marketplace.json and .claude-plugin/marketplace.json both list the same folder, plugins/sd-minilab-standard. That folder carries a Cursor plugin.json, a Claude plugin.json, an Agent Plugins 1.0.0 plugin.json, three skills, a Cursor rule and mcp.json. Once installed, your agent can call audit_repo on any repo and get a pass or fail per control before it trusts that repo's setup.
Minilab (open source)
Cursor's spec lives at cursor/plugins (11,385 stars, no LICENSE file, TypeScript, as of October 14, 2026), which we pin at 837067b7. Re-run bun install, bun test and bun run report, then try bun run sd-audit -- fixtures/good-repo or point it at your own repo.
Run it yourself
SkilledDragonCorp/minilab-dual-plugin-marketplace
Clone, install and run the report with no API keys. The numbers above are what that run writes.
bun install && bun test && bun run reportSkilledDragon is not affiliated with Cursor, Anthropic or cursor/plugins. Numbers are from our own keyless lab run; re-run the report before relying on them. Marks belong to their owners.
All labs