9045d5a214
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>
4.5 KiB
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-codeejecutaclaude --printcomo subproceso enshell/llm/claudecode.go - Cuando
WorkingDiresta vacio (linea 76-78),cmd.Dirno se asigna y hereda el CWD del launcher - Ambos agentes (
assistant-bot,asistente-2) tienenworking_dir: ""ypermission_mode: "bypassPermissions" - Ya existe
storage.base_pathpara 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 cambiosshell/llm/claudecode.go— cambio impuro: default de working_dir cuando esta vacioagents/— cambio de configuracion en los YAML de ambos agentes
Tareas
Fase 1: Default seguro en claudecode.go
- 1.1 En
NewClaudeCodeComplete, sicfg.WorkingDiresta 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
WorkingDiresta 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, setearworking_dira un directorio fuera del repo (e.g./tmp/claude-agents/assistant-bot) - 2.2 En
agents/asistente-2/config.yaml, setearworking_dira/tmp/claude-agents/asistente-2 - 2.3 Evaluar cambiar
permission_modedebypassPermissionsaplano al menos documentar el riesgo si se mantiene
Fase 3: Tests
- 3.1 Test unitario: verificar que
buildClaudeArgsno cambia (no afecta args) - 3.2 Test unitario: verificar que cuando
WorkingDir == "", elcmd.Dirresultante NO es vacio (se asigna un dir temporal) - 3.3 Test unitario: verificar que cuando
WorkingDirtiene valor, se usa ese valor
Fase 4: Cleanup y docs
- 4.1 Documentar en
docs/security.mdla seccion de aislamiento de claude -p - 4.2 Actualizar
.claude/rules/create_agent.mdpara recomendar siempre configurarworking_dir - 4.3 Actualizar
CLAUDE.mdseccion 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_diresta vacio, mejor usar un tmpdir que romper el arranque. El WARN avisa al operador. - No forzar permission_mode: el cambio de
bypassPermissionses una recomendacion, no un requisito de este issue. El aislamiento real viene delworking_dir. - Dir por agente, no compartido: cada agente tiene su propio directorio para evitar interferencias entre sesiones.
Prerequisitos
- Ninguno. El campo
WorkingDirya 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.MkdirTemplo crea automaticamente. Si se usa un path fijo en config, hay que asegurar que exista o crearlo al arrancar.