docs(flows): DoD obligatorio con user-facing surface + abrir issues 0100-0103 (taxonomia, frontmatter migration, dev_console, work dashboard)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-17 00:07:04 +02:00
parent 4abc3f97ec
commit 4a786911cb
3 changed files with 38 additions and 24 deletions
+3 -3
View File
@@ -9,10 +9,10 @@ add_imgui_app(dag_engine_ui
) )
target_include_directories(dag_engine_ui PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(dag_engine_ui PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
# fn_table_viz: provides data_table::render(), viz_render, TQL engine, Lua, LLM. # fn_module_data_table: provides data_table::render(), viz_render, TQL engine, Lua, LLM.
# Guard keeps the app compilable in builds where vendor/lua is absent. # Guard keeps the app compilable in builds where vendor/lua is absent.
if(TARGET fn_table_viz) if(TARGET fn_module_data_table)
target_link_libraries(dag_engine_ui PRIVATE fn_table_viz) target_link_libraries(dag_engine_ui PRIVATE fn_module_data_table)
endif() endif()
if(WIN32) if(WIN32)
+4
View File
@@ -19,10 +19,14 @@ uses_functions:
- llm_anthropic_cpp_core - llm_anthropic_cpp_core
- empty_state_cpp_core - empty_state_cpp_core
uses_types: [] uses_types: []
uses_modules: [data_table_cpp]
framework: "imgui" framework: "imgui"
entry_point: "main.cpp" entry_point: "main.cpp"
dir_path: "apps/dag_engine_ui" dir_path: "apps/dag_engine_ui"
repo_url: "https://gitea.organic-machine.com/dataforge/dag_engine_ui" repo_url: "https://gitea.organic-machine.com/dataforge/dag_engine_ui"
icon:
phosphor: "tree-structure"
accent: "#7c3aed"
e2e_checks: e2e_checks:
- id: build_cmake - id: build_cmake
cmd: "cmake --build cpp/build -j --target dag_engine_ui" cmd: "cmake --build cpp/build -j --target dag_engine_ui"
+31 -21
View File
@@ -1,5 +1,5 @@
#include "tabs.h" #include "tabs.h"
#include "viz/data_table.h" #include "data_table/data_table.h"
#include "core/data_table_types.h" #include "core/data_table_types.h"
#include "core/icons_tabler.h" #include "core/icons_tabler.h"
#include "core/empty_state.h" #include "core/empty_state.h"
@@ -127,7 +127,7 @@ void draw_dag_list(const std::string& api_url,
ti.rows = static_cast<int>(dags.size()); ti.rows = static_cast<int>(dags.size());
ti.cols = static_cast<int>(ti.headers.size()); ti.cols = static_cast<int>(ti.headers.size());
// BadgeRule set: shared by Status (Badge) and Recent (Dots). // BadgeRule set: shared by Recent (Dots).
auto run_status_badges = [](){ auto run_status_badges = [](){
std::vector<data_table::BadgeRule> rules; std::vector<data_table::BadgeRule> rules;
rules.push_back({"success", "#22c55e", ""}); // verde rules.push_back({"success", "#22c55e", ""}); // verde
@@ -137,14 +137,24 @@ void draw_dag_list(const std::string& api_url,
rules.push_back({"cancelled", "#6b7280", ""}); // gris rules.push_back({"cancelled", "#6b7280", ""}); // gris
return rules; return rules;
}; };
// ChipRule set: Status (CategoricalChip — dot izquierda + texto, siempre visible).
auto run_status_chips = [](){
std::vector<data_table::ChipRule> rules;
rules.push_back({"success", "#22c55e"});
rules.push_back({"failed", "#ef4444"});
rules.push_back({"running", "#eab308"});
rules.push_back({"pending", "#94a3b8"});
rules.push_back({"cancelled", "#6b7280"});
return rules;
};
// ColumnSpec per column. // ColumnSpec per column.
ti.column_specs.resize(ti.cols); ti.column_specs.resize(ti.cols);
for (int i = 0; i < ti.cols; i++) ti.column_specs[i].id = ti.headers[i]; for (int i = 0; i < ti.cols; i++) ti.column_specs[i].id = ti.headers[i];
// idx 2 — "Status": Badge renderer for the single last-run status string. // idx 2 — "Status": CategoricalChip (dot izquierda + texto, always visible).
ti.column_specs[2].renderer = data_table::CellRenderer::Badge; ti.column_specs[2].renderer = data_table::CellRenderer::CategoricalChip;
ti.column_specs[2].badges = run_status_badges(); ti.column_specs[2].chips = run_status_chips();
// idx 3 — "Recent": Dots renderer — each dot = one of the last 5 runs. // idx 3 — "Recent": Dots renderer — each dot = one of the last 5 runs.
ti.column_specs[3].renderer = data_table::CellRenderer::Dots; ti.column_specs[3].renderer = data_table::CellRenderer::Dots;
@@ -953,29 +963,29 @@ void draw_all_runs(const std::string& /*api_url*/,
ti.rows = static_cast<int>(sorted.size()); ti.rows = static_cast<int>(sorted.size());
ti.cols = static_cast<int>(ti.headers.size()); ti.cols = static_cast<int>(ti.headers.size());
auto status_badges = [](){ auto status_chips = [](){
std::vector<data_table::BadgeRule> rules; std::vector<data_table::ChipRule> rules;
rules.push_back({"success", "#22c55e", ""}); rules.push_back({"success", "#22c55e"});
rules.push_back({"failed", "#ef4444", ""}); rules.push_back({"failed", "#ef4444"});
rules.push_back({"running", "#eab308", ""}); rules.push_back({"running", "#eab308"});
rules.push_back({"pending", "#94a3b8", ""}); rules.push_back({"pending", "#94a3b8"});
rules.push_back({"cancelled", "#6b7280", ""}); rules.push_back({"cancelled", "#6b7280"});
return rules; return rules;
}; };
auto trigger_badges = [](){ auto trigger_chips = [](){
std::vector<data_table::BadgeRule> rules; std::vector<data_table::ChipRule> rules;
rules.push_back({"manual", "#3b82f6", ""}); rules.push_back({"manual", "#3b82f6"});
rules.push_back({"cron", "#a855f7", ""}); rules.push_back({"cron", "#a855f7"});
rules.push_back({"api", "#06b6d4", ""}); rules.push_back({"api", "#06b6d4"});
return rules; return rules;
}; };
ti.column_specs.resize(ti.cols); ti.column_specs.resize(ti.cols);
for (int i = 0; i < ti.cols; i++) ti.column_specs[i].id = ti.headers[i]; for (int i = 0; i < ti.cols; i++) ti.column_specs[i].id = ti.headers[i];
ti.column_specs[2].renderer = data_table::CellRenderer::Badge; ti.column_specs[2].renderer = data_table::CellRenderer::CategoricalChip;
ti.column_specs[2].badges = status_badges(); ti.column_specs[2].chips = status_chips();
ti.column_specs[3].renderer = data_table::CellRenderer::Badge; ti.column_specs[3].renderer = data_table::CellRenderer::CategoricalChip;
ti.column_specs[3].badges = trigger_badges(); ti.column_specs[3].chips = trigger_chips();
// Helper: duracion humana entre started_at y finished_at (best-effort). // Helper: duracion humana entre started_at y finished_at (best-effort).
auto duration_str = [](const std::string& s, const std::string& f) -> std::string { auto duration_str = [](const std::string& s, const std::string& f) -> std::string {