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, shown inplan, and configured through supported agent CLIs inapply.
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
source:
npm:
package: pyright
version: 1.1.399
verify:
command: pyright
args:
- --version
- name: ruff
kind: cli
source:
uv:
package: ruff
version: 0.13.0
verify:
command: ruff
args:
- --version
mcps:
- name: github
transport: stdio # Optional: transport hint such as stdio, http, or sse
command: github-mcp # Required for stdio MCPs
args:
- --serve
env:
GITHUB_TOKEN: ${GITHUB_TOKEN}
agents:
- claude-code
- name: linear
transport: http
url: http://localhost:8765/mcp # Required for HTTP/SSE MCPs
bearer_token_env_var: LINEAR_TOKEN # Optional: Codex bearer token env hook
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.sourceRequired. Explicit installer backend. Supported forms today:uv.packagenpm.packagego.packagecargo.package
verifyRequired. Post-install verification command and optional arguments.
Tool behavior in apply:
source.uvRunsuv tool install <package>and then the verification commandsource.npmRunsnpm install -g <package>and then the verification commandsource.goRunsgo install <package>@<version-or-latest>and then the verification commandsource.cargoRunscargo install <package>with optional--version, then the verification command
mcps
Each mcps entry supports:
nameRequired. MCP server name.agentsOptional. Overrides top-levelagentsfor this MCP only.transportOptional. Transport hint such asstdio,http, orsse. Defaults tostdiofor command-based MCPs andhttpfor URL-based MCPs.commandRequired for stdio MCPs. Command used to launch the MCP server.argsOptional. Additional command arguments for stdio MCPs.envOptional. Environment variables for stdio MCPs.headersOptional. HTTP headers for MCP configuration. Applied for Claude Code and ignored for Codex, because the Codex CLI does not expose a generic header flag.urlRequired for HTTP/SSE MCPs. URL for an already-running MCP server.bearer_token_env_varOptional. Environment variable name for HTTP bearer authentication. Applied directly in Codex; resolved into anAuthorizationheader for Claude Code.
MCP behavior in apply:
transport=stdioRunscodex mcp add <name> -- <command>...orclaude mcp add --transport stdio <name> -- <command>...transport=http|sseRuns the corresponding agent HTTP MCP add command using the configured URLheadersPassed through to Claude Code. Retained in the manifest and lockfile for Codex, but omitted duringcodex mcp addbecause the CLI rejects arbitrary header flags.- existing MCPs with the same name Are removed and re-added so the config is reconciled instead of duplicated
Current Support
skillsFully supported inplanandapplytoolsSupported inplanandapplyforuv,npm,go, andcargosources with explicit verificationmcpsSupported inplanandapplyfor Codex and Claude Code
CLI
uv run skillsible validate -f skills.yml
uv run skillsible lock -f skills.yml
uv run skillsible diff -f skills.yml -l skillsible.lock
uv run skillsible plan -f skills.yml
uv run skillsible plan -f skills.yml -l skillsible.lock
uv run skillsible apply -f skills.yml
uv run skillsible apply -f skills.yml -l skillsible.lock
uv run skillsible doctor
uv run skillsible inspect
Machine-readable output is available for validation and inspection workflows:
uv run skillsible validate --json -f skills.yml
uv run skillsible lock --json -f skills.yml
uv run skillsible diff --json -f skills.yml -l skillsible.lock
uv run skillsible plan --json -f skills.yml
uv run skillsible inspect --json
skillsible lock writes a normalized skillsible.lock file with:
- the source manifest path
- the current
skillsibleversion - resolved skill revisions when the source can be resolved through git
- normalized snapshots of
toolsandmcps
This is groundwork for reproducibility. The lockfile is generated today, but apply does not yet
consume every field. Current lockfile support includes:
plan -l skillsible.lockapply -l skillsible.lockvalidate -l skillsible.lockdiff -l skillsible.lock
When a lockfile is applied, skillsible prefers the locked skill revision and resolved source when
present.
inspect is the current post-install verification command for supported agents. It queries real
local CLIs instead of guessing from manifest state:
npx skills ls ...for Codex and Claude skill discoverycodex mcp listfor Codex MCP discoveryclaude plugins listandclaude mcp listfor Claude discovery
This is stronger than a dry-run or command log because it asks the agent surfaces what they currently see after installation. It still has a support boundary:
skillsVerified throughskills.shdiscoverytoolsVerified separately through their installed binariesmcpsApplied throughcodex mcp addandclaude mcp add;inspectverifies current runtime discoverylockfileGenerated byskillsible lock; consumed for skill planning/apply via-l/--lockfile
See SUPPORT_MATRIX.md for the explicit feature-by-feature support table.
Install
From PyPI:
uv tool install skillsible
skillsible doctor
For a specific version:
uv tool install skillsible==1.2.0
skillsible doctor
From a checkout:
uv tool install .
skillsible doctor
From a built wheel:
uv build
uv tool install dist/skillsible-1.2.0-py3-none-any.whl
skillsible doctor
Design Goals
- declarative desired state
- multi-agent support
- idempotent operations
- portable across machines
- extensible adapter model
Near-Term Roadmap
- agent adapters
- drift detection
- lockfile support
- export current installed skills
- lockfile consumption for exact resolved commits
- tool installers and bootstrap support
- richer MCP auth/config support across agents
Development
uv sync --dev
uv run pytest
uv run skillsible validate -f examples/stack.yml
uv run skillsible plan -f examples/skills.yml
Demo
See docs/demo.md.
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.2.0.tar.gz.
File metadata
- Download URL: skillsible-1.2.0.tar.gz
- Upload date:
- Size: 23.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c032591161d9bb69c702ad62e1449270165963c758613c7a74458200f549d6b1
|
|
| MD5 |
acf5a98f03aed17a9b32835baef39df7
|
|
| BLAKE2b-256 |
5d4a114dd0fae2c1a83dea530f00c9b9c351fe506249c361cf05a8d891658373
|
Provenance
The following attestation bundles were made for skillsible-1.2.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.2.0.tar.gz -
Subject digest:
c032591161d9bb69c702ad62e1449270165963c758613c7a74458200f549d6b1 - Sigstore transparency entry: 1108722211
- Sigstore integration time:
-
Permalink:
srikalyan/skillsible@2e6773fcf7cba7bf28cbaa156ad602f1f66130e8 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/srikalyan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2e6773fcf7cba7bf28cbaa156ad602f1f66130e8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file skillsible-1.2.0-py3-none-any.whl.
File metadata
- Download URL: skillsible-1.2.0-py3-none-any.whl
- Upload date:
- Size: 18.5 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 |
cfa998ba8b9d524d1f6584f4d9f3c3156d9e1ee7c632649f61d9834a7aad70f4
|
|
| MD5 |
700eb9542c5cdcd4ca3d0eba32281c27
|
|
| BLAKE2b-256 |
875276dc61895734eb56c8b27a17d6629f692e5fe4cd83d89e1c9d51b3fc6732
|
Provenance
The following attestation bundles were made for skillsible-1.2.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.2.0-py3-none-any.whl -
Subject digest:
cfa998ba8b9d524d1f6584f4d9f3c3156d9e1ee7c632649f61d9834a7aad70f4 - Sigstore transparency entry: 1108722240
- Sigstore integration time:
-
Permalink:
srikalyan/skillsible@2e6773fcf7cba7bf28cbaa156ad602f1f66130e8 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/srikalyan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2e6773fcf7cba7bf28cbaa156ad602f1f66130e8 -
Trigger Event:
push
-
Statement type: