Skip to content

fix(distribution): make the Cursor plugin installable and document the install - #424

Merged
TMHSDigital merged 1 commit into
mainfrom
fix/cursor-plugin-install
Oct 5, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
fix/cursor-plugin-install

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Closes #347.

Problem

A Cursor user who followed the README got the 9 rules and none of the 16 skills. Cursor loads skills only from a skills folder (.cursor/skills/, .agents/skills/, …) or from an installed plugin, so "reference skills by name in chat" did nothing.

The repo's .cursor-plugin/plugin.json couldn't be that plugin either. Cursor's schema (cursor/plugins schemas/plugin.schema.json) sets additionalProperties: false, and the manifest carried four inventory keys (snippets, templates, examples, showcase). Those keys only mirrored the filesystem for this repo's own CI. There was also no marketplace.json, which a repository import needs.

Change

  • .cursor-plugin/plugin.json: drops the four inventory keys; skills and rules stay; adds homepage and repository.
  • New .cursor-plugin/marketplace.json: one entry, source: "./".
  • scripts/build_plugin_dist.py:
    • the slim plugin-dist tree now ships both Cursor manifests;
    • verify() checks every Cursor skills/rules path exists in the dist;
    • the dist README tells Cursor users to clone the branch into ~/.cursor/plugins/local/.
  • README Quick start, landing installSteps (site.json), README update/uninstall:
    • the primary path is a local plugin from plugin-dist;
    • teams can import the repo as a team marketplace;
    • per-project copying of skills/* + rules/*.mdc is the fallback;
    • copying only the rules now explicitly "gives you no skills".
  • scripts/site/build_site.py: snippet, template and example-total counts come from disk instead of the manifest arrays.
  • validate.yml validate-manifest:
    • rejects any key outside Cursor's schema;
    • requires a kebab-case name;
    • keeps the skills/rules and disk two-way check and the VERSION check;
    • checks marketplace.json lists exactly this plugin with allowed keys.
  • CLAUDE.md / AGENTS.md / CONTRIBUTING.md: drop the "list it in .cursor-plugin/plugin.json" authoring step for examples and showcase pieces (one less wiring step per new example).
  • Unchanged: the release workflow's version-line regex still matches, and marketplace.json has no version field to sync.

Evidence

  • jsonschema against Cursor's published schemas:
    • new plugin.json: valid;
    • new marketplace.json: valid;
    • main's plugin.json: invalid, Additional properties are not allowed ('examples', 'showcase', 'snippets', 'templates' were unexpected).
  • New Validate step, run locally: passes (Manifest verified at v0.143.6: {'skills': 16, 'rules': 9}). Falsified against main's manifest, it exits 1 with four is not in the Cursor plugin schema errors.
  • build_plugin_dist.py --check: 69 files, 0.28 MB ok. test_build_plugin_dist.py passes.
  • Landing page before/after: identical counts. The only difference is that the snippet list is now alphabetical: shader-node-group moved one place, because the manifest order wasn't sorted.
  • check_counts.py and check_frontmatter.py pass.

Not run: installing into an actual Cursor client (no Cursor on this host, and I didn't want to modify a local Cursor profile). The layout follows Cursor's documented component discovery, and the manifests validate against Cursor's own schemas.

🤖 Generated with Claude Code

…e install

Following the README, a Cursor user got the 9 rules and none of the 16
skills: Cursor loads skills only from a skills folder or an installed
plugin, and "reference skills by name in chat" does nothing. The repo's
.cursor-plugin/plugin.json could not serve as that plugin: Cursor's
schema (cursor/plugins schemas/plugin.schema.json) sets
additionalProperties: false, and the manifest carried four inventory
keys (snippets, templates, examples, showcase) that only mirrored the
filesystem for this repo's own CI. jsonschema rejects it with exactly
those four keys.

- plugin.json drops the inventory keys (skills and rules stay) and adds
  homepage/repository; .cursor-plugin/marketplace.json is new. Both
  validate against Cursor's schemas.
- The plugin-dist build ships the Cursor manifests, so a Cursor user
  clones the slim branch into ~/.cursor/plugins/local/ (README, landing
  install steps and the dist README say how; per-project copying of
  skills/ and rules/ is the fallback).
- The landing page counts snippets, templates and examples from disk;
  Validate checks the manifest against the schema's allowed keys and the
  marketplace entry, instead of the inventory. CLAUDE.md, AGENTS.md and
  CONTRIBUTING.md drop the "list it in plugin.json" authoring step.

Closes #347

Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@TMHSDigital

Copy link
Copy Markdown
Owner Author

CI evidence before merge: all checks pass ( 13 pass ). Blender Smoke on PR head: Blender 5.2.2 LTS / Blender 4.5.14 LTS. Summaries (happy path; falsifiers) per leg: 143 passed, 1 skipped, 0 failed;142 passed, 0 skipped, 0 failed;141 passed, 3 skipped, 0 failed;136 passed, 6 skipped, 0 failed;

@TMHSDigital
TMHSDigital merged commit cf76bff into main Oct 5, 2026
13 checks passed
@TMHSDigital
TMHSDigital deleted the fix/cursor-plugin-install branch October 5, 2026 00:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

distribution: Cursor install delivers the 9 rules but none of the 16 skills; .cursor-plugin manifest is unused and off-schema

1 participant