Entenda o que muda quando um mod carrega
Sem mods, o Claude Code faz sempre a mesma coisa: recebe o seu pedido, chama o modelo, roda ferramentas e desenha a conversa. Um mod entra no meio desse caminho.
Ele pode observar (contar quantos arquivos o Claude leu), desenhar (uma faixa acima do prompt, um painel do lado), acrescentar (um comando /meu-comando, uma ferramenta nova para o modelo) ou mudar o que acontece (perguntar antes de um rm, trocar o modelo de um subagente).
🆕 Novo aqui? Quatro palavras deste módulo
- Mod — o apelido de um plugin do Claude Code que traz function hooks: código JavaScript ou TypeScript que reage ao que acontece na sessão.
- Plugin — o pacote: uma pasta com
.claude-plugin/plugin.json. Um plugin pode trazer mod, skills, agentes, servidores MCP. - Evento — um acontecimento com nome, como
tool.call(o Claude vai rodar uma ferramenta) ouprompt.submit(você mandou uma mensagem). - Hook — a função que o mod pendura num evento. Ela roda toda vez que o evento acontece.
Como ler o desenho: a linha azul é o caminho normal de um pedido. Os pontos verdes são eventos. O mod não fica "rodando ao lado": ele só age quando um desses pontos acontece e a função dele é chamada.
contar, registrar
faixa, painel, status
comando, ferramenta
negar, perguntar, trocar
Separe mod, hook clássico, skill e MCP
Quatro coisas estendem o Claude Code, e é fácil misturar. A pergunta que separa: quem executa e quando.
O hook clássico é um comando de shell que o settings.json chama. A skill é texto que o modelo lê. O MCP é um servidor à parte. O mod é código que roda dentro do Claude Code, com acesso aos eventos e à tela.
| O quê | Quem executa | Pode desenhar na tela? | Use quando |
|---|---|---|---|
| Mod (function hooks) | o próprio Claude Code, num ambiente isolado | sim: faixa, painel, status, linha da conversa | reagir a eventos e mostrar algo |
| Hook clássico | o shell, por um comando no settings.json | não | regra simples por script (lint, bloqueio) |
| Skill | o modelo, lendo instruções | não | ensinar um jeito de trabalhar |
| Servidor MCP | um processo à parte | não | dar ferramentas e dados ao modelo |
O que olhar na tabela: só a primeira linha tem "sim" na coluna da tela. Se o que você quer é ver alguma coisa enquanto o Claude trabalha, é mod. Se é só bloquear um comando, um hook clássico pode bastar.
✓ Problema de mod
- ✓ "Quero ver quais arquivos o Claude tocou"
- ✓ "Quero um /recibo do que mudou na sessão"
- ✓ "Quero um medidor de contexto acima do prompt"
- ✓ "Quero perguntar antes de apagar uma pasta"
✗ Não precisa de mod
- ✗ "Quero que o Claude siga meu padrão de commit" (skill ou CLAUDE.md)
- ✗ "Quero que ele consulte meu banco" (MCP)
- ✗ "Quero rodar o lint depois de cada edição" (hook clássico)
- ✗ "Quero mudar o modelo padrão" (configuração)
🆕 Novo aqui? E os hooks clássicos dentro de um mod?
Um mod também enxerga os hooks clássicos. Eles aparecem como eventos com o prefixo classic., por exemplo classic.Stop ou classic.PreToolUse. Você vê isso na trilha 2. Se quiser um curso só de hooks clássicos, o INEMA tem o Automação & Hooks no Claude Code.
código + tela
script no shell
texto para o modelo
processo à parte
Leia a assinatura register(on, options)
Todo mod exporta uma função register. O Claude Code chama essa função uma vez quando o módulo carrega (e de novo a cada recarga). Ela não faz o trabalho: ela pendura os hooks.
Recebe dois argumentos. on é a função que pendura um hook num evento. options traz os valores que a pessoa escolheu para as opções que o mod declarou no plugin.json (você vê no módulo 1.2).
// Minimal teaching example. Counter is scoped to this module instance.
export function register(on) {
let count = 0;
on("session.start", async ($, e, next) => {
const result = await next(e);
count = 0;
await $.command.register({ name: "readcount", description: "Show successful reads observed by this example" });
return result;
});
on("tool.call", { tool: "Read" }, async ($, e, next) => {
const result = await next(e);
if (!result.isError && result.deny === undefined) count += 1;
return result;
});
on("command.run", { command: "readcount" }, async () => ({ text: `Successful reads observed: ${count}` }));
}
on, três eventos. Nenhuma linha "roda sozinha": tudo espera um evento acontecer.on("session.start", hook)
Quando a sessão fica pronta, registra o comando /readcount.
on("tool.call", { tool: "Read" }, hook)
O segundo argumento é o matcher: só chamadas da ferramenta Read chegam neste hook. Ele conta as que deram certo.
on("command.run", { command: "readcount" }, hook)
Quando alguém digita /readcount, responde com um texto. Sem chamar o modelo.
🆕 Novo aqui? Matcher
O matcher é um objeto opcional entre o nome do evento e o hook. Ele filtra: { tool: "Read" } deixa passar só a ferramenta Read; { command: "readcount" } só o comando /readcount. Sem matcher, o hook recebe todas as ocorrências do evento.
register é exportada
pendura um hook
filtra o evento
valores do /config
Conheça os três parâmetros de todo hook
Todo hook tem a mesma forma: ($, e, next). Decorar esses três é metade do curso.
$ é tudo o que o mod pode pedir ao Claude Code. e é o que aconteceu. next passa a vez para os outros plugins e, por fim, para o comportamento normal do Claude Code.
Como ler o desenho: o hook está no meio do caminho. O e chega da esquerda, o $ desce de cima com tudo o que o mod pode usar, e o next é a porta para a direita. Quem não chama next responde no lugar de todo o resto (trilha 2).
| Parâmetro | O que é | No starter-mod |
|---|---|---|
$ | a interface do engine, organizada por nouns ($.ui, $.fs, $.command...) | $.command.register(...) |
e | a entrada do evento, como dado simples | no tool.call: a ferramenta e os argumentos dela |
next | continua a cadeia e devolve o resultado | const result = await next(e), depois olha result.isError |
💡 O detalhe que o starter-mod ensina
No tool.call, o contador soma depois do await next(e). Só depois do next o mod sabe se a leitura deu certo. Contar antes contaria também as leituras que falharam ou foram negadas.
o que você pode pedir
o que aconteceu
passa a vez
tudo é assíncrono
Saiba onde o mod roda e o que ele não tem
O módulo do mod roda num ambiente próprio, sem DOM e sem Node. Não existe require, process.env, fetch nem document. Tudo o que está fora do mod chega pelo $.
Isso é uma vantagem: o que o mod faz fica visível. Quer ler um arquivo? $.fs. Rodar um comando? $.process. Guardar algo? $.store. O claude plugin validate lista exatamente o que o mod chama (você vê no módulo 1.4).
✓ Pode
- ✓
importestático de outros arquivos do próprio mod - ✓ JSX, com
hcomo fábrica - ✓ Arquivos
.ts,.tsx,.js,.mjs(e variantes) - ✓ Tudo o que o
$oferece
✗ Não pode
- ✗
import()dinâmico: o módulo nem carrega - ✗
require, APIs do Node, DOM - ✗
Date.now()nos testes: use o relógio do engine (trilha 2) - ✗ Acessar o disco ou a rede por fora do
$
⚠️ Isolado não quer dizer inofensivo
O mod roda com as permissões do Claude Code. Pelo $ ele pode escrever arquivos, rodar processos e até chamar o modelo (que gasta cota). Antes de instalar um mod de terceiro, leia o código ou peça ao Claude para ler e explicar, sem rodar.
🆕 Novo aqui? Noun
Os tipos chamam cada grupo do $ de noun (substantivo): ui, fs, session, tool... O método vem depois do ponto: $.fs.read, $.ui.toast. O mesmo par vira nome de evento: tool.call é o evento, e um hook nele recebe as chamadas de ferramenta.
sem Node, sem DOM
fs, process, store...
validate lista as chamadas
as do Claude Code
Veja o mapa do curso e os dois kits
O curso usa dois kits abertos como material. Você clona os dois e roda os exemplos de verdade. Quem acompanha os exemplos é o Rafa, 34, dev numa agência pequena: ele quer ver o que o Claude toca no repositório e não perder trabalho entre sessões.
Claude Mods Starter Kit
Da Prompt Advisers (licença MIT). Dez mods prontos, um modelo mínimo (templates/starter-mod), scripts de teste e um prompt de construção por mod. Escrito em .mjs, sem compilar.
Espelho INEMA: github.com/inematds/claude-mods-starter-kit
inema-mods
Dezoito mods em português, com testes, um verificador (scripts/checar-mod.sh) e o guia docs/COMO-FAZER-UM-MOD.md, com as pegadinhas que já custaram tempo. Escrito em .tsx tipado.
Como ler o desenho: cada degrau usa o anterior. Na T1 o mod carrega e responde um comando; na T2 ele reage a eventos e guarda estado; na T3 ele desenha; na T4 ele controla o fluxo, passa nos testes e vai para um marketplace.
Teste rápido (opcional): o Rafa quer ver, enquanto o Claude trabalha, quais arquivos foram editados. O que ele precisa?
10 mods em .mjs
18 mods em .tsx
o dev dos exemplos
seu mod testado
🎓 Resumo do módulo
Próximo módulo:
1.2 — Estrutura de arquivos e manifesto