skilly
Manage Agent Skills from the command line or Python. Creates specification-compliant skills, installs from GitHub, Bitbucket Cloud, Bitbucket Data Center, or dependencies, and keeps them up to date.
Installation
uvx skilly --help # Python (uvx/pip)
npx @xelandernt/skilly --help # Node (npx)
brew install xelandernt/skilly/skilly # Homebrew
Python
uvx skilly --help
Ships CLI + Python import surface. Pre-built wheels for Linux x64, macOS arm64/x64, Windows x64.
Node
npx @xelandernt/skilly --help
Ships native Rust CLI (macOS arm64/x64, Linux x64 glibc, Windows x64). No Python import surface.
Homebrew
brew tap xelandernt/skilly https://github.com/xelandernt/skilly
brew install xelandernt/skilly/skilly
Ships native Rust CLI (macOS arm64/x64, Linux x64).
Info
See the installation guide for a full capability comparison.
Quick Start
skilly create deployment-checks \
--description "Validate deployment readiness." \
--instructions "# Instructions\n\nRun the deployment checklist." \
--yes
skilly list
CLI Commands
| Command | Purpose |
|---|---|
scan |
Find skills provided by Python and Node project dependencies |
download <repository-url> |
Install one or more skills from a supported repository |
list |
Browse, update, or remove installed skills |
update |
Preview updates across configured directories; --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 directory |
configure |
Manage directories and repository credentials |
Run skilly <command> --help for all options.
Run skilly --version to print the installed package version.
Create Skills
See creating skills.
Install Dependency Skills
See dependency scanning.
Install Repository Skills
Destinations
All management commands accept the same explicit 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
In an interactive terminal, skill rows show their source beneath the name (for
example, GitHub · owner/repo). list checks known update sources in the
background without blocking navigation: a spinner marks pending checks, while
✓, ↑, and ! mark current, updatable, and failed checks. Plain
non-interactive output remains local-only.
Without a destination flag, skilly update checks every directory configured
through skilly configure. Pass --local, --global, an agent flag, or
--directory <path> to limit it to one destination.
| 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.
Configuration
skilly configure manages directories and saved repository credentials.
uvx skilly configure
uvx skilly configure --show # Print current config as TOML
uvx skilly configure --reset # Restore defaults
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.).
When viewing a skill's files, press / to filter by filename and Esc to
clear the filter.
Repository Authentication
For download, list, and update, Skilly resolves credentials in this order:
--token <TOKEN>for a one-off command.- A saved provider credential with the exact provider and base URL.
- A provider environment variable.
| Provider | Environment fallback | Saved base URL example |
|---|---|---|
| GitHub | SKILLY_GITHUB_TOKEN, GITHUB_TOKEN, GH_TOKEN |
https://github.com |
| Bitbucket Cloud | SKILLY_BITBUCKET_CLOUD_TOKEN |
https://bitbucket.org |
| Bitbucket Data Center | SKILLY_BITBUCKET_DATA_CENTER_TOKEN |
https://git.example.com/bitbucket |
Save a reusable credential with skilly configure, or use the
non-interactive command:
skilly configure --add-provider bitbucket-data-center \
--provider-url https://git.example.com/bitbucket \
--provider-token "$BITBUCKET_TOKEN"
Saved tokens are redacted from skilly configure --show, never written to
installed skill metadata, and stored in ~/.skilly.toml; on Unix that file is
owner-only. Remove a saved credential with:
skilly configure --remove-provider bitbucket-data-center \
--provider-url https://git.example.com/bitbucket
Use --provider bitbucket-data-center for Bitbucket Data Center repositories:
uvx skilly download https://git.example.com/bitbucket/projects/ENG/repos/skills \
--provider bitbucket-data-center --token "$SKILLY_BITBUCKET_DATA_CENTER_TOKEN"
Python API
Full Python API reference with
SkillRepository, local discovery functions, caller-owned repository discovery,
source types, SkillsMP client, and custom filesystem protocol.
from pathlib import Path
from skilly import (
ProjectSettings,
PythonSource,
Skill,
SkillRepository,
)
repository = SkillRepository(
directory=Path(".agents/skills"),
project=ProjectSettings(
sources=(
PythonSource(
dependency_groups=("dev",),
optional_dependencies=("docs",),
),
),
),
)
repository.install(
Skill(
name="code-review",
description="Review code for correctness and maintainability.",
body="# Instructions\n\nReview the proposed change.",
)
)
for match in repository.scan_project():
print(match.available.name, match.status)
Load an untrusted skill bundle directly from memory without filesystem or network access:
from pathlib import PurePosixPath
from skilly import Skill, SkillResource
skill = Skill.from_bundle(
skill_markdown,
(
SkillResource(PurePosixPath("references/runbook.md"), "reference", runbook_bytes),
),
)
Stateless discovery functions for one-shot reads:
from skilly import (
NodeSource,
PythonSource,
discover_installed_skills,
discover_package_source_skills,
)
installed = discover_installed_skills()
python_skills = discover_package_source_skills(PythonSource())
node_skills = discover_package_source_skills(NodeSource())
ProjectSettings accepts PythonSource, NodeSource, and MavenSource:
from pathlib import Path
from skilly import (
MavenSource,
NodeSource,
ProjectSettings,
PythonSource,
SkillRepository,
)
repository = SkillRepository(
directory=Path(".agents/skills"),
project=ProjectSettings(
sources=(
NodeSource(
include_dependencies=True,
include_dev_dependencies=False,
),
),
),
)
Use ProjectSettings(sources=()) to disable scanning, or pass
individual PackageSource entries to scan only specific ecosystems.
SkillRepository() defaults to Python, Node, and Maven sources.
Maven support
Maven skills are discovered from JAR artifacts in the local Maven
repository (~/.m2/repository by default). The scanner:
- Reads only direct
<dependencies>frompom.xml— profiles, plugins, and<dependencyManagement>are ignored. - Resolves
${property}references defined in the same file's<properties>block. - Loads skills from recognized archive layouts:
.agents/skills/<name>/SKILL.mdandskills/<name>/SKILL.md. - Preserves binary resources inside JARs.
- Rejects coordinates with path traversal components.
Known limitations:
- Only the local repository is used; no remote artifact resolution.
- No POM inheritance or effective-model merging.
- No Gradle build file support.
- Build execution and dependency graph traversal are not performed.
- MavenSource includes compile, runtime, and test scopes by default; provided and system scopes are excluded.
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].repository_url)
Development
just install
just lint
just test
License
Metadata
Release files for skilly 0.0.37
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| skilly-0.0.37.tar.gz | 229.0 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| skilly-0.0.37-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| skilly-0.0.37-cp310-abi3-win32.whl | CPython 3.10 | abi3 | Windows x86-32 | Details |
| skilly-0.0.37-cp310-abi3-musllinux_1_2_x86_64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ x86-64 | Details |
| skilly-0.0.37-cp310-abi3-musllinux_1_2_aarch64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ ARM64 | Details |
| skilly-0.0.37-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| skilly-0.0.37-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| skilly-0.0.37-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| skilly-0.0.37-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 19.4 MB
Release files / skilly-0.0.37.tar.gz
| Download URL | skilly-0.0.37.tar.gz |
|---|---|
| Size | 229.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
51ad99f4c1aebab98cc6d3dd95acfd1a92de6f6ec7022d4a55f6d8f39495c766
|
|
BLAKE2b-256 checksum How to use checksums |
478af2d56c71da0da11bb7ba0924c3d06f204d092c2b43b5a8ccb97bbbfdb4ba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
|
Release files / skilly-0.0.37-cp310-abi3-win_amd64.whl
| Download URL | skilly-0.0.37-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
3cd568df20f1c90f3f3a06f37552462feee13c2ef85c1d19665c195970ebe64d
|
|
BLAKE2b-256 checksum How to use checksums |
d3768c427c4a272be7cbaa09215e1b32d81c69711e54a4872d12af28556b8bb8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
|
Release files / skilly-0.0.37-cp310-abi3-win32.whl
| Download URL | skilly-0.0.37-cp310-abi3-win32.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.10 Windows x86-32 abi3 |
|
SHA-256 checksum How to use checksums |
9ccf7be08d60b3c384e03d8fe501ad6d6a5089cc20d3b5db334d8eaf121843e9
|
|
BLAKE2b-256 checksum How to use checksums |
e0596e7f3d4dff2c8a6e91a836a9eb685a698d052cd1ce509b08c78d67fd6104
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
|
Release files / skilly-0.0.37-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | skilly-0.0.37-cp310-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
99b6c13c26e27250e392b64b6f192e4dcaa831bdcf49fd5db21c2848afb4b5d7
|
|
BLAKE2b-256 checksum How to use checksums |
7fe2e0226e44762f35d137061a0894cd3791bcd6010182f5932db4b0174d3503
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
|
Release files / skilly-0.0.37-cp310-abi3-musllinux_1_2_aarch64.whl
| Download URL | skilly-0.0.37-cp310-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.10 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
c2a0ffb51d5a06a28c56b066e8aad20e41ed861a35ac3c65d2322a7568c4496a
|
|
BLAKE2b-256 checksum How to use checksums |
2f9de7bb22e038fa94934eb912e205cc173fcfa34c706df9c6236ab008459f77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
|
Release files / skilly-0.0.37-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | skilly-0.0.37-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
5eae13d88224664eb92cf9f210f6570ba8a12df246adb61f670773e33469aa19
|
|
BLAKE2b-256 checksum How to use checksums |
94440ec1f89271bad9a333f6f32cad44c877ccc934848e5e4f7fbb6690c01dfd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
|
Release files / skilly-0.0.37-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | skilly-0.0.37-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
7b0f68cbbd41ae04fcf1887b595e43408cf905d9ccbdaa491ffa9a8ae4f2cc40
|
|
BLAKE2b-256 checksum How to use checksums |
c151a83195044e3fd003d7819e644b620864a7dce790de4804f982c04794abf4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
|
Release files / skilly-0.0.37-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | skilly-0.0.37-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.2 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
890e293dab81feeb9c846e3fbc6210298583e43716a453fd553b69dc38280444
|
|
BLAKE2b-256 checksum How to use checksums |
fd66609eda9fb1dab429ef7b2af59cb722c645634c456907aea8106e41853c95
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
|
Release files / skilly-0.0.37-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | skilly-0.0.37-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
2f9077fa2eb26df7a84bb65bb447979564f15ccc43993d74ad9ba5b4f23f56b7
|
|
BLAKE2b-256 checksum How to use checksums |
21e5fd10fec03be9812d7dd3f0bc5dbcea1901a2bb44e349a308e4a84ddfe56b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
|