skills
A package manager for agent skills: directories
holding a SKILL.md that teach Claude Code, Codex, OpenCode and other agents
how to do something.
skills installs them from any git repository, locks each one to a commit
and links it into every agent you use. The skills you added go in a manifest
and the exact commits in a lock file next to it, so committing both gives you
the same skills on every machine.
$ skills add anthropics/skills --skill pdf --skill xlsx
Added skills at dbd4588: pdf, xlsx
Installed pdf, xlsx for claude, codex
$ skills list
skills dbd4588 anthropics/skills
pdf installed skills/pdf
xlsx installed skills/xlsx
$ skills update
skills is up to date at dbd4588
All skills are installed for claude, codex
Install
You need git. With Go:
go install simenandre.no/skills@latest
With Nix:
nix profile install git+https://git.simenandre.no/skills
Use
skills add owner/repo # every skill in a GitHub repository
skills add owner/repo --skill pdf # just one
skills add owner/repo#v1.2.0 # follow a tag or branch, or pin a commit
skills add git@host:me/skills.git # any git URL, including private ones
skills list # what is installed, from where, for whom
skills update [source...] # move to the newest commits
skills remove <source>... # uninstall
skills install # install exactly what is locked
skills <command> --help explains each command, with examples.
Where things go
| What | Where |
|---|---|
| Manifest | --manifest, else $SKILLS_MANIFEST, else $XDG_CONFIG_HOME/skills/skills.json |
| Lock | skills.lock, next to the manifest |
| Checkouts | $XDG_DATA_HOME/skills |
| Installed skills | symlinks in each agent's skills directory |
Agents: claude ($CLAUDE_CONFIG_DIR or ~/.claude), codex ($CODEX_HOME
or ~/.codex) and opencode ($XDG_CONFIG_HOME/opencode). By default
skills installs into every one of them that exists on the machine; to choose,
list them in the manifest:
{
"agents": ["claude"],
"sources": { "...": {} }
}
skills only ever replaces or removes symlinks it created, so skills you
installed some other way are left alone. If one is in the way, it tells you.
Scripts
skills list --json prints machine-readable output. Progress goes to stderr,
and only to a terminal; --quiet silences everything but errors. Exit codes:
0 success, 1 failure, 2 invalid usage, 130 interrupted.
home-manager
The flake has a home-manager module that installs the locked skills itself, so they are part of your configuration like anything else:
{
inputs.skills.url = "git+https://git.simenandre.no/skills";
# in your home-manager configuration
imports = [ inputs.skills.homeManagerModules.default ];
programs.skills = {
enable = true;
lockFile = ./skills.lock;
# Lets `skills add` and `skills update` edit this file in your checkout.
manifest = "/home/me/dotfiles/skills.json";
agents = [ "claude" "codex" ];
};
}
The module sets SKILLS_MANAGED_BY=home-manager. skills then edits the
manifest and lock, fetches sources into the Nix store as you, and leaves the
installing to your next switch. Fetching as you matters for private
repositories: Nix finds them already in the store by their hash, even when
root evaluates your configuration without your SSH keys. On a new machine, run
skills install before your first switch for the same reason.
Agent skill
skill/skills teaches agents to use this CLI. Install it with:
skills add https://git.simenandre.no/skills --skill skills
License
MIT
