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
| Step | Command | Note |
|---|---|---|
| Install the tool | cd ~/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 skills | skm (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) -> Enter | skm 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 five | skm: 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) -> Enter | Listing: 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 Codex | Codex 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' -> Enter | Five 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
| Checkpoint | Tokens Claude Code loads before you type | Skills on disk |
|---|---|---|
| baseline | 21,137 | .claude/skills: 0 |
| installed-20 | 21,533 | .claude/skills: 20 |
| risky | 21,535 | .claude/skills: 21 |
| pruned | 21,312 | .claude/skills: 5 |
| synced | 21,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)