spm is a package manager for AI agent skills. It installs reusable skills from Git-based catalogs into every coding agent on your machine β one spm install, and the skill lands wherever your agents look for it:
| Agent | Project scope | Global scope |
|---|---|---|
| Claude Code | .claude/skills/<skill>/ |
~/.claude/skills/<skill>/ |
| Google Antigravity (IDE + CLI) | .agents/skills/<skill>/ |
~/.gemini/config/skills/, ~/.gemini/antigravity-cli/skills/ |
| OpenAI Codex CLI | .agents/skills/<skill>/ |
~/.agents/skills/<skill>/ |
| Cursor | .cursor/rules/<skill>.mdc |
β |
| Cline | .clinerules/<skill>.md |
~/Documents/Cline/Rules/<skill>.md |
| Devin | .devin/skills/<skill>/ |
%APPDATA%/devin/skills/ (or ~/.config/devin/skills/) |
| Aider | .aider/skills/ + .aider.conf.yml |
~/.aider/skills/ + ~/.aider.conf.yml |
| GitHub Copilot | .github/instructions/<skill>.instructions.md |
β |
| Hermes | skills/<skill>/ |
~/.hermes/skills/<skill>/ |
| OpenClaw | .agents/skills/<skill>/ |
~/.openclaw/skills/<skill>/ |
| opencode | .opencode/skills/<skill>/ |
~/.config/opencode/skills/<skill>/ |
| Sourcegraph Amp | .agents/skills/<skill>/ |
~/.config/amp/skills/<skill>/ |
| Pi | .agents/skills/<skill>/ |
β |
Global deployments only target agents that are actually installed on your system. Many agents read the
shared .agents/skills/ convention, so one install often reaches several at once.
By default a skill installs to every detected agent β use the interactive checklist or the
--agents flag to pick a subset. See Choosing which agents.
npm β no .NET required:
npm install -g @hiadamhere/spm
# or run it without installing:
npx @hiadamhere/spm --helpHomebrew (macOS / Linux):
brew install hiadamhere/spm/spmScoop (Windows):
scoop bucket add spm https://github.com/hiadamhere/scoop-spm
scoop install spmStandalone binary β download the self-contained executable for your platform from the latest release (also no .NET required).
.NET tool β for .NET users (requires the .NET 10 SDK or runtime):
dotnet tool install -g spmVerify any of them with spm --help, or run spm with no arguments for an interactive REPL.
Install one now β point spm at any GitHub repo that has skills; nothing is kept around:
spm install anthropics/skills # pick one or more of the repo's skills
spm install anthropics/skills/pdf # install one directlyspm shallow-clones the repo to a temp folder, deploys the skill, and throws the clone away. No subscription, no clutter.
Subscribe to a library β when you'll reuse a set of skills, add it as a catalog; its skills then show up in list/search and install by bare name:
spm catalog add mine https://github.com/you/skills.git # or: spm catalog add mine you/skills
spm catalog sync # clone/pull subscribed catalogs
spm list # everything available, with descriptions
spm install some-skill # by name β no URL neededOr import a curated index of repos in one go:
spm catalog import # spm's official featured catalog
spm catalog syncRun spm with no arguments for an interactive REPL.
By default spm install deploys to every AI agent detected on your machine. You control which ones:
-
On a terminal, install shows a checklist β Claude Code, Antigravity/Gemini, and OpenAI Codex are pre-checked; the rest are listed unchecked (space to toggle, enter to confirm).
-
Non-interactively / in scripts, pass
--agentswith a comma-separated list of keys:spm install pdf --agents claude,cursor # only these two spm install pdf --agents copilot # just GitHub Copilot
Valid agent keys:
claude Β· gemini (alias antigravity) Β· codex Β· cursor Β· cline Β· devin Β· aider Β·
copilot Β· hermes Β· openclaw Β· opencode Β· amp Β· pi
Combine with the scope flags below (--project / --global / --all) to control where as well as
which. Agents that write the same folder (e.g. Codex, OpenClaw, Amp and Pi all read .agents/skills/)
are offered as a single choice.
spm install org/repo |
spm catalog add / import |
|
|---|---|---|
| For | grabbing a skill once | a library you'll reuse |
| Keeps a clone? | no (temp, discarded) | yes (a subscription) |
| Reference by | the repo each time | bare skill name |
| Updates | re-fetches the repo | pulls the catalog |
Both honor a repo's custom skills location β see Skill layout.
spm listshows every skill across your catalogs, grouped by catalog, one line each with its description and install status.spm search <text>(aliasfind) ranks skills by relevance across names and descriptions β not just an exact substring. It's tolerant of word order, partial words/stems, and typos, sospm search "seo website"surfaces a skill described as "analyze a website's SEO and ranking factors."spm info <skill>(aliasshow) prints a detail view: catalog, description, install status/scope, version, and reference-file count.
Descriptions are read from each skill's SKILL.md YAML frontmatter (description:).
A skill is a folder with a SKILL.md (its name + description frontmatter) and optional references/:
my-skill/
βββ SKILL.md
βββ references/
By default spm looks for skills under skills/ at a repo's root. To keep them elsewhere, add a skills.json at the repo root β vendor-neutral, so any tool can adopt it:
{ "path": "packages/skills" }path may also be a list: { "path": ["skills", "extra/skills"] }. This works for both install org/repo and subscribed catalogs.
A catalog is a subscription to a skills repo. Manage them with:
spm catalog add <name> <url|org/repo> [--priority N] [--local <path>]
spm catalog import [<catalog.json url | org/repo | official>]
spm catalog sync # clone/pull all subscribed catalogs
spm catalog list
spm catalog remove <name>
spm catalog root [<path>] # where clones are stored (or set SPM_HOME)- Priority (lower wins) decides which catalog provides a skill when names collide.
--local <path>reuses a clone you already have (or clones there instead of the default root) β great for turning an existing checkout into a catalog.catalog removenever deletes a--localclone.- Private repos work through your existing git auth (SSH keys, credential manager).
- Clone location defaults to
~/.spm/catalogs/; move it per-catalog with--local, globally withspm catalog root <path>, or relocate everything with theSPM_HOMEenv var.
spm catalog import subscribes to every repo listed in a catalog.json index β spm's official one by default, or any URL / org/repo you pass:
{
"name": "spm featured",
"description": "Curated agent skills",
"repos": [
{ "url": "https://github.com/anthropics/skills", "name": "anthropic" },
{ "url": "https://github.com/openai/skills", "path": "skills/.curated", "name": "openai" }
]
}Each entry needs a url; optional path overrides that repo's skills folder (if it has no skills.json), and optional name/description are for nicer output.
- Inside a project (a folder with
.gitorpackage.json),spm install <skill>deploys to project-local agent folders. - Outside a project, it deploys globally for every detected agent.
--projectforces project-only;--globalforces global-only;--alldoes both.- To pick which agents receive the skill, see Choosing which agents above.
spm uninstall <skill>removes only that skill's files/sections, using the same scope rules. Runspm uninstallwith no name to pick a scope and then multi-select which installed skills to remove.
Skill versions are tracked by their source's Git commit SHA.
spm update my-skill # re-fetch this skill, refresh if it changed
spm update # pick which installed skills to update (or updates all non-interactively)
spm resurrect # review skills whose files went missingAn update refreshes only the deployments that still exist, reproducing the exact scope, agents, and project directory the skill was installed with β from anywhere. Skills installed straight from a repo (install org/repo) update by re-fetching their source; subscribed ones update by pulling the catalog.
If you've manually deleted a skill's files, update won't silently restore them β it marks the skill lost and leaves it alone. spm resurrect lists lost skills and lets you restore (reinstall where they were) or forget them. So: update keeps things current; resurrect brings back what you removed.
spm ships an MCP stdio server so agents can find and install skills without leaving the conversation. Start it with spm mcp serve and point your MCP client at it β spm exposes its commands as tools: search (find a skill by intent), list, info, install, and the catalog_* family. So instead of you wiring up a skill by hand, the agent can search a catalog and install the right one itself.
Read-only tools (list, catalog list, search, info) are annotated as safe; destructive ones (uninstall, catalog remove) carry MCP destructive hints, so agents ask before running them.
- A skill's install state is tracked once per skill name, not per project β installing the same skill into several projects tracks only the most recent project path.
- The single-file agents get just the skill's text, not its folder, so bundled reference files aren't deployed there: Aider (
SKILL.mdcontent), Cursor (.mdcrule), Cline (rule file), and GitHub Copilot (instruction file). The folder-based agents β Claude Code, Antigravity/Gemini, Codex, Devin, Hermes, OpenClaw, opencode, Amp, and Pi β get the full skill folder.
Repl Toolkit (command graph, REPL, and MCP integration) and Spectre.Console.