maddhruv/absolute-prune
> Triggers on "absolute prune", "remove dead code", "find unused deps/exports", "what can we delete", "clean up orphaned files".
npx skills add https://github.com/maddhruv/absolute --skill absolute-prune
> Start your first response with the ✂️ emoji.
Cut dead growth from the repo: unused dependencies, unreferenced exports, unreachable code,
orphaned files. Evidence-based — every removal is backed by a tool that proves nothing
references it — applied in safe waves with tests green after each.
Runs the shared engine in references/health-engine.md — read it for the
DETECT → SCAN → TRIAGE → FIX → VERIFY → REPORT loop and the safety contract. This file
covers only what's specific to pruning.
prune vs simplify: simplify polishes *your working git diff*. prune sweeps the
whole committed repo for things that are dead repo-wide. Use simplify mid-change;
prune as standing cleanup on green main.
Dead dependencies — declared but never imported (and missing deps that are imported but
undeclared):
| Ecosystem | Tool |
|---|---|
| JS/TS | depcheck or knip (knip also covers exports/files) |
| Python | deptry |
| Go | go mod tidy (diff), unused module detection |
Dead code — unreferenced exports, unreachable branches, orphaned files:
| Ecosystem | Tool |
|---|---|
| JS/TS | knip (exports/files), ts-prune, eslint no-unused-vars |
| Python | vulture, ruff unused rules |
| Go | deadcode ./..., staticcheck (U1000) |
Prefer tools already in the project. Treat results as *candidates* — verify each isn't
reached via dynamic import, reflection, DI, public API, or a config string before removing.
| Wave | Removal | Default |
|---|---|---|
| 1 | unused devDeps, unreferenced *local* exports/functions | fix now — lowest risk |
| 2 | unused runtime deps, orphaned internal files | fix this pass after confirming no dynamic ref |
| 3 | anything reachable via public API, plugin system, dynamic require, reflection, or config | gated / usually defer — high false-positive risk |
Static tools miss dynamic references. Anything in wave 3, or anything a tool flags but you
can't *prove* is dead, gets confirmed with the user or deferred — never auto-removed.
"orphaned files").
removed symbol truly had no references. If anything goes red, the symbol wasn't dead —
revert and reclassify.
for a config/plugin you can't trace. Report those as "suspected dead, needs human call".
Treat preferences.health.protectedPaths from config as never-delete globs — anything
matching is out of scope even if a tool flags it.
lookups defeat static analysis. Confirm before deleting.
the package entry points / exports map.
Wave it.
prune removes dead things; it does not restructure live code.Restructuring → simplify or work.
/absolute simplify — for restructuring/clarity of *live* code in your diff./absolute upgrade — pairs well: prune unused deps, then upgrade what remains./absolute debt — pruning often clears a batch of lint/unused-var warnings too.Take maddhruv/absolute-prune from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.