bf1efb2099
- Migration 007: repo_url on apps table + analysis table with FTS5 - Analysis struct, parser, CRUD, validation, hash computation - Selective purge: remote-only apps/analysis preserved across fn index - CLI: fn app list/clone/pull, fn analysis list/clone/pull - search/show/list now include analysis results - Apps removed from git tracking (content lives in Gitea repos) - .gitkeep for apps/ and analysis/ dirs - Bash functions: jupyter analysis pipeline, shell utilities - Browser domain: CDP functions moved from infra to browser Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
75 lines
2.6 KiB
Bash
75 lines
2.6 KiB
Bash
# 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"
|
|
}
|