Slash commands e skills
Objetivos de aprendizagem
- Criar slash commands de projeto (
.claude/commands/, compartilhados via git) e pessoais (~/.claude/commands/) — task statement 3.2. - Criar skills em
.claude/skills/comSKILL.mde frontmatter:context: fork,allowed-tools,argument-hint. - Explicar quando
context: forké a escolha certa (saída verbosa/exploração que não deve poluir a conversa principal). - Decidir entre skill (workflow sob demanda) e CLAUDE.md (padrão universal sempre carregado).
- Criar variantes pessoais de skills em
~/.claude/skills/com nomes distintos, sem afetar o time.
Slash commands: prompts empacotados
Um slash command é um arquivo Markdown cujo conteúdo vira o prompt quando alguém digita /nome-do-comando. Existem dois escopos, e a distinção cai na prova (é uma das sample questions oficiais):
| Escopo | Local | Quem recebe |
|---|---|---|
| Projeto | .claude/commands/review.md → /review | Todo o time, automaticamente, via git clone/pull |
| Pessoal | ~/.claude/commands/meu-fluxo.md | Só você, em todos os seus projetos |
O arquivo aceita frontmatter (description, argument-hint, allowed-tools, model) e placeholders: $ARGUMENTS (tudo que foi digitado após o comando) ou $1, $2... (posicionais):
---
description: Roda o checklist de code review do time no diff atual
argument-hint: "[branch-base]"
allowed-tools: "Bash(git diff*) Bash(git log*) Read Grep"
---
Revise o diff contra a branch $1 seguindo o checklist do time:
1. Segurança: entradas validadas? segredos hardcoded?
2. Erros: caminhos de falha tratados e logados?
3. Testes: novos comportamentos cobertos?
Reporte cada achado com arquivo:linha e severidade (alta/média/baixa).
Comando que codifica um processo do time (ex.: /review com o checklist padrão) pertence a .claude/commands/ no repositório: é versionado, chega a todos no clone e evolui por pull request como qualquer código.
Skills: capacidades sob demanda
Uma skill vive em .claude/skills/<nome>/SKILL.md (com arquivos auxiliares na mesma pasta, se precisar). Diferente do CLAUDE.md — carregado sempre, em toda sessão —, a skill é carregada sob demanda: quando invocada ou quando o Claude julga que a descrição dela casa com a tarefa. É o mecanismo certo para workflows específicos que não precisam ocupar contexto em toda interação.
---
name: analyze-deps
description: Analisa o grafo de dependencias do monorepo e aponta ciclos
context: fork
allowed-tools: "Read Grep Glob"
argument-hint: "[pacote]"
---
Analise as dependencias do pacote $ARGUMENTS:
1. Liste imports entre pacotes internos (use Grep em package.json e imports).
2. Detecte ciclos e dependencias nao declaradas.
3. Retorne APENAS um resumo: ciclos encontrados, top 5 acoplamentos, riscos.
Os três campos de frontmatter cobrados no exame:
context: fork— executa a skill em um subagente com contexto isolado: as dezenas de leituras e buscas intermediárias ficam no fork e só o resultado final volta à conversa principal. Use para skills de saída verbosa (análise de codebase) ou exploratória (brainstorm de alternativas) que poluiriam a sessão.allowed-tools— restringe as ferramentas disponíveis durante a execução da skill (ex.: só leitura/busca para uma skill de análise, impedindo ações destrutivas; ou só operações de escrita de arquivo quando é isso que a skill deve fazer).argument-hint— mostra ao desenvolvedor quais parâmetros o comando espera (aparece no autocomplete), evitando invocações sem os argumentos necessários.
flowchart TD
I["/analyze-deps pacote-x"] --> F{context: fork?}
F -- sim --> SUB["Subagente isolado
leituras e buscas verbosas
ficam aqui"]
SUB --> RES["Só o resumo volta
à conversa principal"]
F -- não --> MAIN["Roda na conversa principal
toda a saída entra no contexto"]
Skill vs CLAUDE.md: o critério
| Pergunta | CLAUDE.md / rules | Skill |
|---|---|---|
| Quando o conteúdo é necessário? | Em (quase) toda interação | Só em tarefas específicas |
| Custo de contexto | Pago em toda sessão | Pago só quando invocada |
| Natureza | Convenções, padrões universais | Workflow/procedimento com passos |
| Exemplo | "Use TypeScript strict; teste com Vitest" | "Gerar relatório de migração de esquema" |
Sintoma de erro de projeto: CLAUDE.md inchado com procedimentos passo-a-passo raramente usados (custo de tokens em toda sessão) ou, no inverso, convenções universais escondidas numa skill que nem sempre é carregada. Cada conteúdo no mecanismo certo.
Variantes pessoais sem afetar o time
Quer experimentar uma versão diferente de uma skill do time (outro formato de relatório, outros passos)? Crie a variante em ~/.claude/skills/ com nome diferente (ex.: analyze-deps-experimental). Ela fica disponível só para você, em qualquer projeto, e não interfere na skill oficial versionada do repositório. O mesmo raciocínio vale para comandos pessoais em ~/.claude/commands/.
Pegadinhas da prova
- Distrator típico: criar o comando do time em
~/.claude/commands/— pessoal, nunca chega aos colegas. Comando de time =.claude/commands/no repositório. - Distrator típico: definir comandos num
config.jsoncom "commands array" — esse mecanismo não existe; comandos são arquivos Markdown. - Distrator típico: colocar convenções que devem valer sempre numa skill — skills são sob demanda; convenção universal pertence ao CLAUDE.md/rules.
- Distrator típico: rodar análise verbosa de codebase sem
context: fork"para o Claude manter todo o contexto" — o entulho intermediário degrada a conversa principal; o fork isola e devolve só o resumo. - Distrator típico: editar a skill compartilhada do repositório para experimentar algo pessoal — a variante pessoal vai em
~/.claude/skills/com outro nome. - Distrator típico: achar que
allowed-toolsé orientação — é restrição real de ferramentas durante a execução da skill.
Resumo em 5 linhas
- Slash commands: Markdown em
.claude/commands/(projeto, versionado, time todo) ou~/.claude/commands/(pessoal); placeholders$ARGUMENTS/$1. - Skills:
.claude/skills/<nome>/SKILL.md, carregadas sob demanda — ao contrário do CLAUDE.md, que é sempre carregado. context: forkroda a skill em subagente isolado: saída verbosa/exploratória não polui a conversa principal.allowed-toolsrestringe ferramentas na execução (segurança/escopo);argument-hintguia a invocação com os parâmetros certos.- Variante pessoal de skill:
~/.claude/skills/com nome diferente — experimenta sem afetar o time.
Documentação oficial
Questões de fixação
1. O time quer um comando /changelog disponível para qualquer desenvolvedor imediatamente após clonar o repositório. Onde criá-lo?
Gabarito: A. Comandos de projeto são versionados e chegam a todos via clone/pull. B exigiria que cada pessoa criasse o arquivo manualmente — e não é compartilhado. C: CLAUDE.md carrega contexto/instruções, não define comandos invocáveis. D: não existe array de comandos em settings.json; comandos são arquivos Markdown.
2. Uma skill de auditoria de dependências lê centenas de package.json e gera logs extensos; depois de usá-la, a conversa principal fica "entupida" e o Claude perde o fio da tarefa original. Qual configuração resolve?
Gabarito: C. É o caso de uso definidor de context: fork: a saída verbosa fica no contexto do fork e apenas o resultado volta. A reduz o escopo, não o padrão do problema. B restringe ferramentas (segurança), não o volume de contexto gerado por leituras legítimas. D piora: colocaria conteúdo pesado no arquivo carregado em toda sessão.
3. Você quer garantir que a skill generate-fixtures só possa criar/editar arquivos de fixture, sem jamais executar comandos de shell durante sua execução. Qual mecanismo usar?
Gabarito: B. allowed-tools restringe de fato o conjunto de ferramentas durante a skill — enforcement, não pedido. A é instrução probabilística. C isola o contexto, mas não remove ferramentas por si só. D vai na direção oposta: bypass elimina verificações em vez de restringir.
4. Uma desenvolvedora quer testar uma versão modificada da skill oficial release-notes do time, sem impactar ninguém. Qual é o caminho recomendado?
Gabarito: D. Variante pessoal em ~/.claude/skills/ com nome distinto: só ela a vê, em qualquer projeto, e a oficial permanece intacta. A deixa uma modificação não commitada esperando para vazar num commit acidental. B quebra o fluxo do time inteiro. C cria conflito de nomes no escopo compartilhado.