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>
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
---
|
||||
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.
|
||||
Reference in New Issue
Block a user