SKPM is a v0 skills package manager for AI tools (Claude Code, Codex, Cursor, Windsurf, etc.). It installs, updates, searches, and publishes skills from an HTTP registry with deterministic lockfiles.
skpm init
skpm add frontend
skpm installskpm init [name]- Create a projectskpm.jsonskpm search [query]- Search the registryskpm add <name[@range]>- Add a skill and installskpm install- Install skills fromskpm.jsonskpm update- Update versions and reinstallskpm list- List installed skillsskpm remove <name>- Remove a skill and reinstallskpm info <name> [--version <version>]- Show skill infoskpm publish- Publish a skill package to the registry
Global options:
--registry <url>- Override registry URL--tool <name[,name]>- Override agent targets for install--json- JSON output--verbose- Verbose logging
{
"name": "my-project",
"skills": {
"frontend": "^1.2.0",
"backend": "~2.0.0"
},
"registry": "https://registry.skpm.dev",
"agentTargets": ["claude", "codex"]
}Required fields:
nameskills(map of skill name -> semver range)
Optional fields:
registryagentTargets
{
"name": "frontend",
"version": "1.2.3",
"description": "Frontend skills",
"dependencies": {
"base": "^1.0.0"
},
"files": ["skills/**", "agents/**"],
"license": "MIT",
"author": "Your Name",
"skills": [{ "source": "skills/frontend.md" }],
"agents": [{ "source": "agents/frontend.md" }]
}Required fields:
nameversiondescriptionfiles(glob patterns relative to package root)licenseauthor
Optional fields:
dependenciesskillsagents
{
"lockfileVersion": 1,
"registry": "https://registry.skpm.dev",
"root": {
"name": "my-project",
"skills": {
"frontend": "^1.2.0"
}
},
"packages": {
"frontend@1.2.3": {
"name": "frontend",
"version": "1.2.3",
"dependencies": {
"base": "^1.0.0"
},
"resolved": {
"base": "1.0.4"
},
"integrity": "sha256-..."
}
}
}The registry is a static HTTP layout with metadata + tarballs:
index.json
packages/<name>/index.json
tarballs/<name>/<version>.tgz
Each package index entry includes the package manifest, integrity, and tarball path. The default registry URL used by the CLI is https://registry.skpm.dev.
SKPM installs packages into:
.agents/skills/.store/<name>@<version>/
Then exposes a single version per top-level skill:
.agents/skills/<name> -> .store/<name>@<version>
Tool-specific symlinks (auto-detected unless --tool / agentTargets is set):
- Claude:
.claude/agents/<name>->../../.agents/skills/<name> - Codex:
.codex/<name>->../.agents/skills/<name> - Cursor:
.cursor/rules/<name>/*.mdc->.agents/skills/<name>/*.md - Windsurf:
.windsurf/rules/<name>->../../.agents/skills/<name> - Gemini:
.gemini/rules/<name>->../../.agents/skills/<name> - Copilot:
.github/<name>->../.agents/skills/<name>
skpm initskpm add frontend@^1.2.0skpm updateFrom a skill package root (with a package skpm.json):
skpm publishThis writes a tarball and metadata into a file-based registry directory, updating index.json and packages/<name>/index.json. The CLI requires a local registry path (e.g. --registry file:///path/to/registry or --registry ./local-registry) because HTTP upload is not supported yet.
npm run typecheck
npm run lint:fix
npm run test
npm run build