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