--- id: "0096" title: "Estandarizar ubicacion de apps: fuera de carpetas por lenguaje" status: pendiente type: feature domain: - apps-infra scope: app-scoped priority: alta depends: [] blocks: [] related: [] created: 2026-05-17 updated: 2026-05-17 tags: [] --- # 0096 — Estandarizar ubicacion de apps: fuera de carpetas por lenguaje **Status:** pendiente **Created:** 2026-05-15 **Type:** refactor **Priority:** alta **Blocks:** 0097 (data_factory) — no se arranca app nueva mientras la convencion esta rota ## Problema La regla esta documentada (`.claude/rules/apps_vs_functions.md`, memoria `apps_location`): **toda app vive en `apps/` (independiente) o `projects/

/apps/` (de proyecto)**. NUNCA en una carpeta nombrada por lenguaje (`cpp/apps/`, `python/apps/`, etc.). Violacion actual: `cpp/apps/` contiene 8 apps: | Actual | Tipo | Destino propuesto | |---|---|---| | `cpp/apps/altsnap_jitter_test` | test ad-hoc | `apps/altsnap_jitter_test` | | `cpp/apps/chart_demo` | demo standalone | `apps/chart_demo` | | `cpp/apps/dag_engine_ui` | companion `apps/dag_engine` | `apps/dag_engine_ui` | | `cpp/apps/engine_smoke` | smoke runtime | `apps/engine_smoke` | | `cpp/apps/primitives_gallery` | demo componentes registry | `apps/primitives_gallery` | | `cpp/apps/runtime_test` | smoke runtime | `apps/runtime_test` | | `cpp/apps/shaders_lab` | tooling shaders | `apps/shaders_lab` (existe homonimo en `apps/shaders_lab` — VERIFICAR antes) | | `cpp/apps/text_editor_smoke` | smoke editor | `apps/text_editor_smoke` | Carpetas `python/apps/`, `bash/apps/`, `frontend/apps/` no existen — convencion solo rota por C++ historicamente. ## Por que importa - **Auto-discovery**: `fn doctor cpp-apps`, `fn doctor artefacts`, indexador, `pc_locations` asumen `apps/` o `projects/

/apps/`. Soporte de `cpp/apps/` esparcido por codigo, ramas if-else, paths hardcodeados. - **Sub-repos Gitea**: cada app es `dataforge/` (ADR 0002). Path en disco no afecta al remoto pero la entrada `pc_locations.dir_path` diverge. - **Onboarding**: nueva persona/agente lee la regla, ve `cpp/apps/`, asume que aplica solo a Go/Py. Confusion. - **Scaffolder roto**: `init_cpp_app_bash_pipelines` puede haber generado en `cpp/apps/` historicamente; debe forzar `apps/`. ## Objetivo 1. Mover los 8 directorios `cpp/apps/*` -> `apps/*`. 2. Actualizar `cpp/CMakeLists.txt` para apuntar a los nuevos paths. 3. Actualizar `dir_path` en cada `app.md`. 4. `fn index` para refrescar registro. 5. `fn sync` para actualizar `pc_locations` en BD remota. 6. Modificar scaffolder `init_cpp_app_bash_pipelines` para escribir siempre en `apps/` (o `projects/

/apps/` si flag `--project`), nunca en `cpp/apps/`. 7. Anadir check `fn doctor artefacts` (o nuevo subcomando `fn doctor app-location`) que falle si encuentra cualquier artefacto bajo carpeta de lenguaje (`cpp/apps`, `python/apps`, `bash/apps`, `frontend/apps`, ademas `cpp/analysis`, etc.). 8. Borrar `cpp/apps/` vacio al final. ## Aceptacion - `ls cpp/apps/ 2>/dev/null` devuelve vacio (o el directorio no existe). - `ls apps/` incluye los 8 nuevos. - `cmake --build cpp/build -j` compila todos los targets (mismo binario, distinto path source). - Cada app sigue ejecutandose y pasando su `e2e_checks` (si declarado). - `fn doctor artefacts` y `fn doctor cpp-apps` sin nuevos warnings. - `fn doctor app-location` (nuevo) reporta 0 violaciones. - `mcp__registry__fn_show id=""` devuelve `dir_path: "apps/"` para los 8. - `init_cpp_app_bash_pipelines` con destino default crea en `apps/`, no `cpp/apps/`. - ADR / regla `.claude/rules/cpp_apps.md` actualizada: tabla "Ubicacion" elimina la fila "App independiente | `cpp/apps//`" -> "App independiente | `apps//`". ## Plan de ejecucion Por cada app `` (en orden de dependencia: tests primero, luego demos, luego apps): ```bash # 1. Verificar que no hay homonimo en apps/ test -d apps/ && echo "CONFLICT" || true # 2. Mover (preserva .git interno del sub-repo) git mv cpp/apps/ apps/ # o si .git esta dentro y git mv complica: cp -a + rm + commit en sub-repo # 3. Editar dir_path en apps//app.md sed -i 's|dir_path: "cpp/apps/"|dir_path: "apps/"|' apps//app.md # 4. Editar cpp/CMakeLists.txt para usar _DIR pattern como graph_explorer: # set(__DIR ${CMAKE_SOURCE_DIR}/../apps/) # add_subdirectory(${__DIR} ${CMAKE_BINARY_DIR}/apps/) # 5. Re-build cmake --build cpp/build -j --target # 6. Validar binario ./cpp/build/apps// --self-test || ./cpp/build/apps// --help ``` Una vez los 8 movidos: ```bash rmdir cpp/apps/ # debe estar vacio ./fn index ./fn sync ./fn doctor app-location # subcomando nuevo ``` ### Sub-tareas (recomendado: una rama TBD por bloque) | Rama | Apps | Comentario | |---|---|---| | `issue/0096-tests` | altsnap_jitter_test, engine_smoke, runtime_test, text_editor_smoke | smoke tests, riesgo bajo | | `issue/0096-demos` | chart_demo, primitives_gallery | demos | | `issue/0096-tools` | shaders_lab, dag_engine_ui | tooling. shaders_lab CHECK homonimo en `apps/shaders_lab` primero | | `issue/0096-scaffolder` | — | parche a `init_cpp_app_bash_pipelines` + `fn doctor app-location` + regla `.md` | Merge `--no-ff` a master tras cada bloque, validar build entre uno y otro. ## Riesgos | Riesgo | Mitigacion | |---|---| | Homonimo en `apps/` ya existente (caso `shaders_lab`) | Verificar `ls apps/` antes de mover. Si existe: decidir merge / rename. | | `git mv` rompe sub-repo interno con su propio `.git/` | El `.git/` viaja con el directorio. Verificar `git -C apps/ status` tras mv. Si rompe, cp -a + delete + commit. | | `pc_locations` queda desincronizado en otros PCs | `fn sync` push tras cambios + `/full-git-pull` en otros PCs lo reconcilia. Documentar. | | `cpp/CMakeLists.txt` con paths absolutos sucios | Usar variable `__DIR` con `${CMAKE_SOURCE_DIR}/../apps/` igual que `graph_explorer`. Convencion ya probada. | | Sub-repo tiene gitignore o config que asume path | Improbable. Verificar tras primer mv. | | Memoria del usuario / claude assumes paths viejos | Actualizar `.claude/rules/cpp_apps.md` + memoria `apps_location` con nota explicita. | ## No-objetivos - Mover `cpp/functions/`, `python/functions/`, `bash/functions/`, `frontend/functions/`. Estos NO son artefactos — son codigo del registry organizado por lenguaje. La regla solo aplica a apps/analysis/vaults/projects. - Mover `cpp/build/`, `cpp/vendor/`, `cpp/framework/`. Son infraestructura compartida del registry C++, no artefactos. - Renombrar apps. Solo se mueve directorio. - Cambiar identidad de sub-repo Gitea (`dataforge/` queda igual). ## Nueva regla: detector Funcion nueva (delegar a fn-constructor): `audit_app_location_go_infra` (puro: scan filesystem). Reglas: - Si encuentra `app.md` con `lang: cpp` (o cualquier lang) bajo `cpp/apps/`, `python/apps/`, `bash/apps/`, `frontend/apps/` -> reporta violacion. - Lo mismo para `analysis.md` bajo carpetas de lenguaje. - Wrap en `fn doctor app-location`. Add al `fn doctor` agregador. ## Telemetria objetivo - 8 entradas en `pc_locations` actualizadas (`entity_type='app'`, `dir_path` cambia de `cpp/apps/*` a `apps/*`). - `function_stats` de `init_cpp_app_bash_pipelines`: incremento de version (v1.x.0 -> v1.(x+1).0) por el cambio de default path. - `fn doctor app-location` con 0 violaciones tras ejecucion.