Pular para o conteúdo
MÓDULO 1.1

🧬 O que é um mod por dentro

Um mod é uma pasta com três arquivos e uma função chamada register. Antes de escrever a primeira linha, vale entender o que essa função recebe, onde ela roda e o que ela consegue mudar no Claude Code.

6
Tópicos
~35
Minutos
Base
Nível
Fundamento
Tipo
0 de 60%
Versão conferida: tudo neste curso foi rodado no Claude Code 2.1.289, em 05/10/2026. A API de mods está em acesso antecipado e muda entre versões. Quando algo não bater na sua máquina, a autoridade é o arquivo de tipos da sua instalação (módulo 2.1, tópico 6).
1

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) ou prompt.submit (você mandou uma mensagem).
  • Hook — a função que o mod pendura num evento. Ela roda toda vez que o evento acontece.
você digitano prompt pedido enviadoentra na fila turnochama o modelo ferramentaRead, Bash, Edit... teladesenha prompt.submit turn.start tool.call ui.render cada ponto verde é um evento onde o seu hook pode entrar

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.

👀
Observar

contar, registrar

🎨
Desenhar

faixa, painel, status

➕
Acrescentar

comando, ferramenta

🛡️
Mudar

negar, perguntar, trocar

2

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 executaPode desenhar na tela?Use quando
Mod (function hooks)o próprio Claude Code, num ambiente isoladosim: faixa, painel, status, linha da conversareagir a eventos e mostrar algo
Hook clássicoo shell, por um comando no settings.jsonnãoregra simples por script (lint, bloqueio)
Skillo modelo, lendo instruçõesnãoensinar um jeito de trabalhar
Servidor MCPum processo à partenãodar 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.

🧩
Mod

código + tela

🪝
Hook clássico

script no shell

📘
Skill

texto para o modelo

🔌
MCP

processo à parte

3

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).

📄 templates/starter-mod/hooks/starter.mjs (do Claude Mods Starter Kit, inteiro)
// 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}` }));
}
O que olhar: três chamadas a on, três eventos. Nenhuma linha "roda sozinha": tudo espera um evento acontecer.
1

on("session.start", hook)

Quando a sessão fica pronta, registra o comando /readcount.

2

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.

3

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.

📤
export

register é exportada

🪝
on

pendura um hook

🎯
matcher

filtra o evento

⚙️
options

valores do /config

4

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.

hook($, e, next) a sua função $ · o engine ui · fs · store · clock · session · command e · o evento { tool: "Read", file_path } next(e) outros plugins → Claude Code devolve o resultado do evento

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âmetroO que éNo starter-mod
$a interface do engine, organizada por nouns ($.ui, $.fs, $.command...)$.command.register(...)
ea entrada do evento, como dado simplesno tool.call: a ferramenta e os argumentos dela
nextcontinua a cadeia e devolve o resultadoconst 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

📨
e

o que aconteceu

➡️
next

passa a vez

⏳
await

tudo é assíncrono

5

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

  • ✓ import estático de outros arquivos do próprio mod
  • ✓ JSX, com h como 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.

📦
Isolado

sem Node, sem DOM

💲
Tudo pelo $

fs, process, store...

🔍
Visível

validate lista as chamadas

🔐
Permissões

as do Claude Code

6

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.

github.com/inematds/inema-mods

T1anatomia T2eventos e estado T3telas e comandos T4controlar, testare distribuir seu modpublicado você está aqui

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?

🦀
Starter Kit

10 mods em .mjs

🧩
inema-mods

18 mods em .tsx

👨‍💻
Rafa

o dev dos exemplos

🏁
Projeto final

seu mod testado

🎓 Resumo do módulo

✓
O mod entra no caminho do pedido — por eventos como tool.call e ui.render.
✓
Mod é o único que desenha — hook clássico, skill e MCP não.
✓
register(on, options) pendura os hooks — não faz o trabalho.
✓
Todo hook é ($, e, next) — engine, evento e a vez dos outros.
✓
Ambiente isolado, permissões reais — tudo passa pelo $.

Próximo módulo:

1.2 — Estrutura de arquivos e manifesto