Commit Graph

8 Commits

Author SHA1 Message Date
egutierrez c93cca82ba fix(skill_tree): UNC fallback para encontrar registry desde Windows nativo
Problema: skill_tree.exe en Windows tenia 0 nodos porque discover_registry_root
solo probaba env FN_REGISTRY_ROOT y walk-up desde cwd. Cwd en deploy es
C:\Users\lucas\Desktop\apps\skill_tree\ — sin registry.db cerca.

Fix:
- Anadir 3a estrategia (#ifdef _WIN32): probar paths UNC a WSL.
- Distros: WSL_REGISTRY_PATH env > Ubuntu-22.04 > Ubuntu > kali-linux > Debian.
- Tanto \wsl.localhost\<distro>\... como \wsl$\<distro>\... (legacy).
- Banner rojo en panel Tree si root vacio, con instrucciones.

Diagnostico:
- Mover discover + reload a first render frame (fn_log no inicializado
  antes de fn::run_app). Ahora log captura el path encontrado.

Verificacion: log dice
  discover_registry_root -> '\\wsl.localhost\Ubuntu-22.04\home\lucas\fn_registry'
  reloaded 173 nodes, 0 parse errors

Roadmap proximo: 0109m (issues_api HTTP service) reemplazara UNC con
cliente HTTP cuando este disponible.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:29:35 +02:00
egutierrez a6366b4d50 feat(skill_tree): Dashboard panel + ghost-nodes + mock generate ideas
Cierra 0109k (Dashboard) + 0109h fase 1 (ghost-nodes framework con mock LLM).

Dashboard (Ctrl+3 / menu View / Dashboard):
- HUD: LV global = floor(sqrt(XP_total)) + barra de progreso al next level
- Conteo done/planned/todo/drafts
- Tabla por dominio sortable: Done/Planned/Todo/Progreso bar/LV
- Top 3 dominios masterizados
- Top 3 dominios proximos a desbloquearse (mas todo count)
- XP scheme: epic=10, infra=4, feature=3, refactor/spike/planning=2,
  bugfix/chore/docs=1, flow=5

Ghost-nodes framework:
- DraftNode struct con animacion emerge desde source -> target ring/sector
- g_drafts buffer in-memory (NO persistido, viven hasta promote/discard)
- g_sel_kind tagged: SelKind::None|Node|Draft (sustituye int g_selected)
- Inspector pivota a draft view cuando seleccion es draft
- Pass 3 de render en canvas: ghost-nodes con pulse alpha + label visible

Generate ideas button (Inspector de nodos reales):
- Color emerald
- On click: mock_generate_ideas(node) genera 3-5 drafts hardcoded
- TODO 0109h2: spawn claude -p real con prompt contextual + parse JSON

Promote buttons (Inspector de drafts):
- [Generate issue] -> escribe dev/issues/NNNN-<slug>.md (next_issue_id scan)
- [Generate flow] -> escribe dev/flows/NNNN-<slug>.md (next_flow_id scan)
- [Discard] -> elimina del buffer

Self-test: 171 nodes, parse_errors=0, unmapped=0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 20:40:43 +02:00
egutierrez c0ad94e050 fix(skill_tree): tooltip width fixed + Claude fix button
Tooltip:
- Fija ancho 360px via SetNextWindowSize(Always) + PushTextWrapPos antes de
  BeginTooltip. Soluciona el flash de ventana enorme en primer frame
  cuando TextWrapped no tenia wrap width definido.

Claude fix button (Inspector):
- Aparece solo si status != done (Bucket::Planned o Todo).
- Color violeta-500 destacado.
- On click: lanza terminal externa con
    wt.exe wsl.exe --cd ~/fn_registry -- bash -ic 'claude --dangerously-skip-permissions'
- Fallback: cmd.exe /C start wt.exe ... si CreateProcessA falla.
- Linux: probe x-terminal-emulator/gnome-terminal/konsole/xterm/alacritty/
  kitty hasta encontrar uno disponible.
- Feedback temporal 5s ok/fail tras click.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 20:28:23 +02:00
egutierrez 17c99cd9d2 feat(skill_tree): 3-bucket colors + grid anti-collision por bin
Cambios visuales pedidos por el usuario:

1. Colores simplificados a 3 buckets independientes del ring:
   - done    (completado/completed)         -> green-500  #22c55e
   - planned (in-progress)                  -> amber-500  #f59e0b
   - todo    (resto: pendiente/locked/...)  -> violet-500 #a855f7
   Ring sigue separando geografia, color cuenta el estado.

2. Hash-distribute unknown domains: nodos sin domain valido (61 sobre 167)
   ya no se amontonan en sector 17. Se distribuyen via FNV-1a(id) % 18
   entre los 18 sectores canonicos.

3. Anti-collision grid 2D por bin (ring,sector). compute_ring_layout
   distribuia solo radialmente; ahora main.cpp resuelve bins poblados
   con un grid rows x cols (con brick offset entre filas) que ocupa
   tanto eje radial como angular del sector. Determinista (sort by id).

self-test: 167 nodes, 0 parse_errors, 0 unmapped. Linux + Windows OK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 20:23:01 +02:00
egutierrez 78910bc295 fix(skill_tree): anti-overlap + flows mas visibles
- kNodeRadius 18 -> 10 (mas cards caben sin pisarse)
- ring_radii expandidos { 0, 200, 380, 600, 900, 1200 } (mas banda por anillo)
- bin_padding 18 -> 28 (margen entre anillos)
- Initial zoom = auto-fit (Min(canvas) * 0.92 / 2400) en lugar de zoom=1
- Boton 'Fit view' reemplaza 'Reset view'
- Flows ahora 1.55x mayores que issues + outline cyan permanente para
  destacar entre la marea de 160 circulos
- Render en 2 pasadas: issues primero (background), flows on top
- Labels de ID siempre visibles en flows (no condicionado al zoom)
- Ring bands con tint sutil por status para legibilidad

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 20:16:29 +02:00
egutierrez ad8944af8e feat(skill_tree): canvas ImDrawList + ring layout + cards (0109b)
Render anillos concentricos + sectores radiales por dominio con ImDrawList.
166 nodos pintados con label ID, tooltip on hover, picking O(N), pan+zoom.

Decisiones:
- Pivote desde graph_renderer GPU a ImDrawList CPU. 166 nodos no justifican
  pipeline GPU; ahorra ~120 LOC y init_gl_loader.
- 5 rings: done / in-progress / unlocked / locked / deferred.
- 18 sectores = 18 dominios canonicos (dev/TAXONOMY.md), labels en aro
  exterior.
- Issues = circulos, flows = rombos para diferencial visual.
- Lock-unlock derivado: pendiente_unlocked vs pendiente_locked segun depends.
- Animacion lerp 1s ease-in-out entre prev/current position en cambios de
  status entre reloads.
- HUD strip: LV + XP + conteos por bucket.
- Pan: drag derecho/medio. Zoom: rueda centrada en cursor.

uses_functions:
- parse_md_frontmatter_cpp_core (ya existia desde 0109a)
- compute_ring_layout_cpp_core (NUEVA, pure, 10/10 tests, 142 assertions)

Self-test: 166 nodes, parse_errors=0, unmapped=0, exit 0.
Breakdown: done=77 in-progress=2 unlocked=64 locked=22 deferred=1.

Sigue: 0109c (Inspector con DoD parseado y uses_functions linkables).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 20:02:27 +02:00
egutierrez a49481e1d4 feat(skill_tree): scan dev/issues+flows, parse frontmatter, render counts
- main.cpp scan dev/issues + dev/flows con std::filesystem
- parsea cada .md con parse_md_frontmatter_cpp_core (nueva fn pure)
- cuenta por status/domain/kind, lista nodos en panel Tree
- panel Inspector muestra detalle del nodo seleccionado (DoD, depends, related)
- --self-test imprime conteos a stdout (exit 0 si parse_errors=0)
- Reload manual via boton o tecla F5
- discover_registry_root: FN_REGISTRY_ROOT env o walk-up desde cwd
- uses_functions actualizado con parse_md_frontmatter_cpp_core
- CMakeLists.txt incluye el .cpp del parser

Smoke test 166 nodos parseados (159 issues + 7 flows), 0 parse errors.
Fase A del epic 0109. Sigue: 0109b layout anillos + render estatico.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 19:44:10 +02:00
egutierrez 9a59708422 chore: scaffold skill_tree (issue 0109)
Initial scaffold via init_cpp_app_bash_pipelines:
- main.cpp con Tree + Inspector panels (placeholders)
- app.md con trio icon (tree-structure + #c026d3) + e2e_checks
- CMakeLists.txt via add_imgui_app
- appicon.ico generado con generate_app_icon_py_infra

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