Mis à jour · 2026-08-28

Architecture

Stack technique, couches applicatives et décisions structurantes.

Architecture

Stack

Nuxt 4 · Vue 3 · Vue Flow · Pinia · Dexie · Tailwind v4 · Nuxt Content · PWA · Firebase Auth (phase 0) · Vitest (281 tests, 49 fichiers) · pnpm · ESLint (imports UI)

Dev : pnpm dev (port 9087). Jeu : /play. Déploiement : push main → Docker sur VPS (.github/workflows/deploy.yml).

P2 : Auth UI → cloud save → FCM. Persistance locale (Dexie) jusqu’au cloud save. Voir Firebase Auth.

Couches

Vue → Pinia (game + schemaUi + auth) → SimulationEngine → GameState → Dexie
         ↘ Firebase Auth (phase 0) → (P2 cloud save) → Firestore
         ↘ (P2) FCM après Auth UI

Dossiers

app/pages/             / (site), /play, /docs, /legal
app/lib/firebase/      config, client lazy, types, userSnapshot
app/stores/auth.ts     session Firebase (orthogonal au game save)
app/components/game/   Canvas, HUD (pocket / settings), shop, craft, research, objectives, PWA
app/composables/       useSchema* · useSiteSeo
app/stores/game/       session · economy · graph · research (façade Pinia)
app/utils/seo.ts       constantes site (nom, description, URL)
app/components/nodes/  deposit, extractor, storage, storage_tap, furnace, lab, market, splitter, merger
game/models/nodes/     types + familles par machine
game/definitions/      machines, tech, objectives, handCraft, shopUnlocks, deposits
game/selectors/        helpers lecture seule pour l’UI et le store
game/engine/           production · logistics · economy · research · debug
game/persistence/      Dexie + migrations + normalize/{nodes,fields} + validate
server/routes/         sitemap.xml (docs dynamiques)
public/                robots.txt · og/default.png · icônes PWA

Imports UI ↔ domaine

  • Mutations → useGameStore uniquement
  • Catalogues → @game/definitions
  • Helpers lecture → @game/selectors
  • @game/engine (apply*) → slices store seulement ; ESLint bloque tout import direct ailleurs dans app/
  • Firebase → app/ uniquement ; @game/* reste sans Firebase

SEO (état)

ÉlémentÉtat
useSiteSeo + canonical / OG / TwitterFait
Image OG public/og/default.pngFait
JSON-LD landing / + WebApplication /playFait
sitemap.xml (docs Nuxt Content) · robots.txt dynamiqueFait
Prerender /, /docs/*, /legal/* · perf landingFait
Search Console (ops prod)P1 — env prêt, soumission manuelle

État clé

ChampRôle
saveSchemaVersionRévision schéma save (migrations au load)
handCraftQueueFile crafts
researchPoints / activeResearchId / techProgressRecherche
unlockedTechsEffets tech
score / completedObjectiveIdsObjectifs
enabled (machines)Interrupteur ON/OFF (tech Interrupteurs)
viewportPan/zoom persisté

Décisions

Tick unique · stocks entiers · lab = drag + câble · gisement / coffre dockés · marché 200 (tech 50) · offline ≤ 8 h · PWA · local-first jusqu’à cloud save (P2) · FCM après Auth UI