Saltar al contenido
Menú
¿Lo necesito?Lo que un agente puede alcanzar en tu máquinaCómo funcionaLas capas entre el agente y tu sistemaCompararSandboxes integrados, Docker y VMsConfigurarAbre solo lo que la tarea necesitaSeguridadEl modelo de amenazas y sus límitesDescargarBinarios, checksums y notas de la versiónInstalar
Instalar

Instálalo, mira dentro, ejecuta tu agente

ai-jail es un solo programa, sin daemon y sin root. Lo instalas, pones su nombre delante del comando que ya escribes y el agente arranca dentro de un sandbox.

Para la persona que está al teclado.

Instalar

Elige la forma en que ya instalas tus herramientas de línea de comandos. Todos los métodos te dan el mismo y único programa ai-jail.

terminal
brew tap akitaonrails/tap && brew install ai-jail

Funciona en macOS y en Linux.

Lo que necesita tu sistema

Linux

Instala bubblewrap, el pequeño programa que ai-jail usa para construir el sandbox. La mayoría de las distribuciones lo empaquetan como bubblewrap.

terminal
pacman -S bubblewrapapt install bubblewrapdnf install bubblewrap

macOS

No hay nada que instalar. ai-jail usa sandbox-exec, que viene con macOS. Apple marca esa interfaz como obsoleta. En macOS los registries de paquetes no son accesibles por defecto: añade uno con --allow-host, o abre la red con --network.

Windows

No está soportado. Usa WSL2 y sigue dentro de él los pasos de Linux.

Tu primera ejecución

Tres comandos: un plan, un vistazo dentro, un agente funcionando. El login ya está dentro, y ai-jail abre por ti la ruta al host de la API del agente.

↔ Desliza hacia un lado para ver el diagrama completo

Tu directorio home se queda fuera en cada paso, y el login del agente está dentro desde el principio. En el último, ai-jail abre el host de la API del propio agente; en Linux, las toolchains también alcanzan los registros de paquetes. Todo lo demás sigue cerrado.
  1. Mira el plan sin ejecutar nada

    Ve a tu proyecto y pide un dry run, una simulación. ai-jail imprime el comando de sandbox que usaría y termina. Un dry run nunca escribe un archivo.

    dry run
    cd ~/Projects/my-appai-jail --dry-run claude
  2. Echa un vistazo dentro

    Arranca una shell simple en la jaula. Tu proyecto está ahí, en su ruta real, y puedes editarlo. Tu directorio home es uno nuevo, y los tokens de tu shell ya no están. Escribe exit para salir.

    una shell en la jaula
    ai-jail bash
  3. Ejecuta el agente

    ai-jail monta por defecto la carpeta de estado del propio agente, así que ya tiene la sesión iniciada. Cuando conoce al agente, también deja pasar el host de la API del propio agente por su proxy filtrado: api.anthropic.com para Claude Code, api.openai.com y chatgpt.com para Codex, generativelanguage.googleapis.com para Gemini, api.x.ai para Grok, server.codeium.com para Devin, en Linux y en macOS. Los hosts de telemetría siguen cerrados. En Linux, las toolchains alcanzan por defecto registries de paquetes como crates.io, npm y PyPI, así que las compilaciones funcionan. --network abre en cambio toda la red.

    la ejecución real
    ai-jail claude# o, con toda la red abierta:ai-jail --network claude
  4. Cuando necesites más

    Pon una lista de hosts en ~/.ai-jail, tu propio archivo de configuración, bajo el nombre del agente. La lista se suma al host de la propia API del agente, que sigue permitido, y en Linux github.com y los registries de paquetes ya están dentro. O usa --network para toda la red. Para una ejecución sin sesión, pasa --no-agent-state. Un archivo .ai-jail dentro del proyecto solo puede endurecer la jaula: puede recortar la lista de hosts o la lista forward_ports y apagar el login, nunca lo contrario, así que un repositorio que clones no puede abrir la jaula por su cuenta.

    ~/.ai-jail
    [commands.claude]allow_hosts = ["api.example.com"]# se suma al host de la API y a los registries que ai-jail ya permite # o, para una sola ejecución:# ai-jail --network claude

