Skip to main content
A mods API é o conjunto de métodos que um mod chama para agir: adicionar comandos e ferramentas, chamar um modelo, executar trabalho entre eventos e acessar o sistema de arquivos, processos e a rede. Cada hook a recebe como seu primeiro argumento, $, com os métodos agrupados em namespaces como $.ui e $.fs. Events decidem quando um hook é executado, e a mods API é o que o hook chama uma vez que o faz. Construa seu primeiro mod antes de começar aqui. Para cada método, veja mods API methods ou leia os tipos para sua compilação.

Adicione um comando ou uma ferramenta

Um mod pode adicionar um comando para o usuário executar e uma ferramenta para Claude chamar. Registre ambos em um hook session.start. Claude Code aguarda esse hook antes do primeiro prompt, então o que você registra está disponível desde o primeiro turno.

Adicione um comando

Um comando é para o usuário. Registre-o e, em seguida, manipule command.run para seu nome. Este exemplo adiciona um comando /standup que leva um número opcional de dias:
Após a sessão iniciar, /standup aparece com sua descrição na lista que você vê quando digita /. O argumentHint aparece no prompt após você digitar o comando e um espaço, como em /standup [days]. Quando você executa /standup 3, o segundo hook retorna Summary for the last 3 day(s): ..., e a transcrição mostra esse texto após o nome do plugin. O hook nunca chama next, porque o comando não tem comportamento além do seu. O text que você retorna é impresso na transcrição e Claude o lê. Para não imprimir nada, como um comando que apenas abre um pane, retorne {}. Para permitir que o comando seja executado enquanto Claude está trabalhando, adicione immediate: true ao registro. Escolha um nome que nenhum comando integrado use. Digite / em uma sessão para vê-los. $.command.register lança uma exceção para um nome ocupado, com uma mensagem como "/focus" refused: it is the built-in /focus". Um hook que lança uma exceção é ignorado, então o resto do seu hook session.start também não é executado. Registre comandos por último nesse hook ou envolva a chamada em try e catch.

Adicione uma ferramenta

Uma ferramenta é para Claude. Registre-a com um nome, uma descrição que Claude lê e um JSON Schema para sua entrada. Claude a vê sob um nome mais longo feito de mcp__, o nome do seu plugin, dois sublinhados e o nome que você registrou. Você manipula suas chamadas em um hook tool.call filtrado para esse nome completo. Este exemplo, de um plugin chamado my-mod, registra ticket, então o nome completo é mcp__my-mod__ticket. Ele dá a Claude uma ferramenta que procura um ticket em um rastreador de problemas:
Quando você pergunta sobre um ticket, Claude pode chamar mcp__my-mod__ticket com seu id. O segundo hook busca o ticket e retorna o corpo da resposta, que Claude lê como o resultado da ferramenta. Quando o servidor responde com um status de erro, Claude lê Lookup failed with status e o número.

Chame um modelo

Um mod pode fazer uma pergunta a um modelo por conta própria, fora da conversa, para um pequeno trabalho como classificar ou resumir um pedaço de texto. $.model.complete envia um prompt para um modelo com as credenciais da sua sessão e resolve para a resposta. Ele não tem histórico de conversa. Este hook responde a um comando /triage, registrado como um comando, pedindo a um pequeno modelo para rotular o texto digitado após ele:
Quando você executa /triage the export button does nothing, o mod envia esse texto para o modelo e imprime sua resposta, como Label: bug. A conversa de Claude não faz parte da solicitação. Quando o modelo não responde, o rótulo é unknown. Uma falha da Claude API não rejeita a chamada, então verifique r.isAnswered e leia r.reason quando for false. A chamada rejeita apenas para uma solicitação que Claude Code não enviará, como um modelo que sua organização bloqueia. Os tipos para sua compilação listam as outras opções, como effort, e os limites fornecem o padrão maxTokens. $.model.fork({ prompt }) faz uma pergunta sobre a conversa atual, com o mesmo modelo e prompt do sistema, então a Claude API serve a maior parte dela do cache de prompt. Essas chamadas usam o plano ou chave de API do usuário.

Execute trabalho em segundo plano

