Novedades de zn-gate 1.14.0: compatibilidad con Antigravity y ZCode desktop app, hooks para Gemini CLI y GitHub Copilot CLI, más comprobaciones en Codex CLI, correcciones del vault y de Team y análisis de configuraciones MCP
En npm esta versión se publica como 1.14.1, que es la 1.14.0 más correcciones para Windows (consulta el registro de cambios de seguridad). zn-gate 1.14.0 añade hooks para Google Antigravity y ZCode desktop app, ahora agentes admitidos, y hooks experimentales para Gemini CLI y GitHub Copilot CLI y más comprobaciones en Codex CLI. También encuentra claves y contraseñas escritas en texto plano en las configuraciones de servidores MCP, refuerza el vault y zn Team, cierra un hueco en el guardián de herramientas de Python y añade ejemplos para quien construye agentes con un framework. zn-gate sigue sin necesitar cuenta y por defecto no envía nada. Actualiza con npm install -g zn-gate@1.14.1 y pip install -U zn-gate.
¿Qué agentes nuevos protege zn-gate?
Cuatro agentes más reciben un hook previo a la ejecución. Antigravity y ZCode desktop app se unen a Claude Code, Codex CLI, Cursor y OpenCode como agentes admitidos, lo que hace seis. Gemini CLI y Copilot CLI son experimentales y se muestran aparte.
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
Añade --project para instalar el hook solo en el proyecto actual (no para ZCode, que ignora los hooks de proyecto). Sin esa opción, el hook va a tu configuración de usuario.
- Gemini CLI: el hook impide que el agente lea o escriba archivos secretos por ruta y que ejecute comandos de shell que manejan secretos. También protege de ediciones del agente los archivos de configuración de Gemini CLI. Los hooks de Gemini CLI no pueden pedir confirmación, así que zn-gate bloquea lo que rechazaría, y lo que preguntaría, con el motivo y cómo aprobarlo. Para todo lo demás se aplica la aprobación propia de Gemini CLI.
- Google Antigravity: el hook hace lo mismo y protege sus propios archivos de hook. Una búsqueda en una carpeta pide confirmación cuando la carpeta contiene un
.envo un archivo de claves en texto plano. Los hooks de Antigravity no pueden reescribir la salida de las herramientas, así que allí las líneas coincidentes y la salida de los comandos no se ocultan. La guía de Antigravity detalla lo que el hook no cubre, incluido que Antigravity no documenta qué ocurre cuando falla un hook. - Aplicación de escritorio ZCode:
zn hooks install zcode(onpx -y zn-gate init) añade hooks que se ejecutan antes de cada llamada a una herramienta y antes de cada prompt. Bloquea la lectura y la escritura de archivos secretos, los comandos de shell que manejan secretos, las llamadas MCP que enviarían un secreto y un prompt que contiene un secreto, y el agente no puede editar el archivo de configuración propio de ZCode. No puede eliminar secretos de lo que devuelve una herramienta (zn añade un aviso cuando una salida contiene uno), ZCode ignora los hooks de un proyecto, y el launcher de zn bloquea la llamada cuando su Node.js ya no está, así que considéralo una primera capa. La documentación de ZCode no dice qué ocurre cuando un hook falla; en nuestras pruebas con la aplicación de escritorio de ZCode 3.16.3 en Linux, un hook que falló (un código de salida distinto de 2, un fallo o un tiempo agotado) dejó que la llamada se ejecutara, y solo el código de salida 2 o una respuesta deny la bloqueó. Probado de extremo a extremo en la aplicación de escritorio oficial de ZCode 3.16.3 en Linux x64 (octubre de 2026). Las mismas comprobaciones se superaron en Windows x64 (Windows Server 2022, misma versión de la aplicación, octubre de 2026), con un administrador y con un usuario estándar, a través del agente que incluye la aplicación; no se manejó la ventana de la aplicación de Windows. macOS no se ha probado. En Windows,zn-gate checkahora reconoce el hook que escribezn hooks install zcode. Existe una versión de ZCode como plugin para Linux; sus pasos de instalación se publicarán con su repositorio de plugin. Detalles: página de ZCode. - GitHub Copilot CLI: el hook impide que el agente lea o escriba archivos secretos por ruta y que ejecute comandos de shell que manejan secretos, sustituye los valores secretos en los resultados de las herramientas de lectura y de shell, y protege de ediciones del agente los archivos de hook y de configuración de Copilot. Los hooks de Copilot CLI no pueden bloquear un prompt escrito y Copilot deja pasar una llamada si un hook agota el tiempo, así que zn, que fija un tiempo límite de 15 segundos en sus hooks, bloquea la propia llamada a los 11 segundos.
zn-gate check informa de estos hooks y avisa cuando Gemini CLI, Copilot CLI o ZCode tienen los hooks desactivados. Consulta Instalación para cada agente.
¿Qué hay de nuevo para Codex CLI?
Tras actualizar, vuelve a ejecutar zn-gate hooks install codex y revisa en Codex los hooks modificados con /hooks.
- zn-gate ahora comprueba las llamadas a herramientas MCP antes de que se ejecuten, como ya hacía con Cursor.
- Responde a la solicitud de permiso de Codex con una denegación cuando su comprobación denegaría la llamada, de modo que no aparece un botón Aprobar para una llamada que zn-gate bloquea. Nunca responde Permitir.
- Revisa la respuesta final del modelo. Te avisa cuando la respuesta contiene un valor secreto o un marcador
__ZN_que no vio antes en la sesión. El aviso se te muestra a ti, no al modelo. Para que Codex pida al modelo que reescriba esa respuesta, define"stopReview": "block"dentro dehooksen~/.zn/config.json. - Un ajuste opcional,
hooks.replaceToolOutputOnSecret, sustituye un resultado de herramienta que contiene un secreto real por un texto breve que nombra el tipo de secreto, nunca el valor. Viene desactivado. zn-gate checkinforma de que Codex no está totalmente protegido cuando hay un hookPreToolUseoPermissionRequestde otra herramienta, porque Codex ejecuta esos hooks a la vez y uno de ellos puede cambiar un comando después de que zn-gate lo haya comprobado. También informa de un hook de zn configurado para ejecutarse en segundo plano o desactivado enconfig.toml.zn-gate hooks install codexañade además los hooksSessionStartySubagentStart. Añaden un recordatorio breve para el modelo y nunca bloquean. La guía de Codex explica la configuración.
¿Qué encuentra ahora scan?
zn-gate scan y zn audit buscan claves y contraseñas escritas en texto plano en las configuraciones de servidores MCP (.mcp.json, .cursor/mcp.json, .vscode/mcp.json, .codex/config.toml, claude_desktop_config.json y similares). Comprueban un valor bajo un nombre como clave de API, token o contraseña, una cabecera Authorization, el valor que sigue a una opción de credencial en args y una clave en la URL de un servidor. Las referencias como ${NAME} no se notifican. El informe muestra el tipo, el nombre que contiene el valor, el archivo y la línea, nunca el valor, e indica cómo moverlo a la bóveda o a una variable de entorno.
npx -y zn-gate scan --include-home
--include-home también revisa tus propias configuraciones MCP (Claude Desktop, Claude Code, Cursor, Codex, Gemini, Antigravity, OpenCode y Amazon Q). Scan ahora enumera las carpetas que no lee, con el motivo, en lugar de omitirlas en silencio; dice "No files were scanned" cuando no encuentra nada que analizar, para que un resultado vacío ya no parezca limpio; sigue un enlace que indiques como carpeta que analizar; y lee .vscode/mcp.json. Consulta la guía de scan.
¿Hay correcciones de seguridad?
Sí.
- Hooks que bloquean si fallan: los hooks de Claude Code, Codex, Cursor y Gemini CLI ya no dejan que las llamadas a herramientas se ejecuten sin comprobar cuando desaparece el Node.js con el que se instalaron (un cambio o una desinstalación de
nvm, una actualización) o cuando el hook falla. En su lugar, bloquean la llamada. En Claude Code y Codex también bloquean cuando el hook agota el tiempo. Vuelve a ejecutarzn hooks install <agent>para actualizar una instalación existente;zn-gate checkahora informa de un hook cuyo Node.js o lanzador ha desaparecido. Para el plugin de Claude Code, ejecutaclaude plugin update zn-gate@usezne inicia una sesión nueva; requiere Claude Code 2.1.295 o posterior. Codex no tiene un ajuste para esto, así que sus hooks responden por sí mismos con una denegación unos segundos antes del límite de tiempo de Codex. - Guardián de herramientas de Python: los argumentos o resultados de herramientas anidados a más de unos ocho niveles se dejaban pasar sin comprobar, de modo que un valor oculto a esa profundidad se saltaba todas las reglas. Ahora se bloquean con el motivo "nested too deeply to check". Afecta al paquete de Python, versión 1.13.1 y anteriores. Actualiza con
pip install -U zn-gate. - Salida de scan:
zn-gate scanmuestra los caracteres de control de los nombres de archivos y carpetas como secuencias de escape (por ejemplo\x1b), de modo que un nombre en un repositorio no pueda escribir secuencias de terminal. Cubre los dos paquetes. - Hooks: los nombres de archivo y los textos mal formados (como sustitutos Unicode sin pareja) se rechazan en lugar de detener el hook en algunos sistemas Windows. La regla que protege el módulo de claves de zn también reconoce su nombre cuando se construye dentro de un comando.
- Gateway experimental: los registros de auditoría cifrados quedan ligados a su propio id y espacio de nombres, el registro de auditoría se niega a abrirse con una contraseña incorrecta, la comprobación de origen por defecto solo acepta orígenes de loopback y una política subida se verifica antes de guardarse.
- Informes de auditoría:
zn auditoculta el valor que sigue a más opciones de credencial, como--passphrase,--bearery--jwt. - Instalación de ZCode:
zn hooks install zcodeyuninstallson atómicos. La instalación guarda el valor que teníahooks.enabledantes de tocar la configuración y escribeconfig.jsonen último lugar, de modo que una instalación que falla a medias ya no deja tus propios hooks activados sin nada registrado para deshacerlo. El launcher tiene su propio plazo, dos segundos por debajo del tiempo de espera de los hooks de ZCode, así que un hook que se cuelga al arrancar se bloquea en lugar de dejar que la llamada se ejecute. - Hooks de proyecto: una instalación de proyecto (
zn hooks install <agent> --project) para Claude Code, Codex CLI, Cursor, Gemini CLI y Copilot CLI escribía un comandozn hook <agent>sin protección. Dondezno Node.js no podían arrancar, por ejemplo en otra máquina, el comando fallaba y el agente ejecutaba la llamada sin comprobar. Ahora el hook de proyecto se ejecuta dentro de una protección de arranque que bloquea la llamada cuando faltazno Node.js o el hook falla (o solo avisa, en los eventos que no pueden bloquear). La protección solo confía enzny Node.js en entradas absolutas dePATH, funciona con cualquiersh, incluido el de macOS, y tiene una forma en PowerShell para Windows.zn-gate checkindica que unzn hook <agent>sin protección en un archivo de proyecto no está protegido, y que una protección distinta de la que escribe zn está modificada. Ejecuta de nuevozn hooks install <agent> --projecten ese proyecto para sustituirla. - Launchers de hooks: los scripts launcher nunca ejecutan un programa encontrado en una entrada relativa de
PATHcomo., así que nunca se ejecuta un programa colocado en la carpeta de un proyecto, y eliminan sus archivos privados tras cada llamada. En Windows,zn.cmdya no puede iniciar unnode.exeonode.batde la carpeta actual. Si probaste una release candidate de 1.14.0, ejecutazn hooks installde nuevo (yzn hooks install --projecten cada proyecto con un hook de proyecto) para que los hooks que escribió reciban estas correcciones. - Hooks de plugin: los hooks del plugin zn-gate para Claude Code, Codex y ZCode inician Node.js solo desde entradas absolutas de
PATHfuera del proyecto o desde las carpetas de instalación habituales, y el plugin de ZCode inicia sus hooks con/bin/shpor su ruta completa, así que unnodeo unshdel proyecto (subin/onode_modules/.bin) nunca se ejecuta en su lugar. El plugin de Cursor ya no se ofrece: usazn hooks install cursor, y si añadiste el plugin en Cursor, quítalo allí (Customize). El plugin ya no añade servidores MCP: para el servidorsecrets, usazn hooks install claude-code.zn-gate checkinforma como no protegido un hook de plugin que no se inicia así. En Claude Code en Windows el plugin necesita Git Bash; sin él, usazn hooks install claude-code. Actualiza el plugin conclaude plugin update zn-gate@usezne instala de nuevo el plugin de ZCode en ZCode (Settings, Plugins). - Carpetas de plugins: los hooks ahora protegen las carpetas de plugins de los agentes y el estado de los plugins igual que protegen los ajustes de hooks: un agente ya no puede escribir, borrar ni mover los archivos de un plugin instalado ni la lista de plugins instalados en Claude Code, Codex, Cursor, ZCode y Antigravity, de modo que un agente víctima de una inyección de prompt no puede cambiar el script de hook de un plugin para saltarse las comprobaciones de zn. Las carpetas
.gemini/y.claude/plugins/propias de un proyecto siguen siendo escribibles. - Salida de los hooks: un hook que no podía escribir su respuesta completa al agente (por ejemplo porque el agente cerró la tubería) terminaba como si hubiera funcionado, así que un bloqueo podía perderse. Ahora una escritura fallida hace fallar el hook, y los launchers solo aceptan un hook cuando confirma que escribió su respuesta completa; de lo contrario bloquean la acción, o avisan en los eventos que no se pueden bloquear.
- Tiempos límite de los hooks: un hook cuya entrada no termina nunca, o cuya comprobación no acaba, ahora bloquea la llamada antes del tiempo límite del propio agente, en lugar de dejar al agente sin respuesta, lo que deja que la llamada se ejecute. Gemini CLI y Copilot CLI, que dejan pasar una llamada cuando un hook agota el tiempo (zn fija el tiempo límite de su hook en 15 segundos), reciben el bloqueo a los 11 segundos. Un
SIGTERM,SIGHUPoSIGINTdurante una comprobación también responde con el bloqueo. - Agentes que no pueden preguntar: Codex CLI, Cursor, OpenCode y Gemini CLI no pueden mostrar una pregunta, y zn descartaba las que quería hacer (una escritura en un archivo de instrucciones, datos personales en una llamada MCP, una búsqueda en una carpeta con un
.enven texto plano), así que la llamada se ejecutaba. Ahora zn bloquea esa llamada y el motivo indica qué se retuvo y cómo aprobarlo. Claude Code, Copilot CLI, Antigravity y ZCode siguen preguntando. Una llamada a una herramienta que no se puede leer ahora se bloquea en todos los agentes. - Marcas invisibles: las reglas ahora ignoran las marcas de izquierda a derecha, de derecha a izquierda y de letra árabe, el separador vocálico mongol y los caracteres de relleno del hangul cuando comparan texto, de modo que estos caracteres ya no pueden partir una frase desencadenante. La comprobación de salidas de herramientas formadas sobre todo por caracteres invisibles también los cuenta. El texto normal en árabe y hebreo no se bloquea.
- Salida de herramientas demasiado grande: un evento de herramienta demasiado grande ya no llega al modelo sin comprobar en Claude Code, Codex ni Copilot CLI. El hook ahora retiene la salida de un evento posterior a la herramienta que es demasiado grande para comprobarse, y el launcher del plugin deja de leer un evento a los 32 MiB.
zn-gate init: ya no escribe enzn.jsonclaves ni tokens leídos del entorno (ZN_API_KEY,ZN_JWT_SECRET,ZN_MCP_WS_TOKEN,ZN_DB_KEY), y crea el archivo legible solo por su propietario en Linux y macOS.- Auditoría experimental del gateway: cada entrada de auditoría lleva el namespace del llamante autenticado, de modo que un inquilino ya no puede ver las llamadas de otro inquilino cuyo namespace coincidía. El registro de auditoría guarda solo metadatos por defecto, y la capa neuronal ya no conserva los argumentos de las llamadas. Al actualizar el gateway se limpia el texto que las versiones anteriores dejaron en los archivos de memoria vectorial y se borra el texto antiguo de vecinos del registro de auditoría, compactando la base de datos para que el texto no quede en páginas libres. El flujo de eventos, la exportación SIEM y las alertas por webhook nunca incluyen el contenido de la solicitud, y se rechaza al arrancar un
data/ref.keyque sea un enlace o que esté abierto a otros usuarios. - Llamadas MCP y peticiones de red: Claude Code ahora comprueba las llamadas a herramientas MCP antes de que se ejecuten, como ya hacían los demás agentes: un valor secreto o un marcador en los argumentos se bloquea y los datos personales te piden aprobar la llamada (vuelve a ejecutar
zn hooks install claude-codepara actualizar una instalación existente). Antes de que un agente ejecute una petición de red (curl,wget,Invoke-WebRequest,python -conode -een línea, WebFetch, o una llamada MCP con una URL o cabeceras), los hooks revisan sus cabeceras, la cadena de consulta y el cuerpo en busca de datos personales y secretos literales y te preguntan antes de que se ejecute. Las peticiones alocalhostse omiten, yhooks.egressCheckyhooks.egressAllowHostsen~/.zn/config.jsoncambian este comportamiento. - Instrucciones en la salida de herramientas: en Claude Code, la salida de las descargas web, las herramientas MCP y los comandos de shell se comprueba con las reglas locales. Cuando marcan texto que parece instrucciones, se le dice al agente que lo trate como datos y que te lo comunique. Está activado por defecto y nunca bloquea;
hooks.checkToolOutputInstructions: falselo desactiva. Nuevas reglas también marcan texto de una página, un resultado MCP o un archivo que le dice al agente que identifique a su usuario o que ponga el nombre, el correo o la clave de API del usuario en una cabecera, una URL, una cookie o un campo de formulario. Por defecto son un aviso y bloquean en modo estricto. - Reglas de comandos: las reglas de comandos destructivos y de archivos protegidos ahora leen un comando como lo hace un shell. Las palabras partidas por una barra invertida, las listas con llaves (
c{u,}rl ... | sh), las cargas Base64 entre comillas, conprintfo en un here-string, una redirección pegada a la palabra anterior, los flujos de datos alternativos de NTFS (.aws\credentials::$DATA) y una ruta del directorio personal después de@en un argumento de subida se detectan igual que sus formas simples. La carpeta propia de zn también sigue protegida cuando el nombre de la carpeta personal lleva un acento escrito en otra forma Unicode, como en macOS. Los paquetes de Node.js y Python dan los mismos veredictos. - Comandos destructivos: los hooks de los agentes ahora rechazan por defecto un borrado recursivo de la carpeta personal, de la raíz del sistema de archivos o de una carpeta del sistema, y una escritura en un dispositivo de disco. Se le dice al agente que te pida confirmación antes. Otras cuatro reglas (una descarga canalizada a un shell,
chmod -Rochown -Rsobre la raíz o una carpeta del sistema, una fork bomb y una descarga escrita en un archivo de arranque del shell) vienen desactivadas;hooks.blockDestructiveCommandsen~/.zn/config.jsonlas activa. Solo lee el texto del comando y no es un sandbox. - Shield de MCP: ahora comprueba los resultados de herramientas completos hasta 32 MB (antes solo se comprobaban el principio y el final de un resultado mayor), y también las notificaciones y solicitudes que envían los servidores, el contenido de recursos y prompts, y todas las cadenas de los esquemas de herramientas. Un esquema de herramienta demasiado profundo o grande para comprobarse se sustituye por un aviso en lugar de pasar sin comprobar. Una salida de herramienta formada sobre todo por caracteres invisibles ya no deja pasar un secreto en Claude Code, Copilot y OpenCode. En el SDK, un resultado de herramienta de más de 4 MB ahora se bloquea por defecto;
ZN_ALLOW_TRUNCATED=1lo permite. - Ocultación de secretos: los secretos partidos en varias líneas, usados como nombres de propiedad en la salida de una herramienta, en claves privadas OpenPGP, anidados en resultados de LangChain o en más formas de URL de conexión ahora se ocultan, tanto en el paquete de npm como en el de Python. Una prueba ahora oculta textos aleatorios de claves falsas con ambos paquetes y falla si cualquiera de los dos deja una clave en la salida.
- Más comprobaciones del guardián de Python: ahora lee las cadenas dentro de dataclasses, modelos de pydantic y otros objetos, bloquea los argumentos que no puede leer por completo (un generador, por ejemplo, porque comprobarlo lo consumiría), decodifica Base64 sin relleno
=y comprueba y oculta el mensaje de un error lanzado por una herramienta, porque los frameworks de agentes envían ese mensaje al modelo. La integración con LangChain admitelangchain-core1.3.3 y posteriores; las versiones anteriores tienen un aviso de seguridad de gravedad alta conocido. - Auditoría, bóveda y gateway: el cifrado del registro de auditoría toma cada nonce de un generador aleatorio inicializado por el sistema operativo, y los registros cifrados existentes se actualizan la primera vez que la bóveda de auditoría se abre con su clave. Un error de la bóveda ya no cita texto descifrado.
zn auditya no muestra el valor que sigue a una opción de credencial como nombre de paquete de un servidor MCP de npx.zn-gate init --revertrestaura solo la copia de seguridad más reciente junto a la configuración y omite las copias que son enlaces o están en otra carpeta, de modo que un repositorio ya no puede redirigir una restauración a tu propia configuración MCP. El gateway experimental actualiza rustls-webpki, webpki-root-certs y wasmtime (RUSTSEC-2026-0378, -0379, -0382 y -0383).
- Archivos de instrucciones: los hooks de los agentes preguntan antes de que un agente escriba en los archivos donde guarda su memoria y sus instrucciones permanentes (
MEMORY.md,AGENTS.md,CLAUDE.md,.cursorrulesy similares), porque los agentes los leen en sesiones posteriores. En modo estricto la escritura se rechaza, yhooks.agentInstructionWrites: "off"desactiva la pregunta. Leer estos archivos nunca se bloquea. Los agentes que no pueden preguntar (Codex CLI, Gemini CLI, OpenCode y las herramientas de archivos de Cursor) conservan sus propias reglas de aprobación.
- Más formas de escribir comandos: una descarga canalizada a un shell o a
Invoke-Expressionahora también se detecta cuando se escribe con comillas ANSI-C ($'...') o con escapes de acento grave de PowerShell dentro de una palabra. El texto que solo se imprime, como enecho $'curl ... | sh', sigue permitido.
¿Qué cambió en el vault y en zn Team?
- Marcadores de secreto en los argumentos (cambio incompatible):
zn runy los hooks del agente ya no rellenan un marcador de secreto escrito en los argumentos de un comando, porque los argumentos aparecen en la lista de procesos y en los registros de la línea de comandos. Guarda el secreto para el programa (zn secret set PGPASSWORD --command psql) y luego ejecutazn run --secrets PGPASSWORD -- psql "postgres://user@db/app", dondepsqllee la variable por sí mismo. Un marcador en un archivo de entorno que carga tu shell (un.envque oculta otro) se sigue rellenando.secrets_http_requestahora envía solo los secretos guardados en modoproxy: cambia el modo de un secreto conzn secret allow NAME --mode proxysi una API lo necesita. - Las aprobaciones siguen al valor: una aprobación de primer uso ahora pertenece al valor para el que se dio. Eliminar un secreto borra sus aprobaciones, y sustituir un valor vuelve a preguntar. Las aprobaciones guardadas por la 1.13.x y anteriores no llevan identificador y no cuentan, así que tras actualizar cada secreto pregunta una vez más la primera vez que un comando lo usa.
- Valores cortos: el vault ya no acepta un secreto nuevo de menos de 8 caracteres, porque un valor así no se distingue del texto normal. Un valor corto guardado por una versión anterior sigue funcionando.
- Quién puede pedir un valor: el enmascaramiento ahora se ejecuta dentro del daemon del vault, y cada petición de un valor indica un destino o una finalidad que el daemon comprueba con lo que guarda. Una petición sin contexto se rechaza y se anota en el registro de auditoría. Un programa que pueda hablar con el daemon aún puede pedir un secreto guardado por su nombre en un contexto que le corresponda: el modelo de amenazas explica qué detiene esto y qué no.
- Windows y scripts no seguros: el vault establece permisos explícitos solo para el propietario en sus carpetas, la clave de sesión y la tubería del daemon, y no arranca si no puede verificarlos.
zn runse niega a entregar valores secretos a un script en el que otros pueden escribir o que está en una carpeta en la que otros pueden escribir. - Reset y purge:
zn vault resetconserva una copia de seguridad cifrada e indica dónde está. El nuevozn vault purgeelimina un vault de forma definitiva: enumera todos los archivos, pide confirmación (nunca a un agente de IA) y comprueba que no quede ninguno.zn-gate uninstallahora elimina también las copias de seguridad y los mapas de tokens. - Comprobación del registro de auditoría: el vault desbloqueado ahora comprueba todo el registro de auditoría (la firma de cada registro, la cadena y el último registro que recuerda) antes de que
zn vault loglo muestre,zn vault log export --otlplo exporte ozn team synclo suba, y antes de añadirle algo. Hasta ahora solo se comparaba el último registro. El vault también compara el registro con el último registro que recuerda, por número de secuencia y firma, antes de desbloquearse y antes de cada escritura, y los registros de auditoría se vuelcan a disco al escribirse. Si una comprobación falla, el registro no se muestra, exporta ni sube, el vault guarda una advertencia que sobrevive al bloqueo y desbloqueo, yzn vault verifyfalla hasta que aceptes el registro conzn vault verify --acknowledgeen tu propia terminal. Límites: con el vault bloqueado,zn vault logyzn vault log export --otlpno pueden comprobar la cadena y lo indican; no se detecta la restauración de unsecrets.agemás antiguo, con o sin suaudit.jsonlmás antiguo; y si el proceso del vault se termina a la fuerza, los registros escritos desde su último guardado (hasta un minuto) pueden cortarse sin aviso. Cuando el vault se desbloquea tras un apagado incorrecto y se hace cargo de registros de auditoría que aún no tenían punto de control, escribe un registrowarn, de modo que cada fallo se ve enzn vault log. - Política de zn Team:
zn team syncrechaza una segunda política firmada que tenga la misma versión pero distinto contenido, y una sincronización que empezó antes de que dejaras un equipo ya no puede aplicar su respuesta. Cuando una nueva versión de la política relaja una restricción,zn team statusenumera lo que cambió, el registro de auditoría lo anota y Claude Code lo avisa una vez. - Unirse y salir de zn Team:
zn team joinya no sube los registros de auditoría escritos antes de que te unieras;--include-historylos añade, solo en la primera unión.zn team joinyzn team syncterminan con código 1 cuando la política no se aplicó, yzn team leaveavisa primero al servidor e indica qué respondió.zn team jointambién se detiene, sin enviar nada, cuando no se puede leer el registro de auditoría local. - Detectores del equipo: los detectores personalizados de la organización ya no se pierden cuando se borra o edita
~/.zn/team.jsono la copia de la política:zn team syncyzn team statuslos restauran desde el vault.
¿Qué más hay de nuevo?
- El paquete de Node.js tiene el mismo guardián de herramientas que el de Python:
checkToolCallyguardTool. También incluye tipos de TypeScript. zn vault resetes la salida cuando olvidas la contraseña de la bóveda. Solo se ejecuta en tu propio terminal, te pide escribir una frase de confirmación y antes guarda la bóveda anterior en una carpeta de copia de seguridad.zn team managed-configmuestra los ajustes gestionados que un administrador despliega con la gestión de dispositivos para que los hooks se ejecuten en cada máquina de desarrollo. No escribe nada.- Cuando un hook bloquea algo u oculta un secreto,
zn-gate evidenceahora lo muestra como un evento (nunca un valor, comando, ruta ni texto de prompt). - Ejemplos ejecutables para CrewAI, LlamaIndex, el OpenAI Agents SDK, Pydantic AI, Google ADK y Haystack. Cada uno comprueba la salida de una herramienta antes de que la lea el modelo, se ejecuta en local con páginas inventadas y no necesita clave de API. Consulta Frameworks.
- Una referencia de línea de comandos enumera todos los comandos de
zn-gate, y una guía de actualización explica qué hacer tras cada actualización. - Cada versión incluye ahora una lista de materiales de software para los paquetes de npm y Python.
zn-gate scanya no termina con código 0 cuando su resultado no cubre todos los archivos que debería haber leído. Termina con 3 cuando no se leyó ningún archivo o cuando se omitió un archivo o carpeta (de 2 MiB o más, ilegible, que no es un archivo normal). Los hallazgos siguen terminando con 1, y--allow-partialmantiene el código 0 cuando solo se omitieron algunos archivos. Los trabajos de CI que ejecutanzn-gate scanpueden ver este nuevo código de salida.- Los hooks arrancan más rápido en Node.js 22.1 y posteriores, y el paquete de Python ya declara Python 3.14. Los hooks también cargan el código que ejecuta otros programas solo cuando lo necesitan, y comprobar si hay caracteres ocultos en una salida de herramienta muy grande es más rápido cuando no hay ninguno.
- El scrubber detecta más formas de pegar un secreto: valores entre comillas invertidas, JSON con comillas escapadas copiado de registros,
setx NAME value, asignaciones de PowerShell yNAME=value comando. zn-gate uninstallelimina zn-gate en un solo paso. Muestra lo que encontró (el plugin de Claude Code, los hooks de zn para cada agente y los servidores MCP envueltos coninit --wrap-mcp), te pide confirmar en tu propio terminal, lo elimina y ejecutazn-gate check. La bóveda solo se borra si lo confirmas por separado, y--dry-runmuestra la lista sin cambiar nada. Los agentes no pueden ejecutarlo por ti: como los demás comandos que cambian tu configuración, necesita que lo ejecutes tú en tu propio terminal. Consulta Eliminar zn-gate.- Hooks para el framework pre-commit:
zn-gate-scanejecutazn-gate scanyzn-auditejecutazn auditen tu repositorio antes de cada commit. Requieren Node.js 18 o posterior. zn auditahora lee los archivos de instrucciones que los agentes cargan a través de otro archivo (las importaciones@pathenCLAUDE.mdy las rutasinstructionsdeopencode.json), encuentra archivos de agentes cuyos nombres solo difieren en mayúsculas y minúsculas, informa de un archivo de agente que no puede leer y dice "not checked" en lugar de "No findings" cuando no encontró nada que leer para un agente. También da menos falsos positivos: los permisos acotados de Claude Code comoBash(git status:*), los pasos de configuración normales como copiar.env.examplea.envy la documentación dentro de unSKILL.mdya no se notifican como riesgos.zn-gate checkyzn-gate statusreconocen las instalaciones gestionadas (los ajustes gestionados de Claude Code, los hooks de empresa de Cursor y elrequirements.tomlde Codex) y nombran el archivo. También avisan, sin bloquear, cuando tu Node.js ha llegado al fin de su vida útil (18 y 20) o es anterior a la versión con parches de su línea. El plugin de Claude Code ahora requiere Node.js 20.19 o posterior; zn-gate y los hooks de zn siguen funcionando en Node.js 18 y posteriores.- En Python,
guarded_toolahora analiza por defecto la salida de una herramienta en busca de inyección de prompts (pasacheck_result=Falsepara mantener el comportamiento anterior), nombra los objetivos bloqueados comotool:<name>y también funciona con herramientas asíncronas. Nuevos hooks nativos cubren Google ADK, el OpenAI Agents SDK y Pydantic AI, incluidas las herramientas que estos frameworks aportan por sí mismos, como los servidores MCP. El paquete incluye información de tipos (py.typed). - Más ejemplos ejecutables: AG2, DSPy, LangChain.js, Mastra, OpenAI Agents SDK (JavaScript), Vercel AI SDK, smolagents y Semantic Kernel.
- Los errores de la bóveda, del llavero y de connect ahora dicen qué ocurrió y un siguiente paso, en palabras sencillas. El detalle técnico solo aparece con
ZN_VERBOSE=1oDEBUG=zn;DEBUG=*ya no lo activa.zn unlockyzn vault statusmuestran cuándo se bloquea la bóveda en tu hora local, yzn-gate -vimprime la versión en el paquete de Python. Los servidores MCP locales de zn admiten versiones del protocolo hasta 2025-11-25 y las descripciones de sus herramientas dicen cuándo llamarlas. El paquete de npm es más pequeño: unos 1,0 MB de descarga en lugar de 1,6 MB.
zn auditinforma de un archivo de instrucciones con una serie de 40 o más líneas vacías seguida de más texto (nueva regla ZNA021, media), porque ese texto queda fuera de la vista de quien lo revisa. Las reglas locales también leen una serie larga de líneas vacías como una sola, de modo que el texto tras el relleno se comprueba junto con el texto anterior.zn auditya no marca el texto que solo comentacurl | shcomo un riesgo, ni un marcador como<system-or-project>en las notas de una skill.
¿Qué más se ha corregido?
- Un prompt bloqueado por contener un secreto ahora nombra la credencial cuando el texto muestra su nombre, por ejemplo
DB_PASSWORD. El valor nunca se muestra. zn env shadowmueve a la bóveda una URL de conexión completa cuando su contraseña es corta.- OpenCode en Windows con PowerShell como shell envuelve correctamente un comando con un marcador
__ZN_NAME__. - El registro de evidencias ya no pierde un registro cuando varios programas escriben a la vez, también en Windows.
--helpfunciona enzn unlock,zn lock,zn vaultyzn team. Enzn hooks,zn secretyzn env, pídela a un subcomando:zn hooks install --help,zn secret set --helpyzn env shadow --help.- Un servidor MCP lento o bloqueado ya no retrasa a tus otros servidores, y un servidor WebSocket caído se vuelve a conectar.
- Un comando con varias tuberías Base64 (
echo ... | base64 -d) ahora se revisa tubería por tubería. Antes solo se decodificaba la primera, así que una primera tubería inofensiva podía ocultar un comando bloqueado en otra posterior. Se bloquea si hay más de 16 tuberías o más de 128 KiB de datos decodificados. - El hook de Antigravity ahora responde con los pasos para repararlo cuando falta Node.js o el hook no puede arrancar: instala zn-gate y ejecuta de nuevo
zn hooks install antigravity. Antes, Antigravity no recibía una respuesta utilizable. - El shield de MCP revisa las claves del contenido estructurado de un servidor igual que sus valores, así que una instrucción colocada en una clave ya no llega al agente.
- Antigravity: el hook ahora bloquea las escrituras en un archivo
.envque contiene secretos en texto plano, como dicen los documentos, y pregunta antes de una búsqueda recursiva de shell (grep -r,rg) en una carpeta que contiene uno. En Windows ahora arranca: el comando del hook ya no depende de comillas, que Antigravity no usa, así que una ruta de Node.js con espacios ya no lo rompe. Vuelve a ejecutarzn hooks install antigravitypara sustituir un hook existente. - Gateway experimental: una acción ya denegada ya no se aprueba, una aprobación solo se puede usar una vez y un bloqueo dura hasta que caduca. Las aprobaciones pendientes caducan por defecto a los 15 minutos, y un mensaje de WebSocket de más de 1 MiB cierra la conexión por defecto. Con AWS KMS mantiene la misma clave de datos entre reinicios, y se niega a arrancar, salvo que permitas un respaldo, cuando no se puede obtener la clave de KMS. Su scrubber ahora coincide con el de Node.js en los miembros JSON, las cabeceras
Authorizationy los números de tarjeta que siguen a un candidato rechazado. zn-gate scanahora lee las carpetastest,testsy__tests__en los dos paquetes, porque los datos de prueba pueden contener secretos reales, y ambos omiten las mismas carpetas. El scan de Python enumera una carpeta que no puede leer, como hace el de Node.js, y las rutas se muestran limpias cuando se llega a la carpeta analizada a través de un enlace.
Una versión cada semana
A partir de la 1.14, zn-gate se publica con un calendario semanal: una versión más grande cada semana en lugar de muchas pequeñas. Unos días antes de cada versión sale una candidata a versión (RC) (etiqueta next de npm y una versión preliminar en PyPI), para que puedas probarla pronto. Solo publicamos fuera de este calendario por una corrección de seguridad alta o crítica o por una instalación rota.
En nuestro horizonte
- Pedir confirmación antes de que un agente edite sus propios archivos de memoria e instrucciones (CLAUDE.md, AGENTS.md, skills).
- Detectar instrucciones ocultas en comentarios HTML dentro de skills y documentos.
- ZCode probado de principio a fin en macOS, y Antigravity en Windows y macOS.
- Las mismas reglas de comandos en el motor Rust que en los paquetes de Node y Python.
Preguntas frecuentes
¿Qué novedades trae zn-gate 1.14.0?
Hooks para Google Antigravity y la aplicación de escritorio ZCode, ahora agentes admitidos, y hooks experimentales para Gemini CLI y GitHub Copilot CLI. Más comprobaciones en Codex CLI (llamadas a herramientas MCP, solicitudes de permiso y la respuesta final). zn-gate scan y zn audit encuentran claves y contraseñas escritas en texto plano en las configuraciones de servidores MCP. Correcciones del vault y de zn Team: un marcador de secreto en los argumentos de un comando ya no se rellena, las aprobaciones siguen al valor para el que se dieron y la sincronización de políticas de zn Team es más estricta. Una corrección del guardián de herramientas de Python, que omitía los valores anidados a más de unos ocho niveles. Un guardián de herramientas y tipos de TypeScript para el paquete de Node.js, zn vault reset, zn team managed-config y ejemplos para CrewAI, LlamaIndex, el OpenAI Agents SDK, Pydantic AI, Google ADK y Haystack.
¿Cómo actualizo a zn-gate 1.14.0?
En npm esta versión se publica como 1.14.1: ejecuta npm install -g zn-gate@1.14.1 para el paquete de Node y pip install -U zn-gate para el de Python. Después vuelve a ejecutar npx -y zn-gate@1.14.1 hooks install <agent> para cada agente que uses (por ejemplo hooks install codex) para añadir los hooks nuevos; npx -y zn-gate@1.14.1 check te dice qué agentes lo necesitan. Si usas el plugin de Claude Code, ejecuta claude plugin update zn-gate@usezn e inicia una sesión nueva; requiere Claude Code 2.1.295 o posterior.
¿Están Antigravity y la aplicación de escritorio ZCode admitidos y están terminados los hooks de Gemini CLI y Copilot CLI?
Antigravity y la aplicación de escritorio ZCode son agentes admitidos, lo que hace seis con Claude Code, Codex CLI, Cursor y OpenCode. Sus hooks bloquean la lectura y la escritura de archivos secretos por ruta y los comandos de shell que manejan secretos, pero no pueden reescribir la salida de las herramientas, así que allí las líneas coincidentes y la salida de los comandos no se ocultan. Un secreto pegado en el prompt no se bloquea en Antigravity; ZCode sí lo bloquea. ZCode ignora los hooks de un proyecto, así que no tiene instalación por proyecto. Probado de extremo a extremo en la aplicación de escritorio oficial de ZCode 3.16.3 en Linux x64 (octubre de 2026). Las mismas comprobaciones se superaron en Windows x64 (Windows Server 2022, misma versión de la aplicación, octubre de 2026), con un administrador y con un usuario estándar, a través del agente que incluye la aplicación; no se manejó la ventana de la aplicación de Windows. macOS no se ha probado. Los hooks de Gemini CLI y Copilot CLI son experimentales: los de Gemini CLI no pueden pedir confirmación, los de Copilot CLI no pueden bloquear un prompt escrito y Copilot deja pasar una llamada cuando un hook agota el tiempo, así que zn, que fija un tiempo límite de 15 segundos en sus hooks, bloquea la propia llamada a los 11 segundos. zn-gate check indica si cada hook está instalado.
¿Tengo que cambiar algo por el vault y zn Team?
Sí, en dos casos. Si un comando que ejecutas con zn run o con los hooks del agente lleva un marcador de secreto como __ZN_DB_PASSWORD__ en sus argumentos, ahora se rechaza, porque los argumentos aparecen en la lista de procesos y en los registros de la línea de comandos: guarda el secreto para el programa (zn secret set PGPASSWORD --command psql) y ejecuta en su lugar zn run --secrets PGPASSWORD -- psql. Y las aprobaciones guardadas por la 1.13.x y anteriores ya no cuentan, así que zn pregunta una vez más, la primera vez que un comando usa cada secreto después de actualizar. Nada más requiere cambios.
¿Me afecta la corrección del guardián de herramientas de Python?
Afecta al paquete de Python, versión 1.13.1 y anteriores, si usas el guardián de herramientas (guard, guarded_tool o check_tool_call) con argumentos o resultados que pueden estar muy anidados. Los valores anidados a más de unos ocho niveles se dejaban pasar sin comprobar. Desde la 1.14.0 se bloquean con el motivo "nested too deeply to check". Actualiza con pip install -U zn-gate.
¿Necesito una cuenta para usar zn-gate 1.14.0?
No. zn-gate sigue sin necesitar cuenta y por defecto no envía nada. La comprobación opcional en la nube sigue desactivada hasta que ejecutes zn-gate connect.
La lista completa de cambios está en las notas de la versión 1.14.0. zn-gate es MIT, se ejecuta en local y no necesita cuenta: empieza con npx -y zn-gate scan --include-home o consulta Instalación para cada agente.