---
name: redeploy_all_cpp_apps
kind: pipeline
lang: bash
domain: pipelines
version: "1.0.0"
purity: impure
signature: "redeploy_all_cpp_apps(filter?: string) -> void"
description: "Cross-compila TODOS los apps C++ del registry en un solo cmake pass y despliega cada .exe al Desktop de Windows. Mas rapido que N builds individuales. Acepta filtro de nombre para despliegue parcial."
tags: [cpp, windows, deploy, redeploy, bulk, cpp-windows]
uses_functions:
  - build_cpp_windows_bash_infra
  - deploy_cpp_exe_to_windows_bash_infra
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
tested: false
tests: []
test_file_path: ""
file_path: "bash/functions/pipelines/redeploy_all_cpp_apps.sh"
params:
  - name: filter
    desc: "Opcional. Substring para limitar el deploy a apps cuyo nombre lo contenga (ej: 'graph' solo despliega apps con 'graph' en el nombre). Sin valor = todas las apps."
output: "Imprime tabla resumen con OK/SKIPPED/FAILED y nombres de cada app. Exit 1 si al menos una app fallo el deploy."
---

## Ejemplo

```bash
# Recompilar y redesplegar TODAS las apps C++ tras un cambio en cpp/framework/
./fn run redeploy_all_cpp_apps

# Solo apps cuyo nombre contenga "graph"
./fn run redeploy_all_cpp_apps graph
```

## Cuando usarla

Tras un cambio en `cpp/framework/app_base.cpp`, `cpp/functions/core/*` o cualquier
funcion linkada a multiples apps. Ahorra correr `redeploy_cpp_app_windows <name> <dir>`
N veces — un solo cmake pass compila todo el arbol en paralelo.

## Comportamiento

1. **Build**: invoca `build_cpp_windows` sin argumento (compila todo el arbol con
   `-j$(nproc)`). Un solo cmake pass — mucho mas rapido que N builds individuales.
2. **Descubrimiento**: itera `apps/*/CMakeLists.txt` y `projects/*/apps/*/CMakeLists.txt`.
   **No** usa `cpp/apps/` (deprecado tras issue 0096).
3. **Filtro** (opcional): si se paso un argumento, solo procesa apps cuyo `basename`
   contiene el substring.
4. **Por cada app**:
   - Localiza `.exe` en `cpp/build/windows/apps/<name>/<name>.exe`; si no existe,
     busca bajo `cpp/build/windows/` como fallback.
   - Si no hay `.exe`: log SKIP, continua (no aborta — apps headless o sub-repos no
     clonados no tienen build target).
   - `taskkill.exe /IM <name>.exe /F` silencioso (no aborta si falla).
   - `deploy_cpp_exe_to_windows <name> <app_dir>` (copia exe + DLLs + assets +
     enrichers + runtime, preserva `local_files/`).
   - Error por app: log FAILED, continua con la siguiente.
5. **Resumen final**: tabla `OK / SKIPPED / FAILED` con nombres. Exit 1 si hay
   al menos un FAILED.

## Variables de entorno

| Variable | Default | Descripcion |
|---|---|---|
| `FN_REGISTRY_ROOT` | auto-detect | Raiz del registry (busca hacia arriba desde el script) |
| `BUILD_WIN` | `$root/cpp/build/windows` | Directorio de build Windows |
| `WIN_DESKTOP_APPS` | `/mnt/c/Users/lucas/Desktop/apps` | Destino de deploy en Windows |

## Gotchas

- Solo Windows (cross-compile mingw-w64 + Desktop deploy via WSL2). En Linux puro no aplica.
- `taskkill.exe` requiere WSL2 con interop habilitado. No funciona en WSL1 ni Linux nativo.
- Algunas apps pueden no estar en el grafo cmake actual (sub-repo no clonado, `add_subdirectory`
  protegido por `if(EXISTS ...)`). El pipeline las SKIPea sin abortar — comportamiento esperado.
- Build paralelo puede consumir varios GB de RAM. Si hay OOM, reducir paralelismo exportando
  `BUILD_JOBS=4` antes de invocar (actualmente la funcion `build_cpp_windows` usa `$(nproc)`;
  si necesitas override edita `BUILD_JOBS` como variable de entorno custom o fork la funcion).
- El loop de deploy atrapa errores por app (`|| { failed+=...; continue; }`) para no abortar
  en el primer fallo — todas las apps se intentan aunque alguna falle.

## Capability growth log

- v1.0.0 (2026-05-16) — creacion. Tras issue 0096 (apps movidas a `apps/<X>/`) el patron "recompilar+desplegar todas tras un cambio en `cpp/framework/`" se repitio varias veces sin un wrapper. Pipeline tolerante a fallos: build best-effort (test_* roto en mingw no aborta), deploy por app captura fallos individuales, summary OK/SKIPPED/FAILED al final. Primera corrida real (16 May 2026): 12 OK / 1 SKIP (`data_factory` sin .exe target) / 0 FAILED.

## Notas operativas (2026-05-16)

- `build_cpp_windows` sin arg compila el arbol entero. Si hay targets rotos (ej. `test_llm_anthropic`, `test_graph_icons` usan `setenv()` no disponible en mingw-w64), el pipeline logea `[1/2] Build returned exit=N — continuing with deploy of available exes` y sigue con la fase de deploy. Cada app sin `.exe` queda SKIPPED.
- Tras una corrida exitosa, los `.exe` quedan en `/mnt/c/Users/lucas/Desktop/apps/<name>/<name>.exe`. Lanzar individualmente con `./fn run is_cpp_app_running_windows <name>` para chequear y `launch_cpp_app_windows <name>` para arrancar.
