pr-daaif
266ffaaf1b
feat(r1.1): socle backend du référentiel — modèle, contrat, API, seed, tests
...
- migration r1_referentiel : Category (EQUIPMENT/COMPONENT_TYPE), Location
(site → zone, lat/lng + colonne PostGIS générée geography(Point,4326)
+ index GIST), Asset (statut d'équipement), AssetComponent (organe sans
emplacement PAR CONSTRUCTION), Team, invitation sur User ; migration
autosuffisante (CREATE EXTENSION IF NOT EXISTS postgis)
- contrat : 21 nouvelles opérations (26 total), générateur OpenAPI étendu
aux paramètres de chemin ; spec + client web régénérés dans ce commit
- API : modules categories/locations/assets/teams + gestion des personnes
(liste, rôles, invitation lien 7 j à usage unique, activation publique
qui connecte directement, mise à jour rôle/équipes) — tout sous
@RequirePermission ; invariants en service (profondeur 2, kinds,
catégorie jamais supprimée)
- seed : parc de la maquette validée (5 sites + 8 zones, 8 appareils,
organes A1/B2, 9 catégories, 2 équipes) — idempotent
- 36 tests verts (couverture 96 % stmts / 85 % branches) : recette
site→zone→appareil→organes, matrice vivante, invitation→activation ;
smoke test sur build de prod
- CI : postgres → postgis/postgis:18-3.6 (la migration R1 l'exige)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 12:27:48 +01:00
pr-daaif
6d9aafdab4
docs(r1): kickoff design-first — maquettes HD R1 (7 écrans) à valider
...
- R0 close : tag release/r0 (recette + production en ligne)
- maquette-r1.html dans le moule validé (CSS répliquée, tokens identiques) :
sites + carte PostGIS, fiche site (hiérarchie d'emplacements), liste
ascenseurs (statuts d'équipement distincts des statuts OT), création
(identité → rattachement → organes), étiquette QR imprimable A6,
personnes & équipes (invitation par lien d'activation), catégories
- rendu vérifié en Chrome headless (7 écrans, bi-thème, zéro erreur)
- BLOQUANT : validation du référent avant tout code applicatif R1
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 12:00:05 +01:00
pr-daaif
1effa64916
docs: R0 en production — https://siop2.apps.enset.top vérifiée en ligne
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 11:32:58 +01:00
pr-daaif
ce24d9c32b
build(r0.13): Dockerfiles api/web + compose Dokploy + runbook — R0 prêt à déployer
...
- image api : multi-stage (pnpm deploy --legacy --prod), client Prisma
régénéré dans l'arborescence déployée, binaryTargets explicites
(debian/arm64 openssl-3), entrypoint migrate deploy → seed optionnel
(SEED_ON_START, compilé dist/seed) → API ; non-root, healthcheck /health
- image web : nginx alpine, statique Vite, proxy /api résolu À LA REQUÊTE
(resolver Docker + variable — nginx démarre sans l'API), fallback SPA,
cache immuable /assets, healthcheck IPv4 (127.0.0.1)
- infra/docker-compose.dokploy.yml : 5 services préfixés siop2-, secrets
exigés, seul siop2-web rejoint dokploy-network (API jamais exposée)
- runbook docs/06-production/runbook-dokploy.md : topologie, profils
d'environnement, checklist première prod, rollback, répétition locale
- répétition locale validée de bout en bout : migrate+seed au boot,
parcours demo-login → /users/me à travers nginx conteneurisé, conteneurs
healthy ; le double verrou ADR-002 (DEMO_MODE sans I_KNOW en production)
a refusé de démarrer — observé en situation réelle
- prisma passe en dépendance de production (migrations au boot)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-15 22:58:42 +01:00
pr-daaif
36de93bb7e
test(r0.12): ESLint monorepo + parcours démo Playwright — R0.12 clos
...
- ESLint 10 flat config racine (typescript-eslint, react-hooks) ; règle
ADR-001 codée : no-restricted-imports interdit « minio » partout sauf
minio-storage.service.ts (violation vérifiée) ; jobs lint par paquet
- Playwright apps/web/e2e : redirection sans jeton, connexion démo 1 clic,
coquille (rail actif, chip DÉMO), bascule de rôle chronométrée < 3 s
(ADR-002), /design, déconnexion avec purge ; webServer api dist + vite,
seed idempotent en globalSetup, PW_CHANNEL=chrome en local
- CI : jobs lint + e2e (services PostgreSQL/Redis, artefact
playwright-report sur échec) ; vitest restreint à src/
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-15 22:36:17 +01:00
pr-daaif
a9e51507aa
docs: état d'avancement — CI R0.12 (1/2) en place
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-15 22:28:27 +01:00
pr-daaif
4f3af5af4f
feat(r0.11): apps/web — connexion + sélecteur démo, coquille, /design, client typé
...
- React 19 + Vite + Tailwind v4 : tokens.css copié tel quel (source de
vérité), classes composants extraites de la maquette validée, Manrope
auto-hébergée, primitives shadcn-style possédées (Button cva, menu Radix)
- connexion fidèle à la maquette ; liste démo affichée seulement si
/auth/demo-accounts répond (404 ⇒ rien — ADR-002, l'API seule source)
- coquille : sidebar 4 groupes avec rail safran actif (écrans futurs marqués
R1-R3), topbar recherche/thème/chip DÉMO + sélecteur de rôle (bascule 101 ms,
critère < 3 s) ; page /design = référence vivante des revues pixel
- règle d'or : schema.d.ts généré depuis docs/openapi.json et committé
(openapi-typescript + openapi-fetch)
- tokens.css : tokens --nav-* ajoutés (valeurs de la maquette validée) ;
seed réaligné sur les personas de la maquette
- vérifié en navigateur réel (Playwright + Chrome headless) : 7 captures,
parcours démo complet, bi-thème, zéro erreur console ; typecheck + vitest + build OK
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-15 22:09:40 +01:00
pr-daaif
8adb561b63
feat(r0.10): apps/api — auth fermée par défaut, matrice en base, démo-login ADR-002, seed
...
- packages/shared : rôles/catégories, schémas Zod, contrat d'API ;
pnpm contract → docs/openapi.json committée (règle d'or ADR-001)
- apps/api : NestJS 11 + Prisma 6, migration r0_identity (Role/Permission/User) ;
guard JWT global + @Public() ; PermissionsGuard (@RequirePermission,
matrice relue en base, cache 60 s) ; FileStorage (seul import MinIO) ; /health
- démo-login ADR-002 : module conditionnel DEMO_MODE (404 sinon, testé e2e),
double verrou production, refus des comptes isDemo=false
- seed idempotent : 7 rôles, matrice complète (70 lignes), 7 comptes démo
- 19 tests Jest (unit + e2e) ; smoke test sur build de prod
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-15 21:55:04 +01:00
pr-daaif
04e61056f6
docs(r0): kickoff SIOP V2 — vision, cadrage, charte graphique, maquettes HD
...
Refondation design-first du projet SIOP (v1 gelée) :
- Playbook 00-vision (charte projet, personas, benchmark Atlas)
- Playbook 01-cadrage (releases R0→R5 + DoD, user-story map, exigences, risques)
- Playbook 02-design : charte graphique, tokens.css bi-thème (palettes
analytics validées CVD/contraste par script), maquettes HD navigables
(7 écrans dont démo-login DEMO_MODE, bilan codé, portail QR, mobile)
Prochaine étape : validation des maquettes par le référent avant tout code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-15 21:06:33 +01:00