From 74dd1b48c615ac343a791739139681dac74d4ad1 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 20 Aug 2026 03:19:33 +0000 Subject: [PATCH] feat: drop Agent Plugin packaging Remove plugin.json and document skills CLI plus Cursor Cloud environment install as the only supported distribution paths. Co-authored-by: Ben Sykes --- AGENTS.md | 2 +- README.md | 20 +++++++++++++------- docs/ARCHITECTURE.md | 14 +++++++------- docs/DEVELOPMENT.md | 1 - plugin.json | 9 --------- tests/test_skill_contract.py | 17 ++++------------- 6 files changed, 25 insertions(+), 38 deletions(-) delete mode 100644 plugin.json diff --git a/AGENTS.md b/AGENTS.md index 9baa33a..37cfdd3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ > Scope: Root project (applies to all subdirectories unless overridden) -Agent skills catalog for the [skills CLI](https://github.com/vercel-labs/skills) and a Cursor [Agent Plugin](https://agent-plugins.org) (`plugin.json` + `skills/`). Each skill is `skills//SKILL.md` (+ optional helpers). +Agent skills catalog for the [skills CLI](https://github.com/vercel-labs/skills). Each skill is `skills//SKILL.md` (+ optional helpers). ## Quick Facts diff --git a/README.md b/README.md index 11c852f..dc6fdce 100644 --- a/README.md +++ b/README.md @@ -89,21 +89,27 @@ Install every skill in this repo: bunx skills add SystemFiles/skills --skill '*' ``` -### Cursor plugin (IDE / team / Cloud Agents) +Laptop `--global` writes into your home skill dirs. Cursor Cloud Agents run on isolated VMs and do not see that home. -This repo is also an [Agent Plugin](https://agent-plugins.org): root [`plugin.json`](plugin.json) plus `skills/*/SKILL.md`. Prefer this path when you want Cursor (not other agents) to load the whole catalog without the skills CLI. +### Cursor Cloud -Local dry-run: +Cloud Agents load skills from the consumer checkout (`.cursor/skills/` or `.agents/skills/`) and from skill dirs on the **VM** home. They do not load a workspace-root plugin manifest. + +Preferred: attach a Cloud environment whose `install` runs at Build time: ```bash -ln -s "$(pwd)" ~/.cursor/plugins/local/systemfiles-skills +bunx skills add SystemFiles/skills --skill '*' --yes --global ``` -Reload Cursor, then confirm skills under Customize. +That populates the VM home skill dirs. Re-run a Build after catalog changes. A just-in-time agent with no environment skips this and gets only what is already in the checkout. + +Fallback: install (or copy) selected skills into the consumer repo and commit: -Team Marketplace (Teams / Enterprise): Dashboard → Plugins → import this GitHub repo → set Required or Default On. Enable auto-refresh if the Cursor GitHub App is on the repo. +```bash +bunx skills add SystemFiles/skills --skill issue-triage --yes +``` -Cloud Agents do not see `bunx skills add --global` home installs. After marketplace install, verify a Cloud Agent can invoke a skill from this catalog. If it cannot, commit the needed skills under `.agents/skills/` or `.cursor/skills/` in the target repo (project-scoped discovery). +Then commit the resulting `.cursor/skills/` or `.agents/skills/` paths. ## Updating and removing diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 8311f0e..d5733d8 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,12 +1,11 @@ # Architecture -This repo is a **skills.sh source catalog** and an [Agent Plugin](https://agent-plugins.org) package. Consumers install skills with the [skills CLI](https://github.com/vercel-labs/skills) (`bunx skills add SystemFiles/skills …`) or load the whole catalog as a Cursor plugin via root `plugin.json`. Agents load installed `SKILL.md` files; this repo’s Python tooling only validates the catalog and vendors upstream copies. Prefer `bun`/`bunx` over `npm`/`npx`. +This repo is a **skills.sh source catalog**. Consumers install skills with the [skills CLI](https://github.com/vercel-labs/skills) (`bunx skills add SystemFiles/skills …`). Agents load installed `SKILL.md` files; this repo’s Python tooling only validates the catalog and vendors upstream copies. Prefer `bun`/`bunx` over `npm`/`npx`. ## Layout ```text . -├── plugin.json # Agent Plugins manifest (Cursor / portable clients) ├── skills// # installable units (authored + vendored) │ └── SKILL.md # required; YAML frontmatter name + description ├── scripts/ # catalog maintenance (sync / capture) @@ -58,16 +57,17 @@ The skills CLI finds skills by **frontmatter `name`**, not directory name alone. Install surface for humans: root `README.md` skill tables. -## Cursor / Agent Plugin install +## Install surfaces -Root [`plugin.json`](../plugin.json) follows the [Agent Plugins](https://agent-plugins.org) standard. Cursor discovers every immediate child of `skills/` that has a `SKILL.md`. Catalog dirs (`scripts/`, `tests/`, `docs/`) stay in-repo; plugin clients ignore them. +The skills CLI is the only supported install path. There is no Agent Plugin manifest. | Surface | Mechanism | Cloud Agents | | --- | --- | --- | -| skills CLI | `bunx skills add …` into agent skill dirs | No — cloud VMs lack user home installs | -| Cursor plugin | Team Marketplace import of this repo, or `~/.cursor/plugins/local` symlink | Verify after install; if missing, commit skills under `.agents/skills/` / `.cursor/skills/` in the target repo | +| skills CLI (project) | `bunx skills add …` into the consumer repo’s agent skill dirs; commit those dirs | Yes — files are in the checkout | +| skills CLI (`--global` on a laptop) | Home skill dirs on the developer machine | No — Cloud VMs do not see that home | +| Cloud environment `install` | Build-time `bunx skills add SystemFiles/skills --skill '*' --yes --global` on the VM | Yes — when that environment is attached; JIT agents with no environment skip it | -Team distribution: Dashboard → Plugins → import this GitHub repo → **Required** or **Default On**. Local dry-run: symlink the repo to `~/.cursor/plugins/local/systemfiles-skills` and reload Cursor. +Team Marketplace plugin import and `~/.cursor/plugins/local` symlinks are not supported for this catalog. ## Quality pipeline diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 98113f2..96f4469 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -39,7 +39,6 @@ uv run python scripts/sync_upstream_skills.py | Validate skill-creator `evals/evals.json` | `task evals:validate` (optional `SKILL=name`) | | Run skill-creator evals via Cursor agent | `task evals` (all skills with `evals/`); `task evals SKILL=name` (one). Uses Sonnet 5 (`claude-sonnet-5-high`); override with `MODEL=…`. One agent per eval in parallel, then aggregate. | | Confirm skills CLI sees this path | `task verify-discovery` | -| Dry-run as Cursor Agent Plugin | `ln -s "$(pwd)" ~/.cursor/plugins/local/systemfiles-skills` then reload Cursor | | Refresh vendored skills | `task sync-upstream-skills` | | Propose catalog from another project | `task capture-project PROJECT=/path/to/project` | | Install git hooks | `task install-hooks` | diff --git a/plugin.json b/plugin.json deleted file mode 100644 index 505ab1d..0000000 --- a/plugin.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", - "name": "systemfiles-skills", - "description": "SystemFiles agent skills catalog (authored and vendored).", - "version": "1.0.0", - "author": { - "name": "SystemFiles" - } -} diff --git a/tests/test_skill_contract.py b/tests/test_skill_contract.py index 733c7a9..559beec 100644 --- a/tests/test_skill_contract.py +++ b/tests/test_skill_contract.py @@ -78,18 +78,9 @@ def test_skill_names_are_unique() -> None: assert not dupes, f"duplicate skill names: {dupes}" -def test_agent_plugin_manifest_present() -> None: - """Root plugin.json marks this catalog as an Agent Plugin for Cursor.""" +def test_agent_plugin_manifest_absent() -> None: + """This catalog is skills CLI only; do not ship an Agent Plugin manifest.""" manifest_path = ROOT / "plugin.json" - assert manifest_path.is_file(), "plugin.json must exist at repo root" - data = yaml.safe_load(manifest_path.read_text(encoding="utf-8")) - assert isinstance(data, dict), "plugin.json must be a JSON object" - assert data.get("$schema") == ( - "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json" - ), "plugin.json must declare the Agent Plugins 1.0.0 schema" - name = data.get("name") - description = data.get("description") - assert isinstance(name, str) and name.strip(), "plugin.json: 'name' required" - assert isinstance(description, str) and description.strip(), ( - "plugin.json: 'description' required" + assert not manifest_path.exists(), ( + "plugin.json must not exist at repo root (not an Agent Plugin package)" )