Files
agents_and_robots/dev/issues/completed/0020-claude-code-sandbox.md
T
egutierrez 9045d5a214 chore: cerrar issue 0020 y mover a completed
Todas las tareas del issue implementadas: default seguro con tmpdir,
configuracion de agentes existentes, tests unitarios y documentacion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:48:34 +00:00

4.5 KiB

0020 — Aislar ejecucion de claude -p del repositorio

Objetivo

Evitar que el subproceso claude -p ejecutado por los agentes tenga acceso al repositorio del proyecto. Actualmente working_dir esta vacio y hereda el directorio de trabajo del launcher (raiz del repo), con permission_mode: bypassPermissions, dando acceso total de lectura/escritura al codigo fuente.

Contexto

  • El provider claude-code ejecuta claude --print como subproceso en shell/llm/claudecode.go
  • Cuando WorkingDir esta vacio (linea 76-78), cmd.Dir no se asigna y hereda el CWD del launcher
  • Ambos agentes (assistant-bot, asistente-2) tienen working_dir: "" y permission_mode: "bypassPermissions"
  • Ya existe storage.base_path para aislar datos de runtime, pero no aplica al CWD de claude -p
  • Issue 0019 endurece prompts y tools, pero no cubre el aislamiento del proceso claude -p

Arquitectura

shell/llm/claudecode.go                  — aplicar working_dir por defecto si esta vacio
internal/config/schema.go                — documentar el default de working_dir
agents/assistant-bot/config.yaml         — configurar working_dir y permission_mode
agents/asistente-2/config.yaml           — configurar working_dir y permission_mode

Patron pure core / impure shell

  • pkg/ — sin cambios
  • shell/llm/claudecode.go — cambio impuro: default de working_dir cuando esta vacio
  • agents/ — cambio de configuracion en los YAML de ambos agentes

Tareas

Fase 1: Default seguro en claudecode.go

  • 1.1 En NewClaudeCodeComplete, si cfg.WorkingDir esta vacio, usar un directorio temporal aislado (e.g. os.MkdirTemp("", "claude-agent-*")) en lugar de heredar el CWD del launcher
  • 1.2 Asegurar que el directorio temporal se crea antes de cada invocacion y se limpia despues (o reusar uno fijo por agente)
  • 1.3 Loguear a nivel WARN si WorkingDir esta vacio y se usa el default temporal, para que el operador lo note

Fase 2: Configurar agentes existentes

  • 2.1 En agents/assistant-bot/config.yaml, setear working_dir a un directorio fuera del repo (e.g. /tmp/claude-agents/assistant-bot)
  • 2.2 En agents/asistente-2/config.yaml, setear working_dir a /tmp/claude-agents/asistente-2
  • 2.3 Evaluar cambiar permission_mode de bypassPermissions a plan o al menos documentar el riesgo si se mantiene

Fase 3: Tests

  • 3.1 Test unitario: verificar que buildClaudeArgs no cambia (no afecta args)
  • 3.2 Test unitario: verificar que cuando WorkingDir == "", el cmd.Dir resultante NO es vacio (se asigna un dir temporal)
  • 3.3 Test unitario: verificar que cuando WorkingDir tiene valor, se usa ese valor

Fase 4: Cleanup y docs

  • 4.1 Documentar en docs/security.md la seccion de aislamiento de claude -p
  • 4.2 Actualizar .claude/rules/create_agent.md para recomendar siempre configurar working_dir
  • 4.3 Actualizar CLAUDE.md seccion de seguridad si aplica

Ejemplo de uso

# agents/assistant-bot/config.yaml — ANTES (inseguro)
claude_code:
  working_dir: ""                        # hereda CWD del launcher = raiz del repo
  permission_mode: "bypassPermissions"   # acceso total

# agents/assistant-bot/config.yaml — DESPUES (aislado)
claude_code:
  working_dir: "/tmp/claude-agents/assistant-bot"  # directorio aislado
  permission_mode: "bypassPermissions"              # aun tiene bypass, pero sin acceso al repo
# En logs al arrancar si alguien deja working_dir vacio:
{"level":"WARN","msg":"claude-code working_dir is empty, using temporary directory","dir":"/tmp/claude-agent-123456"}

Decisiones de diseno

  • Default temporal en vez de fallar: si working_dir esta vacio, mejor usar un tmpdir que romper el arranque. El WARN avisa al operador.
  • No forzar permission_mode: el cambio de bypassPermissions es una recomendacion, no un requisito de este issue. El aislamiento real viene del working_dir.
  • Dir por agente, no compartido: cada agente tiene su propio directorio para evitar interferencias entre sesiones.

Prerequisitos

  • Ninguno. El campo WorkingDir ya existe en el schema y en claudecode.go.

Riesgos

  • Claude sin contexto de archivos: al mover el CWD fuera del repo, claude -p no podra leer archivos del proyecto. Esto es el comportamiento deseado — los agentes son asistentes conversacionales, no necesitan acceso al codigo.
  • Directorio temporal no existe: os.MkdirTemp lo crea automaticamente. Si se usa un path fijo en config, hay que asegurar que exista o crearlo al arrancar.