# write_claude_jupyter_rules
# ----------------------------
# Genera .claude/CLAUDE.md con reglas para agentes que trabajan con Jupyter.
# Si ya existe CLAUDE.md y no tiene las reglas, las prepend.
#
# USO (sourced):
#   source write_claude_jupyter_rules.sh
#   write_claude_jupyter_rules /path/to/project

write_claude_jupyter_rules() {
    local project_dir="${1:-.}"
    local claude_dir="${project_dir}/.claude"
    local claude_md="${claude_dir}/CLAUDE.md"

    mkdir -p "$claude_dir"

    # Si ya tiene las reglas, no hacer nada
    if [ -f "$claude_md" ] && grep -q "JUPYTER HABILITADO" "$claude_md" 2>/dev/null; then
        echo "$claude_md"
        return 0
    fi

    local rules
    rules='# JUPYTER HABILITADO EN ESTE ANALISIS

## Reglas OBLIGATORIAS para Claude

### 1. CODIGO INMUTABLE — NUNCA MODIFICAR CELDAS EXISTENTES
- **PROHIBIDO** usar NotebookEdit para reemplazar celdas existentes
- **SIEMPRE** anadir celdas NUEVAS al final del notebook
- Si hay un error en una celda, crear celda nueva con la correccion
- El historial de trabajo debe quedar intacto para trazabilidad

### 2. PROGRAMACION FUNCIONAL OBLIGATORIA
- **Funciones puras**: sin efectos secundarios, mismo input -> mismo output
- **Inmutabilidad**: nunca mutar datos, crear copias transformadas
- **Composicion**: funciones pequenas que se combinan
- Preferir: `map`, `filter`, `reduce`, list comprehensions
- Evitar: loops con mutacion, `global`, modificar argumentos in-place

### 3. SIEMPRE usar MCP jupyter para ejecutar codigo Python
- Las ejecuciones se ven en tiempo real en Jupyter Lab del usuario
- Compartimos variables y estado del kernel
- **NUNCA usar bash para ejecutar Python en este analisis**

### 4. Verificar Jupyter activo ANTES de ejecutar
- Si no esta activo: pedir al usuario que ejecute `./run-jupyter-lab.sh`

### 5. Gestion de notebooks
- Notebooks en la carpeta `notebooks/` o subcarpetas
- Si un notebook tiene >50 celdas, crear uno nuevo
- Nombrar descriptivamente: `01_exploracion.ipynb`, `02_limpieza.ipynb`

### 6. Gestion de Python
- **SIEMPRE usar `uv`** para gestionar dependencias
- Anadir paquetes con `uv add nombre_paquete`

### 7. Acceso al fn_registry
- `FN_REGISTRY_ROOT` apunta a la raiz del registry
- Para importar funciones Python: `sys.path.insert(0, os.path.join(os.environ["FN_REGISTRY_ROOT"], "python", "functions"))`
- Para consultar registry.db: `sqlite3` o `import sqlite3` con la ruta `$FN_REGISTRY_ROOT/registry.db`

'

    if [ -f "$claude_md" ]; then
        local existing
        existing=$(cat "$claude_md")
        printf '%s\n%s' "$rules" "$existing" > "$claude_md"
    else
        echo "$rules" > "$claude_md"
    fi

    echo "$claude_md"
}
