Referência de mods
Referência completa para mods do Claude Code: estrutura do módulo de hooks, eventos, métodos da API de mods, pontos de renderização, elementos por superfície, limites e configurações.
Consulte qualquer evento que um mod pode tratar, método da API de mods que ele pode chamar ou ponto de renderização em que ele pode desenhar, para a CLI do Claude Code e o aplicativo Desktop a partir da v2.1.287. Cada entrada fornece o nome e uma descrição de uma linha, e aponta para a seção do guia que a explica, quando houver.
A referência completa são as declarações TypeScript para mods do Claude Code, que descrevem cada evento, método e elemento, com exemplos. A cópia no GitHub pode ser mais antiga que a versão do Claude Code que você tem instalada. Quando as duas divergirem, confie na cópia que o Claude Code grava para a sua versão.
Arquivos
Um mod é um diretório de plugin com estes arquivos:
| Arquivo | Obrigatório | Conteúdo |
|---|---|---|
.claude-plugin/plugin.json |
Sim | O manifesto do plugin. Mods não adicionam campos obrigatórios. |
hooks/hooks.json |
Sim | modules: um array com um caminho, relativo a este arquivo, para o módulo de hooks, como em "modules": ["./register.js"]. Também pode conter hooks de configuração em hooks. |
O módulo de hooks, como hooks/register.js |
Sim | O ponto de entrada do mod. Exporta register(on, options). Nomeado .js, .mjs, .cjs, .jsx, .ts, .mts, .cts ou .tsx. Um módulo ES. |
types/index.d.ts, indicado por types no manifesto |
Quando o mod usa $.state ou adiciona um namespace à API de mods |
Declara os valores de PluginState e qualquer namespace que o mod adiciona |
Arquivos cujos nomes terminam em .test.ts ou .test.tsx |
Não | Testes que o claude plugin test executa |
register recebe on e options. options contém os valores dos campos userConfig que o manifesto declara, com os valores padrão preenchidos.
A função de hook
Um mod registra cada um de seus hooks, que são manipuladores de eventos, chamando on dentro de register. on recebe o nome do evento, um matcher opcional, que é um filtro sobre os campos do evento, e o hook, como em on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e)). on retorna um registro com um método, .catch(handler), que define o manipulador de erros do hook.
| Argumento | O que é |
|---|---|
$ |
A API de mods: todos os métodos em métodos da API de mods. Escreva cada chamada por completo, namespace e depois método, como em $.fs.read('notes.md'). |
e |
A entrada do evento, como dados simples profundamente congelados. Para alterá-la, passe uma cópia para next. |
next(e) |
O próximo manipulador, como em um middleware. Executa os hooks depois deste e, em seguida, o comportamento do Claude Code. Resolve para o resultado do evento. |
next.signal |
Um AbortSignal que é abortado quando o evento é abandonado |
next.origin |
{ plugin, tier } de quem disparou o evento. O próprio Claude Code é { plugin: 'engine', tier: 'core' }. O tier de um mod é seu grupo de prioridade na ordem em que os mods são executados: prepend, user, append ou builtin. |
next.budget |
O limite de tempo do hook em milissegundos: next.budget.ms é o limite inteiro e next.budget.remainingMs é o que resta agora |
next.to(e, tier) |
Pula para um tier posterior, que é append, builtin ou core. next.to(e, 'append') pula os mods que um usuário instalou. Somente um mod em prependPlugins ou appendPlugins pode chamá-lo. |
next.error, next.called |
Somente em um manipulador .catch. next.error.kind é throw ou timeout, next.error.message é o texto do erro e next.called é true quando o hook que falhou havia chamado next. |
Eventos
Os eventos estão agrupados pelo assunto de que tratam, cada um com quando é disparado e o que um hook nele pode retornar. Hooks em turn.step e process.spawn são geradores assíncronos, e os outros hooks são funções assíncronas.
A última coluna de cada tabela usa uma notação abreviada. next(e) repassa o evento sem alterações. next({ ...e, text }) repassa uma cópia com o campo indicado alterado, como em next({ ...e, text: e.text.trim() }). Um objeto responde ao evento sem chamar next, e uma palavra como reason representa uma string que você escreve, como em { deny: 'Use the file tools.' }.
Ferramentas
Eventos de ferramenta são disparados em torno de cada chamada de ferramenta que o Claude faz, desde a descrição que o Claude lê até a decisão sobre se a chamada é executada:
| Evento | Dispara quando | Um hook pode retornar |
|---|---|---|
tool.call |
Uma ferramenta está prestes a ser executada | next(e), { deny: reason } ou { result } |
tool.check |
O Claude Code decide se uma chamada de ferramenta pode ser executada, após os hooks tool.call e PreToolUse. next(e) resolve para a decisão a que chegaram as regras, o modo de permissão e esses hooks. |
{ decision }, que é allow, ask ou deny |
tool.describe |
Uma vez para cada ferramenta, quando sua descrição é enviada pela primeira vez ao Claude | { description } |
Prompts e o que o Claude lê
Eventos de prompt abrangem o texto que o usuário digita e o texto que o Claude Code envia ao Claude por conta própria, como o system prompt e lembretes:
| Evento | Dispara quando | Um hook pode retornar |
|---|---|---|
prompt.submit |
Um prompt é enviado | next({ ...e, text }), next({ ...e, context }) ou { drop: reason } |
prompt.fill, prompt.suggest |
Um texto está prestes a entrar na caixa de prompt como rascunho ou como uma sugestão esmaecida | next(e) com o texto alterado |
prompt.edit |
O usuário edita a caixa de prompt | next(e) |
prompt.compose |
O Claude Code renderiza um system prompt | { sections }, uma lista de { id, text, scope } na ordem em que são enviadas |
prompt.section |
Uma vez para cada seção nomeada do system prompt. e.name é o id da seção em prompt.compose. |
{ text }, ou { text: null } para omitir a seção |
prompt.context |
Uma vez para cada conversa, para o contexto enviado com a primeira mensagem | { blocks } |
prompt.attachment |
O Claude Code adiciona uma mensagem própria para o Claude, como um lembrete. e.type indica o tipo e, para os tipos que as declarações de tipos declaram, e.detail contém os fatos a partir dos quais o texto foi escrito. |
{ text }, ou { text: null } para omiti-la |
skill.prompt |
O texto de uma skill é expandido para o Claude | { text } |
attribution.text |
O Claude Code compõe o texto de atribuição de um commit ou pull request | { text } |
Comandos e configuração
Eventos de comando e de configuração são disparados quando um comando é executado ou listado, e quando uma linha de /config é exibida ou alterada:
| Evento | Dispara quando | Um hook pode retornar |
|---|---|---|
command.run |
Um comando está prestes a ser executado | { text }, {} ou next(e) |
command.describe |
Uma vez para cada comando, para a lista de comandos | { description, argumentHint, isHidden } |
config.set |
Uma linha de /config está prestes a mudar |
next({ ...e, value }) ou { deny: reason } |
config.describe |
Uma vez para cada linha de /config |
{ label, description, isHidden } |
Turnos
Eventos de turno acompanham uma resposta do início ao fim, incluindo cada requisição ao modelo dentro dela:
| Evento | Dispara quando | Um hook pode retornar |
|---|---|---|
turn.start |
Um turno começa | next(e) |
turn.step |
Uma requisição está prestes a ir para o modelo | yield* next(e), ou next({ ...e, model }), next({ ...e, effort }) |
turn.complete |
Um turno terminou | next(e), ou { text } para mostrar uma linha abaixo da resposta |
Sessão
Eventos de sessão marcam o início, o fim e a compactação da sessão, e a troca de mensagens com outras sessões:
| Evento | Dispara quando | Um hook pode retornar |
|---|---|---|
session.start |
Uma vez para cada mod carregado, antes do primeiro prompt, e novamente após um recarregamento desse mod. Não após /clear, /resume ou /branch. |
next(e) |
session.end |
A sessão termina, ou /clear, /resume ou /branch é executado. e.reason é clear, resume, logout, prompt_input_exit ou other. /branch informa resume. |
next(e) |
session.compact |
A conversa está prestes a ser compactada | { skip: reason } |
session.receive, session.send |
Uma mensagem chega de, ou está prestes a ir para, outro agente ou sessão. Consulte Enviar e receber mensagens entre sessões. | { consumed: reason } para receive, { isDelivered: false, reason } para send |
session.append |
Uma vez para cada linha que a conversa mantém, como um prompt, um bloco de resposta, um resultado de ferramenta ou um aviso, antes de ser armazenada | next({ ...e, message }) para reescrever o content da linha |
session.attach, session.detach |
Outro aplicativo se conecta à sessão ou se desconecta dela | next(e) |
session.measure |
Após cada turno e quando o percentual usado de um limite do plano muda | next(e) |
Subagentes
Eventos de subagente são disparados quando um tipo de subagente é oferecido ao Claude e quando um está prestes a iniciar:
| Evento | Dispara quando | Um hook pode retornar |
|---|---|---|
agent.offer |
Um tipo de subagente é oferecido ao Claude | { isOffered: false } para retê-lo |
agent.spawn |
Um subagente está prestes a iniciar | { model } ou { deny: reason } |
Interface
Eventos de interface são disparados quando o Claude Code desenha um ponto de renderização e quando o usuário usa um controle que um mod desenhou. Desenhar na interface mostra o que um hook ui.render retorna:
| Evento | Dispara quando |
|---|---|
ui.render |
Um ponto de renderização está prestes a ser desenhado |
ui.resolve |
Os mods são carregados, uma vez para cada aplicativo, ponto de renderização e mod. O resultado é a tabela de elementos que $.ui.resolve(e) lê. |
ui.press, ui.input, ui.select |
Um Button, Input ou Select que um mod desenhou é usado |
ui.focus, ui.scroll |
O controle em foco ou a posição de rolagem de um painel ou da faixa está prestes a mudar |
ui.close |
Um painel está prestes a fechar. e.id é o painel e e.origin.kind é plugin, person ou unload. |
ui.message |
Um elemento Client envia dados para o seu mod |
Outros mods
Estes eventos permitem que um mod atue sobre outros mods à medida que são carregados, para recusar um deles ou alterar a API de mods que ele recebe:
| Evento | Dispara quando | Um hook pode retornar |
|---|---|---|
plugin.register |
Um módulo de hooks está prestes a ser carregado. e.uses lista seus eventos, chamadas à API de mods, variáveis de ambiente e estado, como o claude plugin validate os imprime. Cada chamada é escrita sem o prefixo $., como fs.read. |
{ refuse: reason } |
engine.create |
A API de mods está sendo construída para este mod | Uma API de mods alterada, para adicionar um namespace ou reter um |
Telemetria
Eventos de telemetria são disparados para os registros de uso que o Claude Code registra em log:
| Evento | Dispara quando | Um hook pode retornar |
|---|---|---|
telemetry.log, telemetry.mark |
Um registro de telemetria está prestes a ser registrado em log, ou um uso de um recurso é marcado. Em um mod que você instala, dê a um hook de telemetria o filtro { to: 'collector' }, como em on('telemetry.log', { to: 'collector' }, hook). Sem o filtro, o mod falha no claude plugin validate. * não corresponde a esses eventos. |
next(e) ou { deny: reason } |
Eventos de hooks de configuração
Cada evento de hook de configuração é um evento chamado classic.<Event>, como classic.Stop ou classic.PostToolUse. e é o JSON de stdin do hook.
Chamadas à API de mods
Cada método da API de mods também é um evento, nomeado pelo seu namespace e método, como fs.read, model.complete ou ui.open. Um hook em um deles intercepta chamadas dos mods executados depois dele e pode retornar next(e), { deny: reason } ou { value }.
Métodos da API de mods
A API de mods é o argumento $ que todo hook recebe. Seus métodos estão agrupados em namespaces, como $.ui. Esta tabela lista os métodos de cada namespace pelo nome, então open na linha de $.ui é a chamada $.ui.open(...). Os guias mostram os mais comuns em uso, e os tipos para o seu build documentam cada método com um exemplo.
| Namespace | Métodos |
|---|---|
$.plugin |
name, root: o nome e o diretório deste plugin |
$.ui |
resolve, invalidate, open, close, panes, focus, scroll, toast, status, log, notice, ask, copy, blit |
$.command |
register, run, list |
$.tool |
register, call, check, list |
$.agent |
register, spawn, list |
$.model |
complete, fork, classify |
$.prompt |
submit, read, fill, suggest, compose. O Claude lê o texto de submit({ text }) após uma frase que indica o seu mod como remetente. submit({ text, asUser: true }) envia o texto como se fossem palavras do próprio usuário, sem essa frase. |
$.turn |
abort |
$.session |
messages, cwd, root, model, turns, id, repo, surfaces, usage, version, compact, send, append, authorize. usage() retorna { startedAt, context, rateLimits, cost }: context tem tokens, window e percent, e rateLimits é uma lista de { kind, percentUsed, resetsAt }. |
$.config |
list, set |
$.settings |
read |
$.env |
get, set |
$.fs |
read, write, list, exists, stat, ancestors. write não é atômico: ele substitui o conteúdo do arquivo no local, então outro processo pode ler um arquivo parcialmente gravado. Mantenha dados que várias sessões alteram em $.store. |
$.store |
get, set, delete, keys. Um armazenamento de chave-valor compartilhado por todas as sessões na máquina. Consulte Salvar a partir de mais de uma sessão. |
$.state |
Estado reativo: get, set, com os auxiliares atom, read, update, derive e memberOf importados de claude-code |
$.clock |
now, sleep, after, every |
$.http |
fetch |
$.process |
run, spawn |
$.mcp |
call, connect. connect(server) conecta um servidor MCP que o manifesto do seu próprio plugin lista. |
$.audio |
play, speak |
$.telemetry |
log, mark. Um registro só é enviado quando o Claude Code ou um mod integrado faz a chamada. |
Pontos de renderização
Um ponto de renderização é um ponto de extensão na interface do Claude Code. Cada linha é um valor de e.component em um hook ui.render, com os campos de e.props e os aplicativos que o renderizam. e.surface é terminal ou desktop. Alterar o que o Claude Code já desenha mostra o que um hook pode fazer em um ponto, com um exemplo de cada opção.
| Ponto | e.props |
e.requestId |
Renderizado em |
|---|---|---|---|
Pane |
title, isFocused, bodyColumns, placement, scroll, view |
O id do painel |
Terminal, Desktop |
AbovePrompt |
hasSurvey, isWorking, maxRows, bodyColumns, scroll, view |
Uma instância | Terminal, Desktop |
UserMessage |
text, origin, isExpanded e task ou from conforme a origem |
O id da mensagem | Terminal, Desktop |
AssistantMessage |
O texto da resposta | O id da mensagem | Terminal, Desktop |
ToolUse, ToolResult, ToolGroup |
O nome, a entrada e o resultado da ferramenta | O id da chamada de ferramenta | Terminal, Desktop |
CommandOutput |
command, text |
O id da mensagem | Terminal, Desktop |
AskUserQuestion |
A pergunta e as opções | O id da chamada de ferramenta | Terminal, Desktop |
ToolProgress |
kind |
O id da chamada de ferramenta | Terminal |
Spinner |
word, message, suffix, mode |
O id do agente | Terminal, Desktop |
TurnDuration |
word, durationMs |
O id da mensagem | Terminal |
InfoNotice |
text, command |
O id da mensagem | Terminal |
SessionMode |
modes |
Uma instância | Terminal, Desktop |
PromptHint |
isDraft, isWorking, hint |
Uma instância | Terminal, Desktop |
e.viewport contém columns, rows e isFullscreen. Ele está ausente até que o aplicativo tenha medido sua janela. Seu rows é a altura da janela inteira, não do seu painel.
Para ajustar uma árvore ao seu ponto, leia estas props no hook:
- Largura de um
Paneou da faixa: desenhe atée.props.bodyColumns - Altura de um
Paneao lado da transcrição: quandoe.props.placementé'dock',e.props.scroll.bodyRowsé o número de linhas que o painel tem - Altura de um
Paneacima do prompt: quandoe.props.placementé'inline', o painel cresce com a sua árvore até um limite, ebodyRowsconta apenas as linhas exibidas no momento. O camporowsde$.ui.opensolicita um limite diferente.
Uma árvore mais alta que o painel rola como um todo.
Elementos
Elementos são os blocos de construção de uma árvore que um hook ui.render retorna, e você os obtém de $.ui.resolve(e). Construir uma árvore a partir de elementos mostra os mais comuns com a forma como o terminal os desenha, e a galeria da interface tem capturas de tela da maioria. Uma marca de seleção significa que o aplicativo pode desenhar o elemento.
| Elemento | Props principais | Terminal | Desktop |
|---|---|---|---|
Box |
key, layout flex, gap, padding, margin, width, height, borderStyle, backgroundColor, position, hover |
✓ | ✓ |
Text |
color, backgroundColor, bold, italic, underline, dimColor, inverse, wrap |
✓ | ✓ |
Button |
key, label, onPress, hotkey, plain, dimColor, autoFocus, action |
✓ | ✓ |
Link |
href, label |
✓ | ✓ |
Code |
O código, até 10.000 caracteres | ✓ | ✓ |
Markdown |
text, até 10.000 caracteres, key, dimColor, onLinkPress, pressableLinks |
✓ | ✓ |
Input |
key, label, placeholder, value, submitLabel, onSubmit, onInput, autoFocus |
✓ | ✓ |
Select |
key, label, options, value, onSelect, autoFocus |
✓ | ✓ |
Svg |
Um documento SVG, até 131.072 caracteres | ✓ | |
Client |
module, key |
✓ | ✓ |
Raster |
key, columns até 512, rows até 256, cells. Consulte Desenhar uma grade de células coloridas. |
✓ | |
Image |
Bytes PNG ou RGBA até 2 MiB, ou um caminho de arquivo | ✓ |
Mais regras de Button: action indica uma das próprias ações de atalho de teclado do Claude Code, e o atalho do usuário para ela pressiona o botão quando esse atalho é um acorde ou uma tecla com modificador. Um hotkey numérico em um botão na faixa também é acionado quando o usuário digita apenas esse dígito em um prompt vazio e faz uma pausa. Quando dois botões em um mesmo desenho indicam o mesmo hotkey, o posterior fica com ele. autoFocus aceita apenas true em qualquer controle, então omita a prop para deixá-lo desativado.
Limites
Hooks e chamadas à API de mods são executados sob limites de tempo e de tamanho. O Claude Code ignora um hook que excede um limite de tempo e rejeita uma chamada que excede um limite de tamanho.
| Limite | Valor |
|---|---|
O tempo de execução próprio de um hook para um evento, sem contar o tempo dentro de next ou de uma chamada à API de mods que não seja $.clock.sleep |
10 segundos |
O tempo de execução de um manipulador .catch |
1 segundo |
Todos os hooks session.end juntos |
1,5 segundo |
Timeout de $.process.run |
30 segundos por padrão, no máximo 10 minutos |
maxTokens de $.model.complete |
1024 por padrão, até 64.000 ou o limite de saída do modelo |
$.fs.read e $.fs.write |
4 MiB para um arquivo |
Um filho string de um Text |
10.000 caracteres |
$.store |
4 MiB de JSON no total |
$.session.messages() |
As 4.096 entradas mais recentes |
Redesenhos de $.ui.invalidate('ui.render') |
Limitados a 10 por segundo, ou 30 no terminal para o painel visível, a faixa expandida e a linha de dica abaixo do prompt. Chamadas que chegam antes disso são agrupadas. |
$.ui.toast |
Exibido por 4 segundos, a menos que você passe { timeoutMs } |
| Um painel aberto sem que o usuário tenha pedido | Posicionado a partir de 144 colunas do terminal, 110 depois que o usuário o tiver aberto uma vez |
| Nomes de comandos, ferramentas, tipos de subagente e painéis | Letras, dígitos, _ e -, até 64 caracteres |
Um teste do claude plugin test |
5 segundos, a menos que o teste defina timeoutMs |
Configurações e variáveis de ambiente
Estas são as configurações e variáveis de ambiente que afetam os mods. A coluna Onde indica de qual arquivo de configurações ou ambiente cada uma é lida:
| Nome | Onde | O que faz |
|---|---|---|
CLAUDE_CODE_PLUGIN_DIRS |
Ambiente, ou env em ~/.claude/settings.json |
Diretórios de plugin a carregar como --plugin-dir faz, para aplicativos aos quais você não pode passar uma flag. Caminhos absolutos separados por :, ou ; no Windows. |
CLAUDE_CODE_PLUGIN_DIR_WATCH |
Ambiente | 1 faz com que uma sessão não interativa de longa duração recarregue os mods de --plugin-dir ao salvar |
prependPlugins, appendPlugins |
Configurações gerenciadas. Configurações do usuário somente em uma máquina sem configurações gerenciadas, para um usuário que não está conectado com um plano Team ou Enterprise. | Listas de ids de plugin, como acme-guard@acme-tools. Mods em prependPlugins são executados antes de todo mod que um usuário instala, e mods em appendPlugins são executados depois, na ordem listada. Consulte A ordem em que os mods são executados. |
allowManagedModsOnly |
Configurações gerenciadas, como uma opção da guarda integrada | Somente mods que contam como da sua organização, e mods integrados ao Claude Code, são carregados. Os hooks de configuração dos usuários continuam em execução. |
allowModsToOverrideDenyRules |
Configurações gerenciadas, como uma opção da guarda integrada | Permite que um mod instalado por um usuário aprove uma chamada de ferramenta que uma regra deny recusa |
allowManagedHooksOnly |
Configurações gerenciadas | Bloqueia hooks e mods instalados que não são da sua organização. Consulte o que continua em execução. |
disableAllHooks |
Qualquer arquivo de configurações | Nas configurações gerenciadas, nenhum mod ou hook de um plugin instalado é executado. Nas suas próprias configurações, o que a sua organização gerencia continua em execução. Consulte disableAllHooks. |
disableSideloadFlags |
Configurações gerenciadas | Rejeita --plugin-dir e --plugin-url na inicialização |
pluginConfigs |
Configurações do usuário ou gerenciadas | Contém valores de userConfig para um mod, indexados pelo id do plugin, como acme-guard@acme-tools, ou pelo seu nome e @inline, como first-mod@inline, para um carregado com --plugin-dir |
sec-default@builtin é uma guarda integrada ao Claude Code, listada como cc-plugin-sec-default em /plugin e no log de depuração. Ela é carregada antes de todo mod que uma pessoa instala em uma máquina com configurações gerenciadas, ou para um usuário conectado com um plano Team ou Enterprise. Se prependPlugins gerenciado estiver definido, a guarda só é carregada quando essa lista a indica, na posição listada. Seu código-fonte está no diretório mods/sec-default do repositório do Claude Code.
Comandos
Estes comandos e flags carregam, inspecionam e testam um mod. Os comandos claude são executados no seu shell e os comandos / no prompt do Claude Code. Na tabela, <directory> representa um caminho que você digita, como em claude plugin validate ./first-mod. Colchetes marcam um argumento opcional.
| Comando | O que faz |
|---|---|
/plugin |
Mostra uma linha como 1 mod active · first-mod abaixo de suas abas quando um mod que não é integrado foi carregado |
claude plugin validate <directory> |
Lê o manifesto e o módulo de hooks de um plugin e informa erros, os eventos que ele trata e as chamadas à API de mods que ele faz. --strict trata avisos como erros e --json imprime um relatório legível por máquina. |
claude plugin test [directory] |
Executa todos os arquivos no diretório, ou no diretório atual quando nenhum é informado, cujo nome termina em .test.ts ou .test.tsx. Sai com status 1 quando um teste falha. |
claude --plugin-dir <directory> |
Carrega um diretório de plugin para uma sessão e recarrega seu módulo de hooks quando você salva. Repita a flag para carregar vários. |
/reload-plugins |
Recarrega os plugins quando você o executa |