Coinche en ligne à quatre, jouable sur téléphone et sur PC : https://romainfjgaspard.github.io/coinche/.
Chacun choisit son nom (ou en ajoute un), crée une partie ou la rejoint avec un code ou un lien ; les
places libres se confient à des bots. Une table nommée donne un lien fixe, le même chaque semaine :
…/coinche/?table=potes mène toujours à la partie en cours de la table.
| Domaine | Contenu |
|---|---|
| Règles | Nos règles maison (docs/REGLES.md) : coinche, surcoinche, capot, générale, belote à annoncer, blitz, objectif au choix |
| Partie | Salon (équipes tirées au sort ou choisies), enchères, jeu de la carte, décompte, « Rejouer » (même soirée) ; une enchère faite par erreur s'annule si les trois autres acceptent |
| Robustesse | Pause ; bots repris par un autre onglet si le leur se ferme ; joueur absent remplaçable par un bot, qui peut reprendre sa place |
| Fin de donne | Décompte détaillé pli par pli ; « Revoir la donne » : mains de départ, huit plis |
| Analyse | À cartes ouvertes (le contrat était-il faisable ?) et carte par carte, avec l'information du joueur, comme aux échecs ; gardée en base pour les quatre une fois faite |
| Bots | « bot » : les réflexes d'un bon joueur (soutien, tirage d'atout, coinche) ; « bot ★ » : chaque carte réfléchie au solveur. Aucun ne voit le jeu des autres |
| Statistiques | Partie en cours (score, enchères, jeu, donnes) et toutes les parties (duos, joueurs, enchères, temps, soirées), avec ou sans les parties à bots |
| Mise en page | Téléphone (une colonne) et PC (table dédiée, à l'échelle de l'écran) |
Stack : Vue 3 + TypeScript + Vite + Pinia + Tailwind v4, Firebase (Firestore, authentification anonyme), GitHub Pages.
docs/REGLES.md— nos règles ; chaque point porte un identifiant (ENC-5…)docs/BOTS.md— les deux niveaux de bots, comment ils enchérissent et jouent, le tournoi qui les mesuredocs/ANALYSE.md— revoir une donne, « Aurait-on pu gagner ? », l'analyse carte par carte et le solveurdocs/STATISTIQUES.md— chaque statistique, et comment elle se calcule (panache, bilan, lanceur…)docs/SECURITE.md— ce que les règles Firestore garantissent, et leurs limites sans serveurdocs/MODELE-DONNEES.md— journal d'événements, archives, conservation intégrale pour les statsdocs/QUALITE.md— outils de qualité (équivalents Python : ruff → ESLint + Prettier, uv → npm), auditdocs/FIREBASE.md— le projet Firebase, les clés, le déploiement, et comment le refaire
- Node 24 ou plus
- Java 21 — requis par l'émulateur Firestore. Version portable Temurin dans
%LOCALAPPDATA%\jre, avecJAVA_HOMEet lePATHposés dans les variables d'environnement de l'utilisateur - Dans PowerShell, taper
npm.cmdau lieu denpmsi la politique d'exécution bloquenpm.ps1
.env.local pointe sur le vrai projet Firebase : npm run dev écrit donc dans la vraie base. Pour
tout essai, lancer l'émulateur puis npm run dev:emu, qui force le projet bidon demo-coinche.
npm ci # installe exactement les versions du lockfile
npm run emu # émulateur Firestore + Auth (nécessite Java) — premier terminal
npm run dev:emu # site branché sur l'émulateur — second terminal : http://localhost:5173/coinche/Pour essayer seul : choisir son nom, créer une partie, puis « + bot » ou « + bot ★ » sur les autres places.
?botDelay=150 dans l'adresse accélère les bots. Une fenêtre de navigation privée compte comme un autre
joueur.
npm run check # lint, formatage, types, tests : ce que fait la CI, hors émulateur et build
npm run lint # ESLint (lint:fix pour corriger ce qui peut l'être)
npm run format # Prettier (format:check pour vérifier sans écrire)
npm run typecheck # vue-tsc
npm test # moteur de règles et composants, sans réseau
npm run test:rules # règles Firestore, parcours, concurrence, pause — lance son propre émulateur
npm run coverage # couverture des tests
npm run tournoi # bots contre bots, donnes jouées deux fois ($env:A, $env:B : base, expert, hasard)Les tests ne parlent jamais à la vraie base : vite.config.ts et src/firebase/app.ts forcent
l'émulateur dès que le mode est test.
Parcours dans de vrais navigateurs (Playwright), avec l'émulateur et npm run dev:emu déjà lancés :
npm run test:e2e (partie complète à quatre), npm run test:bot (un humain, trois bots),
npm run test:apercu (captures des stats), npm run test:lectures (lectures Firestore d'une partie, voir docs/MODELE-DONNEES.md), node tests/audit.mjs (revue d'affichage). Captures dans
captures/ (ignoré par git), ou dans $env:OUT_DIR. Chromium s'installe avec
npx playwright install chromium.
Pour remplir les statistiques de l'émulateur : npm run seed:stats (émulateur lancé ;
$env:GAMES=12 pour le nombre de parties, 8 par défaut). Il ne vise la vraie base que par
npm run seed:stats:prod, avec $env:SEED_CONFIRM='coinche-e708b'.
.github/workflows/deploy.yml :
- À chaque PR et à chaque push sur
main: lint, formatage, types, tests, build, tests sur émulateur. - Sur
main, si tout passe : build avec les clés Firebase, déploiement des règles Firestore (compte de service en secret GitHub), puis publication sur GitHub Pages.
On travaille donc par branche et PR ; merger dans main met en ligne. À régler une seule fois sur GitHub :
- Settings → Pages → Source : GitHub Actions
- Settings → Secrets and variables → Actions : les six
VITE_FIREBASE_*, mêmes valeurs que.env.local, etFIREBASE_SERVICE_ACCOUNT(clé JSON du compte de service). Sans eux, le workflow s'arrête volontairement. - Console Firebase → Authentication → Settings → Authorized domains : ajouter
romainfjgaspard.github.io.
Projet réel coinche-e708b : Firestore natif, authentification anonyme. .firebaserc garde
demo-coinche par défaut (émulateur) et le vrai projet sous l'alias prod. Les règles
(firestore.rules) sont déployées par la CI ; la procédure de création est dans docs/FIREBASE.md.
Les figures (public/cards/) viennent du projet svg-cards de David Bellot, portrait français, sous
LGPL 2.1+ — attribution obligatoire, voir public/cards/LICENCE.md. Les autres rangs sont dessinés en
CSS.