--- name: regenerate_app_icons kind: pipeline lang: py domain: pipelines version: "1.0.0" purity: impure signature: "def regenerate_app_icons(only: list[str] | None = None) -> dict" description: "Escanea todas las apps C++ del registry, lee el bloque `icon: {phosphor, accent}` de cada app.md y regenera el appicon.ico via generate_app_icon. Reemplaza el script ad-hoc dev/gen_app_icons.py." tags: [cpp-windows, icon, phosphor, batch] uses_functions: [generate_app_icon_py_infra] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [os, sys, pathlib, typing, yaml] params: - name: only desc: "Lista opcional de nombres de app (campo `name` del frontmatter) a procesar. Si None, regenera todas las apps C++ con icon: declarado." output: "dict {ok: [name], skipped: [{name, reason}], failed: [{name, error}]}" tested: false tests: [] test_file_path: "" file_path: "python/functions/pipelines/regenerate_app_icons.py" --- ## Ejemplo ```bash # Regenerar todas las apps C++ con icon: declarado ./fn run regenerate_app_icons # Solo una app ./fn run regenerate_app_icons chart_demo # Varias apps ./fn run regenerate_app_icons chart_demo registry_dashboard ``` ```python import sys sys.path.insert(0, "python/functions") from pipelines.regenerate_app_icons import regenerate_app_icons result = regenerate_app_icons() print(f"OK: {len(result['ok'])}, FAIL: {len(result['failed'])}") ``` Bloque `icon:` esperado en `app.md`: ```yaml icon: phosphor: "chart-bar" accent: "#0ea5e9" ``` ## Cuando usarla Cuando anades una app C++ nueva (anades `icon:` a su `app.md` y corres el pipeline), cambias el color/glyph de una app existente, o pulleas cambios de iconos desde otra rama. Antes de `redeploy_cpp_app_windows` para que el `.exe` lleve el icono actualizado. ## Gotchas - **Sobreescribe `appicon.ico` sin warning** — igual que `generate_app_icon`. Hacer backup si necesitas preservar version anterior. - **Requiere `sources/phosphor-core/`**: clonar con `git clone --depth=1 https://github.com/phosphor-icons/core.git sources/phosphor-core` si no existe. - **Solo procesa apps con `lang: cpp`** en frontmatter — apps Go/Python se ignoran aunque tengan `icon:`. - **Apps sin `icon:` se reportan en `skipped`**, no son error. Util para detectar apps C++ a las que falta declarar el icono. - **No invalida el cache de iconos de Windows** — si Explorer no muestra el icono nuevo tras redeploy: `ie4uinit.exe -show` o reiniciar Explorer.