#pragma once #include #include // Sistema de proyectos: cada proyecto es una subcarpeta junto al exe que // contiene sus propios `operations.db`, `types.yaml` y `graph_explorer.db` // (layouts). El usuario crea proyectos, los nombra y conmuta entre ellos. // // Layout en disco: // // / // graph_explorer.ini # last_active + recent (gestionado aqui) // projects/ // default/ // operations.db # bootstrap con DDL completo // types.yaml # copia editable; semilla = ./examples/types.yaml o embed // graph_explorer.db # layouts del proyecto // caso_X/ // ... namespace ge { constexpr const char* k_projects_dir = "projects"; constexpr const char* k_default_project = "default"; constexpr const char* k_settings_file = "graph_explorer.ini"; struct ProjectPaths { std::string root_dir; // /projects// std::string operations_db; // /operations.db std::string types_yaml; // /types.yaml std::string layout_db; // /graph_explorer.db }; // Valida slug (a-z, 0-9, _ y -). Devuelve true si es valido. error_msg // describe el motivo del fallo. bool project_validate_slug(const char* name, std::string* error_msg); // Devuelve los paths del proyecto `slug`. NO comprueba existencia en disco. ProjectPaths project_paths(const char* slug); // Asegura que `/projects/` existe. Idempotente. bool projects_root_ensure(); // Lista proyectos detectados (subdirs de `/projects/`). Ordenado alfa. // Cada string es el slug (basename de la subcarpeta). bool project_list(std::vector* out); // Devuelve true si la carpeta del proyecto existe y contiene operations.db. bool project_exists(const char* slug); // Crea el proyecto `slug`: // - mkdir /projects// // - bootstrap operations.db con el DDL completo (entities, relations, fts, ...) // - escribe types.yaml semilla (basado en examples/types.yaml o embed) // Devuelve false y rellena `error_msg` si falla. bool project_create(const char* slug, std::string* error_msg); // Migracion: si `/projects/` no existe pero hay operations.db en el cwd, // crea projects/default/ y mueve operations.db + graph_explorer.db ahi. // Idempotente: no-op si projects/ ya existe. bool projects_migrate_legacy_layout(); // Lee/escribe `graph_explorer.ini` (junto al exe). Formato: // last_active = // recent = slug1,slug2,slug3 struct ProjectSettings { std::string last_active; // slug del ultimo proyecto abierto std::vector recent; // mas reciente primero, max 5 }; bool project_settings_load(ProjectSettings* out); bool project_settings_save(const ProjectSettings& s); // Marca `slug` como activo y lo empuja al frente de `recent`. Persiste en // disco. No-op si slug es vacio. void project_settings_touch(const char* slug); // Abre la carpeta del proyecto en el explorador del sistema. // (Windows: explorer.exe; Linux: xdg-open). void project_reveal_in_explorer(const char* slug); } // namespace ge