c468b24d2b
Registry (issue 0130a):
- 5 fns infra: parse_issue_md, write_issue_md, scan_issues_dir,
scan_flows_dir, watch_dir_fsnotify
- 3 tipos: Issue, Flow, FsEvent
- Tests round-trip + scan reales + watcher fsnotify (all PASS)
- Capability group 'kanban' nuevo (docs/capabilities/kanban.md)
Apps:
- apps/kanban_cpp/ (sub-repo) — frontend ImGui: board drag-drop,
flows, filters, detail con CSV editors
- apps/kanban_cpp/backend/ — Go service port 8487: REST + SSE +
fsnotify watcher, parser bidireccional MD<->SQLite cache
Issues:
- dev/issues/0130-kanban-cpp-v2.md (epic)
- 0130a parser, 0130b backend, 0130c frontend
CMakeLists.txt: add_subdirectory apps/kanban_cpp (registrado por
init_cpp_app scaffolder).
End-to-end verde: backend devuelve 189 issues + 9 flows; PATCH a
/api/issues/{id} reescribe .md (solo frontmatter, body intacto);
frontend --self-test exit 0; tests Go infra 5/5 PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
122 lines
4.3 KiB
Markdown
122 lines
4.3 KiB
Markdown
---
|
|
id: "0130"
|
|
title: Kanban C++ v2 — gestor de dev/issues y dev/flows con backend Go + frontend ImGui
|
|
status: pendiente
|
|
type: epic
|
|
domain:
|
|
- cpp-stack
|
|
- apps-infra
|
|
- dev-ux
|
|
scope: multi-app
|
|
priority: alta
|
|
depends: []
|
|
blocks: []
|
|
related:
|
|
- "0112"
|
|
- "0119"
|
|
tags:
|
|
- kanban
|
|
- cpp
|
|
- imgui
|
|
- dev_ux
|
|
- issues
|
|
- flows
|
|
created: "2026-05-22"
|
|
updated: "2026-05-22"
|
|
---
|
|
|
|
# 0130 — Kanban C++ v2
|
|
|
|
**Status:** pendiente
|
|
|
|
## Por que
|
|
|
|
La v1 (`apps/kanban_cpp` borrada el 2026-05-22) mezclaba paneles ajenos al dominio kanban (agent runs, DoD, worktrees, calendar) y un backend que no era reutilizable. Para gestionar los 98 issues activos + 12 flows del proyecto necesitamos una vista board nativa, sin web, con edicion bidireccional de los archivos markdown.
|
|
|
|
## Que entrega
|
|
|
|
App kanban_cpp v2 con dos piezas:
|
|
|
|
1. **Backend Go** (`apps/kanban_cpp/backend/`) — service HTTP en puerto 8487.
|
|
- Parser bidireccional MD <-> SQLite (cache).
|
|
- Watcher fsnotify sobre `dev/issues/` (+ `completed/`) y `dev/flows/`.
|
|
- Endpoints REST: `/api/issues`, `/api/issues/{id}` (GET/PATCH), `/api/flows`, `/api/flows/{id}`, `/api/meta`, `/api/sse`.
|
|
- PATCH a issue reescribe el frontmatter en disco preservando body + orden de campos.
|
|
|
|
2. **Frontend C++ ImGui** (`apps/kanban_cpp/`) sobre el framework `fn::run_app`.
|
|
- Panel **Board**: columnas por status (pendiente / in-progress / bloqueado / completado). Drag-drop = PATCH status.
|
|
- Panel **Flows**: lista de flows con detalle.
|
|
- Panel **Filtros** (Aside): multi-select domain, scope, priority, tags.
|
|
- Panel **Detalle**: edicion de campos frontmatter de un issue (status, priority, scope, tags, depends, blocks).
|
|
- SSE para refrescar tras cambios externos en disco.
|
|
|
|
## Sub-issues
|
|
|
|
- **0130a** — parser MD + scan dirs (funciones registry).
|
|
- **0130b** — backend Go: schema + handlers + watcher + SSE.
|
|
- **0130c** — frontend C++: paneles + http client.
|
|
|
|
Cada sub-issue mergeable independiente en su rama corta TBD.
|
|
|
|
## Reusa del registry
|
|
|
|
Backend Go:
|
|
- `sqlite_open_go_infra`, `sqlite_apply_migrations_go_infra`
|
|
- `http_router_go_infra`, `http_serve_go_infra`, `http_middleware_chain_go_infra`
|
|
- `http_cors_middleware_go_infra`, `http_logger_middleware_go_infra`
|
|
- `http_json_response_go_infra`, `http_error_response_go_infra`, `http_parse_body_go_infra`
|
|
- `random_hex_id_go_core`
|
|
|
|
Frontend C++:
|
|
- `http_request_cpp_core`
|
|
- `sse_client_cpp_core`
|
|
- `data_table_cpp_viz` (lista flows)
|
|
- `kpi_card_cpp_viz` (contadores por status)
|
|
|
|
## Crea (delegadas a fn-constructor en 0130a)
|
|
|
|
- `parse_issue_md_go_infra` — lee .md → struct (frontmatter YAML + body).
|
|
- `write_issue_md_go_infra` — escribe struct → .md preservando body + orden de campos.
|
|
- `scan_issues_dir_go_infra` — walk `dev/issues/` + `dev/issues/completed/`.
|
|
- `scan_flows_dir_go_infra` — walk `dev/flows/`.
|
|
- `watch_dir_fsnotify_go_infra` (si no existe) — events channel.
|
|
|
|
## DoD
|
|
|
|
- `fn doctor` verde para ambas apps (artefacts + e2e).
|
|
- `e2e_checks` en ambos `app.md` (build + health + self-test).
|
|
- Drag-drop en frontend reescribe el `.md` correspondiente y `git diff` lo muestra (solo frontmatter, body intacto).
|
|
- Trio obligatorio (`description` + `icon.phosphor` + `icon.accent`) en ambos `app.md`.
|
|
- Sub-repos Gitea creados (`dataforge/kanban_cpp` reactivado o nuevo, mismo nombre).
|
|
|
|
dod_evidence_schema:
|
|
- id: backend_health
|
|
kind: cmd
|
|
expected: "curl -fsS http://localhost:8487/api/health == 200"
|
|
required: true
|
|
- id: api_issues_count
|
|
kind: cmd
|
|
expected: "curl -fsS http://localhost:8487/api/issues | jq 'length' >= 90"
|
|
required: true
|
|
- id: patch_writes_md
|
|
kind: cmd
|
|
expected: "PATCH /api/issues/0130 status=in-progress reescribe dev/issues/0130-*.md (git diff muestra solo status)"
|
|
required: true
|
|
- id: frontend_self_test
|
|
kind: cmd
|
|
expected: "./cpp/build/linux/apps/kanban_cpp/kanban_cpp --self-test exit 0"
|
|
required: true
|
|
- id: board_screenshot
|
|
kind: screenshot
|
|
expected: "kanban_cpp Board panel con 4 columnas pobladas con issues reales"
|
|
required: true
|
|
|
|
## Anti-scope
|
|
|
|
NO incluye en esta version:
|
|
- Grafo de dependencias (depends/blocks/related visual).
|
|
- Edicion de body MD desde la app (solo frontmatter).
|
|
- Multi-PC sync (backend es local).
|
|
- Crear issues nuevos desde la UI (solo editar existentes).
|
|
- DoD evidence panel, agent runs, calendar, worktrees (la v1 los mezclaba — fuera).
|