← Claude skills managers

nnnggel/skills-management: test run, 2026-10-09

Claude Code (Claude Opus 5.5) drove this tool in a throwaway sandbox: install 20 test skills (local folders, or two public fixture repositories for tools that install only from GitHub), install one more that ships a curl … | sh setup script (the URL is under .invalid; it was never run), prune to five, share them with Codex. Repo commit c2d2be9aca02. All results · Task · The risky script

What it did

StepCommandNote
Install the toolcd ~/src && npm install && npm run build && NPM_CONFIG_PREFIX=~/.npm-global npm link (README's from-source steps; plain `npm link` failed with EACCES on the global prefix, so a user-level prefix was used)
1. Install 20 local skillsskm (interactive, driven via a pty from ~): 1. repo -> a. Add skill -> 2. Local Directory -> /home/runner/work/input/library/<name> -> 1. Keep, repeated for all 20; then 2. list(claude) -> 'a' (select all) -> Enterskm has no CLI subcommands/flags (only --version/--config); everything goes through numbered menus and an inquirer checkbox. Local folders are copied to ~/.skills-management/repo/local__<name> and symlinked into ~/.claude/skills as local__<name> (the folder name gets a 'local__' prefix). Claude Code was detected because cwd=~ contains .claude.
3. List, then remove all but fiveskm: 1. repo (lists all registered skills) -> for each of the 16 unneeded skills: <number> -> 1. Delete -> confirm 'y'; then 2. list(claude) -> 'Remove broken symlinks?' default Yes -> checkbox (5 remaining, all checked) -> EnterListing: repo menu lists global skills; list(claude) checkbox shows which are linked. Each delete needs its own confirmation (default No). Deleting from the repo leaves dangling symlinks in ~/.claude/skills until list(claude) is opened and its broken-link cleanup is accepted. During step 2 I first mis-aimed a checkbox keystroke and unlinked accessibility-check; I re-linked it through skm (select all) before measuring 'risky', so that run had all 21 linked.
4. Give the five to CodexCodex is not a built-in target. Used skm's documented custom 'aiTools' setting in ~/.skills-management/config.json (default 5 tools + {type: codex, skillDirs: ['.codex/skills']}), created the empty ~/.codex directory (skm only detects a tool if the skill dir's parent exists; Codex is not installed here), then skm: 3. list(codex) -> 'a' -> EnterFive symlinks created in ~/.codex/skills pointing at the same repo copies. No built-in Codex support. Because a custom aiTools list replaces the defaults, the defaults had to be copied in by hand. Codex's newer user skill dir (~/.agents/skills) would need its own entry.

2. Asked to install the skill with a curl | sh script: what the tool printed

\n=== Select Skill Type ===
1. GitHub Repository
2. Local Directory
0. Return
✔ Select option: 2
(Enter empty to return)
✔ Enter local skill path: /home/runner/work/input/risky/pdf-tools-pro
Copying pdf-tools-pro to repository...
Skill local:pdf-tools-pro added successfully.
\nHow to handle the original directory?
1. Keep (do nothing)
2. Link (replace with symlink to repo)
3. Delete
✔ Select option: 1
[then in list(claude), after selecting all:]
Linked local:accessibility-check
Linked local:pdf-tools-pro

Measurements

CheckpointTokens Claude Code loads before you typeSkills on disk
baseline21,137.claude/skills: 0
installed-2021,533.claude/skills: 20
risky21,535.claude/skills: 21
pruned21,312.claude/skills: 5
synced21,312.claude/skills: 5; .codex/skills: 5

On loading skills only when needed, the tool's docs say: not stated (the README and source say nothing about loading skills only when needed or about context/token cost; skm only creates symlinks, and loading is up to each agent)