# Entorno Python
.venv/
__pycache__/
*.pyc
*.pyo

# Caches de herramientas (se regeneran solas; NO se versionan). graphify también las
# IGNORA al indexar porque respeta .gitignore — antes ensuciaban el grafo con nodos basura.
.import_linter_cache/
.ruff_cache/
.pytest_cache/
.mypy_cache/
.claude/settings.local.json

# Secretos y configuración local (NUNCA al repo)
.env
# Ignora TODO el contenido de secrets/ (llaves, etc.) pero conserva la carpeta vacía.
secrets/*
!secrets/.gitkeep

# Logs (no versionamos contenido, sí la carpeta)
logs/*
!logs/.gitkeep

# BD sqlite local (p. ej. la del demo: DATABASE_URL=sqlite:///milpa.db)
*.db
*.sqlite3

# Runtime: PID del servidor web (lo escribe start.sh, lo lee stop.sh)
app.pid

# Handoff local entre sesiones (estado actual + pendientes); NO se versiona.
NEXT_SESSION.md

# Editor / SO
.idea/
.DS_Store
docs/

# Sitio generado por MkDocs (se construye en CI; no se versiona)
site/

# Frontend (workspace pnpm en surcos/, ver pnpm-workspace.yaml): deps y artefactos
# de build NO se versionan. public/ es 100% generado (vite build de cada surco →
# public/<app>); el hot-file es runtime del dev server (modelo Laravel).
node_modules/
# Anclado a la raíz: sin la barra inicial taparía también surcos/<app>/public/
# (las fuentes estáticas de un surco, p. ej. los iconos de la PWA).
/public/

# surcos/ NO se versiona en ESTE repo (solo la carpeta-convención con su .gitkeep):
# los surcos de demo viven en el skeleton del scaffolder (`milpa new --demo`);
# aquí son área de trabajo local. Por lo mismo, el pnpm-lock.yaml TAMPOCO se
# versiona aquí: sus importers (surcos/*) no existen en un clone fresco y pnpm
# lo reescribiría — en los proyectos GENERADOS el lock SÍ se versiona (ahí los
# surcos son código del usuario).
surcos/*
!surcos/.gitkeep
pnpm-lock.yaml
