Organize skills
Audit and reorganize a Claude Code / Codex skill library — enforce a naming convention (prefix each skill by which backend or product it touches), rename skills consistently, fix the symlinks and cross-references a rename breaks, and report broken symlinks and stale name references.
by OpenClaudia·MIT license·★ 705 Stars on the repo·GitHub ↗
npx degit OpenClaudia/openclaudia-skills/skills/organize-skills#main ~/.claude/skills/organize-skillsChecked ·commit main
Files of Organize skills
Show the full text88 lines
Organize Skills
Reorganize a skill library so names encode what each skill actually touches, and keep symlinks and cross-references consistent when you rename.
Many setups keep ONE canonical skill library in a shared dir and symlink it into each tool's hub
(e.g. ~/.claude/skills/, ~/.codex/skills/). Some skills live inside a project repo and are
symlinked into the hub. A single rename can therefore touch several symlinks plus every doc that
references the old name — that fan-out is what this skill manages.
Step 1 — Inventory
List every skill and where it really lives. A hub entry is usually a symlink to the canonical dir:
for hub in <hub-1> <hub-2>; do
echo "== $hub =="; ls -la "$hub"
done
Resolve each name to its real directory with readlink -f. Note which skills live in a project repo
versus the shared library — repo-resident renames must be git mv in that repo.
Step 2 — Classify by backend (the naming rule)
The convention: the prefix names the backend the skill depends on, decided by what it actually calls, not by its topic. Grep each skill dir for the tell-tale dependency:
grep -rlE "<api-host>/api|/api/<x>|<db-client>|<AUTH_TOKEN_NAME>" "$skill_dir"
- Calls a specific product's API / database → that product's prefix (e.g.
acme-*). - Pure-local (browser automation, offline SOP, file processing, no backend) → a generic/local prefix.
- Keep a topical infix when a family is large (e.g.
acme-seo-*vsacme-reddit-*) so related skills sort together.
State the classification back to the user before renaming. A skill that feels product-specific but makes zero backend calls belongs in the local bucket, and vice versa — go by the dependency.
Step 3 — Rename (and fix everything a rename breaks)
For each rename OLD → NEW:
- Move the canonical dir.
- Shared-library-resident:
mv <lib>/OLD <lib>/NEW - Repo-resident:
cd <repo> && git mv <skills-path>/OLD <skills-path>/NEW && git commit - Misplaced in the wrong repo? Move it to the shared library rather than just renaming in place.
- Shared-library-resident:
- Rewire symlinks in every hub. Remove the stale link, create the new one pointing at the canonical dir. Do this for each tool hub that mirrors the library.
- Update the
name:frontmatter insideNEW/SKILL.mdto match the directory — the loader keys on it, not on the folder name. - Fix cross-references. Other skills and any long-term memory/notes files may mention
OLDby name or by old path:
Replace the most-specific string first (full old path before the bare name) so a skill that also moved gets its path updated cleanly.grep -rln "OLD" <lib> <memory-dirs> 2>/dev/null
Step 4 — Verify
# broken symlinks in any hub
for hub in <hub-1> <hub-2>; do
find -L "$hub" -maxdepth 1 -type l ! -exec test -e {} \; -print
done
# no lingering old names
grep -rn "OLD" <lib> 2>/dev/null
# each renamed skill's name: matches its dir
grep -m1 "^name:" <lib>/NEW/SKILL.md
Confirm the loader re-registers each renamed skill under its new name. Remove any pre-existing dead symlinks you find while sweeping — cheap to fix, confusing to leave.
Notes
- Never drop a skill you didn't rename. Only touch what the convention requires.
- Renames are cheap and reversible; broken cross-references are the real cost — Steps 3.4 and 4 are the
point of this skill, not the
mv. - Commit repo-resident renames one logical rename per commit so they bisect and revert independently.
| 1 | |
| 2 | name organize-skills |
| 3 | description Audit and reorganize a Claude Code / Codex skill library — enforce a naming convention (prefix each skill by which backend or product it touches), rename skills consistently, fix the symlinks and cross-references a rename breaks, and report broken symlinks and stale name references. Use when the user says "organize my skills", "rename these skills", "clean up the skill library", "enforce a skill naming convention", or "fix broken skill symlinks". |
| 4 | user_invocable true |
| 5 | argument-hint "[optional: the prefix rule, e.g. 'acme-* if it calls the Acme API, local-* otherwise']" |
| 6 | |
| 7 | |
| 8 | # Organize Skills |
| 9 | |
| 10 | Reorganize a skill library so names encode what each skill actually touches, and keep symlinks and |
| 11 | cross-references consistent when you rename. |
| 12 | |
| 13 | Many setups keep ONE canonical skill library in a shared dir and symlink it into each tool's hub |
| 14 | (e.g. `~/.claude/skills/`, `~/.codex/skills/`). Some skills live inside a project repo and are |
| 15 | symlinked into the hub. A single rename can therefore touch several symlinks plus every doc that |
| 16 | references the old name — that fan-out is what this skill manages. |
| 17 | |
| 18 | ## Step 1 — Inventory |
| 19 | |
| 20 | List every skill and where it really lives. A hub entry is usually a symlink to the canonical dir: |
| 21 | |
| 22 | |
| 23 | for hub in <hub-1> <hub-2>; do |
| 24 | echo "== $hub =="; ls -la "$hub" |
| 25 | done |
| 26 | |
| 27 | |
| 28 | Resolve each name to its real directory with `readlink -f`. Note which skills live in a project repo |
| 29 | versus the shared library — repo-resident renames must be `git mv` in that repo. |
| 30 | |
| 31 | ## Step 2 — Classify by backend (the naming rule) |
| 32 | |
| 33 | The convention: **the prefix names the backend the skill depends on**, decided by what it actually |
| 34 | calls, not by its topic. Grep each skill dir for the tell-tale dependency: |
| 35 | |
| 36 | |
| 37 | grep -rlE "<api-host>/api|/api/<x>|<db-client>|<AUTH_TOKEN_NAME>" "$skill_dir" |
| 38 | |
| 39 | |
| 40 | Calls a specific product's API / database → that product's prefix (e.g. `acme-*`). |
| 41 | Pure-local (browser automation, offline SOP, file processing, no backend) → a generic/local prefix. |
| 42 | Keep a topical infix when a family is large (e.g. `acme-seo-*` vs `acme-reddit-*`) so related skills sort together. |
| 43 | |
| 44 | State the classification back to the user before renaming. A skill that *feels* product-specific but |
| 45 | makes zero backend calls belongs in the local bucket, and vice versa — go by the dependency. |
| 46 | |
| 47 | ## Step 3 — Rename (and fix everything a rename breaks) |
| 48 | |
| 49 | For each rename `OLD → NEW`: |
| 50 | |
| 51 | **Move the canonical dir.** |
| 52 | Shared-library-resident: `mv <lib>/OLD <lib>/NEW` |
| 53 | Repo-resident: `cd <repo> && git mv <skills-path>/OLD <skills-path>/NEW && git commit` |
| 54 | Misplaced in the wrong repo? Move it to the shared library rather than just renaming in place. |
| 55 | **Rewire symlinks in every hub.** Remove the stale link, create the new one pointing at the |
| 56 | canonical dir. Do this for each tool hub that mirrors the library. |
| 57 | **Update the `name:` frontmatter** inside `NEW/SKILL.md` to match the directory — the loader keys |
| 58 | on it, not on the folder name. |
| 59 | **Fix cross-references.** Other skills and any long-term memory/notes files may mention `OLD` by |
| 60 | name or by old path: |
| 61 | |
| 62 | grep -rln "OLD" <lib> <memory-dirs> 2>/dev/null |
| 63 | |
| 64 | Replace the most-specific string first (full old *path* before the bare *name*) so a skill that |
| 65 | also moved gets its path updated cleanly. |
| 66 | |
| 67 | ## Step 4 — Verify |
| 68 | |
| 69 | |
| 70 | # broken symlinks in any hub |
| 71 | for hub in <hub-1> <hub-2>; do |
| 72 | find -L "$hub" -maxdepth 1 -type l ! -exec test -e {} \; -print |
| 73 | done |
| 74 | # no lingering old names |
| 75 | grep -rn "OLD" <lib> 2>/dev/null |
| 76 | # each renamed skill's name: matches its dir |
| 77 | grep -m1 "^name:" <lib>/NEW/SKILL.md |
| 78 | |
| 79 | |
| 80 | Confirm the loader re-registers each renamed skill under its new name. Remove any pre-existing dead |
| 81 | symlinks you find while sweeping — cheap to fix, confusing to leave. |
| 82 | |
| 83 | ## Notes |
| 84 | Never drop a skill you didn't rename. Only touch what the convention requires. |
| 85 | Renames are cheap and reversible; broken cross-references are the real cost — Steps 3.4 and 4 are the |
| 86 | point of this skill, not the `mv`. |
| 87 | Commit repo-resident renames one logical rename per commit so they bisect and revert independently. |
| 88 |
Discussion
Alternatives
Browse more free Claude skills or everything in Development.