El repositorio es un workspace de pnpm gestionado con Turborepo. Cada app es un Worker que puedes ejecutar en local con Wrangler.
Estructura
| Ruta | Qué es | Puerto local |
|---|---|---|
apps/web | Editor Nuxt, sistema de diseño con Panda CSS | 3000 |
apps/api | API con Hono | 4000 |
apps/realtime | Salas Yjs | 8788 |
apps/sites | Sitios publicados, <slug>.localhost:8790 | 8790 |
apps/runner | Flujos de trabajo de servidor, tablas, autenticación de visitantes | 8791 |
apps/mcp | Servidor MCP | 8792 |
packages/* | Librerías compartidas, importadas desde el código fuente | — |
docs/ | Arquitectura, guía de despliegue, proceso de agentes | — |
Puesta en marcha
Instala
Usa la versión de pnpm fijada en
package.json.bashpnpm install # also runs nuxt prepare + panda codegen for web cp apps/api/.dev.vars.example apps/api/.dev.vars cp apps/sites/.dev.vars.example apps/sites/.dev.vars cp apps/realtime/.dev.vars.example apps/realtime/.dev.vars cp apps/mcp/.dev.vars.example apps/mcp/.dev.vars # fill in DATABASE_URL (a Neon dev branch) and the shared keysMigra la base de datos
Aplica
packages/db/migrationsa tu rama de desarrollo conpnpm --filter @malla/db db:migrateyDATABASE_URLdefinido.Ejecuta
bashpnpm dev # every Worker and the editor through turbo pnpm --filter web dev # just the editor pnpm --filter api dev # just one Worker
Sandbox local
pnpm sandbox ejecuta todo el stack (Postgres, api, realtime, sites, runner y el editor) sin .dev.vars y sin DATABASE_URL que configurar. Postgres es PGlite, las migraciones de packages/db/migrations se aplican al arrancar y los secretos de desarrollo se generan una sola vez. Los datos se conservan entre ejecuciones; presiona Ctrl+C para detenerlo.
pnpm sandbox # start; data persists between runs
pnpm sandbox --reset # wipe the sandbox data first, then start
| Servicio | URL |
|---|---|
| Editor | http://localhost:3200/login |
| API | http://localhost:4200/health |
| Realtime | ws://localhost:8988 |
| Sites | http://<slug>.localhost:8990 (después de publicar) |
| Runner | http://localhost:8991/health |
| Postgres | postgres://postgres@127.0.0.1:5599/postgres |
Inicia sesión como demo@malla.local con la contraseña demo-password-123. El primer arranque crea ese usuario, su espacio de trabajo y un sitio llamado "Demo site" con el slug demo. Los puertos no chocan con pnpm dev ni con el stack de e2e, así que los tres pueden correr a la vez. El sandbox no arranca el Worker de MCP y no tiene claves de correo ni de IA: no envía correos (así que no hay enlaces de inicio de sesión) y la IA integrada está desactivada. Todo lo que genera vive en scripts/sandbox/.data/; scripts/sandbox/README.md explica cómo cambiar los puertos y los demás detalles.
Controles de calidad
pnpm check-types # TypeScript across the monorepo
pnpm test # Vitest unit tests in every package
pnpm --filter web build # production build of the editor
pnpm e2e # Playwright against the full local stack
graphify update . # refresh the code knowledge graph
La suite de e2e arranca su propio stack en un directorio de estado por checkout, así que los worktrees en paralelo nunca chocan, y guarda una captura de pantalla por test en apps/web/e2e/.screenshots/.
Convenciones
- Vue 3
<script setup lang="ts">, TypeScript estricto, imports explícitos (los auto-imports están desactivados). - La interfaz del editor se estiliza con Panda CSS usando solo tokens semánticos; las animaciones pasan por
app/motion(GSAP). - Todos los cambios del documento pasan por ops y
editor.document.transact; nunca modifiques el documento directamente. - Commits pequeños con Conventional Commits, un cambio lógico por commit. Las reglas completas están en
docs/frontend-conventions.md.