Lo que verás dentro

El prompt cambia a (jail) y el proyecto está donde siempre estuvo. Tus toolchains también están ahí, en solo lectura. Falta lo que vale la pena robar, salvo el login del propio agente, que está ahí a propósito.

ai-jail bash, en Linux
$ ai-jail bash# el proyecto está en su ruta real(jail) ~/Projects/my-app $ pwd/home/you/Projects/my-app# un token exportado en tu shell no vino contigo(jail) ~/Projects/my-app $ echo $GITHUB_TOKEN # tus claves no están en este home(jail) ~/Projects/my-app $ cat ~/.ssh/id_ed25519cat: /home/you/.ssh/id_ed25519: No such file or directory# la jaula tiene su propio hostname(jail) ~/Projects/my-app $ hostnameai-sandbox

Esta es una sesión de Linux. macOS no tiene forma de construir un árbol de archivos aparte, así que ahí las mismas rutas existen y se deniega su lectura.

↔ Desliza hacia un lado para ver el diagrama completo

Desde dentro, el proyecto es lo único tuyo que puedes cambiar. Tus toolchains (mise, cargo, npm y otras) están ahí, en solo lectura, con una caché de dependencias propia de la jaula. La red se queda fuera, salvo el host de la API del propio agente conocido y, en Linux, los registries de paquetes de los que esas toolchains descargan, hasta que abras un host con --allow-host, un puerto local con --forward-port o toda la red con --network. Cómo se mapean las toolchains.

Cuando la jaula bloquea algo

Todo lo que el agente arranca corre dentro con él, así que lo bloqueado falla, y nada te pregunta. Así se ve, y así puedes comprobarlo.

  • Un archivo fuera del proyecto no está. En Linux la ruta no existe; en macOS existe y se deniega su lectura.
  • Un host fuera de la lista no se puede alcanzar: la conexión falla. --allow-host HOST lo añade para la siguiente ejecución.
  • Una variable de tu shell está vacía dentro, salvo que la pases con --env NAME o --env-from-file.
  • Para ver qué se denegó, añade --audit-log: registra cada arranque y cada conexión que el proxy permitió o denegó. ai-jail --audit-show lo imprime.
  • Para mirar tú mismo, ai-jail bash abre una shell dentro de la misma jaula.

Lo que abrirás el primer día

Instalaciones

En Linux funcionan tal cual: los registries y github.com están en la lista por defecto. En macOS añade uno, --allow-host registry.npmjs.org, o ábrelo todo con --network.

Servicios locales

Una base de datos, un servidor MCP local o el socket de un editor en el loopback de tu máquina: --forward-port 5432 reenvía ese único puerto en Linux. En macOS, --network.

Git push

Clonar y hacer pull desde GitHub funciona en Linux. Un push necesita una credencial: --github para tu token de gh por HTTPS (en macOS añade --allow-host github.com), o --network --ssh para tu clave SSH.

Servidores MCP

Arrancan dentro de la jaula con el agente. Uno que lee un token de tu shell no recibe nada hasta que se lo pases, --env GITHUB_TOKEN o --env-from-file. Uno remoto por HTTP necesita su host en --allow-host.

Si no arranca

Estos son los casos que cubre la sección de problemas del README, más las dos reglas de configuración con las que la gente tropieza.

bwrap: setting up uid map: Permission denied

Ubuntu 24.04 y posteriores y Debian 13 y posteriores traen una política de AppArmor que impide a los programas crear user namespaces sin root, que es como bubblewrap aísla la jaula. Afecta a todas las herramientas sin root de este tipo. Relájala para todo el sistema:

terminal
echo 'kernel.apparmor_restrict_unprivileged_userns=0' \  | sudo tee /etc/sysctl.d/60-userns.confsudo sysctl --system

