Dashboard
L'app web : pages, modèle installé vs catalogue, endpoints /web/*.
platform/frontend/ — React 19 + Vite + Tailwind v4 + react-router + Mermaid. Auth par
session Better Auth (cookie httpOnly), client dans src/lib/auth-client.ts (plugins
organization, admin, multiSession, sso). Tape l'API backend sous /web/* ; l'auth vit sous
/api/auth/*.
Connexion & organisations
Trois voies de connexion : e-mail/mot de passe, Google OAuth, ou le SSO de son organisation (OIDC/SAML, routé par domaine e-mail). Après connexion, l'utilisateur crée ou rejoint une organisation (tenant) ; toute nouvelle organisation démarre en « en attente d'approbation ». Tant qu'un administrateur plateforme ne l'a pas approuvée, ses membres voient un écran d'attente avec l'étape suivante et peuvent seulement se déconnecter. Le dashboard, le catalogue, les projets et les API métier restent indisponibles. Un utilisateur membre de plusieurs organisations bascule de l'une à l'autre via la palette de commandes (⌘K), sans se ré-authentifier (multi-session).
Pages
| Route | Contenu |
|---|---|
/login | Connexion / création de compte : e-mail + mot de passe, Google, ou SSO d'organisation. |
/ | Accueil (sélection d'un projet ou création). |
/talents | Catalogue : recherche + cartes des talents Grace et des talents actifs de l’organisation, avec source, version publiée et politique projet. |
/talents/:id | Fiche talent : présentation, graphe des dépendances directes (cliquable au pointeur et au clavier), rôles / déclencheurs / budget, tests de conformité, aperçu compact, Installer. |
/specializations | Bibliothèque des spécialisations builtin et de l'organisation active : consulter, créer, éditer, dupliquer ou supprimer une spécialisation custom. Le paramètre ?specialization=<id> ouvre son détail dans le tiroir sans créer une nouvelle route. |
/org | Espace organisation : membres & rôles, invitations, statut, SSO et hébergement de code. Une navigation persistante donne accès aux vues analytiques autorisées. |
/org/insights | Santé opérationnelle de l'organisation active (owner/admin d'organisation). |
/org/talent-adoption | Adoption des talents dans les projets de l'organisation active (owner/admin d'organisation). |
/org/expertises | Création, vérification, publication et cycle de vie des talents propres à l’organisation (expertises privées côté API, owner/admin d’organisation). |
/org/new | Création d'une organisation. |
/accept-invitation/:id | Acceptation d'une invitation reçue par e-mail. |
/projects/new | Création projet (dans l'organisation active) → onboarding 2 étapes (.mcp.json + stub CLAUDE.md). |
/projects/:id | Détail projet. |
Une palette de commandes globale (⌘K / Ctrl+K) accélère la navigation vers les projets, les talents et la bibliothèque des spécialisations. Une spécialisation nommée ouvre directement son tiroir de détail ; le changement d'organisation active reste porté par le sélecteur d'organisation.
L'administration plateforme (rôle user.role="admin") passe par les endpoints /web/admin/*
(liste des organisations et de leur statut, approuver / rejeter / suspendre / réactiver, users,
évènements de sécurité).
Le dashboard renvoie vers cette documentation à des points clés : entrée Documentation de la
barre latérale, guide de démarrage (accueil), onboarding Brancher un projet, et fiches conceptuelles
(catalogue → Qu'est-ce qu'un talent ?, spécialisations). Ces liens utilisent la configuration runtime
GRACE_DOCS_BASE (voir Variables d'environnement) et s'ouvrent dans un nouvel onglet.
Modèle « installé » vs « catalogue »
Les talents Grace et les talents d’organisation optionnels suivent trois états : non installé → installé mais désactivé → installé et actif. Un talent d’organisation obligatoire est appliqué à tous les projets sans installation manuelle ; le catalogue projet l’affiche coché et verrouillé. La page projet n’affiche que les talents installés explicitement ; le catalogue présente aussi les talents obligatoires. Le MCP sert les talents Grace actifs, les talents optionnels sélectionnés et les talents obligatoires de l’organisation.
Page projet
- Schéma des talents installés — graphe Mermaid (activé / désactivé / requis non installé / manquant), nœuds cliquables, stats Installés / Actifs / Manquants.
- Liste des installés — toggle, désinstaller, « voir le modèle » (diagramme structurel).
- État vide — « Démarrer avec un spécialisation » ou catalogue.
- Connexion MCP (repliable) — retrouve / régénère le
.mcp.json+ stubCLAUDE.md. - Validation CI (repliable) — config
dependency-cruisergénérée depuis les talents. - Onglet Activité — tableau des actions tracées, lu depuis
trace_events(voir Tracing & activité) : Date, Action, Auteur, Source, Route, Statut. Un clic n'importe où sur la ligne ouvre le tiroir de détail, qui nomme l'auteur du geste ainsi que les talents entrés et sortis de la sélection. Chaque appel MCP indique l'outil de développement d'où il vient.- Tri — Date, Action ou Auteur, par clic sur l'en-tête ; un second clic inverse le sens. Le tri porte sur ce que la cellule affiche, pas sur la colonne SQL voisine : Action se range dans l'ordre alphabétique des libellés, le même que celui de la liste du filtre, et non dans celui des types techniques.
- Filtres — quatre listes multi-sélection : Action, Auteur, Source et Statut. Plusieurs valeurs d'un même filtre se lisent en « ou », les filtres entre eux en « et ».
- Ce qu'elles proposent — les valeurs viennent du journal lui-même
(
GET /web/projects/:id/traces/filter-options), pas d'une liste tenue ailleurs : un filtre ne propose donc jamais une valeur qui ne ramènerait aucune ligne. Elles suivent la portée de lecture, si bien qu'un membre ne se voit proposer que ce que sa propre consommation contient. Source est la clé qu'affiche la colonne —Web,MCPpour un client MCP qui ne se nomme pas, sinon le nom de l'outil de développement (claude code,codex…) sans son numéro de version, deux sorties du même outil étant le même outil. Statut est le code HTTP lui-même : on demande les 404, pas « les échecs ». - URL — tri et filtres vivent dans les paramètres de l'URL (
sort,order,type,author,source,status), donc une vue filtrée survit au rechargement et se partage par lien.type,author,sourceetstatuss'y répètent, une occurrence par valeur retenue. Untype, unauthorou unstatusmal formé y est ignoré plutôt que servi au serveur, qui le refuserait ; une source inconnue, elle, est servie telle quelle et ne ramène rien — aucune liste ne connaît d'avance le nom qu'un outil se donne.
- Supprimer le projet (confirmation inline ; cascade DB).
Endpoints web (/web/*, session Better Auth, scopés par l'organisation active)
L'authentification (sign-in/up, Google, SSO, organisations, admin, sessions) est servie par
Better Auth sous /api/auth/*. Les endpoints métier restent sous /web/* :
GET /web/orgs/current/status (statut d'approbation)
GET|POST /web/orgs/current/sso · POST /web/orgs/current/sso/test (config SSO de l'organisation)
GET|POST /web/orgs/current/expertises (liste filtrée, création)
GET|PATCH /web/orgs/current/expertises/:id (détail, nouvelle version de travail)
POST /web/orgs/current/expertises/:id/trigger-proposal (proposition de déclencheurs)
PUT /web/orgs/current/expertises/:id/triggers (confirmation des déclencheurs)
POST /web/orgs/current/expertises/:id/{activate|publish|deactivate|reactivate}
GET /web/admin/organizations · POST /web/admin/organizations/:id/{approve|reject|suspend|reactivate}
GET /web/admin/users · GET /web/admin/security-events (admin plateforme)
GET /web/projects · POST /web/projects · GET|DELETE /web/projects/:id
GET /web/projects/:id/setup · POST /web/projects/:id/token (config / régénération token)
GET /web/projects/:id/installed
POST /web/projects/:id/talents (install) · PATCH (toggle) · DELETE /:talentId (uninstall)
POST /web/projects/:id/apply-specialization
POST /web/projects/:id/file (lecture d'un fichier de talent)
GET /web/projects/:id/validator-config (sortie B / CI)
GET|PUT|DELETE /web/projects/:id/relevance (réglages pertinence par projet)
GET /web/catalog[?query] · GET /web/catalog/facets · GET /web/catalog/:id
GET /web/specializations · POST /web/specializations · PATCH|DELETE /web/specializations/:id · POST /web/specializations/:id/duplicate
GET /web/activity/summary · GET /web/projects/:id/traces/summary
GET /web/projects/:id/traces[?type&author&source&status&sort&order&actionOrder&scope&limit&offset]
GET /web/projects/:id/traces/filter-options[?scope] (valeurs présentes dans le journal)
GET /web/projects/:id/talents/:talentId/usageApprobation d’organisation
Toutes les routes métier /web/* exigent que l’organisation active soit approuvée. Dans le cas
contraire, elles renvoient 403 organization_not_approved; seule
GET /web/orgs/current/status reste disponible afin d’afficher l’état d’attente. Les routes
d’administration plateforme restent accessibles à un administrateur plateforme pour qu’il puisse
approuver l’organisation.
Les réponses expertise sont scopées par l'organisation active et exigent un rôle owner/admin. Une
ressource d'une autre organisation est masquée en 404. Les écritures portent une révision
attendue ; une concurrence renvoie 409 expertise_revision_conflict avec la version serveur à
comparer.
→ Guide utilisateur : Gérer les talents de l’organisation.
Design
Direction « console claire et moderne » : accent iris #6D5EF6, ambre #E0900C pour
les manquants. Type : Space Grotesk (display) + Plus Jakarta Sans (corps) +
JetBrains Mono (IDs / code). Tokens et utilitaires (.card, .btn-primary, .input,
.chip…) dans platform/frontend/src/index.css (@theme Tailwind v4).