Skip to content

fix: detecta el stack aunque el manifiesto no esté en la raíz - #18

Merged
lacasoft merged 1 commit into
masterfrom
fix/deteccion-anidada
Aug 17, 2026
Merged

lacasoft merged 1 commit into
masterfrom
fix/deteccion-anidada

Conversation

@lacasoft

Copy link
Copy Markdown
Owner

Este commit iba en #17, pero el merge ocurrió justo antes de que aterrizara el push, así que se quedó fuera de master. Es el arreglo más importante de los que salieron al instalar el kit en un proyecto C# real, así que va en su propio PR. Contenido idéntico al que comenté en #17, sin conflictos.

El problema

La detección solo miraba la raíz del repo. Con el proyecto en PruebaConteo/PruebaConteo.csproj había que pasar --stack backend/dotnet a mano, y en .NET ese layout no es una rareza: es el normal (Proyecto/Proyecto.csproj, src/App/App.csproj).

La solución

Las reglas se factorizan a detectIn(dir), parametrizado por directorio. detectStack() las aplica primero a la raíz y, solo si ahí no hay nada, a los subdirectorios en anchura: 3 niveles, tope de 250 directorios, saltando node_modules, bin, obj, target, dist, packages…

La raíz mantiene prioridad absoluta, así que ningún proyecto que ya se detectaba cambia de resultado — hay un test que lo fija. packages/ se salta a propósito: en un monorepo, elegir un paquete al azar sería peor que pedir --stack.

Auditable, no un acto de fe

✅ Stack detectado: backend/dotnet (por PruebaConteo/, no por la raíz)
   El kit se instala aquí, en testC2/, para que el CLAUDE.md cubra todo el repo.

Esa segunda línea responde la duda que aparece al instalar en la raíz teniendo el proyecto en un subdirectorio.

Verificación

Caso Resultado
PruebaConteo/PruebaConteo.csproj (el caso real) backend/dotnet (por PruebaConteo/)
src/App/App.csproj backend/dotnet (por src/App/)
.sln en raíz backend/dotnet (sin cambio)
backend/pom.xml con Spring backend/spring (por backend/)
web/angular.json frontend/angular (por web/)
Raíz NestJS + sub/Legacy.csproj backend/nestjs — la raíz gana
obj/Debug/generado.csproj, node_modules/x/angular.json no detecta: son artefactos

Test plan

  • node --test — 51 → 56 tests (5 nuevos: el caso real, src/App, Spring y Angular anidados, la raíz ganando sobre el subdirectorio, y artefactos de build ignorados)
  • node scripts/validate.cjs — 49 comprobaciones
  • Smoke test del CI replicado en local: 13 stacks en verde
  • Costo medido: 156 ms en un repo hostil de 422 directorios sin nada detectable — y solo se paga cuando la raíz no resuelve

Instalar en un proyecto C# real destapó que la detección solo miraba la raíz
del repo. En .NET el layout normal es Proyecto/Proyecto.csproj o
src/App/App.csproj, así que un proyecto C# perfectamente estándar no se
detectaba y había que pasar --stack a mano.

Las reglas de detección se factorizan a detectIn(dir), parametrizado por
directorio, y detectStack() las aplica primero a la raíz y, SOLO si ahí no hay
nada, a los subdirectorios en anchura (3 niveles, tope de 250 directorios,
saltando node_modules, bin, obj, target, dist y packages). La raíz mantiene
prioridad absoluta: ningún proyecto que ya se detectaba cambia de resultado.

packages/ se salta a propósito: en un monorepo, elegir un paquete al azar sería
peor que pedir --stack.

El instalador informa de por dónde lo detectó —'backend/dotnet (por
PruebaConteo/, no por la raíz)'— y aclara que se instala en el directorio
actual para que el CLAUDE.md cubra todo el repo.

Coste medido: 156 ms en un repo de 422 directorios sin nada detectable, y solo
se paga cuando la raíz no resuelve.

Tests: 56 (5 nuevos: el caso real, src/App, Spring y Angular anidados, la raíz
ganando sobre el subdirectorio, y artefactos de build ignorados).
@lacasoft
lacasoft merged commit c67c4c9 into master Aug 17, 2026
1 check passed
@lacasoft
lacasoft deleted the fix/deteccion-anidada branch August 17, 2026 17:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant