Mapa da trilha
Conteúdo detalhado
🛡️ Mods que mudam o fluxo
Interceptar tool.call, negar com motivo, perguntar com $.ui.ask, trocar modelo de subagente e respeitar permissões.
Hookar tool.call com matcher na ferramenta e olhar a entrada antes de a chamada acontecer.
É o ponto em que um mod pode impedir um estrago, não apenas registrá-lo.
tool.call, matcher, entrada da ferramenta.
Responder sem next com um motivo que o modelo lê e entende como recusa.
Recusa sem motivo faz o modelo tentar de novo do mesmo jeito.
deny, motivo, resposta sem next.
Perguntar ao humano com opções antes de seguir, com a opção segura primeiro e um .catch para quando não há tela.
Sem tela (claude -p) ou sem resposta, o mod precisa de um padrão seguro e explícito.
$.ui.ask, opção segura, .catch, afk.
Hookar agent.spawn para escolher o modelo de um subagente antes de ele rodar, como faz o roteador-subagente.
Tarefas simples em modelo menor economizam uso sem mudar o fluxo.
agent.spawn, subagente, modelo, roteador-subagente.
Um mod não deve afrouxar o que o usuário configurou: negar é ok, liberar o que estava bloqueado não.
Mod que fura permissão vira risco de segurança para quem instala.
permissões, classic.PreToolUse, menor privilégio.
Ler a guarda do inema-mods que mede o estrago de um comando destrutivo e pergunta antes: prosseguir, lixeira, backup ou cancelar.
É um mod de controle real, curto, com teste e caminho para sessão sem tela.
freio-de-mao, $.process.run, $.ui.ask, $.ui.toast.
🧪 Testar com claude plugin test
O engine de verdade sem modelo: mocks antes do $, comandos de ponta a ponta, relógio controlado e telas montadas.
O claude plugin test roda os *.test.ts com o engine de verdade; os hooks do teste ficam abaixo do plugin e fazem o papel do engine.
Testa o mod como ele roda numa sessão, sem gastar modelo.
claude plugin test, claude-code/testing, test, expect, mock.
Responder no teste cada noun que o mod usa (session.start, fs, store, ui...) antes de chamar o código.
Nada responde por baixo do plugin: faltou mock, o teste diz exatamente qual.
mocks, mundo.ts, noun faltando.
Disparar o comando no teste e conferir o texto devolvido e o estado gravado.
É a prova de que o caminho todo funciona, não só uma função.
command.run, asserção, estado.
Avançar o relógio do teste para disparar timers sem esperar tempo real.
Mod com clock.every testado em milissegundos, sempre igual.
mock.clock, timers, determinismo.
Montar o componente pelo ui do teste numa superfície nomeada e agir por chave com press, input e find.
O mesmo corpo de teste em duas superfícies prova que o mod não depende de uma.
mount, press, input, find, superfície.
Ler a saída do teste: quantos pass, quantos fail e a linha que diz o que faltou.
Uma falha bem lida aponta a correção em uma linha.
pass, fail, mensagem de erro, timeout de 5 s.
🔍 Depurar e as pegadinhas
O log do --debug, módulos que não carregam, árvores recusadas, as 23 pegadinhas e o teste de fumaça.
Rodar com --debug para ter no log uma linha para cada hook pulado e cada resultado recusado.
Mod que parece não fazer nada quase sempre já disse por quê no log.
claude --debug, debug log.
A linha do hook pulado traz o plugin, o evento e o nome do erro; o texto da primeira, encurtado, aparece na transcrição.
Ler essa linha é metade da depuração.
hook pulado, motivo, transcrição.
Módulo com import() dinâmico, arquivo com sufixo fora da lista ou caminho errado no hooks.json não carregam.
São as causas mais comuns de "o mod sumiu".
import(), sufixo, hooks.json, validate.
Achar no log a linha da árvore que não valida e trocar o elemento ou a prop que a superfície não aceita.
Sem isso o engine continua desenhando o dele e você não vê o seu.
ui.render refused, elemento, prop.
A lista do docs/COMO-FAZER-UM-MOD.md do inema-mods: funções com $ no topo, mocks, opção segura primeiro e as outras.
Cada pegadinha foi um erro real; ler antes poupa o mesmo erro.
COMO-FAZER-UM-MOD.md, pegadinhas, checar-mod.sh.
Rodar o comando do mod com claude -p e --plugin-dir e conferir a resposta sem abrir sessão interativa.
Fumaça rápida antes de qualquer commit.
claude -p, --plugin-dir, teste de fumaça.
📦 Distribuir e projeto final
marketplace.json, repositório, versões, revisão antes de compartilhar, o projeto final e os próximos passos.
O .claude-plugin/marketplace.json lista os plugins com name e source, como no kit: ./plugins/<nome>.
É o que permite instalar o seu mod com um comando.
marketplace.json, plugins, source.
Pôr o mod num repositório público e adicioná-lo como marketplace pelo caminho dono/repo.
Quem usa instala direto do repositório e recebe atualizações.
repositório, claude plugin marketplace add, dono/repo.
Subir a version a cada mudança e saber que quem instalou recebe por claude plugin update e /reload-plugins.
Mudar nome de comando ou formato de estado sem aviso quebra quem já usa.
version, claude plugin update, /reload-plugins, compatibilidade.
validate, test com 0 fail, README, botão ou comando de desligar e nada que gaste modelo sem avisar.
Mod compartilhado roda na máquina de outra pessoa: o cuidado é seu.
revisão, README, desligar, consentimento.
Comando /x, faixa ou painel, estado em $.state, teste com mocks, validate OK e comando de desligar.
Junta tudo o que o curso ensinou num mod que você mesmo usa.
projeto final, claude plugin test, claude -p.
Os cursos de hooks clássicos, de plugins de produção e o curso-agent-runtime, além dos dois kits.
O curso termina; os mods continuam mudando a cada versão.
cchooks, MakeClaudeX, curso-agent-runtime, kits.