Back to docs
Guide 10

Development

Contribute to Simmetric Chat: setup, monorepo, scripts, conventions.

Guida per contribuire al codebase: setup, struttura monorepo, script, convenzioni, i18n.

Setup

git clone <repo> && cd simmetric-chat
pnpm install            # installa dipendenze tutti i package
cp .env.example .env    # poi edita JWT_SECRET, COLLECTOR_SECRET, WIDGET_API_KEY
pnpm db:setup           # crea DB + migra + seed admin
pnpm dev                # avvia server/collector/widget/frontend via turborepo

PostgreSQL 16 in locale. pnpm db:setup crea il DB, applica migrazioni Prisma (packages/server/prisma/migrations) e seeda l'admin bootstrap.

Struttura monorepo

pnpm workspaces + Turborepo. 5 package + Tauri:

PackagePortaStackRuolo
sharedTS + ZodTipi, schema, costanti (leaf, dip solo zod)
server3000Express + PrismaAPI, RBAC, agent, RAG FTS/RRF, backup
collector3210ExpressIngestione, parsing, embedding, vector store
widget3211Express + Preact IIFEWidget embeddabile
frontend5173Vite + React 19 + TailwindSPA admin/chat
src-tauriRust + TauriDesktop app

Grafo dipendenze: shared ← {server, collector, frontend, widget}. Modularità strict: server↔collector = HTTP only (COLLECTOR_SECRET); widget↔server = API key (X-Api-Key). Nessun import diretto tra server/collector/widget.

Script comuni

ScriptScopeDescrizione
pnpm devrootTurborepo: avvia tutti i servizi in parallelo
pnpm buildrootBuild produzione tutti i package
pnpm lintrootESLint tutti i package
pnpm typecheckroottsc --noEmit
pnpm testrootJest (unit + integration)
pnpm test:e2erootPlaywright
pnpm db:setupserverCrea DB + migra + seed
pnpm db:migrateserverprisma migrate dev
pnpm db:resetserverReset DB (destructive)
pnpm i18n:checkrootVerifica chiavi i18n

Script per-package in packages/<pkg>/package.json. Turborepo cachea output e dipendenze tra task.

Convenzioni di codice

  • TypeScript strict ovunque; niente any non giustificato.
  • Zod per validazione input (shared definisce gli schema riutilizzabili).
  • Prisma come ORM; schema in packages/server/prisma/schema.prisma.
  • RBAC via middleware: requirePermission, requireAdmin, requireWorkspaceAccess.
  • Error handling: risposte { error } (400/401/403/404/409/402/429/500); validazione Zod → 400 con details.
  • SSE per streaming chat (@microsoft/fetch-event-source lato frontend).
  • Logging: LOG_LEVEL env; usa il logger configurato, non console.log diretto in prod.
  • Commit: formato Conventional Commits (feat:, fix:, docs:, refactor:...).

Frontend (React 19)

  • State 3-tier (server-persisted / session / local).
  • shadcn/ui + Tailwind per l'admin; widget usa Preact + Tailwind, NO shadcn (IIFE bundle).
  • i18n via hook; file in packages/frontend/src/i18n/locales/.
  • Shortcut chat: /model (palette Cmd+K), confronto Cmd+Shift+M.

Server (Express)

  • Route in src/routes/, servizi in src/services/, middleware in src/middleware/.
  • Agent in src/agent/ (orchestrator.ts, builtinSkills.ts, mcpClient.ts).
  • Config env in src/config/env.ts (Zod, process.exit(1) se invalide).
  • OpenAPI via annotazioni @openapi JSDoc → Swagger su /api-docs.

i18n

Lingue con file concreti: en, it, ru. Aggiungi chiavi in tutti e tre i file. pnpm i18n:check verifica completezza.

Discrepanza nota: alcune doc citano "7 languages" ma i file concreti sono en/it/ru. Verifica packages/frontend/src/i18n/locales/ per la lista reale prima di aggiungere traduzioni.

Aggiungere una feature (workflow)

  1. Schema shared — tipi/Zod in packages/shared/src/.
  2. Prisma — modello + migrazione (pnpm db:migrate).
  3. Server — servizio + route + middleware RBAC/license.
  4. Frontend — UI + hook + i18n (en/it/ru).
  5. Test — unit (Prisma mock) + integration (worker DB) + E2E se user-facing.
  6. Docs — aggiorna docs-guide/ e OpenAPI @openapi.

Estensioni comuni

  • Nuova skill agente: registerSkill in server/src/agent/builtinSkills.ts.
  • Nuovo endpoint: route in server/src/routes/ + mount in src/index.ts.
  • Nuovo permesso: PERMISSION_NAMES in shared/src/constants/permissions.ts + ruoli.
  • Nuovo provider LLM: server/src/services/providerService.ts + preset.
  • Nuova destinazione backup: implementa IBackupDestinationProvider in server/src/services/backup/providers/.

Cross-link