O conserva la política y exime solo a bwrap. Guarda esto como /etc/apparmor.d/bwrap y luego ejecuta sudo apparmor_parser -r /etc/apparmor.d/bwrap.

/etc/apparmor.d/bwrap
abi <abi/4.0>,include <tunables/global>profile bwrap /usr/bin/bwrap flags=(unconfined) {  userns,}

Tu BWRAP_BIN es rechazado

Puedes apuntar ai-jail a un bubblewrap concreto con BWRAP_BIN. ai-jail lo acepta solo cuando resuelve a un programa propiedad de root que otros usuarios no pueden escribir, o a uno en un /nix/store multiusuario estándar. Rechaza una copia en tu propio home, porque quien pueda reemplazar ese archivo controla la jaula.

opencode se queda colgado en Starting background server

opencode 2.x habla con un servidor en segundo plano compartido. La jaula es un wrapper de un solo uso con un home nuevo, así que ese servidor no sobrevive entre ejecuciones. Arranca opencode de forma autónoma con --standalone, y fíjalo en tu configuración para no escribirlo cada vez. ai-jail avisa al arrancar cuando opencode se inicia sin él:

~/.ai-jail
[commands.opencode]command = ["opencode", "--standalone"]

Failed to create stream fd al arrancar

Viene de un script de inicio de sesión de Ubuntu desktop durante la preparación de mise. Es inofensivo y mise sigue funcionando. Pasa --no-mise para omitir la preparación de mise y, con ella, el mensaje.

terminal
ai-jail --no-mise claude

Por agente

ai-jail sabe dónde guarda su login cada agente y lo monta por defecto: solo las carpetas del agente que arrancas, y solo si existen. --no-agent-state lo apaga. Si está definida en tu shell, la variable con la clave de API de ese agente también entra: ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY o GOOGLE_API_KEY, XAI_API_KEY, MOONSHOT_API_KEY.

Mostrar la tabla por agente
EjecutasMontado por defectoConviene saber
ai-jail claude~/.claude
~/.claude.json
Para un segundo perfil de Claude, apunta --claude-dir a su directorio.
ai-jail codex~/.codexDespués de redimensionar la ventana, ai-jail envía a Codex una tecla de redibujado. En macOS, fuera de lockdown, Codex recibe un ps shim privado; con el estado del agente activado, recibe también los servicios limitados que necesita su app server. --no-agent-state elimina esos servicios, no el shim.
ai-jail gemini~/.gemini
ai-jail opencode~/.config/opencode
~/.local/share/opencode
Necesita --standalone. Mira el punto de arriba en "Si no arranca".
ai-jail antigravity~/.geminiComparte su login de Google con Gemini, así que una sola sesión sirve para los dos.
ai-jail kimi~/.kimi~/.kimi-code, la ubicación antigua, también se monta cuando existe.
ai-jail kiro-cli~/.kiro
~/.local/share/kiro-cli
En macOS la segunda carpeta es ~/Library/Application Support/kiro-cli en su lugar.
ai-jail prime-agent~/.prime/agentSolo la carpeta del propio agente, nunca todo ~/.prime.
ai-jail devin~/.local/share/devin
~/.config/devin
La instalación propia del CLI bajo devin/cli/_versions se queda en solo lectura. Actualiza Devin en el host y después abre una sesión nueva.
ai-jail ai-memory run claudeLas carpetas del agente lanzadoai-jail reconoce al agente que lanza ai-memory y aplica los ajustes de ese agente, con ambos programas en una sola jaula.

Lo mismo funciona para crush, grok, jcode, pi, aider, soulforge y omp. Cualquier otro comando también corre, con la misma jaula y sin carpeta de login. ai-jail abre el host de la API por defecto para los cinco agentes del paso 03; los demás agentes necesitan --allow-host o --network.

Pon a tu agente tras las rejas

ai-jail es un único binario que no necesita daemon ni root. Añades una palabra delante del comando que ya usas.

terminal
brew tap akitaonrails/tap && brew install ai-jailai-jail claude