Skills
Overview
AKM maintains a cold library of skills on your machine. The library is the
git working tree of your personal registry, checked out at
~/.local/share/akm/library/. A skill you edit locally survives the next sync,
AKM can tell you which side has moved, and publishing one skill is one commit.
Skills are never all loaded globally. They activate through two layers that give you precise control over which skills are available in each context.
Skills follow the Agent Skills specification, an open standard for portable AI coding skills.
Two-Layer Activation
Layer 1 — Core (global, always available)
Specs marked core in their akm.json sidecar
Symlinked into ~/.claude/, ~/.copilot/, ~/.agents/, ~/.pi/agent/, ~/.vibe/
Layer 2 — Project (declared in a manifest, mounted per session)
.agents/akm.json lists skill/agent IDs
Shell wrapper reads the manifest → symlinks into a per-session staging dir
akm skills add/remove refresh the running session immediately
Layer 1 — Core
Core skills are globally available across all projects. Specs marked core in
their akm.json sidecar are symlinked directly into tool directories
(~/.claude/, ~/.copilot/, ~/.agents/, ~/.pi/agent/, ~/.vibe/). The
core default lives in the sidecar and propagates to your other machines;
a per-machine override stays in local.json and does not.
Layer 2 — Project
Project-level skills are declared in a manifest file and loaded automatically
when you start a session. The shell wrappers read the manifest and symlink the
declared specs into a per-session staging directory. akm skills add and
akm skills remove update that manifest and refresh the active session’s
symlinks straight away, so a skill added mid-session is available without a
restart.
Shell Wrappers
akm setup wires akm-init.sh into your .bashrc, providing wrapper functions
for claude, copilot, opencode and pi. These wrappers handle the full
lifecycle:
- Pull latest artifacts (if enabled)
- Create a per-session skills staging directory with manifest specs loaded
- Hand the staging and artifact dirs to the tool in the form it understands —
--add-dirfor Claude Code and Copilot,OPENCODE_CONFIG_DIRfor OpenCode,--skillfor Pi - Cleanup on exit: destroy the staging dir, commit+push artifacts (if auto-push enabled)
Mistral Vibe has no way to take a directory at launch, so it gets no wrapper —
only core skills and global instructions, in ~/.vibe/.
Project Manifests
Declare which skills a project uses in .agents/akm.json:
{
"skills": ["test-driven-development", "systematic-debugging"],
"agents": ["code-reviewer"]
}
These are loaded automatically when you start a session via the shell wrappers. Manage with:
# Add skills to the manifest (also loads them into the running session)
akm skills add test-driven-development systematic-debugging
# Remove a skill
akm skills remove systematic-debugging
Managing Skills
Browsing and searching
# Browse the library (also what bare `akm skills` opens)
akm skills list
# Filter by tag or type
akm skills list --tag testing
akm skills list --type agent
# Search by keyword
akm skills search debugging
Bare akm skills opens the library list — the same view as akm skills list.
Full status overview
akm skills status
The status view leads with the Manifest section — the specs the current
project declares — since that is what matters most when standing in a project;
Core and the rest of the library follow. The list and status TUIs share a
set of action keys — e edits a spec, a
adds it to the project manifest, r removes it, R renames, D deletes. On a
spec that shows drift, p queues it to publish and u discards your local
edits. Add --plain to either command for scriptable plain-text output.
The Registry Model
Your library is your personal registry’s git working tree. There is one
writable registry — configured with registry.url — and it is the only one
mounted into tool directories. Read-only shared registries
are troves you import from; nothing in them is ever mounted.
akm skills sync keeps the library in step with the registry:
- Fetch the registry
- Fast-forward the working tree — never a real merge, so no conflict marker can reach a skill symlinked live into a tool directory
- An edit of yours to a skill the update also touched is parked and put back on top; everything else fast-forwards
- Regenerate
library.jsonand rebuild core symlinks
Sync never merges and never prompts — it reports what needs a decision, and you
decide with publish, diff or revert.
Drift Markers
Because the library is a git working tree, AKM can tell you which side moved.
Each spec carries a marker in akm skills list, akm skills status and the
sync report:
| Marker | Meaning | What to do |
|---|---|---|
* |
Edited here, not yet published | akm skills publish <id> |
v |
The registry is ahead | akm skills sync |
! |
Both sides moved (diverged) | akm skills diff <id>, then publish or revert |
# Inspect a diverged spec
akm skills diff my-skill
# Keep your version
akm skills publish my-skill
# Discard your edits (locally, or take the registry's copy)
akm skills revert my-skill
akm skills revert my-skill --remote
Publishing
Publishing writes to your registry on your own authority. One intent is one commit:
# Publish a single spec
akm skills publish my-skill
# Publish everything pending, as one commit and one push
akm skills publish
# Preview either without touching the remote
akm skills publish --dry-run
When run interactively, akm skills promote and akm skills import offer to
publish the new skill right away. See Skill Format for
authoring and Shared Registries for pulling from,
and contributing back to, other people’s repos.
Importing from GitHub
Import any skill directly from a GitHub repository URL:
# Import from a directory URL
akm skills import https://github.com/user/repo/tree/main/skills/my-skill
# Import with a custom ID
akm skills import https://github.com/user/repo/tree/main/skills/my-skill --id custom-name
# Import every skill under a directory
akm skills import https://github.com/user/repo/tree/main/skills --all
Both /tree/ (directory) and /blob/ (file) GitHub URLs are supported. For
private repos, set the GITHUB_TOKEN environment variable.