Files
fn_registry/dev/issues/0055-docker-tui-registry-first-refactor.md

104 lines
4.4 KiB
Markdown

---
id: "0055"
title: "docker_tui: refactor para usar funciones docker_* del registry"
status: pendiente
type: refactor
domain:
- registry-quality
scope: multi-app
priority: alta
depends: []
blocks: []
related: []
created: 2026-05-17
updated: 2026-05-17
tags: []
---
# 0055 — docker_tui: refactor para usar funciones docker_* del registry
## APP Metadata
| Campo | Valor |
|-------|-------|
| **ID** | 0055 |
| **Estado** | pendiente |
| **Prioridad** | alta |
| **Tipo** | refactor — `apps/docker_tui/` |
## Dependencias
- 12 funciones del registry ya existentes:
- `docker_pull_image_go_infra`, `docker_list_containers_go_infra`, `docker_remove_container_go_infra`
- `docker_remove_image_go_infra`, `docker_remove_network_go_infra`, `docker_create_network_go_infra`
- `docker_stop_container_go_infra`, `docker_start_container_go_infra`, `docker_list_images_go_infra`
- `docker_inspect_container_go_infra`, `docker_run_container_go_infra`, `docker_container_logs_go_infra`
- Tipos relacionados en `functions/infra/` (Container, Image, Network).
## Contexto
`fn doctor uses-functions` (2026-05-07) detecto que `apps/docker_tui/` ejecuta el CLI `docker` directamente via `shell.RunWithTimeout` en `views/docker.go` (`ListContainers`, `StartContainer`, `StopContainer`...). Cero consumo del registry.
Como en `0054`, la TUI fue construida antes de que existieran las funciones equivalentes en `functions/infra/`. Las 12 docker_* del registry parsean output JSON de docker CLI y devuelven tipos Go — exactamente lo que la TUI necesita.
Tras sincronizar `app.md` (2026-05-07) las 12 funciones se quitaron — ahora refleja la realidad, pero la deuda registry-first persiste.
## Objetivo
Reemplazar `views/docker.go` (y similares) por llamadas a `functions/infra/docker_*.go`. Resultado:
1. `apps/docker_tui/views/docker.go` importa `fn-registry/functions/infra`.
2. `app.md` declara las 12 docker_* funciones en `uses_functions`.
3. TUI sigue funcionando identica (acciones lentas se mantienen lentas, no es regresion).
4. `fn doctor uses-functions` reporta docker_tui limpio.
## Arquitectura
### Archivos afectados
- `apps/docker_tui/views/docker.go` — sustituir todas las llamadas inline a docker CLI por funciones del registry.
- `apps/docker_tui/app.md` — anadir 12 deps en `uses_functions`.
- Probable: `apps/docker_tui/handlers/` o similar segun estructura.
## Tareas
### Fase 1 — preparacion
1.1 Listar callsites a docker CLI: `grep -rn 'shell\.Run.*docker\|exec\.Command.*"docker"' apps/docker_tui/`.
1.2 Mapear cada accion TUI (start, stop, list, logs, inspect, ...) a la funcion del registry equivalente.
1.3 Anadir `replace fn-registry => ../..` en `go.mod` si falta.
### Fase 2 — migracion list/inspect (read-only primero)
2.1 `ListContainers``infra.DockerListContainers`.
2.2 `ListImages``infra.DockerListImages`.
2.3 `InspectContainer``infra.DockerInspectContainer`.
2.4 Validar que tipos retornados encajan con lo que la UI espera (`Container`, `Image`).
### Fase 3 — migracion lifecycle (write)
3.1 `StartContainer``infra.DockerStartContainer`.
3.2 `StopContainer``infra.DockerStopContainer`.
3.3 `RemoveContainer``infra.DockerRemoveContainer`.
3.4 `PullImage``infra.DockerPullImage`.
3.5 `RemoveImage``infra.DockerRemoveImage`.
### Fase 4 — migracion network/run/logs
4.1 `CreateNetwork``infra.DockerCreateNetwork`.
4.2 `RemoveNetwork``infra.DockerRemoveNetwork`.
4.3 `RunContainer``infra.DockerRunContainer`.
4.4 `ContainerLogs``infra.DockerContainerLogs`.
### Fase 5 — tests + docs
5.1 Lanzar TUI manualmente, verificar todas las acciones funcionan (smoke test).
5.2 Actualizar `app.md` `uses_functions`.
5.3 `fn index` + `fn doctor uses-functions` limpio.
5.4 Update CHANGELOG.md.
## Riesgos
- Las funciones del registry parsean output JSON; si el TUI dependia de output text-mode, las firmas cambian. Mitigacion: las funciones del registry ya exponen tipos Go estructurados, mejor ergonomia.
- Acciones largas (PullImage, RunContainer con stream): verificar que las funciones del registry soportan streaming o callback. Si no, abrir proposal para extender.
- Tests existentes con mocks de docker CLI rompen. Mitigacion: usar un docker daemon real para integration tests.
## Decisiones de diseno
- Como en `0054`, NO crear adapter layer. Llamadas directas.
- Si una accion del TUI necesita algo que el registry no expone (ej. flags raros), abrir proposal `extend_existing_function` antes de duplicar.