Skip to content

fix: prevent Python/Java backend projects from being detected as web …#56

Open
oscaruiz wants to merge 4 commits into
midudev:mainfrom
oscaruiz:fix/48-python-backend-false-frontend
Open

fix: prevent Python/Java backend projects from being detected as web …#56
oscaruiz wants to merge 4 commits into
midudev:mainfrom
oscaruiz:fix/48-python-backend-false-frontend

Conversation

@oscaruiz
Copy link
Copy Markdown
Contributor

@oscaruiz oscaruiz commented Apr 6, 2026

What Changed

  • Added Python detection to SKILLS_MAP via config files (requirements.txt, pyproject.toml, setup.py, manage.py, etc.) with skills: []
  • Added BACKEND_ONLY_IDS set in skills-map.mjs to classify backend-only stacks (python, java, springboot)
  • Refactored detectTechnologies(): frontend file scan now runs once at the end, only when no frontend packages and no backend-only stack are detected
  • Removed dead code: isFrontendByFiles and skipFrontendFiles from detectTechnologiesInDir()

Why This Change

Fixes #48. Python backend projects (Flask, Django) containing .html templates and .css static files were incorrectly classified as web frontend, causing autoskills to suggest frontend-only skills (frontend-design, accessibility, seo).

Complementary to #17 which adds Python ecosystem skills. This PR focuses on the bug fix. If #17 merges first, this branch can rebase and drop the python entry.

Testing Done

  • Manual testing completed (Flask project, Django project, mixed Python+React project)
  • Automated tests pass locally (all 211 tests)
  • Edge cases considered and tested

Type of Change

  • fix: Bug fix
  • feat: New feature
  • refactor: Code refactoring
  • docs: Documentation
  • test: Tests
  • chore: Maintenance/tooling

Security & Quality Checklist

  • No secrets or API keys committed
  • Follows the project's coding standards
  • No sensitive data exposed in logs or output

Documentation

  • Updated relevant documentation
  • Added comments for complex logic
  • README updated (if needed)

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 6, 2026

@oscaruiz is attempting to deploy a commit to the midudev pro Team on Vercel.

A member of the Team first needs to authorize it.

@midudev
Copy link
Copy Markdown
Owner

midudev commented Apr 9, 2026

¡Hola! Muchas gracias por la PR, se nota el trabajo de análisis del problema y la solución está bien pensada. El bug es real y molesto — un proyecto Flask/Django no debería sugerir skills de frontend-design o SEO solo por tener templates .html.

El approach de BACKEND_ONLY_IDS + mover el escaneo de archivos al final de detectTechnologies me parece razonable. Los tests están bien escritos y siguen las convenciones del proyecto, que se agradece.

Dejo algunos comentarios para considerar:

1. Falta un test para el caso base: proyecto solo HTML/CSS sin backend

La refactorización mueve el file scan fuera de detectTechnologiesInDir, así que sería importante asegurar con un test que un proyecto puro HTML/CSS/JS (sin package.json, sin Python, sin nada) sigue detectándose como frontend. Algo como:

it("detects frontend from .html files when no backend stack is present", () => {
  writeFile(tmp.path, "index.html", "<!DOCTYPE html><html></html>");
  writeFile(tmp.path, "style.css", "body { margin: 0 }");
  const { isFrontend } = detectTechnologies(tmp.path);
  strictEqual(isFrontend, true);
});

2. Edge case: Python + frontend vanilla (sin npm)

Si alguien tiene un proyecto Flask como API junto con un directorio frontend/ con archivos HTML/JS/CSS puros (sin package.json ni framework), el file scan se saltaría porque Python está en BACKEND_ONLY_IDS. Resultado: isFrontend = false cuando podría ser true.

No creo que sea un blocker porque es un caso poco común, y el trade-off es correcto (el falso positivo actual es mucho más frecuente que este falso negativo). Pero estaría bien documentarlo con un comentario junto a BACKEND_ONLY_IDS para que quede constancia.

3. BACKEND_ONLY_IDS podría necesitar crecer

Go con html/template, PHP con .twig o .blade.php, incluso Node.js con .ejs/.hbs/.pug — varios stacks backend tienen extensiones que aparecen en WEB_FRONTEND_EXTENSIONS. Por ahora Python + Java + Spring Boot cubre el issue reportado, pero valdría la pena añadir un comentario indicando que el set es extensible para futuros lenguajes.


En general la PR tiene buena pinta. Con el test adicional del caso base (punto 1) estaría lista para merge. ¡Buen trabajo!

oscaruiz added 2 commits April 9, 2026 12:10
Address review feedback on midudev#56:

- Add regression test verifying that pure HTML/CSS projects without
  any backend stack are still detected as frontend, ensuring the
  refactor of hasWebFrontendFiles() out of detectTechnologiesInDir()
  did not break the happy path.
- Document BACKEND_ONLY_IDS with a JSDoc block covering the known
  false-negative trade-off (backend + vanilla frontend) and noting
  that the set is extensible to other backend template engines.
@oscaruiz oscaruiz force-pushed the fix/48-python-backend-false-frontend branch from d6a0e8c to 3e0536b Compare April 9, 2026 11:02
@oscaruiz
Copy link
Copy Markdown
Contributor Author

oscaruiz commented Apr 9, 2026

Gracias por la review, aplicados los tres puntos en 3e0536b:

  1. Añadido el test del caso base de detección HTML/CSS en detect.test.mjs,
    usando el snippet exacto que propusiste. Lo coloqué en el describe de
    detectTechnologies justo al lado de marks non-frontend projects correctly para que los casos de clasificación frontend queden agrupados.

  2. y 3. Documentado BACKEND_ONLY_IDS con un bloque JSDoc que cubre el
    trade-off del falso negativo (backend + frontend vanilla sin
    package.json) y deja constancia de que el set es extensible a otros
    motores de plantillas de backend (Go html/template, PHP
    .blade.php/.twig, Node server-side).

Aprovecho que la rama también se rebaseó sobre el último main para
integrar #17 (skills del ecosistema Python). Dos de mis tests originales
quedaron obsoletos tras ese rebase: comprobaban que python tenía skills
vacías, cosa que ya no es cierta, así que los
eliminé. Los tests core de regresión (Python/Django backend con plantillas
.html → no frontend, Python + React → frontend) siguen pasando.

Sobre el edge case del punto 2: si te parece útil, puedo abrir un issue
separado tras el merge para trackear una posible solución (heurística por
nombre de directorio, o detección de subproyectos con package.json
anidado). Lo dejo a tu criterio, no quiero meter scope nuevo en este PR.

Cualquier cosa que necesite ajuste, dime :)

…nd-false-frontend

# Conflicts:
#	packages/autoskills/lib.ts
#	packages/autoskills/skills-map.ts
@oscaruiz
Copy link
Copy Markdown
Contributor Author

oscaruiz commented Apr 19, 2026

Buenas,

He mergeado con lo último de main para adaptar el fix a la migración a TypeScript. La lógica es idéntica, los cambios son:

  • .mjs.ts en los 4 ficheros tocados
  • Tipado añadido donde corresponde (Set<string> en
    BACKEND_ONLY_IDS, interfaces DetectInDirOptions y
    DetectInDirResult simplificadas)
  • Todo lo de upstream/main adoptado íntegramente, sin eliminar
    ni modificar nada ajeno al fix

Ficheros tocados (solo 4, mismos que antes):

  • skills-map.ts → BACKEND_ONLY_IDS + JSDoc (+20, -0)
  • lib.ts → refactor de detectTechnologies (+16, -13)
  • tests/detect.test.ts → 8 tests (+60, -0)
  • tests/cli.test.ts → 2 tests (+20, -0)

342 tests pasando, 0 fallos. He testeado también manualmente con algún proyecto de Python.

Lo dicho, cualquier cosa que necesite ajuste, dime :)

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.

Python backend project incorrectly classified as web frontend

2 participants