--- id: "0112" title: "App kanban_cpp: clon C++ ImGui de kanban_web con backend Go propio" status: pendiente type: app domain: - cpp-stack - kanban - agents scope: app priority: alta depends: - "0110" blocks: - "0116" related: - "0008" - "0113" - "0117" - "0118" created: 2026-05-18 updated: 2026-05-18 tags: [kanban, cpp, imgui, agents, backend-copy] flow: "0008" --- # 0112 — App `kanban_cpp` ## Problema `kanban_web` (React + Mantine) funciona bien para humanos. Falta un kanban dedicado a **conducir agentes LLM**: arrastrar card a `Doing (agent)` -> arranca workflow, sin abrir browser ni terminal. Flow 0008 lo requiere como surface 1 user-facing. ## Decision Nueva app `apps/kanban_cpp/` (C++ ImGui via `fn::run_app`). Backend Go **copia identica** de `apps/kanban/backend/` con su propia `operations.db`. Frontend ImGui consume HTTP + SSE/WS del backend local. NO sync con kanban_web — datos independientes a proposito. Auth/users duplicados (cada app sus propios usuarios). ### Estructura ``` apps/kanban_cpp/ CMakeLists.txt # add_imgui_app + linkea http_request_cpp_core app.md # trio: description + icon.phosphor=columns-3 + icon.accent=#a855f7 appicon.ico # generado via generate_app_icon_py_infra main.cpp # fn::run_app + 6 panels data.{h,cpp} # HTTP client wrapper (usa http_request_cpp_core) panel_board.{h,cpp} # columnas + cards drag-and-drop panel_calendar.{h,cpp} # vista calendar (port de CalendarView.tsx) panel_dashboard.{h,cpp} # KPIs (port de Dashboard.tsx) panel_agent_runs.{h,cpp} # lista runs (usa agent_runs_timeline_cpp_viz) panel_worktrees.{h,cpp} # git worktree manager panel_dod.{h,cpp} # DoD inspector (usa dod_evidence_panel_cpp_viz) backend/ # COPIA de apps/kanban/backend main.go # port distinto: 8401 (web) -> 8403 (cpp) db.go, handlers.go, ... # idem migrations/ # mismas migrations operations.db # SU PROPIA DB ``` ## Panels (6 + Board) Mapping con `apps/kanban/frontend/src/components/`: | Mantine component | Panel C++ | Funcion registry | |---|---|---| | `KanbanColumn` + `KanbanCard` | `panel_board` | inline (logica especifica) | | `CalendarView.tsx` | `panel_calendar` | inline | | `Dashboard.tsx` | `panel_dashboard` | `kpi_card_cpp_viz` + `sparkline_cpp_viz` | | nuevo | `panel_agent_runs` | `agent_runs_timeline_cpp_viz` (0118) | | nuevo | `panel_worktrees` | inline (calls `agent_runner_api`) | | nuevo | `panel_dod` | `dod_evidence_panel_cpp_viz` (0117) | ## Criterios de aceptacion - [ ] `apps/kanban_cpp/` creado via `./fn run init_cpp_app kanban_cpp` (scaffolder canonico). - [ ] `backend/` copiado de `apps/kanban/backend` con port distinto (8403) y migrations propias. - [ ] `app.md` con trio completo: description 1 linea + `icon.phosphor: columns-3` + `icon.accent: "#a855f7"`. - [ ] `appicon.ico` generado via `./fn run generate_app_icon "columns-3" "#a855f7" apps/kanban_cpp/appicon.ico`. - [ ] App registrada en `cpp/CMakeLists.txt` (bloque `add_subdirectory`). - [ ] Build Windows cross-compile OK: `cmake --build cpp/build/windows --target kanban_cpp -j`. - [ ] Deploy a `/mnt/c/Users/lucas/Desktop/apps/kanban_cpp/` via `./fn run redeploy_cpp_app_windows kanban_cpp`. - [ ] `--self-test` arranca + verifica GL loader + SQLite local + conexion al backend `:8403`. - [ ] Trio aparece en App Hub tras `./fn run refresh_app_hub`. - [ ] Backend `:8403` arranca via systemd unit (tag `service`). - [ ] `uses_functions` declarado en `app.md` cubre: `http_request_cpp_core`, `kpi_card_cpp_viz`, `sparkline_cpp_viz`, `data_table_cpp_viz`, `dod_evidence_panel_cpp_viz` (0117), `agent_runs_timeline_cpp_viz` (0118). - [ ] `fn doctor uses-functions kanban_cpp` limpio. - [ ] `e2e_checks` declarados en `app.md`: build, --self-test, backend health, smoke board panel. ## Gotchas - 2 services + 2 sqlite locks: nunca compartir `operations.db` entre `kanban` y `kanban_cpp`. Ports + DB independientes. - Auth: backend copia trae `users.go`. Decision: usuarios independientes por app. Documentar en `app.md`. - Mantine es modal-heavy (`Modal`, `Drawer`). En ImGui usar `ImGui::OpenPopup` + `BeginPopupModal`. NO replicar look pixel-perfect — adaptar a fn_tokens. - BD drift cross-PC: `operations.db` por PC, no se sincroniza. Si el usuario quiere portabilidad de cards -> issue separado. ## Out of scope - Sync de cards entre `kanban_web` y `kanban_cpp` (otro issue, decision deferred). - Multi-user concurrent edit en kanban_cpp (single-user por ahora). - Tab `Chat` (`CardChatPanel.tsx`) — postergar a v2. ## Plan implementacion 1. `./fn run init_cpp_app kanban_cpp` (no flag --project: app suelta). 2. `cp -r apps/kanban/backend apps/kanban_cpp/backend` + sed port 8401 -> 8403 + clear `operations.db`. 3. Build cliente data.{h,cpp} con `fn_http::request`. 4. Implement `panel_board` primero (MVP). Resto en orden. 5. Trio + icon + refresh_app_hub. 6. e2e_checks + smoke + deploy Windows.