Novidades do zn-gate 1.14.0: suporte ao Antigravity e ao ZCode desktop app, hooks para Gemini CLI e GitHub Copilot CLI, mais verificações no Codex CLI, correções no cofre e no Team e análise de configurações MCP
No npm esta versão é publicada como 1.14.1, que é a 1.14.0 mais correções para o Windows (veja o changelog de segurança). O zn-gate 1.14.0 adiciona hooks para o Google Antigravity e o ZCode desktop app, agora agentes suportados, e hooks experimentais para o Gemini CLI e o GitHub Copilot CLI e mais verificações no Codex CLI. Ele também encontra chaves e senhas escritas em texto puro nas configurações de servidores MCP, reforça o vault e o zn Team, fecha uma lacuna no guarda de ferramentas do Python e traz exemplos para quem cria agentes com um framework. O zn-gate continua não precisando de conta e não envia nada por padrão. Atualize com npm install -g zn-gate@1.14.1 e pip install -U zn-gate.
Quais novos agentes o zn-gate protege?
Mais quatro agentes recebem um hook de pré-execução. O Antigravity e o ZCode desktop app se juntam a Claude Code, Codex CLI, Cursor e OpenCode como agentes suportados, o que dá seis. Gemini CLI e Copilot CLI são experimentais e aparecem à parte.
npx -y zn-gate hooks install gemini
npx -y zn-gate hooks install antigravity
npx -y zn-gate hooks install zcode
npx -y zn-gate hooks install copilot
Adicione --project para configurar o hook só no projeto atual (não vale para o ZCode, que ignora hooks de projeto). Sem essa opção, o hook vai para as suas configurações de usuário.
- Gemini CLI: o hook impede que o agente leia ou escreva arquivos secretos por caminho e que execute comandos de shell que lidam com segredos. Ele também protege contra edições do agente os arquivos de configuração do próprio Gemini CLI. Os hooks do Gemini CLI não podem pedir confirmação, então o zn-gate bloqueia o que recusaria, e o que perguntaria, com o motivo e como aprovar. Para todo o resto vale a aprovação do próprio Gemini CLI.
- Google Antigravity: o hook faz o mesmo e protege os seus próprios arquivos de hook. Uma busca em uma pasta pede confirmação quando a pasta contém um
.envou um arquivo de chaves em texto puro. Os hooks do Antigravity não podem reescrever a saída das ferramentas, então ali as linhas correspondentes e a saída dos comandos não são ocultadas. O guia do Antigravity detalha o que o hook não cobre, inclusive o fato de o Antigravity não documentar o que acontece quando um hook falha. - Aplicativo desktop ZCode:
zn hooks install zcode(ounpx -y zn-gate init) adiciona hooks que rodam antes de cada chamada de ferramenta e antes de cada prompt. Ele bloqueia a leitura e a gravação de arquivos secretos, comandos de shell que lidam com segredos, chamadas MCP que enviariam um segredo e um prompt que contém um segredo, e o agente não consegue editar o arquivo de configuração do próprio ZCode. Ele não consegue remover segredos do que uma ferramenta devolve (o zn adiciona um aviso quando uma saída contém um), o ZCode ignora os hooks de um projeto, e o launcher do zn bloqueia a chamada quando o Node.js dele não existe mais, então trate-o como uma primeira camada. A documentação do ZCode não diz o que acontece quando um hook falha; em nossos testes com o aplicativo desktop do ZCode 3.16.3 em Linux, um hook que falhou (um código de saída diferente de 2, uma falha ou um timeout) deixou a chamada seguir, e só o código de saída 2 ou uma resposta deny a bloqueou. Testado de ponta a ponta no aplicativo desktop oficial do ZCode 3.16.3 em Linux x64 (outubro de 2026). As mesmas verificações passaram no Windows x64 (Windows Server 2022, mesma versão do aplicativo, outubro de 2026), para um administrador e para um usuário padrão, por meio do agente que o aplicativo inclui; a janela do aplicativo no Windows em si não foi operada. O macOS não foi testado. No Windows,zn-gate checkagora reconhece o hook quezn hooks install zcodegrava. Existe uma build de plugin do ZCode para Linux; seus passos de instalação serão publicados com o repositório do plugin. Detalhes: página do ZCode. - GitHub Copilot CLI: o hook impede que o agente leia ou escreva arquivos secretos por caminho e que execute comandos de shell que lidam com segredos, substitui os valores secretos nos resultados das ferramentas de leitura e de shell e protege contra edições do agente os arquivos de hook e de configuração do Copilot. Os hooks do Copilot CLI não podem bloquear um prompt digitado, e o Copilot deixa passar uma chamada se um hook estourar o tempo, então o zn, que define um timeout de 15 segundos nos seus hooks, bloqueia a própria chamada aos 11 segundos.
O zn-gate check informa esses hooks e avisa quando o Gemini CLI, o Copilot CLI ou o ZCode está com os hooks desligados. Veja Instalação para cada agente.
O que há de novo para o Codex CLI?
Depois de atualizar, execute zn-gate hooks install codex de novo e revise no Codex os hooks alterados com /hooks.
- O zn-gate agora verifica as chamadas de ferramentas MCP antes de serem executadas, como já fazia com o Cursor.
- Ele responde ao pedido de permissão do Codex com uma negação quando a sua verificação negaria a chamada, então nenhum botão Aprovar aparece para uma chamada que o zn-gate bloqueia. Ele nunca responde Permitir.
- Ele revisa a resposta final do modelo. Avisa você quando a resposta contém um valor secreto ou um marcador
__ZN_que ele não viu antes na sessão. O aviso é mostrado a você, não ao modelo. Para que o Codex peça ao modelo que reescreva essa resposta, defina"stopReview": "block"emhooks, em~/.zn/config.json. - Uma configuração opcional,
hooks.replaceToolOutputOnSecret, substitui o resultado de uma ferramenta que contém um segredo real por um texto curto que nomeia o tipo de segredo, nunca o valor. Vem desligada. - O
zn-gate checkinforma que o Codex não está totalmente protegido quando existe um hookPreToolUseouPermissionRequestde outra ferramenta, porque o Codex executa esses hooks ao mesmo tempo e um deles pode alterar um comando depois que o zn-gate o verificou. Também informa um hook do zn configurado para rodar em segundo plano ou desligado noconfig.toml. - O
zn-gate hooks install codextambém adiciona os hooksSessionStarteSubagentStart. Eles acrescentam um lembrete curto para o modelo e nunca bloqueiam. O guia do Codex tem a configuração.
O que o scan encontra agora?
O zn-gate scan e o zn audit procuram chaves e senhas escritas em texto puro nas configurações de servidores MCP (.mcp.json, .cursor/mcp.json, .vscode/mcp.json, .codex/config.toml, claude_desktop_config.json e semelhantes). Eles verificam um valor sob um nome como chave de API, token ou senha, um cabeçalho Authorization, o valor que vem depois de uma opção de credencial em args e uma chave na URL de um servidor. Referências como ${NAME} não são reportadas. O relatório mostra o tipo, o nome que contém o valor, o arquivo e a linha, nunca o valor, e diz como movê-lo para o cofre ou para uma variável de ambiente.
npx -y zn-gate scan --include-home
O --include-home também verifica as suas próprias configurações MCP (Claude Desktop, Claude Code, Cursor, Codex, Gemini, Antigravity, OpenCode e Amazon Q). O scan agora lista as pastas que não lê, com o motivo, em vez de ignorá-las em silêncio; diz "No files were scanned" quando não encontra nada para analisar, para que um resultado vazio não pareça limpo; segue um link informado como pasta a analisar; e lê o .vscode/mcp.json. Veja o guia do scan.
Há correções de segurança?
Sim.
- Hooks que bloqueiam quando falham: os hooks do Claude Code, Codex, Cursor e Gemini CLI não deixam mais as chamadas de ferramentas rodarem sem verificação quando o Node.js com que foram instalados desaparece (uma troca ou desinstalação do
nvm, uma atualização) ou quando o hook falha. Em vez disso, bloqueiam a chamada. No Claude Code e no Codex, também bloqueiam quando o hook estoura o tempo. Executezn hooks install <agent>de novo para atualizar uma instalação existente; ozn-gate checkagora informa um hook cujo Node.js ou iniciador desapareceu. Para o plugin do Claude Code, executeclaude plugin update zn-gate@usezne inicie uma nova sessão; ele exige o Claude Code 2.1.295 ou posterior. O Codex não tem uma configuração para isso, então os hooks respondem por conta própria com uma negação alguns segundos antes do limite de tempo do Codex. - Guarda de ferramentas do Python: argumentos ou resultados de ferramentas aninhados em mais de oito níveis, aproximadamente, passavam sem ser verificados, então um valor escondido nessa profundidade escapava de todas as regras. Agora eles são bloqueados com o motivo "nested too deeply to check". Afeta o pacote Python, versão 1.13.1 e anteriores. Atualize com
pip install -U zn-gate. - Saída do scan: o
zn-gate scanmostra caracteres de controle em nomes de arquivos e pastas como sequências de escape (por exemplo\x1b), para que um nome em um repositório não possa escrever sequências de terminal. Cobre os dois pacotes. - Hooks: nomes de arquivo e textos malformados (como substitutos Unicode sem par) são recusados em vez de interromper o hook em alguns sistemas Windows. A regra que protege o módulo de chaves do zn também reconhece o nome dele quando é montado dentro de um comando.
- Gateway experimental: os registros de auditoria criptografados ficam atrelados ao próprio id e ao próprio namespace, o log de auditoria se recusa a abrir com a senha errada, a verificação de origem padrão aceita apenas origens de loopback e uma política enviada é verificada antes de ser salva.
- Relatórios de auditoria: o
zn auditoculta o valor que vem depois de mais opções de credencial, como--passphrase,--bearere--jwt. - Instalação do ZCode:
zn hooks install zcodeeuninstallsão atômicos. A instalação guarda o valor quehooks.enabledtinha antes de mexer na configuração e grava oconfig.jsonpor último, então uma instalação que falha no meio não deixa mais os seus próprios hooks ligados sem nada registrado para desfazer. O launcher tem um prazo próprio dois segundos abaixo do tempo limite de hooks do ZCode, então um hook que trava ao iniciar é bloqueado em vez de deixar a chamada rodar. - Hooks de projeto: uma instalação de projeto (
zn hooks install <agent> --project) para Claude Code, Codex CLI, Cursor, Gemini CLI e Copilot CLI gravava um comandozn hook <agent>simples. Ondeznou o Node.js não conseguiam iniciar, por exemplo em outra máquina, o comando falhava e o agente executava a chamada sem verificação. O hook de projeto agora roda dentro de uma proteção de inicialização que bloqueia a chamada quandoznou o Node.js está ausente ou o hook falha (ou apenas avisa, em eventos que não podem bloquear). A proteção confia emzne no Node.js apenas em entradas absolutas doPATH, funciona com qualquersh, inclusive o do macOS, e tem uma forma em PowerShell no Windows.zn-gate checkinforma umzn hook <agent>simples em um arquivo de projeto como não protegido, e uma proteção diferente da que o zn grava como modificada. Executezn hooks install <agent> --projectnovamente nesse projeto para substituí-la. - Launchers dos hooks: os scripts launcher nunca executam um programa encontrado em uma entrada relativa do
PATH, como., de modo que um programa colocado em uma pasta de projeto nunca é executado, e removem seus arquivos privados após cada chamada. No Windows, ozn.cmdnão consegue mais iniciar umnode.exeounode.batda pasta atual. Se você testou um release candidate da 1.14.0, executezn hooks installnovamente (ezn hooks install --projectem cada projeto que tenha um hook de projeto) para que os hooks gravados recebam essas correções. - Hooks de plugin: os hooks do plugin zn-gate para Claude Code, Codex e ZCode iniciam o Node.js apenas a partir de entradas absolutas do
PATHfora do projeto ou das pastas de instalação usuais, e o plugin do ZCode inicia seus hooks com/bin/shpelo caminho completo, de modo que umnodeoushno projeto (em seubin/ounode_modules/.bin) nunca é executado no lugar deles. O plugin do Cursor não é mais oferecido: usezn hooks install cursore, se você adicionou o plugin no Cursor, remova-o lá (Customize). O plugin não adiciona mais servidores MCP: para o servidorsecrets, usezn hooks install claude-code. Ozn-gate checkinforma como não protegido um hook de plugin que não inicia dessa forma. No Claude Code no Windows, o plugin precisa do Git Bash; sem ele, usezn hooks install claude-code. Atualize o plugin comclaude plugin update zn-gate@usezne instale o plugin do ZCode novamente no ZCode (Settings, Plugins). - Pastas de plugins: os hooks agora protegem as pastas de plugins dos agentes e o estado dos plugins da mesma forma que protegem as configurações de hooks: um agente não pode mais gravar, apagar nem mover os arquivos de um plugin instalado ou a lista de plugins instalados no Claude Code, Codex, Cursor, ZCode e Antigravity, de modo que um agente alvo de prompt injection não consegue alterar o script de hook de um plugin para pular as verificações do zn. As pastas
.gemini/e.claude/plugins/do próprio projeto continuam graváveis. - Saída dos hooks: um hook que não conseguia gravar a resposta inteira para o agente (por exemplo, porque o agente fechou o pipe) saía como se tivesse funcionado, então um bloqueio podia se perder. Uma gravação com falha agora faz o hook falhar, e os launchers só aceitam um hook quando ele confirma que gravou a resposta inteira; caso contrário, bloqueiam a ação, ou avisam em eventos que não podem ser bloqueados.
- Limites de tempo dos hooks: um hook cuja entrada nunca termina, ou cuja verificação nunca é concluída, agora bloqueia a chamada antes do limite de tempo do próprio agente, em vez de deixar o agente sem resposta, o que permite que a chamada seja executada. O Gemini CLI e o Copilot CLI, que deixam passar uma chamada quando um hook estoura o tempo (o zn define o timeout dos hooks deles em 15 segundos), recebem o bloqueio aos 11 segundos. Um
SIGTERM,SIGHUPouSIGINTdurante uma verificação também responde com o bloqueio. - Agentes que não podem perguntar: o Codex CLI, o Cursor, o OpenCode e o Gemini CLI não conseguem exibir uma pergunta, e o zn descartava as que queria fazer (uma gravação em arquivo de instruções, dados pessoais em uma chamada MCP, uma busca em uma pasta com um
.envem texto simples), então a chamada era executada. Agora o zn bloqueia essa chamada e o motivo diz o que foi retido e como aprová-lo. O Claude Code, o Copilot CLI, o Antigravity e o ZCode continuam perguntando. Uma chamada de ferramenta que não pode ser lida agora é bloqueada em todos os agentes. - Marcas invisíveis: as regras agora ignoram as marcas de esquerda para a direita, de direita para a esquerda e de letra árabe, o separador de vogal mongol e os caracteres de preenchimento do hangul ao comparar texto, de modo que esses caracteres não conseguem mais dividir uma frase de gatilho. A verificação de saída de ferramenta composta principalmente por caracteres invisíveis também os conta. O texto normal em árabe e hebraico não é bloqueado.
- Saída de ferramenta grande demais: um evento de ferramenta grande demais não chega mais ao modelo sem verificação no Claude Code, no Codex ou no Copilot CLI. O hook agora retém a saída de um evento pós-ferramenta grande demais para ser verificado, e o launcher do plugin para de ler um evento aos 32 MiB.
zn-gate init: não grava mais nozn.jsonchaves ou tokens lidos do ambiente (ZN_API_KEY,ZN_JWT_SECRET,ZN_MCP_WS_TOKEN,ZN_DB_KEY) e cria o arquivo legível apenas pelo dono no Linux e no macOS.- Auditoria experimental do gateway: cada entrada de auditoria carrega o namespace de quem chamou, autenticado, então um tenant não pode mais ver as chamadas de outro tenant cujo namespace coincidia. O log de auditoria guarda apenas metadados por padrão, e a camada neural não guarda mais os argumentos das chamadas. A atualização do gateway limpa o texto que versões anteriores deixaram nos arquivos de memória vetorial e remove do log de auditoria o texto antigo de vizinhos, compactando o banco de dados para que o texto não permaneça em páginas livres. O fluxo de eventos, a exportação para SIEM e os alertas por webhook nunca carregam o conteúdo do pedido, e um
data/ref.keyque seja um link ou esteja aberto a outros usuários é recusado na inicialização. - Chamadas MCP e requisições de rede: o Claude Code agora verifica as chamadas de ferramentas MCP antes de serem executadas, como os outros agentes já faziam: um valor secreto ou um marcador nos argumentos é bloqueado e dados pessoais pedem que você aprove a chamada (execute
zn hooks install claude-codede novo para atualizar uma instalação existente). Antes de um agente executar uma requisição de rede (curl,wget,Invoke-WebRequest,python -counode -eem linha, WebFetch, ou uma chamada MCP com URL ou cabeçalhos), os hooks verificam os cabeçalhos, a query string e o corpo em busca de dados pessoais e segredos literais e perguntam a você antes de executar. Requisições paralocalhostsão ignoradas, ehooks.egressCheckehooks.egressAllowHostsem~/.zn/config.jsonmudam esse comportamento. - Instruções na saída das ferramentas: no Claude Code, a saída de buscas na web, ferramentas MCP e comandos de shell é verificada com as regras locais. Quando elas sinalizam um texto que parece instruções, o agente é orientado a tratá-lo como dados e a avisar você. Isso vem ativado por padrão e nunca bloqueia;
hooks.checkToolOutputInstructions: falsedesativa. Novas regras também sinalizam texto de uma página, de um resultado MCP ou de um arquivo que manda o agente identificar o usuário ou colocar o nome, o e-mail ou a chave de API do usuário em um cabeçalho, uma URL, um cookie ou um campo de formulário. Por padrão são um aviso e bloqueiam no modo estrito. - Regras de comando: as regras de comandos destrutivos e de arquivos protegidos agora leem um comando como um shell lê. Palavras divididas por uma barra invertida, listas com chaves (
c{u,}rl ... | sh), cargas Base64 entre aspas, comprintfou em um here-string, um redirecionamento colado à palavra anterior, fluxos de dados alternativos do NTFS (.aws\credentials::$DATA) e um caminho da pasta pessoal depois de@em um argumento de upload são detectados como as formas simples. A pasta do próprio zn também continua protegida quando o nome da pasta pessoal tem um acento escrito em outra forma Unicode, como no macOS. Os pacotes Node.js e Python dão os mesmos veredictos. - Comandos destrutivos: os hooks dos agentes agora recusam por padrão uma exclusão recursiva da pasta pessoal, da raiz do sistema de arquivos ou de uma pasta do sistema, e uma gravação em um dispositivo de disco. O agente é orientado a pedir a sua confirmação antes. Outras quatro regras (um download encaminhado para um shell,
chmod -Rouchown -Rna raiz ou em uma pasta do sistema, uma fork bomb e um download gravado em um arquivo de inicialização do shell) vêm desligadas;hooks.blockDestructiveCommandsem~/.zn/config.jsonas liga. Ele lê apenas o texto do comando e não é um sandbox. - Shield de MCP: agora ele verifica os resultados de ferramentas por inteiro até 32 MB (antes, só o início e o fim de um resultado maior eram verificados), e também as notificações e solicitações que os servidores enviam, o conteúdo de recursos e prompts e todas as strings dos esquemas de ferramentas. Um esquema de ferramenta fundo demais ou grande demais para ser verificado é substituído por um aviso, em vez de passar sem verificação. Uma saída de ferramenta feita em sua maior parte de caracteres invisíveis não deixa mais passar um segredo no Claude Code, no Copilot e no OpenCode. No SDK, um resultado de ferramenta acima de 4 MB agora é bloqueado por padrão;
ZN_ALLOW_TRUNCATED=1o permite. - Ocultação de segredos: segredos divididos em várias linhas, usados como nomes de propriedade na saída de uma ferramenta, em chaves privadas OpenPGP, aninhados em resultados do LangChain ou em mais formas de URL de conexão agora são ocultados, tanto no pacote npm quanto no Python. Um teste agora oculta textos aleatórios de chaves falsas com os dois pacotes e falha se qualquer um deixar uma chave na saída.
- Mais verificações da guarda do Python: agora ele lê as strings dentro de dataclasses, modelos do pydantic e outros objetos, bloqueia argumentos que não consegue ler por inteiro (um gerador, por exemplo, porque verificá-lo o consumiria), decodifica Base64 sem preenchimento
=e verifica e oculta a mensagem de um erro lançado por uma ferramenta, porque os frameworks de agentes enviam essa mensagem ao modelo. A integração com o LangChain suportalangchain-core1.3.3 e posteriores; as versões anteriores têm um aviso de segurança de gravidade alta conhecido. - Auditoria, cofre e gateway: a criptografia do log de auditoria tira cada nonce de um gerador aleatório inicializado pelo sistema operacional, e os registros criptografados existentes são atualizados na primeira vez que o cofre de auditoria é aberto com a sua chave. Um erro do cofre não cita mais texto descriptografado. O
zn auditnão mostra mais o valor que vem depois de uma opção de credencial como nome do pacote de um servidor MCP do npx. Ozn-gate init --revertrestaura apenas o backup mais recente ao lado da configuração e ignora backups que são links ou que estão em outra pasta, então um repositório não pode mais redirecionar uma restauração para a sua própria configuração MCP. O gateway experimental atualiza rustls-webpki, webpki-root-certs e wasmtime (RUSTSEC-2026-0378, -0379, -0382 e -0383).
- Arquivos de instruções: os hooks dos agentes perguntam antes de um agente escrever nos arquivos em que guarda sua memória e suas instruções permanentes (
MEMORY.md,AGENTS.md,CLAUDE.md,.cursorrulese semelhantes), porque os agentes os leem em sessões posteriores. No modo estrito a escrita é recusada, ehooks.agentInstructionWrites: "off"desliga a pergunta. Ler esses arquivos nunca é bloqueado. Os agentes que não podem perguntar (Codex CLI, Gemini CLI, OpenCode e as ferramentas de arquivos do Cursor) mantêm as próprias regras de aprovação.
- Mais formas de escrever comandos: um download encaminhado para um shell ou para o
Invoke-Expressionagora também é detectado quando escrito com aspas ANSI-C ($'...') ou com escapes de crase do PowerShell dentro de uma palavra. Um texto apenas impresso, como emecho $'curl ... | sh', continua permitido.
O que mudou no vault e no zn Team?
- Marcadores de segredo em argumentos (incompatível):
zn rune os hooks do agente não preenchem mais um marcador de segredo escrito nos argumentos de um comando, porque os argumentos aparecem na lista de processos e nos logs de linha de comando. Guarde o segredo para o programa (zn secret set PGPASSWORD --command psql) e executezn run --secrets PGPASSWORD -- psql "postgres://user@db/app", em que opsqllê a variável por conta própria. Um marcador em um arquivo de ambiente que o seu shell carrega (um.envsombreado) continua sendo preenchido.secrets_http_requestagora envia apenas segredos guardados no modoproxy: mude o modo de um segredo comzn secret allow NAME --mode proxyse uma API precisar dele. - As aprovações acompanham o valor: uma aprovação de primeiro uso agora pertence ao valor para o qual foi dada. Remover um segredo apaga as aprovações dele, e substituir um valor pergunta de novo. As aprovações salvas pela 1.13.x e anteriores não têm id e não valem, então, depois da atualização, cada segredo pergunta mais uma vez na primeira vez em que um comando o usa.
- Valores curtos: o vault não aceita mais um novo segredo com menos de 8 caracteres, porque esse valor não se distingue de texto comum. Um valor curto guardado por uma versão anterior continua funcionando.
- Quem pode pedir um valor: o mascaramento agora roda dentro do daemon do vault, e todo pedido de um valor informa um destino ou uma finalidade que o daemon confere com o que ele guarda. Um pedido sem contexto é recusado e registrado no log de auditoria. Um programa que consegue falar com o daemon ainda pode pedir um segredo guardado pelo nome em um contexto compatível: o modelo de ameaças diz o que isso impede e o que não impede.
- Windows e scripts inseguros: o vault define permissões explícitas apenas para o dono nas pastas dele, na chave de sessão e no pipe do daemon, e não inicia se não conseguir verificá-las. O
zn runse recusa a entregar valores secretos a um script que outras pessoas podem alterar ou que fica em uma pasta onde elas podem gravar. - Reset e purge:
zn vault resetmantém um backup criptografado e informa onde ele está. O novozn vault purgeapaga um vault de vez: lista todos os arquivos, pede que você confirme (nunca a um agente de IA) e verifica que nenhum sobrou. Ozn-gate uninstallagora remove também os backups e os mapas de tokens. - Verificação do log de auditoria: o cofre desbloqueado agora verifica todo o log de auditoria (a assinatura de cada registro, a cadeia e o último registro que ele lembra) antes de
zn vault logexibi-lo, dezn vault log export --otlpexportá-lo ou dezn team syncenviá-lo, e antes de acrescentar algo a ele. Até agora apenas o último registro era comparado. O cofre também compara o log com o último registro que lembra, por número de sequência e assinatura, antes de desbloquear e antes de cada gravação, e os registros de auditoria são gravados em disco no momento em que são escritos. Se uma verificação falhar, o log não é exibido, exportado nem enviado, o cofre guarda um aviso que sobrevive ao bloqueio e ao desbloqueio, ezn vault verifyfalha até que você aceite o log comzn vault verify --acknowledgeno seu próprio terminal. Limites: com o cofre bloqueado,zn vault logezn vault log export --otlpnão conseguem verificar a cadeia e informam isso; a restauração de umsecrets.agemais antigo, com ou sem oaudit.jsonlmais antigo correspondente, não é detectada; e se o processo do cofre for encerrado à força, os registros gravados desde o último salvamento (até um minuto) podem ser cortados sem aviso. Quando o cofre é desbloqueado após um desligamento irregular e assume registros de auditoria que ainda não tinham sido gravados em checkpoint, ele grava um registrowarn, de modo que cada falha aparece emzn vault log. - Política do zn Team:
zn team syncrecusa uma segunda política assinada que tenha a mesma versão mas conteúdo diferente, e uma sincronização iniciada antes de você sair de uma equipe não pode mais aplicar a resposta dela. Quando uma nova versão da política afrouxa uma restrição,zn team statuslista o que mudou, o log de auditoria registra e o Claude Code avisa uma vez. - Entrar e sair do zn Team:
zn team joinnão envia mais os registros de auditoria gravados antes de você entrar;--include-historyos inclui, apenas na primeira entrada.zn team joinezn team syncterminam com código 1 quando a política não foi aplicada, ezn team leaveavisa o servidor primeiro e informa o que ele respondeu.zn team jointambém para, sem enviar nada, quando o log de auditoria local não pode ser lido. - Detectores da equipe: os detectores personalizados da organização não se perdem mais quando
~/.zn/team.jsonou a cópia da política é apagada ou editada:zn team syncezn team statusos restauram a partir do vault.
O que mais há de novo?
- O pacote Node.js tem o mesmo guarda de ferramentas do Python:
checkToolCalleguardTool. Ele também traz tipos TypeScript. - O
zn vault reseté a saída quando você esquece a senha do cofre. Ele só roda no seu próprio terminal, pede que você digite uma frase de confirmação e antes guarda o cofre antigo em uma pasta de backup. - O
zn team managed-configmostra as configurações gerenciadas que um administrador distribui com a gestão de dispositivos para que os hooks rodem em todas as máquinas de desenvolvimento. Ele não escreve nada. - Quando um hook bloqueia algo ou oculta um segredo, o
zn-gate evidenceagora mostra isso como um evento (nunca um valor, comando, caminho ou texto de prompt). - Exemplos executáveis para CrewAI, LlamaIndex, o OpenAI Agents SDK, Pydantic AI, Google ADK e Haystack. Cada um verifica a saída de uma ferramenta antes de o modelo a ler, roda localmente com páginas inventadas e não precisa de chave de API. Veja Frameworks.
- Uma referência da linha de comando lista todos os comandos do
zn-gate, e um guia de atualização diz o que fazer depois de cada atualização. - Cada versão agora inclui uma lista de materiais de software para os pacotes npm e Python.
- O
zn-gate scannão termina mais com código 0 quando o resultado não cobre todos os arquivos que deveria ter lido. Ele termina com 3 quando nenhum arquivo foi lido, ou quando um arquivo ou pasta foi ignorado (2 MiB ou mais, ilegível, não é um arquivo comum). Os achados continuam terminando com 1, e--allow-partialmantém o código 0 quando apenas alguns arquivos foram ignorados. Jobs de CI que executamzn-gate scanpodem ver esse novo código de saída. - Os hooks iniciam mais rápido no Node.js 22.1 e posteriores, e o pacote Python agora declara o Python 3.14. Os hooks também carregam o código que executa outros programas somente quando precisam dele, e verificar caracteres ocultos em uma saída de ferramenta muito grande é mais rápido quando ela não tem nenhum.
- O scrubber pega mais formas de colar um segredo: valores entre crases, JSON com aspas escapadas copiado de logs,
setx NAME value, atribuições do PowerShell eNAME=value comando. - O
zn-gate uninstallremove o zn-gate em um só passo. Ele lista o que encontrou (o plugin do Claude Code, os hooks do zn para cada agente e os servidores MCP envolvidos peloinit --wrap-mcp), pede que você confirme no seu próprio terminal, remove tudo e executa ozn-gate check. O cofre só é apagado se você confirmar separadamente, e--dry-runmostra a lista sem alterar nada. Os agentes não podem executá-lo por você: como os outros comandos que alteram a sua configuração, ele precisa que você o execute no seu próprio terminal. Veja Remover o zn-gate. - Hooks para o framework pre-commit: o
zn-gate-scanexecuta ozn-gate scane ozn-auditexecuta ozn auditno seu repositório antes de cada commit. Eles exigem o Node.js 18 ou posterior. - O
zn auditagora lê arquivos de instruções que os agentes carregam por meio de outro arquivo (as importações@pathnoCLAUDE.mde os caminhosinstructionsdoopencode.json), encontra arquivos de agentes cujos nomes diferem só na caixa das letras, informa um arquivo de agente que não consegue ler e diz "not checked" em vez de "No findings" quando não encontrou nada para ler de um agente. Ele também gera menos falsos positivos: permissões restritas do Claude Code comoBash(git status:*), passos de configuração comuns como copiar.env.examplepara.enve a documentação dentro de umSKILL.mdnão são mais reportadas como riscos. - O
zn-gate checke ozn-gate statusreconhecem instalações gerenciadas (as configurações gerenciadas do Claude Code, os hooks corporativos do Cursor e orequirements.tomldo Codex) e indicam o arquivo. Eles também avisam, sem bloquear, quando o seu Node.js está em fim de vida (18 e 20) ou é mais antigo que a versão corrigida da sua linha. O plugin do Claude Code agora exige o Node.js 20.19 ou posterior; o zn-gate e os hooks do zn continuam funcionando no Node.js 18 e posteriores. - Em Python, o
guarded_toolagora analisa por padrão a saída de uma ferramenta em busca de injeção de prompt (passecheck_result=Falsepara manter o comportamento anterior), nomeia os alvos bloqueados comotool:<name>e também funciona com ferramentas assíncronas. Novos hooks nativos cobrem o Google ADK, o OpenAI Agents SDK e o Pydantic AI, inclusive as ferramentas que esses frameworks fornecem por conta própria, como servidores MCP. O pacote traz informações de tipos (py.typed). - Mais exemplos executáveis: AG2, DSPy, LangChain.js, Mastra, OpenAI Agents SDK (JavaScript), Vercel AI SDK, smolagents e Semantic Kernel.
- Os erros do cofre, do chaveiro e do connect agora dizem o que aconteceu e um próximo passo, em palavras simples. O detalhe técnico só aparece com
ZN_VERBOSE=1ouDEBUG=zn;DEBUG=*não o ativa mais. Ozn unlocke ozn vault statusmostram quando o cofre trava no seu horário local, e ozn-gate -vimprime a versão no pacote Python. Os servidores MCP locais do zn suportam versões do protocolo até 2025-11-25 e as descrições das suas ferramentas dizem quando chamá-las. O pacote npm ficou menor: cerca de 1,0 MB para baixar em vez de 1,6 MB.
- O
zn auditinforma um arquivo de instruções com uma sequência de 40 ou mais linhas vazias seguida de mais texto (nova regra ZNA021, média), porque esse texto fica fora da vista de quem revisa. As regras locais também leem uma sequência longa de linhas vazias como uma só, então o texto depois do preenchimento é verificado junto com o texto anterior. Ozn auditnão sinaliza mais um texto que apenas discutecurl | shcomo risco, nem um marcador como<system-or-project>nas notas de uma skill.
O que mais foi corrigido?
- Um prompt bloqueado por conter um segredo agora nomeia a credencial quando o texto mostra o nome dela, por exemplo
DB_PASSWORD. O valor nunca é mostrado. - O
zn env shadowmove para o cofre uma URL de conexão inteira quando a senha dela é curta. - O OpenCode no Windows com o PowerShell como shell envolve corretamente um comando com um marcador
__ZN_NAME__. - O log de evidências não perde mais um registro quando vários programas escrevem ao mesmo tempo, inclusive no Windows.
- O
--helpfunciona emzn unlock,zn lock,zn vaultezn team. Emzn hooks,zn secretezn env, peça-o a um subcomando:zn hooks install --help,zn secret set --helpezn env shadow --help. - Um servidor MCP lento ou travado não atrasa mais os outros servidores, e um servidor WebSocket que caiu é reconectado.
- Um comando com mais de um pipe Base64 (
echo ... | base64 -d) agora é verificado pipe por pipe. Antes, só o primeiro era decodificado, então um primeiro pipe inofensivo podia esconder um comando bloqueado em um pipe seguinte. Mais de 16 pipes, ou mais de 128 KiB de dados decodificados, são bloqueados. - O hook do Antigravity agora responde com os passos para repará-lo quando o Node.js não está instalado ou o hook não consegue iniciar: instale o zn-gate e rode
zn hooks install antigravityde novo. Antes, o Antigravity não recebia uma resposta utilizável. - O shield de MCP verifica as chaves do conteúdo estruturado de um servidor como verifica os valores, então uma instrução colocada em uma chave não chega mais ao agente.
- Antigravity: o hook agora bloqueia gravações em um arquivo
.envque contém segredos em texto puro, como diz a documentação, e pergunta antes de uma busca recursiva de shell (grep -r,rg) em uma pasta que contém um. No Windows ele agora inicia: o comando do hook não depende mais de aspas, que o Antigravity não usa, então um caminho do Node.js com espaços não o quebra mais. Executezn hooks install antigravityde novo para substituir um hook existente. - Gateway experimental: uma ação que já foi negada não é mais aprovada, uma aprovação só pode ser usada uma vez e um banimento dura até expirar. As aprovações pendentes expiram por padrão após 15 minutos, e uma mensagem WebSocket acima de 1 MiB fecha a conexão por padrão. Com o AWS KMS, ele mantém a mesma chave de dados entre reinícios e se recusa a iniciar, a menos que você permita um fallback, quando a chave do KMS não pode ser obtida. O scrubber dele agora coincide com o do Node.js em membros JSON, cabeçalhos
Authorizatione números de cartão que vêm depois de um candidato rejeitado. - O
zn-gate scanagora lê as pastastest,testse__tests__nos dois pacotes, porque os dados de teste podem conter segredos reais, e os dois ignoram as mesmas pastas. O scan do Python lista uma pasta que não consegue ler, como o do Node.js faz, e os caminhos ficam limpos quando a pasta analisada é alcançada por um link.
Uma versão por semana
A partir da 1.14, o zn-gate é lançado em um ciclo semanal: uma versão maior por semana em vez de várias pequenas. Uma versão candidata sai alguns dias antes de cada versão (tag next do npm e um pré-lançamento no PyPI), para que você possa testá-la antes. Só lançamos fora do ciclo para uma correção de segurança alta ou crítica ou para uma instalação quebrada.
No nosso horizonte
- Pedir confirmação antes de um agente editar seus próprios arquivos de memória e de instruções (CLAUDE.md, AGENTS.md, skills).
- Detectar instruções escondidas em comentários HTML dentro de skills e documentos.
- ZCode testado de ponta a ponta no macOS, e Antigravity no Windows e no macOS.
- As mesmas regras de comandos no motor Rust e nos pacotes Node e Python.
Perguntas frequentes
O que há de novo no zn-gate 1.14.0?
Hooks para o Google Antigravity e o aplicativo desktop ZCode, agora agentes suportados, e hooks experimentais para o Gemini CLI e o GitHub Copilot CLI. Mais verificações no Codex CLI (chamadas de ferramentas MCP, pedidos de permissão e a resposta final). O zn-gate scan e o zn audit encontram chaves e senhas escritas em texto puro nas configurações de servidores MCP. Correções no vault e no zn Team: um marcador de segredo nos argumentos de um comando não é mais preenchido, as aprovações acompanham o valor para o qual foram dadas e a sincronização de política do zn Team ficou mais rigorosa. Uma correção no guarda de ferramentas do Python, que deixava passar valores aninhados em mais de oito níveis, aproximadamente. Um guarda de ferramentas e tipos TypeScript para o pacote Node.js, o zn vault reset, o zn team managed-config e exemplos para CrewAI, LlamaIndex, o OpenAI Agents SDK, Pydantic AI, Google ADK e Haystack.
Como atualizo para o zn-gate 1.14.0?
No npm esta versão é publicada como 1.14.1: execute npm install -g zn-gate@1.14.1 para o pacote Node e pip install -U zn-gate para o pacote Python. Depois, execute de novo npx -y zn-gate@1.14.1 hooks install <agent> para cada agente que você usa (por exemplo hooks install codex) para adicionar os novos hooks; npx -y zn-gate@1.14.1 check mostra quais agentes precisam disso. Se você usa o plugin do Claude Code, execute claude plugin update zn-gate@usezn e inicie uma nova sessão; ele exige o Claude Code 2.1.295 ou posterior.
O Antigravity e o aplicativo desktop ZCode são suportados, e os hooks do Gemini CLI e do Copilot CLI estão prontos?
O Antigravity e o aplicativo desktop ZCode são agentes suportados, o que dá seis com Claude Code, Codex CLI, Cursor e OpenCode. Os hooks deles bloqueiam a leitura e a gravação de arquivos secretos pelo caminho e comandos de shell que lidam com segredos, mas não conseguem reescrever a saída das ferramentas, então ali as linhas correspondentes e a saída dos comandos não são ocultadas. Um segredo colado no prompt não é bloqueado no Antigravity; o ZCode o bloqueia. O ZCode ignora os hooks de um projeto, então não tem instalação por projeto. Testado de ponta a ponta no aplicativo desktop oficial do ZCode 3.16.3 em Linux x64 (outubro de 2026). As mesmas verificações passaram no Windows x64 (Windows Server 2022, mesma versão do aplicativo, outubro de 2026), para um administrador e para um usuário padrão, por meio do agente que o aplicativo inclui; a janela do aplicativo no Windows em si não foi operada. O macOS não foi testado. Os hooks do Gemini CLI e do Copilot CLI são experimentais: os do Gemini CLI não podem pedir confirmação, os do Copilot CLI não podem bloquear um prompt digitado e o Copilot deixa passar uma chamada quando um hook estoura o tempo limite, então o zn, que define um timeout de 15 segundos nos seus hooks, bloqueia a própria chamada aos 11 segundos. zn-gate check informa se cada hook está instalado.
Preciso mudar alguma coisa por causa do vault e do zn Team?
Sim, em dois casos. Se um comando que você executa com zn run ou pelos hooks do agente tem um marcador de segredo como __ZN_DB_PASSWORD__ nos argumentos, ele agora é recusado, porque os argumentos aparecem na lista de processos e nos logs de linha de comando: guarde o segredo para o programa (zn secret set PGPASSWORD --command psql) e execute zn run --secrets PGPASSWORD -- psql no lugar. E as aprovações salvas pela 1.13.x e anteriores não valem mais, então o zn pergunta mais uma vez, na primeira vez em que um comando usar cada segredo depois da atualização. Nada mais precisa mudar.
A correção do guarda de ferramentas do Python me afeta?
Afeta o pacote Python, versão 1.13.1 e anteriores, se você usa o guarda de ferramentas (guard, guarded_tool ou check_tool_call) com argumentos ou resultados que podem ser muito aninhados. Valores aninhados em mais de oito níveis, aproximadamente, passavam sem ser verificados. A partir da 1.14.0 eles são bloqueados com o motivo "nested too deeply to check". Atualize com pip install -U zn-gate.
Preciso de uma conta para usar o zn-gate 1.14.0?
Não. O zn-gate continua não precisando de conta e não envia nada por padrão. A verificação opcional na nuvem continua desligada até você executar zn-gate connect.
A lista completa de mudanças está nas notas da versão 1.14.0. O zn-gate é MIT, roda localmente e não precisa de conta: comece com npx -y zn-gate scan --include-home ou veja Instalação para cada agente.