commit 9a59708422d0442534690bb8c57c950808f90da2 Author: Egutierrez Date: Sun May 17 19:30:30 2026 +0200 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) 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 0000000..fff86d4 Binary files /dev/null and b/appicon.ico differ 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); +}