--- 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 ` 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//.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 .exe /F` silencioso (no aborta si falla). - `deploy_cpp_exe_to_windows ` (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//`) 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//.exe`. Lanzar individualmente con `./fn run is_cpp_app_running_windows ` para chequear y `launch_cpp_app_windows ` para arrancar.