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>
91 lines
4.5 KiB
Markdown
91 lines
4.5 KiB
Markdown
# 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
|
|
|
|
```yaml
|
|
# 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.
|