Targets
The 77 runtimes, the two scopes, and where each artifact lands on disk.
Where a skill lands is a function of three things, the artifact type, the runtime you named, and the scope you are writing in. This page covers the last two.
The two scopes
Project is the default, and it only applies inside a git repository. Outside
one, a plain flag line refuses, exit 2, because the rule this product follows
is that the git is the manifest: nothing else on a machine can audit what a
silent write left behind. Global, with --global or -g, writes under the
home directory instead, and needs no git at all.
The two scopes are not the same operation at a different root. They write differently.
| Project | Global | |
|---|---|---|
| What lands | a real copy, always | a real copy at the first destination, relative links after it |
| Needs git | yes, and refuses outside one | no |
| Safety net | git status reveals and undoes | none, which is why --force exists |
| Occupied destination | overwritten, because git shows it | asks in a terminal; refused with exit 3 off a terminal, under --yes or under --dry-run; --force overwrites without asking |
The two scopes, seen from disk
The table above gives the rule; this is what it produces. One skill installed for two runtimes that share the same folder:
# project scope, inside the repository
.claude/skills/panlabs-python-standards/
├── SKILL.md
└── references/...
# machine scope, under the home directory
~/.claude/skills/panlabs-python-standards/ ← real copy, the first destination
~/.agents/skills/panlabs-python-standards -> ../../.claude/skills/panlabs-python-standards
The second destination onward is a relative link, and relative on purpose: a home directory that moves, or that is synced across machines, keeps resolving.
doctor knows the difference and reads it from both sides. A link pointing at
nothing is a dangling link; a link that turned into a text file, because
someone copied the folder without preserving links, is a link turned into text. Both are findings, and a finding fails.
In project scope, every landing is a real copy, never a symlink. This is
deliberate: under core.symlinks=false, a git config value a clone can inherit
silently, a committed symlink checks out as an ordinary text file instead of a
link, and the equipment would be broken for anyone who cloned it. Copying
sidesteps that failure mode entirely.
In global scope, each selection climbs a small ladder: the first destination
in the runtime table's own order receives a real copy, and every destination
after it becomes a relative symlink pointing at that first copy. Relative,
specifically so the link keeps working if $HOME itself moves. On Windows the
same role is filled by a junction, which needs no elevated privilege. Where
neither can be created, the write silently degrades to a second real copy, prints
a warning saying so, and still exits 0.
The universal group
Several runtimes read the exact same directory. In project scope, 19 of the 77,
including the synthetic universal key itself, read .agents/skills, which
makes it the single largest shared destination. Despite the name it is not a path
that reaches every runtime: measured against Claude Code 2.1.223, it does not
discover skills there, and Codex does not read .claude/skills either.
In global scope the same group shrinks to 6. cline, dexto, kimi-code-cli,
loaf, warp and zed all read ~/.agents/skills, while amp reads
~/.config/agents/skills on its own XDG-derived path, codex reads
~/.codex/skills, and cursor reads ~/.cursor/skills.
The plan always names every destination and who reads it, so a selection landing in a shared folder is shown as one write serving several runtimes, never as a promise of one install per runtime.
The runtime table
77 rows: 76 transcribed from the upstream vercel-labs/skills project's own
runtime map, attributed in NOTICE, plus vscode, which has no skill
destination in either scope and exists in this table purely so the MCP graft step
of the wizard has a name for it.
74 of the 77 have a skills destination in global scope. eve and promptscript
do not, so asking for either under --global is a valid line with a negative
answer, exit 3, rather than an invalid one.
vscode is the third, and it refuses on a different axis: it has no skills
destination in either scope, and the refusal does not change with --global.
The message is different too, and names what it takes instead:
`vscode` takes MCP servers and has no skills destination of its own;
--runtime vscode --mcp <name> installs; --runtime vscode --skill <name>
exits 3 in both scopes.
Global paths below use ~ for the home directory. Several are actually resolved
through an environment variable first, falling back to the path shown only when
that variable is unset. There are three mechanisms, and the table does not tell
them apart:
- six honour a variable of the tool's own:
autohand-code(AUTOHAND_HOME),claude-code(CLAUDE_CONFIG_DIR),codex(CODEX_HOME),grok(GROK_HOME),hermes-agent(HERMES_HOME) andmistral-vibe(VIBE_HOME); - six resolve through
XDG_CONFIG_HOMEbefore falling back to~/.config, and they areamp,devin,goose,opencode,replitanduniversal; - one uses the first directory that exists:
openclawlooks for~/.openclaw,~/.clawdbotand~/.moltbotin that order, and falls back to the first when none exists.
The other ~/.config paths in the table are literals, not XDG: crush and
kimchi live there by direct spelling, and do not move with the variable.
A blank value counts as unset. A relative value is ignored on purpose, and the tool declares that divergence against upstream.
--runtime key | Runtime | Project scope | Global scope |
|---|---|---|---|
aider-desk | AiderDesk | .aider-desk/skills | ~/.aider-desk/skills |
amp | Amp | .agents/skills | ~/.config/agents/skills |
antigravity | Antigravity | .agents/skills | ~/.gemini/antigravity/skills |
antigravity-cli | Antigravity CLI | .agents/skills | ~/.gemini/antigravity-cli/skills |
astrbot | AstrBot | data/skills | ~/.astrbot/data/skills |
autohand-code | Autohand Code CLI | .autohand/skills | ~/.autohand/skills |
augment | Augment | .augment/skills | ~/.augment/skills |
bob | IBM Bob | .bob/skills | ~/.bob/skills |
claude-code | Claude Code | .claude/skills | ~/.claude/skills |
openclaw | OpenClaw | skills | ~/.openclaw/skills |
cline | Cline | .agents/skills | ~/.agents/skills |
codearts-agent | CodeArts Agent | .codeartsdoer/skills | ~/.codeartsdoer/skills |
codebuddy | CodeBuddy | .codebuddy/skills | ~/.codebuddy/skills |
codemaker | Codemaker | .codemaker/skills | ~/.codemaker/skills |
codestudio | Code Studio | .codestudio/skills | ~/.codestudio/skills |
codex | Codex | .agents/skills | ~/.codex/skills |
command-code | Command Code | .commandcode/skills | ~/.commandcode/skills |
continue | Continue | .continue/skills | ~/.continue/skills |
cortex | Cortex Code | .cortex/skills | ~/.snowflake/cortex/skills |
crush | Crush | .crush/skills | ~/.config/crush/skills |
cursor | Cursor | .agents/skills | ~/.cursor/skills |
deepagents | Deep Agents | .agents/skills | ~/.deepagents/agent/skills |
devin | Devin for Terminal | .devin/skills | ~/.config/devin/skills |
dexto | Dexto | .agents/skills | ~/.agents/skills |
droid | Droid | .factory/skills | ~/.factory/skills |
eve | Eve | agent/skills | none |
firebender | Firebender | .agents/skills | ~/.firebender/skills |
forgecode | ForgeCode | .forge/skills | ~/.forge/skills |
gemini-cli | Gemini CLI | .agents/skills | ~/.gemini/skills |
github-copilot | GitHub Copilot | .agents/skills | ~/.copilot/skills |
goose | Goose | .goose/skills | ~/.config/goose/skills |
grok | Grok Build | .grok/skills | ~/.grok/skills |
hermes-agent | Hermes Agent | .hermes/skills | ~/.hermes/skills |
inference-sh | inference.sh | .inferencesh/skills | ~/.inferencesh/skills |
jazz | Jazz | .jazz/skills | ~/.jazz/skills |
junie | Junie | .junie/skills | ~/.junie/skills |
iflow-cli | iFlow CLI | .iflow/skills | ~/.iflow/skills |
kilo | Kilo Code | .kilocode/skills | ~/.kilocode/skills |
kimchi | Kimchi | .kimchi/skills | ~/.config/kimchi/harness/skills |
kimi-code-cli | Kimi Code CLI | .agents/skills | ~/.agents/skills |
kiro-cli | Kiro CLI | .kiro/skills | ~/.kiro/skills |
kode | Kode | .kode/skills | ~/.kode/skills |
lingma | Lingma | .lingma/skills | ~/.lingma/skills |
loaf | Loaf | .agents/skills | ~/.agents/skills |
mcpjam | MCPJam | .mcpjam/skills | ~/.mcpjam/skills |
minimax-code | MiniMax Code | .minimax/skills | ~/.minimax/skills |
mistral-vibe | Mistral Vibe | .vibe/skills | ~/.vibe/skills |
moxby | Moxby | .moxby/skills | ~/.moxby/skills |
mux | Mux | .mux/skills | ~/.mux/skills |
opencode | OpenCode | .agents/skills | ~/.config/opencode/skills |
openhands | OpenHands | .openhands/skills | ~/.openhands/skills |
ona | Ona | .ona/skills | ~/.ona/skills |
pi | Pi | .pi/skills | ~/.pi/agent/skills |
qoder | Qoder | .qoder/skills | ~/.qoder/skills |
qoder-cn | Qoder CN | .qoder/skills | ~/.qoder-cn/skills |
qwen-code | Qwen Code | .qwen/skills | ~/.qwen/skills |
replit | Replit | .agents/skills | ~/.config/agents/skills |
reasonix | Reasonix | .reasonix/skills | ~/.reasonix/skills |
rovodev | Rovo Dev | .rovodev/skills | ~/.rovodev/skills |
roo | Roo Code | .roo/skills | ~/.roo/skills |
tabnine-cli | Tabnine CLI | .tabnine/agent/skills | ~/.tabnine/agent/skills |
terramind | Terramind | .terramind/skills | ~/.terramind/skills |
tinycloud | Tinycloud | .tinycloud/skills | ~/.tinycloud/skills |
trae | Trae | .trae/skills | ~/.trae/skills |
trae-cn | Trae CN | .trae/skills | ~/.trae-cn/skills |
warp | Warp | .agents/skills | ~/.agents/skills |
windsurf | Windsurf | .windsurf/skills | ~/.codeium/windsurf/skills |
zed | Zed | .agents/skills | ~/.agents/skills |
zcode | ZCode | .zcode/skills | ~/.zcode/skills |
zencoder | Zencoder | .zencoder/skills | ~/.zencoder/skills |
zenflow | Zenflow | .zencoder/skills | ~/.zencoder/skills |
neovate | Neovate | .neovate/skills | ~/.neovate/skills |
pochi | Pochi | .pochi/skills | ~/.pochi/skills |
promptscript | PromptScript | .agents/skills | none |
adal | AdaL | .adal/skills | ~/.adal/skills |
vscode | VS Code | none | none |
universal | Universal | .agents/skills | ~/.config/agents/skills |
vscode has no row in either column because it is not a skill destination at
all. It exists in the table only for the MCP graft, which reads and writes
.vscode/mcp.json and nothing under skills/. universal is not a real tool: it
is a synthetic key naming the shared .agents/skills destination directly, for
when you want to equip that folder without naming every runtime that happens to
read it.