MallaDocs

Développement local

L’organisation du monorepo, l’exécution locale de chaque Worker et les contrôles qualité.

Guide développeur

Le dépôt est un espace de travail pnpm piloté par Turborepo. Chaque application est un Worker que vous pouvez lancer en local avec Wrangler.

Organisation

CheminContenuPort local
apps/webÉditeur Nuxt, design system en Panda CSS3000
apps/apiAPI Hono4000
apps/realtimeSalles Yjs8788
apps/sitesSites publiés, <slug>.localhost:87908790
apps/runnerWorkflows serveur, tables, authentification des visiteurs8791
apps/mcpServeur MCP8792
packages/*Bibliothèques partagées, importées depuis les sources—
docs/Architecture, guide de déploiement, processus des agents—

Installation

  1. Installez

    Utilisez la version de pnpm fixée dans package.json.

    bash
    pnpm 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 keys
    
  2. Migrez la base de données

    Appliquez packages/db/migrations à votre branche de développement avec pnpm --filter @malla/db db:migrate, DATABASE_URL étant défini.

  3. Lancez

    bash
    pnpm dev                          # every Worker and the editor through turbo
    pnpm --filter web dev             # just the editor
    pnpm --filter api dev             # just one Worker
    

Bac à sable local

pnpm sandbox lance toute la pile (Postgres, api, realtime, sites, runner et l'éditeur) sans .dev.vars ni DATABASE_URL à configurer. Postgres est remplacé par PGlite, les migrations de packages/db/migrations sont appliquées au démarrage et les secrets réservés au développement sont générés une seule fois. Les données persistent d'un lancement à l'autre ; appuyez sur Ctrl+C pour arrêter.

bash
pnpm sandbox                      # start; data persists between runs
pnpm sandbox --reset              # wipe the sandbox data first, then start
ServiceURL
Éditeurhttp://localhost:3200/login
APIhttp://localhost:4200/health
Temps réelws://localhost:8988
Siteshttp://<slug>.localhost:8990 (après publication)
Runnerhttp://localhost:8991/health
Postgrespostgres://postgres@127.0.0.1:5599/postgres

Connectez-vous avec demo@malla.local et le mot de passe demo-password-123. Le premier démarrage crée cet utilisateur, son espace de travail et un site appelé "Demo site" avec le slug demo. Les ports n'entrent pas en conflit avec pnpm dev ni avec la pile e2e : les trois peuvent donc tourner en même temps. Le bac à sable ne lance pas le Worker MCP et n'a ni clé d'e-mail ni clé d'IA : il n'envoie aucun e-mail (donc pas de liens de connexion) et l'IA intégrée est désactivée. Tout ce qu'il génère se trouve dans scripts/sandbox/.data/ ; scripts/sandbox/README.md décrit comment changer les ports et donne les détails.

Contrôles qualité

bash
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 e2e démarre sa propre pile dans un répertoire d'état propre à chaque checkout, pour que des worktrees parallèles n'entrent jamais en collision, et conserve une capture d'écran par test dans apps/web/e2e/.screenshots/.

Conventions

  • Vue 3 <script setup lang="ts">, TypeScript strict, imports explicites (les imports automatiques sont désactivés).
  • L'interface de l'éditeur est stylée avec Panda CSS, uniquement avec des jetons sémantiques ; les animations passent par app/motion (GSAP).
  • Toutes les modifications du document passent par les ops et editor.document.transact ; ne modifiez jamais le document directement.
  • Petits commits Conventional Commits, un changement logique par commit. Les règles complètes sont dans docs/frontend-conventions.md.