From 9a59708422d0442534690bb8c57c950808f90da2 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Sun, 17 May 2026 19:30:30 +0200 Subject: [PATCH] chore: scaffold skill_tree (issue 0109) Initial scaffold via init_cpp_app_bash_pipelines: - main.cpp con Tree + Inspector panels (placeholders) - app.md con trio icon (tree-structure + #c026d3) + e2e_checks - CMakeLists.txt via add_imgui_app - appicon.ico generado con generate_app_icon_py_infra Co-Authored-By: Claude Opus 4.7 (1M context) --- CMakeLists.txt | 14 +++++++++++++ app.md | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ appicon.ico | Bin 0 -> 8860 bytes main.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 app.md create mode 100644 appicon.ico create mode 100644 main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..98361d3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +add_imgui_app(skill_tree + main.cpp +) +target_include_directories(skill_tree PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +# fn_table_viz: provides data_table::render(), viz_render, TQL engine, Lua, LLM. +# Guard keeps the app compilable in builds where vendor/lua is absent. +if(TARGET fn_table_viz) + target_link_libraries(skill_tree PRIVATE fn_table_viz) +endif() + +if(WIN32) + set_target_properties(skill_tree PROPERTIES WIN32_EXECUTABLE TRUE) +endif() diff --git a/app.md b/app.md new file mode 100644 index 0000000..f1141fe --- /dev/null +++ b/app.md @@ -0,0 +1,51 @@ +--- +name: skill_tree +lang: cpp +domain: tools +description: "Mapa interactivo de issues+flows en anillos concentricos por estado, click para spawn agentes" +tags: [dashboard, meta, imgui] +icon: + phosphor: "tree-structure" + accent: "#c026d3" +uses_functions: [] +uses_types: [] +framework: "imgui" +entry_point: "main.cpp" +dir_path: "apps/skill_tree" +repo_url: "https://gitea.organic-machine.com/dataforge/skill_tree" +e2e_checks: + - id: build + cmd: "cd cpp && cmake --build build --target skill_tree -j" + timeout_s: 300 + - id: self_test + cmd: "./cpp/build/apps/skill_tree/skill_tree --self-test" + timeout_s: 30 + severity: warning +--- + +# skill_tree + +Mapa interactivo de los issues + flows del registry en anillos concentricos por estado. +Click en un nodo abre el panel `Inspector` con su Definition of Done y las funciones +del registry asociadas. Dos botones por nodo: + +- **Generate ideas** (`claude -p`) → escribe a `idea_drafts` para revision manual. +- **Run autonomous-task** (`fn-orquestador`) → spawn subagente en sandbox `auto/`. + +Roadmap: issue 0109. Diseno completo en el frontmatter del epic. + +## Build + +```bash +cd cpp && cmake --build build --target skill_tree -j +``` + +## Run + +```bash +./cpp/build/apps/skill_tree/skill_tree +``` + +## Estado + +MVP fase A — sub-issue 0109a: shell + parsers issues/flows. Sin render de grafo todavia. diff --git a/appicon.ico b/appicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fff86d4888e58192e1ad1d0252f9efc36c1d548d GIT binary patch literal 8860 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 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..35f5d39 --- /dev/null +++ b/main.cpp @@ -0,0 +1,52 @@ +#include +#include "app_base.h" +#include "core/panel_menu.h" +#include "core/icons_tabler.h" +#include "core/logger.h" +// #include "viz/data_table.h" // uncomment to enable data_table::render() panel + +static bool g_show_tree = true; +static bool g_show_inspector = true; + +static void draw_tree() { + if (!ImGui::Begin(TI_GRAPH " Tree", &g_show_tree)) { + ImGui::End(); + return; + } + ImGui::TextUnformatted("skill_tree v0.1.0 — fase A (shell)"); + ImGui::TextUnformatted(""); + ImGui::TextUnformatted("Parsers de dev/issues + dev/flows pendientes (0109a)."); + ImGui::TextUnformatted("Render anillos pendiente (0109b)."); + ImGui::End(); +} + +static void draw_inspector() { + if (!ImGui::Begin(TI_INFO_CIRCLE " Inspector", &g_show_inspector)) { + ImGui::End(); + return; + } + ImGui::TextDisabled("Click en un nodo del Tree para inspeccionar."); + ImGui::End(); +} + +static void render() { + if (g_show_tree) draw_tree(); + if (g_show_inspector) draw_inspector(); +} + +int main(int /*argc*/, char** /*argv*/) { + static fn_ui::PanelToggle panels[] = { + { "Tree", nullptr, &g_show_tree }, + { "Inspector", nullptr, &g_show_inspector }, + }; + + fn::AppConfig cfg; + cfg.title = "skill_tree"; + cfg.about = { "skill_tree", "0.1.0", + "Mapa interactivo de issues+flows en anillos concentricos por estado." }; + cfg.log = { "skill_tree.log", 1 }; + cfg.panels = panels; + cfg.panel_count = sizeof(panels) / sizeof(panels[0]); + + return fn::run_app(cfg, render); +}