Skip to content

Not translated yet

This page is not available in English yet. Showing the Português version.

Plugins e ferramentas

Ferramentas em TypeScript em .hinow/tools e plugins com ganchos em .hinow/plugins.

Updated on Sep 16, 2026

Quando um comando ou uma skill não bastam, dá para estender o HiNow Code com código. De um lado, ferramentas que o agente chama como chama as suas. De outro, plugins que reagem ao que acontece: uma ferramenta vai rodar, uma sessão terminou, uma permissão foi pedida. Tudo em TypeScript, carregado quando o programa abre.

Uma ferramenta nova

.hinow/tools/hora.tstypescript
import { tool } from "@hinow-ai/plugin"

export default tool({
  description: "Retorna a data e hora atual da máquina onde o HiNow Code roda",
  args: {},
  async execute() {
    return new Date().toISOString()
  },
})

O nome do arquivo é o nome da ferramenta (hora). Com argumentos, descreva-os com tool.schema (é o zod):

.hinow/tools/pedido.tstypescript
import { tool } from "@hinow-ai/plugin"

export default tool({
  description: "Consulta um pedido pelo número na API interna da loja",
  args: { numero: tool.schema.string().describe("número do pedido, ex. 10234") },
  async execute({ numero }, ctx) {
    const res = await fetch(`https://api.interna/pedidos/${numero}`)
    return { title: `pedido ${numero}`, output: await res.text() }
  },
})

ctx traz directory, worktree, sessionID, agent, abort e ctx.ask(...) para pedir permissão à pessoa antes de algo sensível. Um arquivo pode exportar várias ferramentas (export const buscar = tool(…) vira pedido_buscar). Se um arquivo não carregar (erro de sintaxe, import errado), ele é pulado com um aviso no log e o resto continua.

Um plugin

.hinow/plugins/auditoria.tstypescript
import type { Plugin } from "@hinow-ai/plugin"
import { appendFile } from "node:fs/promises"

export const Auditoria: Plugin = async ({ directory }) => ({
  "tool.execute.before": async (input) => {
    await appendFile(directory + "/auditoria.log", `${new Date().toISOString()} ${input.tool}\n`)
  },
})

Tudo em .hinow/plugins/ (ou ~/.config/hinow/plugins/) é carregado sozinho. O plugin recebe client (a API do HiNow Code), project, directory, worktree e $ (o shell do Bun) e devolve os ganchos que quer:

GanchoQuando roda
eventEm todo evento: sessão criada, mensagem, ferramenta, permissão…
configUma vez, com a configuração somada: dá para alterar campos
chat.message, chat.params, chat.headersAntes de cada mensagem ir ao modelo
tool.execute.before, tool.execute.afterAntes e depois de cada ferramenta (dá para mudar os argumentos ou a saída)
permission.askQuando uma permissão vai ser pedida: pode responder allow, deny ou deixar perguntar
shell.envVariáveis de ambiente dos comandos
toolUm objeto { nome: tool(…) } com ferramentas que o plugin adiciona

De onde vem o @hinow-ai/plugin

Você não instala nada: o próprio HiNow Code grava um pacote @hinow-ai/plugin mínimo em .hinow/node_modules/ (e em ~/.config/hinow/node_modules/) ao abrir, com a versão do programa, e o .gitignore da pasta já o ignora. O editor enxerga os tipos e o runtime encontra o módulo. Se a sua ferramenta precisa de bibliotecas do npm, crie um package.json em .hinow/ com as dependências: elas são instaladas em segundo plano.

Plugins do npm

hinow.jsonjson
"plugin": ["hinow-cli-notify", "hinow-cli-lint@1.2.0", "./ferramentas/meu-plugin.ts"]

hinow-cli plugin <módulo> instala e adiciona à configuração. hinow-cli --pure (ou HINOW_PURE=1) abre sem nenhum plugin externo, para isolar um problema.

É código seu rodando

Plugins e ferramentas rodam dentro do processo, com as suas permissões, antes de qualquer pergunta ao usuário. Revise o que instala e não commite segredos nos arquivos.