Files
graph_explorer/issues/completed/0006-projects-subfolders.md
T
egutierrez c365b1bc43 feat(projects): project_manager module — DDL bootstrap, slug/paths, settings, reveal
Modulo nuevo que gestiona el sistema de proyectos del issue 0006.
Cada proyecto vive como subcarpeta junto al exe con su operations.db,
types.yaml y graph_explorer.db propios. Helpers:

- project_validate_slug / project_paths / project_list / project_exists
- project_create — bootstrap operations.db con DDL completo (entities,
  relations, fts5, triggers, assertions, executions, logs) + types.yaml
  semilla (copia de examples/types.yaml o embed si no existe).
- projects_migrate_legacy_layout — mueve operations.db / graph_explorer.db
  del cwd a projects/default/ si el directorio projects/ no existe.
- project_settings_load/save/touch — graph_explorer.ini con last_active
  y recent (max 5).
- project_reveal_in_explorer — Windows ShellExecute / Linux xdg-open.

CMakeLists registra project_manager.cpp en add_imgui_app.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 23:46:35 +02:00

2.7 KiB

id, title, status, priority, created
id title status priority created
0006 Sistema de proyectos dentro de la app — subcarpetas + switcher pending high 2026-04-30

Objetivo

Cada "proyecto" es una subcarpeta junto al exe que contiene su propio operations.db, types.yaml y graph_explorer.db (layouts). El usuario crea proyectos, los nombra, y conmuta entre ellos sin reiniciar la app. Esto es lo que va a permitir guardar muchos datos separados por caso/tema sin acumularlos en un solo grafo.

Independiente del concepto de "project" del registry (projects/ raiz del repo) — aqui es organizativo, dentro de la app desplegada.

Layout en disco (junto al exe)

graph_explorer.exe
graph_explorer.ini             # estado global: ultimo proyecto abierto, recientes
projects/
  default/
    operations.db
    types.yaml                 # copia editable; semilla = examples/types.yaml
    graph_explorer.db          # layouts de este proyecto
    notes/                     # opcional, .md sueltos
  caso_aurgi/
    operations.db
    types.yaml
    graph_explorer.db
  osint_demo/
    ...

UI

  • Menu "Project" en la menubar:
    • New... (input de nombre, valida slug, crea carpeta + semilla types.yaml + operations.db vacio con schema migrado).
    • Open... (combo con los proyectos detectados en ./projects/).
    • Recent (lista los ultimos 5 desde graph_explorer.ini).
    • Reveal in explorer (abre la carpeta del proyecto activo).
  • Title bar muestra graph_explorer — <proyecto activo>.
  • Switch de proyecto: cierra BDs, limpia grafo + viewport, abre nuevas BDs, hace reload.

Cambios en codigo

  • main.cpp:
    • Resolver paths a traves de g_active_project en vez de ./operations.db y ./graph_explorer.db directos.
    • Modo legacy: si arranca con --input <path> o positional, no usa proyecto (compatibilidad con flujo actual).
  • app_state nuevo campo string active_project_dir.
  • Nueva fn project_create(name) que escribe schema base de operations.db (entities/relations/...) — extraerlo de lo que ya hace el registry o copiar el DDL.
  • graph_explorer.ini lee/escribe via app_settings_* ya existente.

Migracion del flujo actual

  • Al primer arranque sin --input, si no existe ./projects/, crear ./projects/default/ y mover ./operations.db + ./graph_explorer.db ahi (si existen).
  • Issues 0005/0007/0008 ya asumen este layout.

Definicion de hecho

  • Crear, abrir y conmutar proyectos sin reiniciar.
  • Cada proyecto tiene su operations.db, types.yaml, graph_explorer.db aislados.
  • "Recent" persiste entre sesiones via graph_explorer.ini.
  • El layout (posiciones de nodos) es por-proyecto: cambiar de proyecto recupera las posiciones del nuevo, no las del anterior.