b9716a7cd6
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>
113 lines
5.0 KiB
Markdown
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.
|