---
name: resolve_cpp_app_dir
kind: function
lang: bash
domain: infra
version: "1.1.0"
purity: impure
signature: "resolve_cpp_app_dir(app_name?: string) -> stdout: app_name\tapp_dir"
description: "Resuelve el nombre y directorio absoluto de una app C++ del registry. Sin arg deduce desde CWD si esta dentro de apps/<X>/, cpp/apps/<X>/ o projects/*/apps/<X>/. Con arg busca en las tres ubicaciones (apps/ canonical issue 0096 primero, luego cpp/apps/ legacy, luego projects/*/apps/). Imprime '<app_name>TAB<absolute_dir>' en stdout, exit 0; si no resuelve, lista apps disponibles en stderr y sale con exit 1."
tags: [cpp, resolve, app, directory, infra, cpp-windows]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
tested: false
tests: []
test_file_path: ""
file_path: "bash/functions/infra/resolve_cpp_app_dir.sh"
params:
  - name: app_name
    desc: "Nombre de la app C++ a resolver (opcional). Sin arg se deduce desde el directorio actual si estamos dentro de apps/<X>/, cpp/apps/<X>/ o projects/*/apps/<X>/."
output: "Una linea TAB-separada '<app_name>\\t<absolute_dir_path>' en stdout. En caso de error imprime ayuda a stderr y sale con exit 1."
---

## Ejemplo

```bash
# Desde dentro de cpp/apps/chart_demo/
cd $HOME/fn_registry/cpp/apps/chart_demo
resolve_cpp_app_dir
# -> chart_demo\t$HOME/fn_registry/cpp/apps/chart_demo

# Con argumento explicito
resolve_cpp_app_dir registry_dashboard
# -> registry_dashboard\t$HOME/fn_registry/cpp/apps/registry_dashboard

# Capturar los dos campos
resolved=$(resolve_cpp_app_dir graph_explorer)
APP="$(echo "$resolved" | cut -f1)"
APP_DIR="$(echo "$resolved" | cut -f2)"
```

## Notas

Busca en orden:
1. `$ROOT/apps/<X>` con `CMakeLists.txt` — layout canonical post-issue 0096.
2. `$ROOT/cpp/apps/<X>` — legacy pre-issue 0096.
3. `$ROOT/projects/*/apps/<X>` — apps de un proyecto (primer match gana).

Si ninguna ruta existe, imprime lista de apps disponibles (con prefijo de ubicacion) en stderr y sale con exit 1. Sourceable o ejecutable directamente. Helper interno `_list_cpp_apps` evita duplicar codigo en los paths de error.

### Growth log

- v1.1.0 (2026-05-16) — busca tambien en `apps/<X>/` (canonical issue 0096). Antes solo cubria `cpp/apps/<X>/` y `projects/*/apps/<X>/`, lo que hacia que `./fn run compile_cpp_app <name>` fallara para apps movidas al layout canonical (ej. `dag_engine_ui`).
