Contribuer
Configurez un environnement de développement Multica local, exécutez les tests et soumettez vos modifications en suivant les conventions du dépôt.
Multica est composé d'un backend Go et d'un monorepo pnpm. Le moyen le plus simple de démarrer en local est make dev : cette commande prépare l'environnement, la base de données et les migrations pour le checkout courant, puis démarre Web et l'API.
Prérequis
- Node.js 22
- pnpm 10.28.2
- Go 1.26.6
- Docker Engine ou Docker Desktop
- Git et Make
Le package.json racine, server/go.mod et les workflows de CI font foi pour les versions.
Premier démarrage
git clone https://github.com/multica-ai/multica.git
cd multica
make devLe checkout principal utilise .env. Si ce fichier n'existe pas, make dev le crée à partir de .env.example, puis démarre l'instance PostgreSQL partagée, installe les dépendances, exécute les migrations et démarre l'API et Web.
Adresses par défaut :
Web: http://localhost:3000
API: http://localhost:8080Le code de vérification local fixe provient de la configuration de développement. N'utilisez pas un .env local pour un déploiement exposé à Internet.
Développer dans un worktree
Le dépôt permet d'exécuter le checkout principal et plusieurs worktrees en même temps. Ils partagent un même conteneur PostgreSQL, mais utilisent des bases de données et des ports distincts.
git worktree add ../multica-feature -b feat/my-change main
cd ../multica-feature
make setup-worktree
make start-worktreemake setup-worktree génère .env.worktree ; le nom de la base de données et les ports sont dérivés du chemin. Pour le redémarrer :
make start-worktreePour arrêter Web et l'API du worktree courant :
make stop-worktreeVous pouvez aussi exécuter make dev directement. Le script détecte un worktree grâce à son fichier .git et sélectionne .env.worktree.
Les différents worktrees partagent le conteneur PostgreSQL, pas la base de données. Ne démarrez pas un nouveau projet Compose pour chaque worktree. Vérifiez d'abord POSTGRES_DB, PORT et FRONTEND_PORT dans .env.worktree.
Commandes courantes
Workflow complet
make up # Démarre l'environnement de ce checkout (C=api,web,daemon,desktop)
make status # Affiche ce qui tourne et prouve qu'il s'agit de cet environnement
make list # Liste tous les environnements de cette machine
make down # Arrête les processus, conserve la base de données
make destroy # Arrête, puis supprime la base de données et libère l'emplacement
make gc # Nettoie les environnements expirés ou dont le répertoire n'existe plus
make dev # Prépare et démarre le checkout courant au premier plan
make check # Exécute le workflow complet de vérification locale
make build # Compile les binaires server, CLI et migratemake up traite un environnement comme un objet nommé : il alloue sous verrou les ports de l'API, de Web et du renderer Desktop,
le nom de la base de données et le profil CLI, puis les enregistre dans ~/.multica/dev/,
de sorte que deux checkouts ne peuvent pas occuper le même emplacement sans que l'un d'eux en soit averti.
Il vérifie la base de données via DATABASE_URL et le backend via
GET /health, qui renvoie pid, commit et started_at — une simple réponse 200
pourrait aussi provenir d'un processus résiduel sur le même port. make destroy
supprime la base de données, le profil CLI, les espaces de travail du daemon, le userData de Desktop et
l'entrée du registre ; en cas d'échec de la suppression, l'entrée du registre est conservée pour une nouvelle tentative. Les environnements
temporaires sont nettoyés au mieux lors du make up suivant l'expiration de leur TTL.
Frontend
pnpm install
pnpm dev:web
pnpm dev:desktop
pnpm build
pnpm typecheck
pnpm lint
pnpm testLes commandes racine excluent Mobile par défaut. Mobile dispose de ses propres scripts et de sa propre CI ; lisez apps/mobile/AGENTS.md avant de le modifier.
Backend
make server
make daemon
make test
make migrate-up
make migrate-down
make sqlcPour exécuter une commande CLI depuis les sources :
make cli ARGS="issue list"Modifier des fonctionnalités frontend
Placez les fonctionnalités nécessaires à la fois à Web et à Desktop selon leur responsabilité :
- Placez les types d'API, les queries, les mutations et la logique indépendante de la plateforme dans
packages/core/. - Placez l'UI de base dans
packages/ui/; elle ne doit pas dépendre du code métier. - Placez les pages et composants métier dans
packages/views/. - Conservez les adaptateurs Next.js, Electron et de routage dans l'application correspondante.
- Branchez les pages partagées à la fois dans Web et dans Desktop.
TanStack Query gère les données serveur. Zustand gère l'état client, comme les filtres, les brouillons et la mise en page. Consultez Architecture du projet et le AGENTS.md racine pour connaître la frontière exacte.
Lorsque vous ajoutez ou modifiez une API, mettez à jour le schéma zod dans packages/core/api/ et ajoutez des tests de parsing pour les champs manquants, les valeurs d'enum inconnues et les données malformées.
Modifier la base de données
Les migrations se trouvent dans server/migrations/, et les requêtes dans server/pkg/db/queries/.
- Utilisez le prochain préfixe numérique inutilisé et créez à la fois
.up.sqlet.down.sql. - N'ajoutez pas de clés étrangères en base de données, ni de suppressions ou de mises à jour en cascade. Garantissez les relations et le nettoyage dans la couche applicative.
- Tout nouvel index doit utiliser
CREATE INDEX CONCURRENTLYouCREATE UNIQUE INDEX CONCURRENTLY. - Placez chaque index concurrent dans un fichier de migration qui ne contient que cette instruction.
- Exécutez
make sqlcaprès avoir modifié des requêtes et committez les modifications générées dansserver/pkg/db/generated/. - Ne modifiez pas directement les fichiers générés par sqlc.
Utilisez une transaction applicative dans la couche service lorsque plusieurs écritures doivent réussir ou être annulées ensemble.
Emplacement des tests
| Modification | Emplacement des tests |
|---|---|
| Logique métier partagée, queries, stores | packages/core/*.test.ts |
| Pages et composants partagés | packages/views/*.test.tsx |
| Intégration à la plateforme Web ou Desktop | Répertoire apps/* correspondant |
| Workflows de bout en bout | e2e/*.spec.ts |
| Backend | *_test.go dans le package Go concerné |
Exécutez d'abord la vérification la plus proche de la modification, puis élargissez la portée. Pour une modification qui ne touche que Docs :
pnpm --filter @multica/docs typecheckPour les modifications frontend partagées :
pnpm typecheck
pnpm testPour les modifications backend :
make testAvant de soumettre :
make checkmake check exécute la vérification des types TypeScript et les tests unitaires, les tests Go et les tests E2E Playwright. La CI compile et exécute aussi le lint selon la portée des modifications, et lance des tests propres à une plateforme ou à l'installateur.
Réinitialiser la base de données de développement courante
Lorsque vous avez besoin de données propres, réinitialisez la base de données désignée par le fichier d'environnement du checkout courant :
make stop
make db-reset
make startmake db-reset supprime puis recrée la base POSTGRES_DB courante et refuse de se connecter à une base de données distante. Avant de l'exécuter, vérifiez .env ou .env.worktree et confirmez la base de données cible.
Avant de soumettre
- Lisez le
AGENTS.mdracine et les instructions imbriquées pertinentes. - Limitez vos modifications au périmètre nécessaire.
- Rédigez les commentaires de code en anglais.
- Ne committez pas
.env, des jetons, des artefacts de build ni des chemins locaux. - Utilisez des conventional commits tels que
feat(scope),fix(scope)oudocs. - Dans la PR, décrivez les changements de comportement et les commandes de vérification réellement exécutées.
Étapes suivantes
- Conventions de développement — Contrats du dépôt pour le nommage, la terminologie et les textes en chinois.
- Architecture du projet — Couches, packages partagés et chemin du code pour une exécution.
Domaines maintenus par la communauté
Quelles parties de Multica sont maintenues par des contributeurs de la communauté, ce que cela implique pour le support, et comment signaler un problème dans l'un de ces domaines.
Architecture du projet
Découvrez comment les clients de Multica, le service Go, le daemon d'exécution et les packages frontend partagés fonctionnent ensemble.