--- 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.