skilla
CI Release Homebrew Agent Skills Agent Plugins Made for AI agents Pure Bash ShellCheck POSIX License: MIT
A small, dependency-light CLI for installing Agent Skills and Agent Plugins from git repositories into the locations agents read them from.
It clones a repo, discovers skills/<name>/SKILL.md, resolves declared
dependencies (requires:), and installs the skills into a project
(.agents/skills/) or your home (~/.agents/skills/) — tracking what's installed
in a small JSON registry so it can list, update, and remove cleanly. When the
source is an Agent Plugins 1.0.0 package,
skilla plugin validates the manifest, installs the whole package, and hands you the
MCP config with ${PLUGIN_ROOT}/${PLUGIN_DATA} already expanded.
Built to install agentskills.io skills for agents such as Devin (which indexes
.agents/skills/<name>/SKILL.md) while staying host-agnostic — a drop-in for environments where a vendor plugin manager isn't available.
Requirements
bash, git, and jq (apt install jq / brew install jq).
Install
Managed — Homebrew (macOS/Linux):
brew install junior/tap/skilla
Managed — mise:
mise use -g 'github:junior/skilla[exe=skilla,matching=skilla]@0.4.1'
Quick — fetch the single script onto your PATH:
curl -fsSL https://raw.githubusercontent.com/junior/skilla/v0.4.1/skilla \
-o ~/.local/bin/skilla && chmod +x ~/.local/bin/skilla
Usage
skilla <command> [options] [arguments]
Skills:
add <git-url> Install skills from a repo (with --force to reinstall)
repo ls <git-url> List a repo's skills (name · version · description) — no install
update [skill] Update one skill, or all if omitted
list, ls List installed skills + versions
info <skill> Show a skill's details + declared dependencies
remove, rm [skill] Remove a skill (or all with --all)
Plugins (Agent Plugins 1.0.0):
plugin ls [git-url] Inspect a plugin at a URL, or list installed plugins
plugin add <git-url> Install a plugin: package + its skills + its plugin data
plugin info <name> Manifest, components, PLUGIN_ROOT / PLUGIN_DATA
plugin mcp <name> Print its mcp.json with the placeholders expanded
plugin remove <name> Uninstall the package, its skills and its data
plugin validate [dir] Conformance-check a plugin directory (default: .)
plugin init [dir] Scaffold a conformant plugin.json + skills/
Other:
verify <artifact> Verify a cosign-signed release artifact
version Print version (also -v, --version)
Options:
--scope <user|project> project = ./.agents/skills/ (default); user = ~/.agents/skills/
-g, --global Shorthand for --scope user
--path <dir> Install into a custom directory (e.g. .claude/skills)
-s, --skill <name> Install only one named skill from the repo
--force Reinstall even if present
--check Report actions without applying them
-y, --yes Auto-confirm prompts
--all Apply to all (for remove)
Examples
skilla repo ls https://github.com/microsoft/azure-skills # browse before installing
skilla add git@github.com:acme/skills.git # every skill in the repo
skilla add git@github.com:acme/skills.git -s nginx # one skill (+ its deps)
skilla add --scope user git@github.com:acme/skills.git # into ~/.agents/skills (-g works too)
skilla list
skilla info nginx
skilla update nginx
skilla remove nginx
Agent Plugins
An Agent Plugin is a directory with a
plugin.json manifest and components in fixed locations — skills/<name>/SKILL.md
and mcp.json. The format is vendor-neutral (TSC: Amazon, Cursor, Google, Microsoft,
OpenAI, Vercel), so the same package loads in ChatGPT/Codex, Cursor, GitHub Copilot,
Kiro and VS Code — and here.
skilla plugin ls https://github.com/acme/my-plugin # manifest + skills + MCP servers
skilla plugin add https://github.com/acme/my-plugin
skilla plugin ls # installed plugins
skilla plugin mcp my-plugin # ready-to-paste MCP config
skilla plugin remove my-plugin
| Location | |
|---|---|
Package (PLUGIN_ROOT) | .agents/plugins/<name>/ — kept intact, so ${PLUGIN_ROOT} resolves |
Persistent data (PLUGIN_DATA) | .agents/plugin-data/<name>/ — created on install, survives updates |
| Its skills | copied into .agents/skills/ where agents index them, tagged with the plugin |
| Registry | .agents/plugins.json (separate from registry.json, so names can't collide) |
skilla does not run MCP servers. skilla plugin mcp <name> prints the plugin's
mcp.json with ${PLUGIN_ROOT}/${PLUGIN_DATA} expanded to absolute paths (and
PLUGIN_ROOT/PLUGIN_DATA injected into each stdio server's env), ready to paste
into whatever host actually launches them.
Failure boundaries follow the spec: unknown top-level manifest fields and a non-object
extensions are reported but non-fatal; any other manifest violation rejects the whole
plugin; an invalid mcp.json disables MCP only; a bad single server entry or skill is
skipped and the rest still installs.
Authoring a plugin
skilla plugin init ./my-plugin # scaffold a conformant plugin.json + skills/
skilla plugin validate . # check manifest, mcp.json and skills against 1.0.0
validate checks the closed manifest schema, the name grammar, the closed author
object, extension namespacing, the mcp.json transports (stdio single-token command,
cwd containment, reserved PLUGIN_ROOT/PLUGIN_DATA env keys, http-only-for-loopback
URLs, case-insensitive duplicate headers) and each skill's SKILL.md frontmatter.
Unlike a loading client it keeps going after a fatal manifest error, so you can fix
everything in one pass.
How it works
- Discovery — a source repo holds skills at
skills/<name>/SKILL.md(a repo with a single rootSKILL.mdis treated as one skill). This is also the Agent Plugins location, so a plugin's skills are found the same way. - Dependencies — if a skill declares
metadata.requires(or a top-levelrequires:) in itsSKILL.mdfrontmatter, orrequiredSkillsunderplugin.jsonextensions["dev.skilla"], those sibling skills are installed automatically from the same source (transitive closure). - Version — read from
SKILL.mdfrontmattermetadata.version— the location the agentskills.io spec defines, which has no top-levelversion:field. A top-levelversion:is still read as a legacy fallback, thenplugin.json, then the commit hash. - Registry — installs are recorded in
registry.jsonbeside the skills dir (source,commit,version, timestamps), solist/update/removeare exact and only ever touch skills this tool installed. - No code runs at install time — it clones and copies; a skill's own scripts only run later when an agent uses it.
- Fast on big catalogs —
add --skill,update, andrepo lsuse partial + sparse clones (only the needed skill's files download; dependencies materialize on demand), falling back to a plain shallow clone when the server/git can't do it.
Scopes
| Scope | Skills dir | Plugins dir | Registry |
|---|---|---|---|
--scope project (default) | ./.agents/skills/ | ./.agents/plugins/ | ./.agents/registry.json |
--scope user (or -g) | ~/.agents/skills/ | ~/.agents/plugins/ | ~/.agents/registry.json |
custom (--path DIR) | DIR | DIR/../plugins/ | DIR/../registry.json |
Use skilla from your AI CLI (the skilla skill)
This repo also ships a skill named skilla (skills/skilla/SKILL.md,
agentskills.io format) that teaches an AI CLI —
Claude Code, Devin, Cursor, anything that reads agent skills — to install and manage
skills through skilla instead of its vendor-specific mechanism. Install it once and
"install the nginx skill from " just works inside the agent:
# for the current project (Devin indexes .agents/skills/):
skilla add https://github.com/junior/skilla --skill skilla
# user-wide:
skilla add --scope user https://github.com/junior/skilla --skill skilla
# for a Claude Code project (its skills dir):
skilla add --path .claude/skills https://github.com/junior/skilla --skill skilla
This repo is itself a conformant Agent Plugin (plugin.json + skills/), so any
Agent Plugins client can load it — including skilla:
skilla plugin add https://github.com/junior/skilla
Development
bash tests/test.sh # self-contained: builds a fixture catalog, asserts install + deps
shellcheck skilla tests/test.sh