Claude Code reads skills from ~/.claude/skills/ . That is the whole rule, and it is fine until you have a second agent. Here is the situation I kept hitting. I have Claude Code open in a terminal, mid-task. I want a skill called hi-friend . It exists — but it is in ~/.agents/skills/ , because that is where I keep the ones I want to be able to use anywhere, or because Codex wrote it there last week. /hi-friend does nothing. Claude Code cannot see it. The options at that point are all bad: copy the folder into ~/.claude/skills/ — now I maintain two of them symlink it — better, but I am doing filesystem admin mid-task restart with some flag — I’d have to leave the conversation I’m in I did the worst version of all three: a launchd job running rsync every 60 seconds to keep ~/.claude/skills/ and ~/.agents/skills/ in step. It worked. It also meant 10 skills existed twice, 55 MB of it, and the moment I edited one copy, which one Claude Code loads is undefined. What I actually wanted was to not install anything. A skill is a folder with a SKILL.md in it. Claude Code can read files. So the smallest possible answer is to hand it the path: Use the skill “hi-friend”: read /Users/me/.agents/skills/hi-friend/SKILL.md and follow it. Paste that into the conversation you already have open and it does the thing. No install, no copy, no restart, no leaving the session. So I built the launcher I wanted around exactly that. Hit a hotkey, type a few letters of the skill name, press Enter, and that sentence is on the clipboard. Paste. That’s the whole interaction. Things that fall out of it, which I did not plan and which are the reason I kept using it: Where a skill lives stops mattering. When you ask Claude Code to create a skill, it writes into ~/.claude/skills/ . Ask Codex and you get ~/.codex/skills/ . You don’t get a vote. Under the old arrangement every skill an agent generated for me started life stranded in that agent. Now it shows up in the list wherever it landed, and Enter works from anywhere. Name collisions stop being a problem. Two different skills called review in two folders are just two different sentences, because the path is what identifies them. Deleting a skill is deleting a folder. No registry, no state file, nothing to get out of sync. The launcher also lists past Claude Code conversations — Enter there copies claude --resume <id> rather than a path, because a conversation, unlike a file, can only be reopened by the tool that wrote it. Same for Codex, pi and a dozen others it knows the resume syntax for. Some honest limits: it’s macOS only, it’s a Rust program that renders through fzf , and I wrote it for myself, so the parts I don’t use are thinner. It indexes about 40 known skill directories across the agent CLIs I could find, so it should see whatever you already have without configuration. https://github.com/mikewang817/Prelude Deleting the rsync script felt better than writing it did. submitted by /u/Annual_Variation_916
Originally posted by u/Annual_Variation_916 on r/ClaudeCode
