Doze dias de 'se você quiser isso' até o Tetris
Claude Code Mods são módulos TypeScript que rodam dentro do engine do Claude Code e interceptam seus eventos como funções. Boris Cherny, que lidera o Claude Code na Anthropic, anunciou o recurso com cinco palavras: "Claude mods are landing now" (os mods do Claude estão chegando agora). O post reuniu 2.400 curtidas, e alguém já tinha construído um Tetris dentro do terminal. Tetris, Doom e um bichinho de estimação que cresce enquanto o Claude roda seus testes, tudo renderizado acima do prompt, a zero tokens.
O anúncio não linka nenhuma página de documentação. Ele linka uma GitHub issue aberta 12 dias antes por um engenheiro da Anthropic, com uma condição escrita nela. Alice Poteat escreveu que a resposta da comunidade provavelmente determinaria se o recurso seria lançado ou não. 177 comentários depois, as pessoas já tinham martelado o binário com a flag ativada, medido seus timeouts e construído jogos em cima dele.
| Métrica | Valor |
|---|---|
| Curtidas no anúncio | 2.400 |
| Comentários na issue do GitHub | 177 |
| Superfície tipada na build desta semana | 10.700 linhas |
| Eventos em nouns (build da issue-thread) | 84 em 19 |
| Mods no GitHub em 48 horas | 31 |
No momento em que este artigo foi escrito, a página de documentação retorna um 404. Este artigo cobre as quatro formas de estender o Claude Code, um Mod útil construído e quebrado de propósito, e o que ainda está instável antes de você lançar o seu.
Um Mod é uma função no meio
A árvore de código-fonte define isso em uma frase: um Mod é um plugin do Claude Code cujo comportamento vive em um hooks module. Uma entrada de register intercepta os eventos do engine como funções. No disco, isso é uma pasta de plugin, um hooks manifest nomeando exatamente um módulo, e o próprio módulo.
Todo hook é uma função de três coisas: $, a porta pela qual todo efeito colateral passa; o event; e a continuation, o resto da chain abaixo de você. Hooks se aninham como middleware. O primeiro registrado é dono do event, e nada mais abaixo na chain pode impedi-lo. Essa ordem é configurada, não instalada. Nas palavras de Alice Poteat, a ordem é definida pela configuração, não pela ordem em que você instalou os hooks.
Não existe acesso ambiente. Tudo que um Mod faz passa por $, então um admin pode auditar, permitir, negar ou logar qualquer event. Um comentarista resumiu assim: o que um plugin fez é exatamente as chamadas que ele fez. Um único hook em * vê todo event, então um audit log é uma função. Um Mod pode desenhar, porque a interface é React. Ele roda em processo sobre o Bun, a 50 microssegundos no percentil 99. Uma variável de ambiente ativa isso. O que de fato vive em $ ainda está sendo desenhado junto com os parceiros de early access.
Quatro formas de estender o Claude Code, e qual usar para quê
Um shell hook é um script que o engine chama em um momento fixo. Ele recebe JSON na entrada padrão e responde com um exit code. A resposta tem um teto: 8.000 caracteres de contexto de volta, e 2.000 para alguns hooks. Nas palavras de Pratham, no Windows eles costumam quebrar de formas estranhas.
Um plugin é uma caixa. Um manifest empacota skills, agents, hooks e servidores MCP. Ele é instalado de um marketplace ou carregado direto de uma pasta no disco, e um comando valida a caixa antes de qualquer coisa rodar.
Uma skill é um texto que o modelo lê quando precisa dele. O corpo só carrega quando chega um prompt correspondente. Continua sendo a forma mais barata de mudar comportamento.
Um Mod é a mesma caixa com mais um arquivo: um hooks manifest nomeando um módulo, e esse módulo é TypeScript, tipado, em processo, em todo event do engine. Essa é toda a diferença.
| Mecanismo | O que é | Roda | Teto |
|---|---|---|---|
| Shell hook | Script chamado em um momento fixo | Subprocess, exit code | 8.000 caracteres de volta (2.000 para alguns hooks) |
| Plugin | Pacote de skills, agents, hooks, servidores MCP | Instalado ou carregado do disco | Validado antes de rodar |
| Skill | Texto carregado em um prompt correspondente | No contexto do modelo | Mudança mais barata |
| Mod | Plugin mais um hooks module em TypeScript | Em processo, em todo event | Tipado, early access |
Os types vêm de um slash command, que escreve a listagem completa do que $ oferece direto no seu projeto. Os shell hooks antigos são encapsulados (wrapped), não aposentados. Em uma build inicial, Spencer Morley viu o wrapper falhar ao carregar e permanecer declarado. A regra prática: para mudar o que o Claude sabe, escreva uma skill; para rodar um script em um momento, um shell hook; para lançar um pacote, um plugin; para ficar dentro do engine, um Mod. O shell hook continua funcionando em qualquer lugar onde a flag esteja desativada.
Os três Mods da própria Anthropic, lidos direto do código-fonte
Três Mods vêm embutidos no binário e o código-fonte deles está no GitHub: um security default, um diff pane e telemetry.
O security default fica na camada mais externa. Em uma máquina com managed settings, ou em uma organização Team ou Enterprise, nada que uma pessoa instale fica acima dele. Ele intercepta 12 events, e cada hook faz um de três movimentos: passar adiante o user tier, recusar um chamador do user tier pelo nome, ou deixar passar. Ele falha fechado, e o comentário no código diz isso em duas palavras. Foi essa a parte que a thread mais discutiu: um admin remove uma affordance de $, e nada registrado abaixo consegue invocá-la. Nas palavras de um comentarista, isso é categoricamente diferente de pedir a um plugin para não fazer algo.
Diff é um painel ao lado da transcript, mostrando as mudanças não commitadas da sessão arquivo por arquivo, atualizado conforme o Claude edita. Ele é registrado no início da sessão e abrange 27 arquivos auxiliares, nada de brinquedo.
Telemetry adiciona um noun a $ de dentro da criação do engine. Ele aguarda o que está abaixo e devolve isso mais ele mesmo. Roda apenas em builds internas.
O README diz para rodar um a partir do código-fonte e testar um a partir do código-fonte. O help da build de hoje lista validate, eval e details. Não há test na lista, embora o help do test ainda responda. O tier embutido também recusa a sua cópia: lance um plugin com um desses nomes, e o binário carrega o seu próprio.
Quarenta e duas linhas: um Mod que esconde segredos do modelo
O slash command que escreve os types produz, nesta build, 11.700 linhas: 84 events em 23 nouns. O hook de tool call responde com um result ou um deny, nunca o texto. Essa parte é definida pelo core.
O Mod tem três arquivos: o plugin manifest, o hooks manifest com sua única linha, e o módulo. O módulo tem 42 linhas. Ele aguarda o que está abaixo, remove (scrub) o result e devolve. Quatro padrões cobrem dois formatos de chave de fornecedor, um token do GitHub, e qualquer coisa atribuída a uma variável chamada key, secret ou token.
Validate lê o código-fonte antes de rodar. Ele nomeia o event que o módulo intercepta e a única coisa que ele chama em $. O único aviso é um author ausente. Carregado do disco com a flag ativada, o arquivo de teste guarda duas chaves, ambas falsas por construção, e o modelo lê "redacted". Em suas próprias palavras, os valores voltaram como redacted, então ele não consegue ver o que há neles.
| Métrica | Valor |
|---|---|
| Tamanho do módulo | 42 linhas |
| Latência do hop, worker incluído | 28 ms |
| Tokens adicionados à sessão | 0 |
O engine registra o hop como resolvido por um hooks module. O inventário não mostra skills, não mostra agents, nada sempre ativo. Um limite permanece: escondido do modelo não é escondido da tela. A transcript ainda mostra o que a tool imprimiu. Isso é um Mod diferente, como Max, do Ship Notes, observou em uma linha.
Quebrando: um guard lento é um guard ignorado
Mesmo Mod, uma linha a mais: um sleep de 15 segundos antes da chamada ao que está abaixo. Dez segundos depois, o engine desiste dele, reporta que o hook excedeu seu orçamento e foi skipped, e o que está abaixo dele roda em seu lugar. O comando roda mesmo assim e imprime "hi".
Troque o sleep por um throw: 574 milissegundos, mesmo veredito, skipped, e o comando roda.
| Caso | Tempo | Veredito |
|---|---|---|
| Hook saudável | 28 ms | Resolved |
| Throw | 574 ms | Skipped, comando rodou |
| Travamento | mais de 10 s | Skipped, comando rodou |
As duas falhas terminam na mesma palavra: skipped. A thread já tinha medido essa assimetria uma semana antes. Uma capability ausente no carregamento falha fechado. Um hook além do orçamento falha aberto: barulhento, mas contornado, nas palavras de Spencer Morley. Um bloqueio sem motivo simplesmente manda o modelo para outra tool. Pratham viu o modelo escolher uma tool diferente e escrever o arquivo mesmo assim.
A resposta sobre a mesa é um catch. Alice Poteat propõe um catch no retorno do hook, que roda se você demorar demais ou lançar um erro. Uma escrita reescrita ainda precisa de uma nota para o modelo: ele vê o que pediu para escrever, por razões de cache, então você anexa uma linha de contexto. O orçamento também é o isolamento. O hooks worker roda separado, e quando ele trava, o engine o reinicia e desliga os hooks para a sessão. A correção não é um orçamento maior, e sim um catch declarado.
Quarenta e oito horas de Mods, e o que uma frase compra
Dois dias depois: Tetris acima do prompt e outros sete jogos, jogáveis enquanto o Claude trabalha, a zero tokens. Doom, o original de 1993, roda em seu próprio processo; o Mod chega até ele por HTTP local e redesenha 10 vezes por segundo. Há um pacer de respiração no spinner, e um modelo de história com 260.000 parâmetros rodando dentro do hooks worker, com zero tokens de API.
O registry escaneou 31 Mods com validate. 14 podem rodar processos do host. 13 veem toda tool call.
A Demo 8 da thread da comunidade prometia que uma frase escreve um plugin que esconde segredos antes de o modelo lê-los. Nós pedimos um.
| Métrica | Valor |
|---|---|
| Tempo | 4 min |
| Turns | 34 |
| Custo | $1,23 |
| Linhas (mais um arquivo de teste) | 190, contra nossas 42 |
| Testes | 4 passam em um terço de segundo |
Ele rotula o que esconde por tipo, valida limpo, e não precisa de API key nem de chamada ao modelo. Uma resposta colocou assim: allowlists são o produto, Tetris é a demo.
Veredito: construa um agora, lance um depois
Os próprios números do registry são o aviso. 14 dos 31 Mods podem rodar processos do host, e a única verificação é uma análise estática. O próprio help do eval diz isso: uma suite que passa não é uma verificação de segurança.
| Sinal | Valor |
|---|---|
| Events no dia 8 | 20 |
| Events no dia 15 | 84 |
| Versões da CLI em duas semanas | 14 |
| Pontos no Hacker News | 2 |
| Respostas à pergunta de compatibilidade | 0 |
O orçamento de 10 segundos vive no runtime, não nos types, como observou Marat. Não há linha de changelog, não há página de documentação, não há post de lançamento. Um rival diz que a Anthropic copiou a ideia: Ahmad Awais aponta para os mods do Command Code, e ele mesmo escreve o mod de exemplo deles, então pese isso. O post "early access, APIs may change" (early access, as APIs podem mudar) atraiu 357 curtidas.
Construa um agora se você já escreve hooks e quer audit, redação ou um painel. Espere se você for lançar para um time antes de o contrato estar escrito. Essa mesma abertura é o motivo pelo qual o orçamento que falha aberto, a incompatibilidade de tipo na chamada MCP e a falha do wrapper foram encontrados por usuários em poucos dias.
AIDive