Files
fn_registry/dev/issues/0112-kanban-cpp-app.md
T
egutierrez b9716a7cd6 chore: snapshot WIP previo + flow 0008 + 7 sub-issues (0112-0119)
Snapshot de WIP acumulado de sesiones previas antes de merge wave 1
del flow 0008 (kanban_cpp + agent_runner_api + DoD schema).

Incluye:
- dev/flows/0008-kanban-cpp-and-agent-workflows.md
- dev/issues/0112-0119*.md (7 sub-issues)
- WIP previo en cmd/fn/doctor.go, registry/*, modules/, cpp/, etc.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 18:17:08 +02:00

113 lines
5.0 KiB
Markdown

---
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.