From 0f8f8457f6383e7cbc55428f20c49f31ca4f9393 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Thu, 26 Mar 2026 22:46:17 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20a=C3=B1adir=20reglas=20de=20inmutabilid?= =?UTF-8?q?ad=20y=20programaci=C3=B3n=20funcional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Actualiza JUPYTER_RULES en setup-jupyter.sh para incluir: - Regla 1: Código inmutable - prohibido modificar celdas existentes - Regla 2: Programación funcional obligatoria con ejemplos - Renumeración de reglas existentes (3-7) Estas reglas se aplicarán a todos los repos inicializados con /init-jupyter --- .claude/skills/init-jupyter/setup-jupyter.sh | 43 +++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/.claude/skills/init-jupyter/setup-jupyter.sh b/.claude/skills/init-jupyter/setup-jupyter.sh index 2e92ba6..08981b0 100755 --- a/.claude/skills/init-jupyter/setup-jupyter.sh +++ b/.claude/skills/init-jupyter/setup-jupyter.sh @@ -281,29 +281,62 @@ Este repositorio está configurado para exploración de datos con Jupyter + Clau ## Reglas OBLIGATORIAS para Claude -### 1. SIEMPRE usar MCP jupyter para ejecutar código Python +### 1. CÓDIGO INMUTABLE - NUNCA MODIFICAR CELDAS EXISTENTES +- **PROHIBIDO** usar NotebookEdit para reemplazar celdas existentes +- **PROHIBIDO** modificar o sobrescribir notebooks completos +- **SIEMPRE** añadir celdas NUEVAS al final del notebook +- Si hay un error en una celda → crear celda nueva con la corrección, NO editar la original +- El historial de trabajo debe quedar intacto para trazabilidad + +### 2. PROGRAMACIÓN FUNCIONAL OBLIGATORIA +- **Funciones puras**: sin efectos secundarios, mismo input → mismo output +- **Inmutabilidad**: nunca mutar datos, crear copias transformadas +- **Composición**: funciones pequeñas que se combinan +- **Sin estado global**: evitar variables globales mutables +- Preferir: `map`, `filter`, `reduce`, list comprehensions +- Evitar: loops con mutación, `global`, modificar argumentos in-place + +Ejemplo CORRECTO: +```python +# Función pura, sin efectos secundarios +def limpiar_columna(df, col): + return df.assign(**{col: df[col].str.strip().str.lower()}) + +# Composición de transformaciones +df_limpio = (df + .pipe(limpiar_columna, "nombre") + .pipe(limpiar_columna, "email")) +``` + +Ejemplo INCORRECTO: +```python +# Mutación directa - PROHIBIDO +df["nombre"] = df["nombre"].str.strip() +``` + +### 3. SIEMPRE usar MCP jupyter para ejecutar código 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 repo** -### 2. Verificar Jupyter activo ANTES de ejecutar +### 4. Verificar Jupyter activo ANTES de ejecutar ```bash pgrep -af "jupyter" | grep "$(pwd)" || cat .jupyter-port 2>/dev/null ``` - Si no está activo → pedir al usuario: "Ejecuta `./run-jupyter-lab.sh` en otra terminal" -### 3. Gestión de notebooks +### 5. Gestión de notebooks - **TODOS los notebooks van a la carpeta `notebooks/`** o subcarpetas dentro de ella - Si un notebook tiene >50 celdas → crear uno nuevo - Nombrar descriptivamente: `notebooks/01_exploracion.ipynb`, `notebooks/02_limpieza.ipynb` - Mantener notebooks enfocados en una tarea -### 4. Gestión de Python +### 6. Gestión de Python - **SIEMPRE usar `uv` para gestionar Python** (entornos, dependencias, etc.) - Añadir paquetes con `uv add nombre_paquete` - Nunca usar pip directamente si uv está disponible -### 5. Antes de código pesado +### 7. Antes de código pesado - Avisar al usuario - Usar `%%time` o `tqdm` para progreso