Pular para o conteúdo principal

Alvos

Os 77 runtimes, os dois escopos, e onde cada artefato aterrissa em disco.

Onde uma skill aterrissa é função de três coisas: o tipo do artefato, o runtime que você nomeou e o escopo em que você está escrevendo. Esta página cobre os dois últimos.

Os dois escopos

Projeto é o padrão, e ele só vale dentro de um repositório git. Fora de um, uma linha de flags comum recusa, saída 2, porque a regra que este produto segue é que o git é o manifesto: nada mais numa máquina consegue auditar o que uma escrita silenciosa deixou para trás. Global, com --global ou -g, escreve sob o diretório do usuário, e não precisa de git nenhum.

Os dois escopos não são a mesma operação com raiz diferente. Eles escrevem de formas diferentes.

ProjetoGlobal
O que aterrissacópia real, semprecópia real no primeiro destino, link relativo nos demais
Precisa de gitsim, e recusa fora delenão
Rede de segurançagit status revela e desfaznenhuma, e é por isso que --force existe
Destino ocupadosobrescreve, porque o git mostrapergunta num terminal; recusa com saída 3 sem terminal, sob --yes ou sob --dry-run; --force sobrescreve sem perguntar

Os dois escopos, vistos do disco

A tabela acima diz a regra; isto é o que ela produz. Uma skill instalada para dois runtimes que compartilham a mesma pasta:

# escopo de projeto, dentro do repositório
.claude/skills/panlabs-python-standards/
├── SKILL.md
└── references/...

# escopo de máquina, sob o diretório do usuário
~/.claude/skills/panlabs-python-standards/ ← cópia real, o primeiro destino
~/.agents/skills/panlabs-python-standards -> ../../.claude/skills/panlabs-python-standards

O segundo destino em diante é link relativo, e relativo de propósito: um diretório de usuário que muda de caminho, ou que é sincronizado entre máquinas, continua resolvendo.

O doctor conhece a diferença e a lê dos dois lados. Um link que aponta para o vazio é dangling link; um link que virou arquivo de texto, porque alguém copiou a pasta sem preservar links, é link virado texto. Os dois são achado, e achado reprova.

Em escopo de projeto, toda aterrissagem é cópia real, nunca link simbólico. Isso é deliberado: sob core.symlinks=false, um valor de configuração do git que um clone pode herdar calado, um link commitado é conferido como arquivo de texto comum, e o equipamento estaria quebrado para quem clonou. Copiar contorna esse modo de falha por inteiro.

Em escopo global, cada seleção sobe uma escadinha: o primeiro destino da ordem da própria tabela recebe cópia real, e todo destino depois dele vira link relativo apontando para essa primeira cópia. Relativo de propósito, para que o link continue funcionando se o $HOME mudar de lugar. No Windows o mesmo papel é cumprido por uma junção, que não precisa de privilégio elevado. Onde nem link nem junção podem ser criados, a escrita degrada em silêncio para uma segunda cópia real, imprime um aviso dizendo isso, e ainda sai 0.

O grupo universal

Vários runtimes leem exatamente o mesmo diretório. Em escopo de projeto, 19 dos 77, incluindo a chave sintética universal, leem .agents/skills, o que faz dele o maior destino compartilhado. Apesar do nome, ele não é um caminho que alcança todo runtime: medido contra o Claude Code 2.1.223, ele não descobre skills ali, e o Codex também não lê .claude/skills.

Em escopo global o mesmo grupo encolhe para 6. O cline, o dexto, o kimi-code-cli, o loaf, o warp e o zed leem ~/.agents/skills, enquanto o amp~/.config/agents/skills no caminho derivado do XDG dele, o codex~/.codex/skills e o cursor~/.cursor/skills.

O plano sempre nomeia todo destino e quem o lê, então uma seleção que cai numa pasta compartilhada aparece como uma escrita servindo vários runtimes, nunca como promessa de uma instalação por runtime.

A tabela de runtimes

São 77 linhas: 76 transcritas do mapa de runtimes do projeto vercel-labs/skills lá de cima, atribuído em NOTICE, mais o vscode, que não tem destino de skill em nenhum dos escopos e existe nesta tabela só para que o passo de enxerto de MCP do assistente tenha um nome para ele.

74 dos 77 têm destino de skill em escopo global. O eve e o promptscript não têm, então pedir um dos dois sob --global é uma linha válida com resposta negativa, saída 3, e não uma linha inválida.

O vscode é o terceiro, e ele recusa por outro eixo: ele não tem destino de skill em escopo nenhum, e a recusa não muda com --global. A mensagem também é outra, e diz o que ele aceita no lugar:

`vscode` takes MCP servers and has no skills destination of its own;

--runtime vscode --mcp <nome> instala; --runtime vscode --skill <nome> sai 3 nos dois escopos.

Os caminhos globais abaixo usam ~ para o diretório do usuário. Vários são de fato resolvidos por uma variável de ambiente primeiro, caindo no caminho mostrado só quando ela não está posta. São três mecanismos, e a tabela não os distingue:

  • seis honram uma variável da própria ferramenta: autohand-code (AUTOHAND_HOME), claude-code (CLAUDE_CONFIG_DIR), codex (CODEX_HOME), grok (GROK_HOME), hermes-agent (HERMES_HOME) e mistral-vibe (VIBE_HOME);
  • seis resolvem por XDG_CONFIG_HOME antes de cair em ~/.config, e são amp, devin, goose, opencode, replit e universal;
  • um usa o primeiro diretório que existir: o openclaw procura ~/.openclaw, ~/.clawdbot e ~/.moltbot nessa ordem, e cai no primeiro quando nenhum existe.

Os demais caminhos de ~/.config na tabela são literais, não XDG: o crush e o kimchi moram lá por escrita direta, e não mudam com a variável.

Valor em branco conta como não posto. Valor relativo é ignorado de propósito, e a ferramenta declara essa divergência contra o upstream.

Chave de --runtimeRuntimeEscopo de projetoEscopo global
aider-deskAiderDesk.aider-desk/skills~/.aider-desk/skills
ampAmp.agents/skills~/.config/agents/skills
antigravityAntigravity.agents/skills~/.gemini/antigravity/skills
antigravity-cliAntigravity CLI.agents/skills~/.gemini/antigravity-cli/skills
astrbotAstrBotdata/skills~/.astrbot/data/skills
autohand-codeAutohand Code CLI.autohand/skills~/.autohand/skills
augmentAugment.augment/skills~/.augment/skills
bobIBM Bob.bob/skills~/.bob/skills
claude-codeClaude Code.claude/skills~/.claude/skills
openclawOpenClawskills~/.openclaw/skills
clineCline.agents/skills~/.agents/skills
codearts-agentCodeArts Agent.codeartsdoer/skills~/.codeartsdoer/skills
codebuddyCodeBuddy.codebuddy/skills~/.codebuddy/skills
codemakerCodemaker.codemaker/skills~/.codemaker/skills
codestudioCode Studio.codestudio/skills~/.codestudio/skills
codexCodex.agents/skills~/.codex/skills
command-codeCommand Code.commandcode/skills~/.commandcode/skills
continueContinue.continue/skills~/.continue/skills
cortexCortex Code.cortex/skills~/.snowflake/cortex/skills
crushCrush.crush/skills~/.config/crush/skills
cursorCursor.agents/skills~/.cursor/skills
deepagentsDeep Agents.agents/skills~/.deepagents/agent/skills
devinDevin for Terminal.devin/skills~/.config/devin/skills
dextoDexto.agents/skills~/.agents/skills
droidDroid.factory/skills~/.factory/skills
eveEveagent/skillsnenhum
firebenderFirebender.agents/skills~/.firebender/skills
forgecodeForgeCode.forge/skills~/.forge/skills
gemini-cliGemini CLI.agents/skills~/.gemini/skills
github-copilotGitHub Copilot.agents/skills~/.copilot/skills
gooseGoose.goose/skills~/.config/goose/skills
grokGrok Build.grok/skills~/.grok/skills
hermes-agentHermes Agent.hermes/skills~/.hermes/skills
inference-shinference.sh.inferencesh/skills~/.inferencesh/skills
jazzJazz.jazz/skills~/.jazz/skills
junieJunie.junie/skills~/.junie/skills
iflow-cliiFlow CLI.iflow/skills~/.iflow/skills
kiloKilo Code.kilocode/skills~/.kilocode/skills
kimchiKimchi.kimchi/skills~/.config/kimchi/harness/skills
kimi-code-cliKimi Code CLI.agents/skills~/.agents/skills
kiro-cliKiro CLI.kiro/skills~/.kiro/skills
kodeKode.kode/skills~/.kode/skills
lingmaLingma.lingma/skills~/.lingma/skills
loafLoaf.agents/skills~/.agents/skills
mcpjamMCPJam.mcpjam/skills~/.mcpjam/skills
minimax-codeMiniMax Code.minimax/skills~/.minimax/skills
mistral-vibeMistral Vibe.vibe/skills~/.vibe/skills
moxbyMoxby.moxby/skills~/.moxby/skills
muxMux.mux/skills~/.mux/skills
opencodeOpenCode.agents/skills~/.config/opencode/skills
openhandsOpenHands.openhands/skills~/.openhands/skills
onaOna.ona/skills~/.ona/skills
piPi.pi/skills~/.pi/agent/skills
qoderQoder.qoder/skills~/.qoder/skills
qoder-cnQoder CN.qoder/skills~/.qoder-cn/skills
qwen-codeQwen Code.qwen/skills~/.qwen/skills
replitReplit.agents/skills~/.config/agents/skills
reasonixReasonix.reasonix/skills~/.reasonix/skills
rovodevRovo Dev.rovodev/skills~/.rovodev/skills
rooRoo Code.roo/skills~/.roo/skills
tabnine-cliTabnine CLI.tabnine/agent/skills~/.tabnine/agent/skills
terramindTerramind.terramind/skills~/.terramind/skills
tinycloudTinycloud.tinycloud/skills~/.tinycloud/skills
traeTrae.trae/skills~/.trae/skills
trae-cnTrae CN.trae/skills~/.trae-cn/skills
warpWarp.agents/skills~/.agents/skills
windsurfWindsurf.windsurf/skills~/.codeium/windsurf/skills
zedZed.agents/skills~/.agents/skills
zcodeZCode.zcode/skills~/.zcode/skills
zencoderZencoder.zencoder/skills~/.zencoder/skills
zenflowZenflow.zencoder/skills~/.zencoder/skills
neovateNeovate.neovate/skills~/.neovate/skills
pochiPochi.pochi/skills~/.pochi/skills
promptscriptPromptScript.agents/skillsnenhum
adalAdaL.adal/skills~/.adal/skills
vscodeVS Codenenhumnenhum
universalUniversal.agents/skills~/.config/agents/skills

O vscode não tem linha em nenhuma das duas colunas porque ele não é destino de skill. Ele existe na tabela só para o enxerto de MCP, que lê e escreve .vscode/mcp.json e nada sob skills/. O universal não é ferramenta de verdade: é chave sintética nomeando diretamente o destino compartilhado .agents/skills, para quando você quiser equipar essa pasta sem nomear cada runtime que por acaso a lê.