diff --git a/app.md b/app.md index 3292462..9dde777 100644 --- a/app.md +++ b/app.md @@ -2,6 +2,7 @@ name: graph_explorer lang: cpp domain: viz +version: 0.1.0 description: "Visor de grafos GPU-accelerated agnostico del backend. Lee operations.db de cualquier app del registry y permite explorar entidades/relaciones con shapes/iconos/layouts/filtros." tags: [imgui, graph, osint, visualization, gpu] uses_functions: @@ -17,19 +18,6 @@ uses_functions: - graph_icons_cpp_viz - graph_sources_cpp_viz - graph_types_cpp_viz - # data_table stack — issue 0081-J: panel Table migrado a data_table::render - - data_table_cpp_viz - - viz_render_cpp_viz - - compute_stage_cpp_core - - compute_pipeline_cpp_core - - tql_emit_cpp_core - - tql_apply_cpp_core - - lua_engine_cpp_core - - join_tables_cpp_core - - auto_detect_type_cpp_core - - compute_column_stats_cpp_core - - llm_anthropic_cpp_core - - tql_to_sql_cpp_core # core - graph_spatial_hash_cpp_core - button_cpp_core @@ -168,3 +156,13 @@ Recetas validadas en notebooks 04-08 del analysis y vaultadas en `vaults/osint_n Issues que desbloquea: `issues/0041-split-confidence-thresholds.md` y `issues/0042-gliner2-unified-extractor.md`. El registry tiene todas las funciones necesarias; solo falta cablearlas en `extract_graph_hybrid_py_pipelines` y el panel `paste_extract`. Playground de referencia: `projects/osint_graph/analysis/gliner_glirel_tuning/playground/` (FastAPI + Sigma.js, sirviendo en `localhost:7878`). + + +## Capability growth log + +Una linea por bump SemVer. Bump-type segun `.claude/commands/version.md`: +- `major`: breaking observable (CLI args, schema BBDD propia, formato wire). +- `minor`: feature aditiva (nuevo panel, endpoint, opcion). +- `patch`: bugfix sin cambio observable. + +- v0.1.0 (2026-05-18) — baseline. diff --git a/appicon.ico b/appicon.ico index cb5fcef..a162d5a 100644 Binary files a/appicon.ico and b/appicon.ico differ diff --git a/extract_panel.cpp b/extract_panel.cpp index 96b3038..d17d86b 100644 --- a/extract_panel.cpp +++ b/extract_panel.cpp @@ -978,6 +978,7 @@ void extract_panel_render(AppState& app) { // Tabla de entidades. if (!res->entities.empty() && ImGui::CollapsingHeader("Entities", ImGuiTreeNodeFlags_DefaultOpen)) { + // LAYOUT-TABLE — form editor con InputText/Checkbox editables inline; keep BeginTable inline. if (ImGui::BeginTable("##ents", 5, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY, @@ -1024,6 +1025,7 @@ void extract_panel_render(AppState& app) { // Tabla de relaciones. if (!res->relations.empty() && ImGui::CollapsingHeader("Relations", ImGuiTreeNodeFlags_DefaultOpen)) { + // LAYOUT-TABLE — form editor con Checkbox por fila; keep BeginTable inline. if (ImGui::BeginTable("##rels", 5, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY, diff --git a/main.cpp b/main.cpp index 5a6c45e..e1723d3 100644 --- a/main.cpp +++ b/main.cpp @@ -1124,6 +1124,7 @@ static void render_enricher_config_window() { g_app.enr_modal_param_bufs.resize(spec->params.size()); } + // LAYOUT-TABLE — KPI/form/splitter, no data; keep BeginTable inline. if (ImGui::BeginTable("##enr_params", 2, ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_NoBordersInBody)) { diff --git a/views.cpp b/views.cpp index b1a0b0a..9fa5094 100644 --- a/views.cpp +++ b/views.cpp @@ -882,6 +882,7 @@ void views_inspector(AppState& app) { ImGui::TextUnformatted("Identity"); ImGui::Separator(); + // LAYOUT-TABLE — KPI/form/splitter, no data; keep BeginTable inline. if (ImGui::BeginTable("##insp_id", 2, ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_NoBordersInBody)) { @@ -955,6 +956,7 @@ void views_inspector(AppState& app) { const EntitySpec* spec = find_entity_spec(app.parsed_types, app.insp_type_buf); + // LAYOUT-TABLE — KPI/form/splitter, no data; keep BeginTable inline. if (ImGui::BeginTable("##insp_fields", 2, ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_NoBordersInBody)) { @@ -1851,6 +1853,8 @@ void views_node_groups_window(AppState& app) { ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY | ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingStretchProp; + // LAYOUT-TABLE — interactividad app-específica: Selectable+click/dblclick diferenciado, + // PopupContextItem con promote/demote/focus, paginación manual. No migrable a data_table::render. if (col_count > 0 && ImGui::BeginTable("##te_rows", col_count, tflags, ImVec2(0, -ImGui::GetFrameHeightWithSpacing()))) { ImGui::TableSetupScrollFreeze(0, 1);