Audit-first skill and plugin manager for Codex, Claude Code, and Copilot CLI.
Project description
Audit-first skill and plugin management for Codex, Claude Code, and Copilot CLI.
Keep ~/.skills as the source of truth, export only the discovery surfaces each client should see, and repair drift without guessing hidden client state.
Repository: skill-install-plus-plus | Package: skillpp | CLI: skillpp
Table of Contents
- Why This Exists
- What Skillpp Manages
- Highlights
- Support Matrix
- Install
- Quick Start
- Source-of-Truth Model
- Why Audit-First Matters
- Development
- Release Model
- Contributing
- Security
- License
Why This Exists
AI assistant skill setups drift quickly once you mix:
- standalone local skill folders
- Git-backed skill repositories
- hybrid repositories that export skills plus bundle metadata
- plugin bundles with manifests, agents, hooks, and runtime files
Copies go stale, links diverge, and it becomes unclear which files are managed versus accidental.
skillpp gives those assets one managed home under ~/.skills, then projects
only the explicit SKILL.md surfaces into client discovery roots.
It is intentionally conservative: audit first, mutate second.
What Skillpp Manages
- Standalone local skills normalized into
~/.skills/custom - Git-backed skill repositories stored under
~/.skills/repos/<owner>/<repo> - Plugin bundles stored under
~/.skills/plugins/<publisher>/<name> - Explicit skill exposures for Codex, Claude Code, and Copilot CLI
- Non-destructive alignment when client discovery roots drift away from managed state
Highlights
- One managed source-of-truth tree under
~/.skills - Supports standalone skills, Git-backed repos, hybrid repos, and plugin bundles
- Audit-first workflow for drift, broken links, legacy copies, and missing exposures
- Safe alignment that creates missing links without rewriting unrelated client state
- Public Python CLI available through
uvx,uv tool install, andpipx - GitHub Actions CI plus PyPI release automation via Trusted Publishing
Support Matrix
| Client | Status | Discovery root | Notes |
|---|---|---|---|
| Codex | Supported | ~/.agents/skills |
Respects existing aggregate custom exposures where already in place |
| Claude Code | Supported | ~/.claude/skills |
Injects explicit skill surfaces only |
| Copilot CLI | Supported | ~/.copilot/skills |
Injects explicit skill surfaces only |
Install
Try it without installing
uvx skillpp audit
Persistent install with uv
uv tool install skillpp
Persistent install with pipx
pipx install skillpp
Quick Start
- Audit the current managed state:
skillpp audit
- Bootstrap the current project into the managed tree:
skillpp bootstrap --source .
- Install a skill from GitHub:
skillpp install --repo jackwener/OpenCLI --path skills/opencli-browser
- Install a plugin bundle:
skillpp install-plugin --publisher acme --name suite --repo acme/suite
- Create missing non-destructive exposures:
skillpp align --apply
- Refresh managed repositories and git-backed bundles:
skillpp update
Source-of-Truth Model
Everything managed by skillpp lives under ~/.skills:
~/.skills/
|- custom/
|- repos/<owner>/<repo>/
|- plugins/<publisher>/<name>/
`- registry.json
Client discovery roots stay separate:
- Codex:
~/.agents/skills - Claude Code:
~/.claude/skills - Copilot CLI:
~/.copilot/skills
This keeps the managed tree explicit while preserving each client's discovery model.
Why Audit-First Matters
Blind installers are convenient until they overwrite something you needed.
skillpp treats that as a design problem, not a user problem. The tool:
- inventories managed sources before mutating discovery roots
- surfaces legacy copies and mismatched links explicitly
- creates only safe missing links during alignment
- avoids guessing undocumented client plugin registries
That boundary matters most for larger bundles where exported SKILL.md files
are only one part of the package surface.
Development
Run the test suite:
uv run python -m unittest tests.test_manager tests.test_cli -v
Build the package:
uv run --with build python -m build
Check built artifacts:
uv run --with twine python -m twine check dist/*
Release Model
skillpp is PyPI-first.
Recommended usage modes:
uvx skillpp ...for ephemeral runsuv tool install skillppfor persistent installspipx install skillppas a familiar Python CLI alternative
There is no npm package or npx wrapper in v1.
Contributing
Contributions are welcome. Start with CONTRIBUTING.md for development workflow, test expectations, and contribution scope.
Security
Security reporting guidance lives in SECURITY.md.
License
MIT. See 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 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 skillpp-0.1.1.tar.gz.
File metadata
- Download URL: skillpp-0.1.1.tar.gz
- Upload date:
- Size: 21.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
112b64da4fead164eebf093ad1fb7a8001284719c6d36eff114277ee0598f5ab
|
|
| MD5 |
662377c56222583b2cd4f68375320037
|
|
| BLAKE2b-256 |
fa703f3638968eb9448f9125650e67409e4bbf845bd4b6a1df6a20601cfc0685
|
Provenance
The following attestation bundles were made for skillpp-0.1.1.tar.gz:
Publisher:
release.yml on sank96/skill-install-plus-plus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillpp-0.1.1.tar.gz -
Subject digest:
112b64da4fead164eebf093ad1fb7a8001284719c6d36eff114277ee0598f5ab - Sigstore transparency entry: 1285617987
- Sigstore integration time:
-
Permalink:
sank96/skill-install-plus-plus@84b70bc2074a7b2d3ba5c287b1fd20416a7d79d0 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/sank96
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@84b70bc2074a7b2d3ba5c287b1fd20416a7d79d0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file skillpp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: skillpp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 15.8 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 |
5f3ea5033c0fafc12f9f38f308f49a17642ce5afdbcfb2e4bf232b631f345ec8
|
|
| MD5 |
80016b94eda2152eb3724177f2bbd6c3
|
|
| BLAKE2b-256 |
3c17446359da0af00f3700dbc60f5d7ae783ea3fcd891f5bb2f98379adfa576b
|
Provenance
The following attestation bundles were made for skillpp-0.1.1-py3-none-any.whl:
Publisher:
release.yml on sank96/skill-install-plus-plus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillpp-0.1.1-py3-none-any.whl -
Subject digest:
5f3ea5033c0fafc12f9f38f308f49a17642ce5afdbcfb2e4bf232b631f345ec8 - Sigstore transparency entry: 1285618082
- Sigstore integration time:
-
Permalink:
sank96/skill-install-plus-plus@84b70bc2074a7b2d3ba5c287b1fd20416a7d79d0 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/sank96
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@84b70bc2074a7b2d3ba5c287b1fd20416a7d79d0 -
Trigger Event:
push
-
Statement type: