Skill ou comando personalizado no Claude Code: qual usar em cada caso?

skill vs comando no Claude Code: comparação lado a lado
Resposta rápida

Skill vs comando no Claude Code virou uma dúvida diferente depois da versão 2.1.3, quando slash commands e Agent Skills passaram a formar um sistema unificado: qualquer skill pode ser chamada com prefixo / e arquivos Markdown de prompt customizado passam a ser tratados como skills que o Claude descobre quando são relevantes. .claude/commands/deploy.md e .claude/skills/deploy/SKILL.md geram o mesmo /deploy. A diferença real está no que a skill acrescenta: pasta com arquivos de apoio, scripts e invocação autônoma. Comando continua funcionando, mas é o formato legado; skill é o recomendado pra coisa nova

Você montou seu /deploy em .claude/commands/, ele funciona redondo, e aí todo mundo começa a falar de skill

Bate aquela dúvida chata: o que a skill faz que o meu comando já não faz?

A boa notícia é que não é briga de sistema rival

As duas peças resolvem o mesmo problema (empacotar repetição pra você não digitar o mesmo prompt toda semana) e hoje elas moram debaixo do mesmo teto

Aqui eu quero te entregar critério de escolha, não teoria: onde cada uma vive, o que cada uma acrescenta e quando vale mover o que você já tem

O que mudou: os dois viraram um sistema só

Dava pra pensar em slash commands e Agent Skills como dois caminhos separados

Isso acabou: o changelog oficial do Claude Code registra na versão 2.1.3 o merge dos dois em um sistema unificado

Na prática isso significa duas coisas…

Qualquer skill pode ser invocada explicitamente com o prefixo /

E arquivos Markdown de prompt customizado passam a ser tratados como skills, que o Claude pode descobrir quando forem relevantes

Quer o exemplo mais direto? .claude/commands/deploy.md e .claude/skills/deploy/SKILL.md criam ambos o /deploy, e funcionam da mesma forma na invocação

Então a pergunta não é "qual sistema eu uso", é "quanta capacidade eu quero dar pra essa automação"

Se você quiser o mapa mais amplo, eu já destrinchei a diferença entre skills, comandos e subagentes em outro post

Formação Claude Code
Formação Recomendada

Formação Claude Code

Domine Claude Code do absoluto zero até o avançado

  • 116 aulas
  • 4 projetos
  • 9h 23min

Skill x comando personalizado: comparação lado a lado

Critério Comando personalizado Skill
Onde o arquivo mora .claude/commands/ do projeto ~/.claude/skills/ (pessoal), .claude/skills/ (projeto) ou empacotada dentro de um plugin
Estrutura arquivo Markdown de prompt diretório cujo ponto de entrada é o SKILL.md, com frontmatter YAML e os metadados obrigatórios name e description
Invocação por barra por barra (/nome) e também de forma autônoma pelo Claude
Arquivos de apoio o próprio arquivo de prompt templates, exemplos, scripts e documentação de referência, todos opcionais
Scripts não previsto no formato scripts do diretório rodam sem carregar o código no contexto, só a saída consome tokens
Status formato legado formato recomendado para novas automações

Comentando linha por linha, rapidinho:

  • Onde mora: a skill tem três escopos (pessoal, projeto e plugin), o que muda bastante a estratégia de quem trabalha em vários repositórios
  • Estrutura: skill é pasta, não arquivo solto, e o SKILL.md precisa começar com o frontmatter contendo name e description
  • Invocação: aqui mora a diferença que importa, a skill pode entrar em cena sem você chamar
  • Arquivos de apoio: dá pra guardar o template e o exemplo do lado do prompt, em vez de colar tudo dentro dele
  • Scripts: o Claude executa e só o resultado vira token, o que é MUITO bom pra rotina repetitiva
  • Status: a CLI continua suportando os dois, mas .claude/commands/ é descrito como legado e a skill é a sucessora recomendada

Quando usar cada um: escolha pelo tipo de tarefa

Critério na mão, tarefa por tarefa

Tarefa com efeito colateral ou timing controlado:

Commit, deploy, mandar mensagem no Slack

Coisa que você quer disparar na hora que VOCÊ decidir, nunca porque o assunto apareceu na conversa

Pra isso existe o disable-model-invocation: true, que restringe a invocação só ao usuário, indicado justamente pra fluxos como /commit, /deploy ou /send-slack-message

<pre><code>— name: deploy description: Publica a aplicacao e acompanha o resultado do deploy disable-model-invocation: true —</code></pre>

Detalhe que evita dor de cabeça: em skills e comandos de plugin, campos booleanos como esse aceitam yes, no, on, off, 1 e 0 em qualquer caixa, além de true e false

Antes da v2.1.218 só true e false eram reconhecidos, então se você viu um exemplo antigo com yes e ele não pegou, era isso

Tarefa que o Claude deveria puxar sozinho:

Aqui é o oposto: você QUER que ele acione sem pedir

Revisar padrão de código, seguir um checklist de PR, aplicar a convenção da casa

E aí a description vira a peça mais importante do arquivo, porque na inicialização o agente pré carrega apenas name e description de cada skill instalada no system prompt, o suficiente pra saber quando cada uma deve ser usada

Descrição genérica é convite pra confusão, inclusive pra ter duas skills em conflito disputando o mesmo tipo de pedido

Tarefa com muita referência, template ou script:

Se o seu prompt está virando um monstro gigante com exemplo colado dentro, a pasta da skill resolve

A recomendação é manter o SKILL.md abaixo de 500 linhas e mover a referência detalhada pra arquivos separados

E os scripts do diretório podem ser executados sem carregar o conteúdo deles no contexto: o Claude roda e só a saída consome tokens

Tarefa que recebe entrada do usuário:

Nos comandos de barra os argumentos ficam disponíveis pelo placeholder $ARGUMENTS, e $N funciona como atalho para $ARGUMENTS[N] ($0 pro primeiro argumento, $1 pro segundo)

Tem também o encadeamento: a partir da v2.1.199, quando uma invocação de skill é seguida de outras (tipo /skill-a /skill-b faça XYZ), todas as skills nomeadas no início são carregadas e o texto final é passado como argumento pra cada uma

Ferramentas sem aprovação a cada uso:

O allowed-tools limita quais ferramentas o Claude pode usar enquanto a skill está ativa, e concede acesso a essas ferramentas sem aprovação a cada uso

<pre><code>allowed-tools: Bash(git add ) Bash(git commit ) Bash(git status *)</code></pre>

É o campo que transforma um fluxo cheio de "permitir? permitir? permitir?" em algo que roda liso, com guardrails (limites) no lugar

O que eu aprendi montando skills na prática

No vídeo abaixo eu instalo uma skill num projeto meu de gestão de produtos, um CRUD bem simples com tabela e cadastro de itens, só pra ver a coisa funcionando de verdade

Duas decisões que eu tomaria de novo

A primeira: instalei só no escopo do projeto, em vez de deixar aquilo valendo em todo canto

A instalação de plugin segue o formato /plugin install nome-do-plugin@nome-do-marketplace, com escopo de usuário, de projeto ou local

Só pra não embolar com a tabela lá de cima: aqueles três (pessoal, projeto e plugin) dizem onde a SKILL mora, esses aqui dizem onde o PLUGIN é instalado

Testar limpo em um projeto e só depois expandir é bem menos frustrante do que espalhar pra tudo e não saber o que mudou o comportamento

A segunda: instalação de plugin é um cenário diferente de editar texto de skill, e vale saber disso antes de perder tempo

Editar o texto de um SKILL.md que já existe recarrega sozinho, isso eu comento mais pra frente

Agora quando o assunto é plugin recém instalado, se o resumo da instalação pedir, roda /reload-plugins pra ativar

Já me ferrei achando que não tinha funcionado, quando na real o plugin só não tinha sido ativado ainda

Daí eu pedi uma coisa bem específica: adicionar um botão de exportar CSV na tabela, exportando só os produtos visíveis e filtrados

Vi na tela a skill sendo ativada, e esse é o sinal de que o negócio está de pé

Nesse pedido a IA não fez nenhuma pergunta, foi direto pra execução, porque a tarefa era simples e estava bem descrita

Mesmo assim o processo continuou valendo: entrega passo a passo do que foi alterado e relatório final das mudanças

E ela verificou o resultado antes de entregar, conferindo se as colunas exportadas batiam com as colunas visíveis da tabela

Cliquei no botão, abri o CSV no editor, e vieram exatamente os produtos que eu queria 🙂

Depois eu forcei o cenário contrário de propósito, com um prompt vago: "adiciona um sistema de autenticação no projeto"

Aí ela parou antes de implementar e listou as escolhas a alinhar, formas de autenticação, biblioteca, em vez de sair codando por conta própria

É isso que uma boa descrição de comportamento compra: a IA para de assumir coisa sozinha

E quando o pedido já está claro, não perguntar é bom, poupa tempo

Outro conforto do formato de pasta, e aqui é o tal cenário de edição: o Claude Code observa mudanças nos diretórios de skills quando você adiciona, edita ou remove uma skill em ~/.claude/skills/, no .claude/skills/ do projeto ou em um .claude/skills/ dentro de um diretório passado com --add-dir

A detecção ao vivo cobre apenas o texto do SKILL.md, então dá pra ir afinando a descrição e testando na sequência, sem reiniciar nada

No vídeo você vê a skill sendo ativada na tela, a mudança sendo feita de forma cirúrgica no projeto e a diferença entre o pedido claro e o pedido vago

Os problemas que me levaram a testar isso são os de sempre com IA gerando código: suposição silenciosa, over engineering, mexer em arquivo que não precisava e entregar sem testar

Vale acompanhar o repositório, porque ele está sendo atualizado com frequência e pode ganhar coisa nova

Já tenho comandos em .claude/commands/: preciso migrar?

Calma, nada quebra hoje

A CLI continua suportando os dois formatos

Mas .claude/commands/ é descrito como formato legado, e as skills são a sucessora recomendada, então a pergunta certa é "o que eu ganho movendo"

Você ganha a descoberta autônoma, os arquivos de apoio e scripts do lado do prompt, e continua com o mesmo /nome que você já tem no dedo

Migrar um comando é basicamente isso:

  1. Crie o diretório com o nome que você quer no comando, por exemplo .claude/skills/deploy/

O erro comum deste passo: achar que o campo name define o comando

Em skill pessoal ou de projeto, name é apenas o rótulo exibido nas listagens, e o comando continua vindo do nome do diretório

  1. Crie o SKILL.md dentro dele, começando pelo frontmatter YAML com name e description
  1. Cole o conteúdo do seu comando antigo no corpo do arquivo

O erro comum deste passo: trazer o argument-hint junto do comando antigo

Usar argument-hint no SKILL.md gera erro de chave inesperada

No frontmatter você tem allowed-tools, compatibility, description, license, metadata e name, além do disable-model-invocation que a gente viu lá em cima

  1. Decida se aquele fluxo pode ser acionado sozinho pelo Claude, e se não puder, adicione disable-model-invocation: true

E se a sua skill vier de um plugin, se liga: as skills do plugin ficam prefixadas pelo nome do plugin, tipo /commit-commands:commit

Nesse caso o name define o último segmento do comando, e o prefixo do plugin permanece

Veredito: qual peça resolve o seu caso

Sem ficar em cima do muro

Coisa nova você faz como skill

É o formato recomendado, aceita a mesma invocação por barra, e ainda te dá a pasta com arquivos de apoio e a chance de o Claude puxar aquilo sozinho

Comando personalizado fica pra inércia

O que já existe e funciona não precisa de mutirão de migração amanhã, mas eu não começaria nada novo por ali

Pra quem a skill NÃO serve? Pra quem quer só um atalho de texto e não pretende mexer em estrutura de pasta, aí o arquivo único ainda é mais rápido de escrever

E o comando não serve pra quem quer automação com script, referência separada e ativação automática, isso o formato legado não entrega

No fim, a decisão de verdade nem é skill contra comando

É você responder uma pergunta só: eu quero que o Claude acione isso sozinho, ou não?

Se a resposta for sim, capriche na description

Se for não, disable-model-invocation: true e dorme tranquilo

Conclusão

Próximo passo, bem concreto: pega o comando que você mais usa hoje

Recria ele como diretório com SKILL.md e frontmatter com name e description

Decide se ele leva disable-model-invocation ou não

Testa no escopo do projeto antes de jogar pro pessoal, que é onde a bagunça costuma nascer

E não pense nisso como conhecimento preso ao terminal: Agent Skills são suportadas hoje no Claude.ai, no Claude Code, no Claude Agent SDK e na Claude Developer Platform, então o que você aprender montando uma skill aqui viaja pros outros lugares 😀

Dá uma olhada no vídeo pra ver o comportamento acontecendo na tela, é bem diferente de ler sobre

E me conta depois qual comando você migrou primeiro, tô curioso…

até o próximo post!

Perguntas frequentes

Comando em .claude/commands/ vai parar de funcionar no Claude Code?

Não. A CLI continua suportando os dois formatos, e .claude/commands/ segue funcionando normalmente. A diferença é que ele é tratado como formato legado, enquanto a skill é a sucessora recomendada para automações novas.

Dá pra transformar um comando personalizado em skill sem perder o comando de barra?

Dá, e o comando final continua o mesmo. .claude/commands/deploy.md e .claude/skills/deploy/SKILL.md criam ambos o /deploy e funcionam do mesmo jeito na invocação, então migrar não quebra o hábito de quem já usa o comando.

Skill pessoal e skill de projeto disputam o mesmo espaço?

Não, são escopos diferentes. Skill pessoal fica em ~/.claude/skills/, skill de projeto fica em .claude/skills/ dentro do repositório, e ainda existe a skill empacotada dentro de um plugin, cada uma com seu propósito. Só não confunda esses três com os escopos de instalação de plugin (usuário, projeto ou local), que dizem onde o plugin é instalado, não onde a skill mora.

Preciso reiniciar o Claude Code depois de editar o SKILL.md?

Se a mudança for no texto do SKILL.md, não precisa. O Claude Code observa mudanças nos diretórios de skills (pessoal, de projeto ou em um .claude/skills/ passado com –add-dir) e recarrega ao vivo, e essa detecção automática cobre o texto do SKILL.md. Cenário diferente é instalar um plugin novo: aí, se o resumo da instalação pedir, você roda /reload-plugins para ativar.

Agent Skills funcionam só dentro do Claude Code?

Não, o alcance é maior. Hoje as Agent Skills são suportadas no Claude.ai, no Claude Code, no Claude Agent SDK e na Claude Developer Platform, então a mesma skill pode fazer sentido em mais de um lugar.

Por que meu comando antigo com argument-hint dá erro quando vira skill?

Porque argument-hint não é uma propriedade aceita no frontmatter do SKILL.md, e usá-la gera erro de chave inesperada. No frontmatter você tem allowed-tools, compatibility, description, license, metadata e name, além do disable-model-invocation, que impede o Claude de acionar a skill sozinho.




Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares