Skills manager for AI agents
Project description
Sklm
Skills manager for AI agents
Why Sklm? • Quickstart • Usage • Updating • Supported Agents • How it Works • Development
Why Sklm?
Sklm lets you install AI agent skills once and activate them per project. No more copy-pasting SKILL.md files between directories.
- Install a skill globally and every project sees it, even when it's irrelevant.
- Drop it in one project and it's invisible to others.
Sklm keeps a global library in ~/.sklm/, then lets you pick which skills each project sees.
[!NOTE] Sklm only supports
skillresources for now. More resource types may come later.
Features
- Works with 30 AI agents — from OpenCode and Claude Code to Codex CLI, GitHub Copilot, and beyond.
- Install once, scope per project — a global store at
~/.sklm/holds your skills; per-project symlinks activate only what you need. - Auto-sync —
sklm addandsklm rmautomatically update the agent's skills directory. No manual copying. - Registry discovery — index local folders or git repos as searchable skill catalogs.
- Git repo installation —
sklm add --fromclones a repo and figures out where the skill lives. - Per-agent skill variants — a single skill can ship agent-specific file overrides in a
variants/subdirectory. Each agent receives the version tuned for it.
Installation
pip install sklm-cli
[!TIP] For development, clone the repo and use
pip install -e .for an editable install.
Quickstart
pip install sklm-cli # install globally
sklm # interactive wizard opens — detects your setup
That's it. The CLI's interactive wizard detects your AI agents, initializes the workspace, and guides you through adding your first skill — no flags needed.
[!TIP] Run
sklm init --agent opencodeto skip the wizard and set a specific agent. Pass--agentmultiple times for multiple agents.
Usage
Workspace setup
sklm init # auto-detect or prompt for agent(s)
sklm init --agent opencode # force a specific agent
sklm init --agent claude --agent cursor # multiple agents at once
sklm status # show workspace health
sklm status --repair # fix broken symlinks
If no agent directory is detected, Sklm shows an interactive prompt. Select one or more agents (e.g. 1,3,5) or press c to skip.
Global store (install once, activate anywhere)
sklm install skill find-skills \
--from https://github.com/vercel-labs/skills
sklm uninstall skill find-skills # remove from global store
sklm uninstall skill find-skills --force # skip confirmation
sklm migrate # import all from ~/.agents/skills/
sklm migrate skill find-skills # import a single skill
sklm migrate --from-registry my-reg # import from a local registry
sklm migrate --force-cleanup # delete sources after import
Project resources (activate per project)
sklm add skill my-skill # resolve → store → link → sync
sklm add skill my-skill \
--from https://github.com/user/skills # install from git + activate
sklm ls # list active resources
sklm ls --json # machine-readable output
sklm info skill my-skill # origin, path, link status
sklm rm skill my-skill # unlink + clean agent config
Skill variants (authoring)
A skill can ship agent-specific overrides using a variants/ subdirectory inside the skill. When synced, the base skill is copied first, then any files from variants/<agent-id>/ are merged on top.
my-skill/
SKILL.md # fallback for any agent
references/
tools.md
variants/
opencode/
SKILL.md # overrides root SKILL.md for OpenCode
claude/
SKILL.md # overrides it for Claude Code
references/
claude-only.md # additional file, only for Claude
- Files in the variant override same-named files from the base.
- Files only in the variant are added.
- Files only in the base pass through untouched.
variants/itself is never copied to the agent's config directory.- If no variant exists for an agent, the base skill is used as-is.
Variant directory names match agent IDs (opencode, claude, cursor, windsurf, gemini, cline, amazon-q, codex, github-copilot, and all others listed in Supported Agents).
sklm info skill <name> lists available variants when present.
Registry discovery
sklm registry add ~/my-skills # local folder
sklm registry add https://github.com/org/skills.git # git repo
sklm registry ls # list registries
sklm registry search scraper # search all registries
sklm registry search scraper --registry my-skills # within one registry
You can also reference skills by registry when adding:
sklm add skill my-registry:my-skill
Agent management
sklm agent detect # identify the active agent
sklm agent list # list all known agents
sklm agent add opencode # add an agent post-init (syncs skills)
sklm agent remove claude # remove an agent (cleans skills)
sklm agent sync # force re-sync all linked skills
sklm agent sync --dry-run # preview without applying
Telemetry
Anonymous usage data via Umami. Opt out anytime.
sklm telemetry status # check if enabled
sklm telemetry off # disable
sklm telemetry on # re-enable
Telemetry is also disabled by setting SKLM_TELEMETRY=0 in your environment.
Updating
sklm checks for new versions automatically after every command (once per day). When a new release is available, a notice is shown with upgrade instructions.
sklm update # upgrade to latest version via pip
sklm update --check # check only, no upgrade
sklm update --force # bypass 24h cache
Disable the automatic check by setting:
export SKLM_NO_UPDATE_CHECK=1
Updates are installed via pip install -U sklm-cli. The version check uses the GitHub Releases API.
Supported Agents
| Agent | Config dir | Skills path | Auto-detected |
|---|---|---|---|
| OpenCode | .opencode/ |
.opencode/skills/ |
✅ |
| Claude Code | .claude/ |
.claude/skills/ |
✅ |
| Cursor | .cursor/ |
.cursor/skills/ |
✅ |
| Windsurf | .windsurf/ |
.windsurf/skills/ |
✅ |
| Gemini CLI | .gemini/ |
.gemini/skills/ |
✅ |
| Cline | .cline/ |
.cline/skills/ |
✅ |
| Amazon Q | .amazonq/ |
.amazonq/skills/ |
✅ |
| Bob Shell | .bob/ |
.bob/skills/ |
✅ |
| CodeBuddy | .codebuddy/ |
.codebuddy/skills/ |
✅ |
| Codex CLI | .codex/ |
.codex/skills/ |
✅ |
| Continue | .continue/ |
.continue/skills/ |
✅ |
| Crush | .crush/ |
.crush/skills/ |
✅ |
| Factory Droid | .factory/ |
.factory/skills/ |
✅ |
| iFlow | .iflow/ |
.iflow/skills/ |
✅ |
| Junie | .junie/ |
.junie/skills/ |
✅ |
| Kilo Code | .kilocode/ |
.kilocode/skills/ |
✅ |
| Kimi CLI | .kimi/ |
.kimi/skills/ |
✅ |
| Kiro | .kiro/ |
.kiro/skills/ |
✅ |
| Lingma | .lingma/ |
.lingma/skills/ |
✅ |
| Pi | .pi/ |
.pi/skills/ |
✅ |
| Qoder | .qoder/ |
.qoder/skills/ |
✅ |
| Qwen Code | .qwen/ |
.qwen/skills/ |
✅ |
| Trae | .trae/ |
.trae/skills/ |
✅ |
| Mistral Vibe | .vibe/ |
.vibe/skills/ |
✅ |
| Auggie | .augment/ |
.augment/skills/ |
✅ |
| CoStrict | .cospec/ |
.cospec/skills/ |
✅ |
| ForgeCode | .forge/ |
.forge/skills/ |
✅ |
| RooCode | .roo/ |
.roo/skills/ |
✅ |
| Antigravity | .agent/ |
.agent/skills/ |
— (explicit only) |
| GitHub Copilot | .github/ |
.github/skills/ |
— (explicit only) |
Antigravity and GitHub Copilot require sklm init --agent <name> because .agent/ and .github/ exist in many projects unrelated to those tools.
[!TIP]
sklm initwithout--agentshows an interactive prompt if no agent directory is found. Use--agentfor non-interactive setups.
How it Works
Sklm manages three locations to keep skills organized:
~/.sklm/ # global store (user-wide)
store/skills/ # installed skill directories
config.yaml # resource catalog
registries.yaml # registry sources
cache/ # cloned git repos
./.sklm/ # per-project workspace (gitignored)
sklm.yaml # project config (agents, links, resources)
links/skills/ # symlinks → ~/.sklm/store/skills/
<agent-dir>/skills/ # agent-visible copies (auto-synced)
# e.g., .opencode/skills/
Running sklm add skill my-skill does four things in sequence:
- Resolve — finds the skill in the global store, a registry, or a local path
- Store — copies it into
~/.sklm/store/skills/if it wasn't there already - Link — creates a symlink in
./.sklm/links/skills/ - Sync — copies the linked skill into the agent's config directory, applying any
variants/<agent>/overlay automatically
Removal (sklm rm) reverses steps 3 and 4. The global store is untouched, so skills stay available for other projects.
Development
pip install -e . # editable install
pip install -r requirements.txt # dev dependencies (pytest, pytest-cov)
python3 -m pytest tests/ # run the test suite
python3 -m pytest tests/ -k <pattern> # run a subset
sklm --version # check installed version
Troubleshooting
"No Sklm workspace found"
Run sklm init first. It creates the .sklm/ directory and configures your agent.
"No agent configured — not synced"
The skill is installed and linked, but no agent is set up to receive it. Run sklm init --agent <name>.
"Broken symlinks"
Run sklm status --repair to re-create links that point to missing targets.
"Skill not found in git repo"
Some repos use non-standard layouts. Use --subdir to point to the exact directory:
sklm add skill my-skill --from https://github.com/user/repo --subdir custom/path
"GitHub Copilot isn't detected"
That's expected. Copilot requires explicit setup: sklm init --agent github-copilot.
"sklm registry add fails"
For git registries, make sure git is installed and the URL is accessible. For local paths, use an absolute or ~-expanded path.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sklm_cli-0.2.0.tar.gz.
File metadata
- Download URL: sklm_cli-0.2.0.tar.gz
- Upload date:
- Size: 55.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
02fb08d2730f38bceea7ced45d9fe595ef9b3699ae8705608b65e8140ff976f3
|
|
| MD5 |
6930033ce5686ddad509a59f53047499
|
|
| BLAKE2b-256 |
761097eddb2c99eb6cf7d9cdd7f07887266a56337ec56ff5f33ddd5c36e847f7
|
Provenance
The following attestation bundles were made for sklm_cli-0.2.0.tar.gz:
Publisher:
publish.yml on Auran0s/Sklm
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sklm_cli-0.2.0.tar.gz -
Subject digest:
02fb08d2730f38bceea7ced45d9fe595ef9b3699ae8705608b65e8140ff976f3 - Sigstore transparency entry: 2038551418
- Sigstore integration time:
-
Permalink:
Auran0s/Sklm@a0c4f205a68aa4733321daf57d3b60be586ab267 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Auran0s
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a0c4f205a68aa4733321daf57d3b60be586ab267 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sklm_cli-0.2.0-py3-none-any.whl.
File metadata
- Download URL: sklm_cli-0.2.0-py3-none-any.whl
- Upload date:
- Size: 44.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1911b9f2fed3f01423b408e1af0fe70d2461245436690b24c76a50b77527ef7
|
|
| MD5 |
1fd2749a2c7562fd6d0f8dd77c7f652c
|
|
| BLAKE2b-256 |
e684d59944635db1eb334168ca0c8459d00dec9e9d6a3889e758989e98996e3b
|
Provenance
The following attestation bundles were made for sklm_cli-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on Auran0s/Sklm
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sklm_cli-0.2.0-py3-none-any.whl -
Subject digest:
b1911b9f2fed3f01423b408e1af0fe70d2461245436690b24c76a50b77527ef7 - Sigstore transparency entry: 2038551576
- Sigstore integration time:
-
Permalink:
Auran0s/Sklm@a0c4f205a68aa4733321daf57d3b60be586ab267 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Auran0s
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a0c4f205a68aa4733321daf57d3b60be586ab267 -
Trigger Event:
push
-
Statement type: