DevMind convierte un repositorio de código en un asistente técnico con contexto.
Sube un proyecto en formato .zip, deja que DevMind lo analice y haz preguntas
sobre su funcionamiento. Las respuestas incluyen referencias a las partes
relevantes del código para que puedas comprobarlas y seguir investigando.
Web: https://devmind-frontend.vercel.app/
- Análisis de proyectos: sube repositorios en formato
.zipe indexa su código. - Chat con contexto: pregunta sobre el proyecto y recibe respuestas basadas en él.
- Fuentes verificables: consulta los fragmentos de código que respaldan cada respuesta.
- Progreso visible: sigue el estado de la indexación en tiempo real.
- Historial persistente: guarda proyectos y conversaciones con una cuenta registrada.
Crear proyecto → Subir ZIP → Indexar el código →
Preguntar a la IA → Consultar fuentes e historial
Puedes empezar como invitado, sin pasar primero por un registro. Las sesiones de invitado permiten completar el flujo principal, aunque sus datos son temporales y no guardan historial. Al crear una cuenta, los proyectos y las conversaciones pasan a ser persistentes.
Los proyectos creados como invitado no se transfieren a una cuenta nueva porque el backend todavía no ofrece esa operación.
Este frontend está construido con React, Vite y TypeScript. Utiliza
React Router, TanStack Query y Tailwind CSS, y consume la API descrita
en docs/openapi.yaml.
npm install
npm run devLa app queda en http://localhost:5173 (puerto por defecto de Vite, ya permitido
por el CORS del backend).
La URL base de la API se configura con VITE_API_URL (por defecto
http://localhost:3000). Para cambiarla, copia el ejemplo y edítalo:
cp .env.example .env
# VITE_API_URL=http://localhost:3000| Script | Qué hace |
|---|---|
npm run dev |
Arranca el servidor de desarrollo (Vite). |
npm run build |
Comprueba tipos (tsc) y genera el build de producción. |
npm run preview |
Sirve el build de producción localmente. |
npm run gen:api |
Regenera los tipos de la API desde docs/openapi.yaml. |
El frontend siempre tiene un token para llamar a la API:
- Al cargar, si no hay token guardado, se crea una sesión de invitado en
segundo plano (
POST /auth/guest). El visitante entra directo al producto, sin ver nunca un login primero. - Registro / login viven en páginas aparte (
/register,/login) accesibles desde la cabecera. Al completarlas, el modo pasa aregistered. - El modo (
guest|registered) y el token se guardan enlocalStorage; el frontend sabe en qué modo está sin preguntárselo al backend. - Ante un 401, se renueva automáticamente la sesión de invitado y se reintenta la petición; si el usuario estaba registrado, se le lleva al login.
- Invitado: puede subir, indexar y preguntar, pero sus datos son temporales y no se le guarda historial. Registrado: sus proyectos persisten y tiene historial navegable.
El proyecto subido como invitado no se transfiere a la cuenta al registrarse (el backend no lo soporta), y así se indica en la UI.
Lo primero que se ve es el formulario de creación del proyecto (no un login).
El nombre y la descripción se piden aquí porque son los datos que la API necesita
para crear el proyecto (POST /projects); la subida del .zip ocurre ya dentro
del proyecto (POST /projects/{id}/upload).
flowchart LR
U[Usuario] --> UI[Páginas y componentes]
UI --> H[Hooks de dominio]
H --> Q[TanStack Query]
Q --> E[Endpoints tipados]
E --> C[Cliente HTTP]
C --> API[API de DevMind]
A[AuthContext] --> UI
A --> C
A <--> S[(Sesión en localStorage)]
El archivo docs/openapi.yaml es el contrato compartido con
el backend: describe los endpoints, los cuerpos de las peticiones, las respuestas,
los errores y los esquemas de datos de DevMind.
La integración sigue este flujo:
npm run gen:apiejecutaopenapi-typescriptsobre el contrato.- La herramienta genera
src/api/schema.ts; este archivo no se edita a mano. src/api/types.tsexpone alias de dominio —comoProject,ProjectFileoAskProjectQuestionResult— a partir de los esquemas generados.- Los endpoints, hooks y componentes consumen esos tipos durante la compilación.
docs/openapi.yaml → openapi-typescript → schema.ts → types.ts → aplicación
Así, un cambio incompatible en un esquema se detecta al regenerar los tipos y
ejecutar npm run build, antes de llegar al navegador. El contrato sigue siendo
la fuente de verdad y se evita mantener modelos TypeScript duplicados que podrían
quedar desincronizados.
Las funciones de src/api/endpoints.ts conservan una capa pequeña y explícita
sobre fetch: construyen las rutas y peticiones, mientras que src/api/client.ts
centraliza el token Bearer, la serialización, los errores y la recuperación ante
respuestas 401. Actualmente, las rutas y los cuerpos de petición se implementan
manualmente; la generación automática se aplica a los tipos del contrato.
Cuando cambie la API:
npm run gen:api
npm run buildEl primer comando actualiza los tipos y el segundo comprueba la integración y genera el build de producción.
src/
├── api/ Cliente de API tipado (schema generado del OpenAPI + fetch con token)
│ ├── schema.ts Tipos autogenerados (no editar a mano; usar `npm run gen:api`)
│ ├── client.ts Wrapper de fetch: Bearer token, errores amables, recuperación de 401
│ ├── endpoints.ts Una función por operación del OpenAPI
│ └── session.ts Persistencia de token/modo en localStorage
├── auth/ AuthContext: sesión invitado/registrado y bootstrap
├── components/ UI compartida (header, dropzone, progreso, pasos, toasts…)
├── hooks/ Hooks de React Query (proyectos, subida, indexación, chat, historial)
├── pages/ Una página por ruta
└── lib/ Utilidades
| Ruta | Página | Propósito |
|---|---|---|
/ |
Inicio / Crear | Crear proyecto (nombre + descripción). Lo primero que se ve. |
/projects/:id |
Proyecto | Subir el .zip, ver el resumen e indexar con progreso. |
/projects/:id/chat |
Chat | Preguntar a la IA (respuestas con fuentes). |
/projects/:id/history |
Historial | Conversaciones guardadas (solo registrado). |
/projects |
Mis proyectos | Listar / borrar proyectos (registrado). |
/login, /register |
Autenticación | Formularios de acceso. |
- La indexación (
POST /projects/{id}/index) es síncrona en el backend: el frontend hace polling deGET /projects/{id}/indexing-statuscada ~1,5 s en paralelo para mostrar el progreso, y para de sondear al llegar acompletedofailed. - Los tipos de la API no se escriben a mano: se generan desde el OpenAPI, así que reflejan el contrato compartido con el backend.