Trabalho que sobrevive a um evento, como verificar algo uma vez por minuto, é executado em um temporizador que você inicia a partir de session.start. Um hook em si é executado para um evento e tem um limite de tempo de 10 segundos de seu próprio tempo de execução. O tempo gasto aguardando next ou uma chamada da mods API não conta, exceto um $.clock.sleep. $.clock.every e $.clock.after substituem setInterval e setTimeout, com o atraso em milissegundos primeiro: $.clock.after(5000, fn) chama fn uma vez, cinco segundos a partir de agora. Cada um retorna um temporizador com um método cancel(), e await $.clock.now() fornece a hora em milissegundos. Este hook procura as verificações de uma solicitação de pull uma vez por minuto e mostra o resultado sob o prompt. summarize é uma função sua que transforma a saída JSON do comando em algumas palavras:
A sessão inicia como de costume. Um minuto depois, uma linha aparece sob o prompt com um ⚠, o nome do mod e depois checks: e seu resumo. É substituído uma vez por minuto depois disso. O callback do temporizador é executado fora de qualquer evento, então continua funcionando entre turnos e não inicia um. Se o callback lançar uma exceção, o erro vai para o debug log e o temporizador é executado novamente no próximo intervalo.

Mostre algo sem iniciar um turno

Um trabalho em segundo plano pode mostrar ao usuário algo sem iniciar um turno. Cada uma dessas chamadas coloca texto em um lugar diferente:

Inicie um turno a partir de um trabalho em segundo plano

Quando um trabalho em segundo plano encontra algo que precisa da atenção de Claude, ele pode iniciar um turno enviando um prompt com $.prompt.submit({ text }). Claude lê o texto após uma frase que nomeia seu mod como o remetente. Para enviá-lo como as próprias palavras do usuário, sem essa frase, adicione asUser: true. A chamada aguarda até que a sessão esteja ociosa e depois inicia um novo turno. Ela resolve quando esse turno inicia, então não await em um manipulador que é executado enquanto Claude está trabalhando.

Pare o trabalho em segundo plano

O trabalho em segundo plano para de duas maneiras. Os temporizadores param quando o módulo é recarregado. Para trabalho de longa duração dentro de um hook, next.signal é um AbortSignal que aborta quando o evento que seu hook está manipulando é abandonado, por exemplo quando o usuário interrompe, então passe-o para qualquer coisa de longa duração.

Envie e receba mensagens entre sessões

Um mod pode enviar uma mensagem em texto simples para outra de suas sessões ou para um dos subagentes desta sessão e observar as mensagens que chegam e saem. $.session.send({ to, text }) envia uma, a mesma entrega que a ferramenta SendMessage faz. to é { sessionId } para uma sessão, { agentId } para um subagente de $.agent.list() ou o endereço de string de onde uma mensagem recebida veio. A chamada resolve uma vez que a mensagem é enfileirada, com { isDelivered: true }. Quando nada foi entregue, ela resolve com { isDelivered: false, reason }, e reason diz por quê. Este hook responde a um comando /ping, registrado como um comando, pedindo à sessão cujo id você digita após ele um status:
Quando a mensagem é enfileirada, nada aparece em sua sessão e o Claude da outra sessão lê Status? One line. Quando nada foi entregue, uma pequena caixa no canto superior direito fornece o motivo e desaparece após alguns segundos. Dois eventos permitem que um mod observe as mensagens. Retorne next(e) de ambos para passar cada mensagem inalterada: Uma sessão definida para recusar mensagens de entrada recusa uma mensagem antes de session.receive disparar, então um hook nunca a vê. Uma mensagem que é mantida para sua aprovação chega ao hook primeiro, então um mod pode ler uma mensagem que você ainda não aprovou. O next(e) do hook rejeita quando a mensagem não é entregue. O nome do remetente em uma mensagem recebida é o que o remetente escreveu, então não baseie uma decisão nele.

Acesse arquivos, processos e a rede

Um mod acessa o sistema de arquivos, processos e a rede através da mods API, com as mesmas permissões do usuário executando Claude Code. O próprio módulo de hooks não tem APIs Node.js, nenhum global de temporizador como setTimeout e nenhum acesso à rede ou arquivo próprio. APIs JavaScript padrão e web como URL, TextEncoder, AbortController e crypto.subtle estão disponíveis. Cada namespace abaixo cobre um tipo de acesso: Arquivos e processos têm algumas regras próprias:
  • Paths: um caminho relativo está sob o diretório de trabalho da sessão
  • $.fs.list: retorna as entradas de um diretório como { name, kind, size, isLink } e não desce em subdiretórios
  • $.process.run: leva uma lista de argumentos e não usa shell. Ele resolve para { exitCode, stdout, stderr } qualquer que seja o código de saída. Ele rejeita se o programa não puder iniciar ou ainda estiver em execução no tempo limite, que é 30 segundos por padrão, então envolva em try e catch.
Cada uma dessas chamadas é em si um evento, nomeado para seu namespace e método sem o $., como fs.read para $.fs.read. Um mod anterior na cadeia pode observar, reescrever ou recusar sua chamada, que é como uma organização restringe o que os mods alcançam.

Próximas etapas