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 @@ -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/<name>/SKILL.md` (+ optional helpers).
Agent skills catalog for the [skills CLI](https://github.com/vercel-labs/skills). Each skill is `skills/<name>/SKILL.md` (+ optional helpers).

## Quick Facts

Expand Down
20 changes: 13 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
14 changes: 7 additions & 7 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -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/<name>/ # installable units (authored + vendored)
│ └── SKILL.md # required; YAML frontmatter name + description
├── scripts/ # catalog maintenance (sync / capture)
Expand Down Expand Up @@ -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

Expand Down
1 change: 0 additions & 1 deletion docs/DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` |
Expand Down
9 changes: 0 additions & 9 deletions plugin.json

This file was deleted.

17 changes: 4 additions & 13 deletions tests/test_skill_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
)
Loading