skillprune
Every agent skill you install puts its name and description into the system prompt on every turn, forever. Installing is one click; nothing tells you what to remove.
The OSS ecosystem has solved discovery and install several times over — SkillDock (519★), skillfish (315★), skilld (308★). The other half of the loop is empty: every audit/eval/conflict tool on GitHub sits at 1–14 stars.
skillprune is that other half. It reads your real transcript history and
tells you what to turn off.
uvx skillprune # run it, install nothing
pipx install skillprune # or keep it around
skillprune # report
skillprune --json # + skillprune.json
skillprune --selfcheck # the four guards below, as assertions
No install needed either way — it is one stdlib-only file, so
python3 skillprune.py works straight from a clone.
Example, on a real 291-skill install:
291 skills installed · 39 have ever fired · 225 dead (77%) · 27 too new to judge
~26,043 tokens paid on every turn for skills you never use
How it decides
| Source | Used for |
|---|---|
~/.claude/projects/**/*.jsonl |
what actually fired, and when |
SKILL.md frontmatter |
what is installed |
claude plugin details |
real always-on token cost (not re-derived) |
Nothing leaves the machine. No dependencies beyond the standard library.
Where it deliberately errs
A tool that says delete this has one unacceptable failure: naming something
you actually use. Four guards, each pinned by an assertion in --selfcheck:
- Slash commands count. A skill invoked only as
/foonever produces aSkilltool call. Counting just the tool call marks it dead. - Hooks count. A plugin shipping a
SessionStarthook runs every session with an invocation count of zero. Those are held back, never auto-disabled. - Bare-name matching. Transcripts log
<plugin>:<skill>, and that prefix often disagrees with the marketplace directory the skill was found in. Two plugins sharing a skill name will cross-credit — that errs toward in use, the only safe direction here. - 14-day grace. Something installed yesterday hasn't had its chance.
Tune
GRACE_DAYS; skills under it are reported separately, never as dead.
Collision detection is Jaccard overlap on description word-sets (COLLIDE,
default 0.35) — crude next to embeddings, but it needs no model and no network.
MIT.
Release files for skillprune 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| skillprune-0.1.0.tar.gz | 8.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| skillprune-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.3 kB
Release files / skillprune-0.1.0.tar.gz
| Download URL | skillprune-0.1.0.tar.gz |
|---|---|
| Size | 8.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d3dad198b5fd843e3e31d21ad63a82b60cab7eebfd228221f3a9364e15d76086
|
|
BLAKE2b-256 checksum How to use checksums |
9b476973f464402853f0fe593a941326fc2f4897928cb2976f883c9e4371ad46
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Release files / skillprune-0.1.0-py3-none-any.whl
| Download URL | skillprune-0.1.0-py3-none-any.whl |
|---|---|
| Size | 9.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
61dfe3a96943b3dc971f3f2d4890da5a4cc29530574b52aa6fe6195d6a7b0ea4
|
|
BLAKE2b-256 checksum How to use checksums |
98f95f3a8de71f9cf349eb617a52df02b74bf325cb3d308b143ea82ba4a9d12c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|