---
id: "0112"
title: "App kanban_cpp: clon C++ ImGui de kanban_web con backend Go propio"
status: completed
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.
