Ansible-style skill management for agent CLIs
Project description
skillsible
Ansible-style skill management for Codex, Claude Code, and agent CLIs.
What It Does
skillsible manages agent setup declaratively across machines and agents.
- define desired skills, tools, and MCPs in a manifest
- target multiple agent CLIs
- preview changes with
plan - apply supported installs idempotently
- make workstation setup reproducible
MVP
The current version has three manifest layers:
skillsPortableSKILL.md-style agent skills. This is the most mature layer and the oneapplysupports today.toolsShared machine tools such as LSPs or CLIs. These are parsed and shown inplan, and selected installers are supported inapply.mcpsMCP server definitions. These are parsed and shown inplan, but not installed yet.
This split is intentional. Skills are the cleanest cross-agent abstraction. Tools and MCPs vary more by agent and runtime, so skillsible tracks them explicitly without pretending parity that does not exist.
Complete Schema Example
version: 1 # Manifest format version
agents:
- codex # Default target agent
- claude-code # Also receives any skill that does not override `agents`
defaults:
scope: global # Default scope: install for the current user across projects
skills:
- source: obra/the-elements-of-style
skill: writing-clearly-and-concisely # Required: skill directory name
version: v1.2.0 # Optional: branch, tag, or commit SHA
# No `agents` field here, so this inherits both top-level agents:
# - codex
# - claude-code
# No `scope` field here, so this inherits `defaults.scope = global`
- source: obra/the-elements-of-style
skill: writing-clearly-and-concisely
version: main # A skill version can be a branch, tag, or commit SHA
agents:
- codex # Optional override: target only codex
scope: project # Optional override: install only for the current project
tools:
- name: pyright
kind: lsp # Required: free-form category like lsp or cli
package: pyright # Optional: descriptive package name
install:
npm: pyright # Optional: install via npm install -g
agents:
- codex
- claude-code
- name: gh
kind: cli
binary: gh # Optional: expected binary name on PATH
- name: ruff
kind: cli
install:
uv_tool: ruff # Optional: install via uv tool install
mcps:
- name: github
transport: stdio # Optional: transport hint such as stdio or http
command: github-mcp # Optional: command to run for stdio-based MCPs
agents:
- claude-code
- name: linear
transport: http
url: http://localhost:8765/mcp # Optional: server URL for HTTP MCPs
Schema Reference
Top-level version and per-skill version mean different things:
-
top-level
versionThe manifest schema version. This tellsskillsiblehow to interpret the playbook itself. -
per-skill
versionThe source revision to install for that skill. This is used for reproducibility and can be:- a semantic tag like
v1.2.0 - a git tag like
release-2026-03 - a branch like
main - a commit SHA like
8c1f2d4
- a semantic tag like
When a per-skill version is set, skillsible resolves that source to a concrete git checkout before
calling npx skills add .... This keeps apply reproducible even though skills.sh does not expose its
own documented --ref flag.
Recommended usage:
- use a branch for moving development targets
- use a tag for readable pinned versions
- use a commit SHA for exact replayability
Top-level fields
versionRequired. Manifest schema version. Current value:1.agentsRequired. Default target agents used byskills,tools, andmcpswhen an item does not define its ownagents.defaultsOptional. Currently onlydefaults.scopeis supported.
skills
Each skills entry supports:
sourceRequired. GitHub shorthand, GitHub URL, git URL, or local path containing the skill. Preferred GitHub form:owner/repoinstead ofhttps://github.com/owner/repo.skillRequired. Skill directory name to install from that source.agentsOptional. Overrides top-levelagentsfor this skill only.scopeOptional.globalorproject. Defaults todefaults.scopeorglobal.versionOptional. Branch, tag, or commit SHA. When set,applyresolves the source to that exact revision before installation.
tools
Each tools entry supports:
nameRequired. Human-readable tool name.kindRequired. Free-form category such aslsporcli.agentsOptional. Overrides top-levelagentsfor this tool only.packageOptional. Descriptive package name.binaryOptional. Expected binary name onPATH.installOptional. Explicit installer backend. Supported forms today:uv_tool: <package>npm: <package>
Tool behavior in apply:
install.uv_toolRunsuv tool install <package>install.npmRunsnpm install -g <package>binarywithoutinstallVerifies the binary is present onPATH
mcps
Each mcps entry supports:
nameRequired. MCP server name.agentsOptional. Overrides top-levelagentsfor this MCP only.transportOptional. Transport hint such asstdioorhttp.commandOptional. Command used to launch the MCP server.urlOptional. URL for an already-running MCP server.
mcps are currently planning metadata only. They are parsed and shown in plan, but apply does not configure or install them yet.
Current Support
skillsFully supported inplanandapplytoolsSupported inplanandapplyforuv_tool,npm, and binary verificationmcpsSupported inplan;applyreports them as not yet applied
Example Patterns
Some repos can participate in more than one layer.
For example, googleworkspace/cli can already be used directly as a skills source:
version: 1
agents:
- codex
- claude-code
skills:
- source: googleworkspace/cli
skill: gws-drive
That is the minimal setup.
If you also want the CLI binary installed and an MCP endpoint tracked, use the fuller layered version shown in google-workspace.yml.
CLI
uv run skillsible plan -f skills.yml
uv run skillsible apply -f skills.yml
uv run skillsible doctor
Install
From PyPI:
uv tool install skillsible
skillsible doctor
For a specific version:
uv tool install skillsible==1.1.0
skillsible doctor
From a checkout:
uv tool install .
skillsible doctor
From a built wheel:
uv build
uv tool install dist/skillsible-1.1.0-py3-none-any.whl
skillsible doctor
CI And Release
This repo includes GitHub Actions for:
- CI on pushes to
mainand pull requests - building distributions with
uv build - publishing to PyPI when a tag like
v1.1.0is pushed
PyPI Trusted Publishing Setup
Before publishing will work, configure skillsible on PyPI to trust this repository's publish workflow:
- PyPI project:
skillsible - GitHub owner:
srikalyan - GitHub repository:
skillsible - Workflow file:
.github/workflows/publish.yml - Environment name:
pypi
After that, pushing a tag such as v1.1.0 will trigger the publish workflow.
Workflow
The default branch is main and it is protected.
Expected flow:
- Create a feature branch.
- Open a pull request to
main. - Let CI pass.
- Merge to
main. - Tag the merge commit with
vX.Y.Z. - Push the tag to publish to PyPI.
See CONTRIBUTING.md for the release workflow in more detail.
Design Goals
- declarative desired state
- multi-agent support
- idempotent operations
- portable across machines
- extensible adapter model
Near-Term Roadmap
- manifest validation
- agent adapters
- drift detection
- lockfile support
- export current installed skills
- lockfile support for exact resolved commits
- tool installers and bootstrap support
- MCP adapter support per agent
Development
uv sync --dev
uv run pytest
uv run skillsible plan -f examples/skills.yml
Project details
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 skillsible-1.1.0.tar.gz.
File metadata
- Download URL: skillsible-1.1.0.tar.gz
- Upload date:
- Size: 15.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08a76e91763639e5435f6bf1f1704ae04c909c38764395c1c6a93fe71e81f38d
|
|
| MD5 |
fd6e882e032940eddf7dd6157bdb06bc
|
|
| BLAKE2b-256 |
db65c501ab4079d400f6516a4e690c1cc7e330cf706adfbe0f4a6d6fae8e8959
|
Provenance
The following attestation bundles were made for skillsible-1.1.0.tar.gz:
Publisher:
publish.yml on srikalyan/skillsible
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillsible-1.1.0.tar.gz -
Subject digest:
08a76e91763639e5435f6bf1f1704ae04c909c38764395c1c6a93fe71e81f38d - Sigstore transparency entry: 1086038774
- Sigstore integration time:
-
Permalink:
srikalyan/skillsible@eac80b62774e45fe096a9e1997fb3436607a5e11 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/srikalyan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eac80b62774e45fe096a9e1997fb3436607a5e11 -
Trigger Event:
push
-
Statement type:
File details
Details for the file skillsible-1.1.0-py3-none-any.whl.
File metadata
- Download URL: skillsible-1.1.0-py3-none-any.whl
- Upload date:
- Size: 11.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af69f33e05dbc0b80efc5fef17d39f53c1d1b14d1eb9000bfea41d5f6f125582
|
|
| MD5 |
66aa1f05d1b5f695c1db8bd5c1077165
|
|
| BLAKE2b-256 |
a5d59e4a42bf73181f8c22aaf91e2eb2ce193cab3a84b795501c38bed5fb99c4
|
Provenance
The following attestation bundles were made for skillsible-1.1.0-py3-none-any.whl:
Publisher:
publish.yml on srikalyan/skillsible
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillsible-1.1.0-py3-none-any.whl -
Subject digest:
af69f33e05dbc0b80efc5fef17d39f53c1d1b14d1eb9000bfea41d5f6f125582 - Sigstore transparency entry: 1086038835
- Sigstore integration time:
-
Permalink:
srikalyan/skillsible@eac80b62774e45fe096a9e1997fb3436607a5e11 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/srikalyan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eac80b62774e45fe096a9e1997fb3436607a5e11 -
Trigger Event:
push
-
Statement type: