Manage agent skills.
Project description
skilly
Manage Agent Skills from the command line or Python.
skilly creates specification-compliant skills, installs skills from GitHub, Python, or Node dependencies, and keeps managed skills up to date.
Table of Contents
Installation
Python
uvx skilly --help
Node
npx @xelandernt/skilly --help
Homebrew
brew tap xelandernt/skilly https://github.com/xelandernt/skilly
brew install xelandernt/skilly/skilly
Info
| Method | Ships |
|---|---|
uvx / pip |
Python package with import surface + CLI (pre-built wheels: Linux x64, macOS arm64/x64, Windows x64) |
npx |
Native Rust CLI (macOS arm64/x64, Linux x64 glibc, Windows x64) |
brew |
Native Rust CLI (macOS arm64/x64, Linux x64) |
Quick Start
uvx skilly --help
CLI Commands
| Command | Purpose |
|---|---|
scan |
Find skills provided by Python and Node project dependencies |
download <github-url> |
Install one or more skills from GitHub |
list |
Browse, update, or remove installed skills |
update |
Preview available updates; --yes applies all |
remove <name> |
Remove an installed skill by directory name |
skillsmp search <query> |
Search SkillsMP and install a selected result |
create |
Create a valid skill through a terminal wizard or explicit options |
configure |
Set which directories skilly manages via TUI or CLI flags |
Run skilly <command> --help for all options.
Create Skills
Interactive terminals open a full-screen editor. Ctrl+S creates the skill, Ctrl+X cancels.
uvx skilly create deployment-checks \
--description "Validate deployment readiness before a production release." \
--instructions "# Instructions
Run the deployment checklist and report blockers." \
--metadata owner=platform \
--with-scripts \
--yes
Existing skills are rejected unless --overwrite is passed.
Install Dependency Skills
skilly scan discovers skills shipped by your project's dependencies across two ecosystems:
- Python — reads
pyproject.tomland scans the project's.venvfor packages that bundle skills in askills/directory. - Node — reads
package.json(dependencies,devDependencies,optionalDependencies) and scansnode_modules/for packages that bundle skills in askills/directory.
uvx skilly scan
Both ecosystems are scanned by default whenever the corresponding manifest and package directory exist. Results are shown with their source (e.g. node:dependencies, python:project) and status (installable, installed, updatable).
Include or exclude specific Python extras and dependency groups:
uvx skilly scan --group dev --group test --exclude-extra docs
uvx skilly scan --no-project-dependencies # skip [project].dependencies
Install GitHub Skills
uvx skilly download https://github.com/example/project
When a repository contains multiple skills:
uvx skilly download https://github.com/example/project --all
uvx skilly download https://github.com/example/project --skill-name code-review
Destinations
All management commands accept the same destination options:
uvx skilly list --local # .agents/skills
uvx skilly list --global # ~/.agents/skills
uvx skilly list --claude # .claude/skills
uvx skilly list --codex # .codex/skills
uvx skilly list --copilot # .github/skills (local), ~/.copilot/skills (global)
uvx skilly list --directory ~/custom # Explicit directory
| Flags | Resolved destination |
|---|---|
| none | SKILLY_DEFAULT_DIRECTORY if set, otherwise .agents/skills |
--local |
.agents/skills |
--global |
~/.agents/skills |
--claude |
.claude/skills |
--claude --global |
~/.claude/skills |
--codex |
.codex/skills |
--codex --global |
~/.codex/skills |
--copilot |
.github/skills |
--copilot --global |
~/.copilot/skills |
--directory <path> |
That directory (after ~ expansion) |
Set a default destination:
export SKILLY_DEFAULT_DIRECTORY="$HOME/.config/skilly/skills"
--directory overrides all other destination options and SKILLY_DEFAULT_DIRECTORY.
Configure Destinations
skilly configure lets you choose which directories skilly should manage and which one opens by default. Interactive terminals open a two-tab TUI (Global / Local) showing all known agent directories as toggleable checkboxes (agents, claude, codex, copilot). Non-interactive runs accept flags.
uvx skilly configure # Open the TUI
uvx skilly configure --show # Print current config as TOML
uvx skilly configure --reset # Restore defaults
In the TUI:
- Space toggles a known directory on or off, or removes a custom one.
- Enter sets the highlighted directory as the default (marked with a ★).
- Ctrl+S saves; you must have a default directory selected before saving.
Add or remove custom directories via CLI:
uvx skilly configure --add-global /opt/skills
uvx skilly configure --add-local .project/skills
uvx skilly configure --remove-global /opt/skills
uvx skilly configure --remove-local .project/skills
Configuration is stored in ~/.skilly.toml:
default_directory = ".agents/skills"
[global]
directories = ["~/.agents/skills", "/opt/skills"]
[local]
directories = [".agents/skills", ".project/skills"]
The default directory opens first in interactive menus (list, scan, etc.).
GitHub Authentication
Set a token for higher API rate limits (first available wins: SKILLY_GITHUB_TOKEN, GITHUB_TOKEN, GH_TOKEN):
export SKILLY_GITHUB_TOKEN=ghp_your_token
All GitHub-fetching commands also accept --github-token.
Python API
SkillRepository bundles a directory and project settings for stateful workflows:
from pathlib import Path
from skilly import ProjectSettings, Skill, SkillRepository
repository = SkillRepository(
directory=Path(".agents/skills"),
project=ProjectSettings(
dependency_groups=("dev",),
optional_dependencies=("docs",),
),
)
repository.install(
Skill(
name="code-review",
description="Review code for correctness and maintainability.",
content="# Instructions\n\nReview the proposed change.",
)
)
for match in repository.scan_project():
print(match.available.name, match.status)
Stateless discovery functions for one-shot reads:
from skilly import (
discover_installed_skills,
discover_node_modules_skills,
discover_venv_skills,
)
installed = discover_installed_skills()
python_skills = discover_venv_skills()
node_skills = discover_node_modules_skills()
ProjectSettings accepts a NodeProjectSettings to control node scanning:
from skilly import NodeProjectSettings, ProjectSettings, SkillRepository
repository = SkillRepository(
directory=Path(".agents/skills"),
project=ProjectSettings(
node=NodeProjectSettings(
include_dependencies=True,
include_dev_dependencies=False,
),
),
)
Set node=None to skip node ecosystem scanning entirely.
SkillsMP client with typed results:
from skilly.skillsmp import ClientSettings, SkillsMp, SkillsMpSearchQuery
client = SkillsMp(settings=ClientSettings(base_url="https://skillsmp.com/api/v1"))
result = client.search(SkillsMpSearchQuery(text="python", limit=5))
print(result.data.skills[0].github_url)
Development
just install # Install dev dependencies + editable extension
just lint # Run linters
just test # Run tests
just typecheck # Run type checkers
License
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 Distributions
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 skilly-0.0.31.tar.gz.
File metadata
- Download URL: skilly-0.0.31.tar.gz
- Upload date:
- Size: 171.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4305993f06ed67aeaa258460516939d601983a43092bfd9b718d1b85e779bc77
|
|
| MD5 |
71a00ec4f7f6c3ac98b4cbdbae0488a4
|
|
| BLAKE2b-256 |
4d2413bacdefac172a1cc5e97662118ef9b315ce83e6e71587e15ab56db39888
|
File details
Details for the file skilly-0.0.31-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: skilly-0.0.31-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 2.2 MB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5c579177791d3c04b52b27e0dc1dc79c24361286da2f4aa6891dae6dea2efa4
|
|
| MD5 |
ea2e10c4ed46de6d0b514bd858d0248e
|
|
| BLAKE2b-256 |
b69a152fb4ba4f26f9059a4f13de809d1e4bffea5fb18f44a0928faa551d913b
|
File details
Details for the file skilly-0.0.31-cp310-abi3-win32.whl.
File metadata
- Download URL: skilly-0.0.31-cp310-abi3-win32.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.10+, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9487a651793ebe793cdefcdc7418cb9b697b3459e48aa6340bedfd56c06d133c
|
|
| MD5 |
75327606c9099b8272ec1869f6031390
|
|
| BLAKE2b-256 |
e2b0f90faac6bd6d2b5e8493ada318aab1bb54eedb488cf8d6fa362d819fde30
|
File details
Details for the file skilly-0.0.31-cp310-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: skilly-0.0.31-cp310-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 2.6 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a747cc84fac3e6464c7dd027ed81d5e2d51961616747c19686791176dccbb52
|
|
| MD5 |
a3667a7a8058d7336a0f5dee1f80cf9a
|
|
| BLAKE2b-256 |
b78bb5df533c565d4fe9a847926904747559d7ec6f819f6d406d2abbe1a794e3
|
File details
Details for the file skilly-0.0.31-cp310-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: skilly-0.0.31-cp310-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 2.4 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f84df5f1bd8e42a338d217ba816f4f6c496eb15a24c12887f89e7bd8c6c45f42
|
|
| MD5 |
a716bd7b2cc6770a556b443d00a199ec
|
|
| BLAKE2b-256 |
f09587a78687b7cd064df103b9b55e698b84ea6da87135788581acfa02d5350e
|
File details
Details for the file skilly-0.0.31-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: skilly-0.0.31-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 2.4 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a0da9ad6a11809a5cbb63371302af341bc43578b8808431417566538a805568e
|
|
| MD5 |
f64ca0b521efd9e760102a12eecc7207
|
|
| BLAKE2b-256 |
e471b42192da2f10aad9b36431f5ca722903fbc174af68e7dede9dbe514ac74a
|
File details
Details for the file skilly-0.0.31-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: skilly-0.0.31-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 2.3 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb80421dc179549896dea749f1399bb93dbd143f792b09469a72ab9f149b1162
|
|
| MD5 |
3735c6636c294e14b5928231b9d614c6
|
|
| BLAKE2b-256 |
05adffdf541451b930e9e462102444ca860160e756637b6352851afd4d44b459
|
File details
Details for the file skilly-0.0.31-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: skilly-0.0.31-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.1 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7443296f93452dd5bb7e727604efb1c0d0a7ae410c0d487d73074430e5bcd4b
|
|
| MD5 |
9c6d21bbfd4d87d91b688b564cf7ad73
|
|
| BLAKE2b-256 |
f111dfc735160552fd8bc577ea91c979b4093f1b481db896a01c095416c6c2f3
|
File details
Details for the file skilly-0.0.31-cp310-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: skilly-0.0.31-cp310-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 2.2 MB
- Tags: CPython 3.10+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28a30eb814249590c3f23414e12f07d3cb8a0daa268f856cce632b46e457ecb6
|
|
| MD5 |
455736b7169fc79623530f18820c85d5
|
|
| BLAKE2b-256 |
d47881ec4cd93c2e40c38435eb157608aa336cd4ca9be4f6dc516ddb2e1914d2
|