feat(matilda): ghost + linker + CLI — el ciclo completo de aplicación

matilda-ghost: el agente que ejecuta los ApplySteps en la máquina
destino — escribe archivos, corre comandos, reporta paso a paso;
semántica set -e (se detiene en el primer error). dry_run previsualiza
sin tocar nada. 5 tests.

matilda-linker: aplica los pasos en un host remoto por SSH sobre
brahman-ssh-multiplex; produce el mismo ApplyReport que el ghost local.

apps/matilda: deja de ser una demo hardcoded — ahora es una CLI real:
  matilda example | plan | script | apply  (local · --dry-run · --host)
Carga el inventario de un JSON, reconcilia y aplica.

matilda: 6 crates + CLI, ~42 tests. La cadena va de la declaración
a la aplicación local/remota.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-20 20:27:28 +00:00
parent 5b9d8107fc
commit df8f92fbb0
11 changed files with 683 additions and 86 deletions
+16 -10
View File
@@ -35,16 +35,22 @@ App: `apps/matilda` — demo CLI (`cargo run -p matilda`).
- `config` y `plan``matilda-core`. Todos `#![forbid(unsafe_code)]`.
- Cero Docker, cero SSH, cero disco — sólo modelos y strings.
## Crates de ejecución
| crate | tipo | rol |
| ---------------- | ---- | ------------------------------------------------------------ |
| `matilda-ghost` | lib | Ejecuta los `ApplyStep`s en la máquina destino (escribe archivos, corre comandos) + `dry_run`; reporta paso a paso |
| `matilda-linker` | lib | Aplica los pasos en un host **remoto** por SSH (`brahman-ssh-multiplex`); mismo `ApplyReport` |
CLI: `apps/matilda``example` / `plan` / `script` / `apply`
(local · `--dry-run` · `--host usuario@host` por SSH).
## Estado
`core` + `config` + `plan` + `apply` implementados y verdes (35 tests) +
demo CLI. La cadena pura ya llega de la declaración al script de shell
concreto listo para correr en el servidor.
`core` + `config` + `plan` + `apply` + `ghost` + `linker` implementados
y verdes (~42 tests) + CLI. La cadena va de la declaración (inventario
JSON) al plan, al script y a la aplicación —local, en seco o remota—.
**Pendiente** (la capa de I/O):
| crate pendiente | rol |
| ----------------- | ------------------------------------------------ |
| `matilda-linker` | transporte SSH (sobre `transport-ssh-multiplex`) |
| `matilda-ghost` | agente remoto que ejecuta los `ApplyStep`s |
| `matilda-app` | frontend GPUI |
**Pendiente**: `matilda-discover` (leer el estado actual del servidor —
`docker inspect`, sitios de nginx— para un diff real en vez de partir
de un inventario vacío) y `matilda-app`, el frontend GPUI.