1f93e9d502
Cada projects/<name>/ es ahora su propio repo Gitea con branch master, versionando solo sus docs de nivel-project. apps/*/ y analysis/*/ siguen como sub-repos hijos independientes (excluidos por el .gitignore del project). /full-git-push|pull los manejan via discover_git_repos. Cierra el gap de docs de nivel-project sin versionar. Aplicado a web_scraping, fn_monitoring, message_bus.
4.7 KiB
4.7 KiB
Projects: apps, analysis y vaults bajo un tema comun
Un project agrupa apps, analyses y vaults relacionados. Vive en projects/{nombre}/ con esta estructura:
projects/{nombre}/
project.md # Frontmatter obligatorio (name, description, tags)
apps/ # Apps del proyecto (cada una con app.md)
{app_name}/
app.md
...
analysis/ # Analyses del proyecto (cada uno con analysis.md)
{analysis_name}/
analysis.md
.venv/
notebooks/
run-jupyter-lab.sh
...
vaults/ # Datos del proyecto
vault.yaml # Manifest de vaults (nombre, descripcion, path, tags)
{vault_name} -> /abs/path # Symlinks a directorios reales de datos
Reglas
project.mdsigue el template dedocs/templates/project.md— campos:name,description,tags,repo_urlanalysis.mdsigue el template dedocs/templates/analysis.md—dir_pathdebe apuntar aprojects/{nombre}/analysis/{tema}/vault.yamllista los vaults con nombre, descripcion, path absoluto y tags- Los vaults reales viven fuera del repo (ej:
~/vaults/{nombre}/) con symlinks en el proyecto fn indexescaneaprojects/*/y seteaproject_idautomaticamente en apps, analyses y vaults
Cada project es su propio repo Gitea (sub-repo)
Desde 2026-06-05 cada projects/<nombre>/ es un repo Gitea independiente dataforge/<nombre> (branch master), igual que las apps y los analyses. El repo del project versiona solo las docs de nivel-project (project.md, CONVENTIONS.md y demás .md/.claude/ propios del project). El contenido de los hijos NO se versiona aquí: cada apps/<app>/ y cada analysis/<a>/ es su propio sub-repo Gitea y queda excluido por el .gitignore del project:
apps/*/
analysis/*/
vaults/*
!vaults/.gitkeep
- Crear el repo del project:
ensure_repo_synced_bash_infra projects/<nombre> dataforge <nombre> master "init: project <nombre>"(necesitaGITEA_URL+GITEA_TOKEN; el token está enpass gitea/dataforge-git-token). Crear el.gitignorede arriba ANTES, para no trackear el contenido de los sub-repos hijos. - Push/pull:
/full-git-pushy/full-git-pullya lo manejan automáticamente —discover_git_repos_bash_infradescubre cualquier.gitbajofn_registry, incluidos los projects. repo_urlenproject.mdapunta al repo del project; losrepo_urlde cada app viven en suapp.md. Así el project "referencia" sus sub-repos sin git submodules (KISS).- El repo padre
fn_registrysigue ignorandoprojects/*/entero (reglaapps_subrepo.md): nunca trackea contenido de projects. - Estado actual:
dataforge/web_scraping,dataforge/fn_monitoring,dataforge/message_bus. - Apps y analyses sueltos (sin proyecto) siguen en
apps/yanalysis/en la raiz
Raiz vs proyecto
| Ubicacion | Para que |
|---|---|
apps/ |
Apps independientes que no pertenecen a ningun proyecto |
analysis/ |
Analyses independientes |
projects/{nombre}/apps/ |
Apps de un proyecto — project_id se setea automaticamente |
projects/{nombre}/analysis/ |
Analyses de un proyecto — project_id se setea automaticamente |
Crear un proyecto nuevo
# 1. Crear estructura
mkdir -p projects/{nombre}/{apps,analysis,vaults}
# 2. Crear project.md con frontmatter
fn add -k project # genera template
# 3. Crear vault (datos fuera del repo, symlink dentro)
mkdir -p ~/vaults/{vault_name}/{raw,processed,exports}
ln -s ~/vaults/{vault_name} projects/{nombre}/vaults/{vault_name}
# Crear vault.yaml con la entrada
# 4. Crear analysis dentro del proyecto (un solo comando; ya indexa)
fn run init_jupyter_analysis --project {nombre} {nombre_analysis} --desc "..." [paquetes...]
# 5. Verificar
fn show {nombre} # verifica el project y sus componentes
# NUNCA: crear el analisis en analysis/ y luego mv al proyecto.
# Al mover se rompe el .venv (paths hardcodeados en activate).
# Si ya te paso: cd projects/{nombre}/analysis/{tema} && rm -rf .venv && uv sync
Consultas utiles
-- Listar proyectos
SELECT id, description FROM projects;
-- Analysis de un proyecto
SELECT id, name, dir_path FROM analysis WHERE project_id = 'app_turismo';
-- Vaults de un proyecto
SELECT id, name, path, symlink FROM vaults WHERE project_id = 'app_turismo';
-- Apps de un proyecto
SELECT id, name, dir_path FROM apps WHERE project_id = 'app_turismo';
-- Todo lo que pertenece a un proyecto
SELECT 'analysis' as tipo, id, name FROM analysis WHERE project_id = ?
UNION ALL
SELECT 'vault', id, name FROM vaults WHERE project_id = ?
UNION ALL
SELECT 'app', id, name FROM apps WHERE project_id = ?;