feat: groupes de travail (P5)

Ajoute la notion de groupe — collection nommée de repos (membership légère
persistée, many-to-many) — pour piloter plusieurs repos en simultané :

- DB : migration #5 (tables groups + group_repos, FK ON DELETE CASCADE).
- GroupManager (synchrone, EventEmitter) + routes REST /api/v1/groups ;
  ne persiste que la membership, worktrees/sessions filtrés par repoId côté client.
- Protocole : GroupSummary, DTOs, topic WS « groups », events group_update/removed
  (additifs, PROTOCOL_VERSION inchangé).
- Web : store groups, GroupsListView, GroupView (réutilise RepoSection),
  grille multi-terminaux (TerminalGrid/TerminalCell), action « feature cross-repo »
  (orchestration client, tolérante aux échecs partiels), routes + i18n EN/FR.
- Tests : group-manager.test.ts + extension protocol.test.ts ; acceptance-p5.mjs.
This commit is contained in:
2026-06-18 10:03:19 +02:00
parent e6999011d1
commit e38b3a5d5e
24 changed files with 1429 additions and 12 deletions

View File

@@ -63,6 +63,54 @@ const fr: typeof en = {
dashboard: {
title: 'Worktrees',
allSessions: 'Toutes les sessions',
groups: 'Groupes',
},
groups: {
title: 'Groupes',
new: 'Nouveau groupe',
create: 'Créer',
creating: 'Création…',
nameLabel: 'Nom du groupe',
namePlaceholder: 'ex. Stack paiements',
colorLabel: 'Couleur',
reposLabel: 'Dépôts',
empty: 'Aucun groupe — créez-en un ci-dessus.',
noRepos: 'Aucun dépôt sélectionné.',
noReposInGroup: 'Aucun dépôt dans ce groupe — ajoutez-en ci-dessous.',
noReposRegistered: 'Aucun dépôt enregistré — ajoutez-en dabord depuis le tableau de bord.',
open: 'Ouvrir',
edit: 'Modifier les dépôts',
editDone: 'Terminé',
remove: 'Supprimer',
confirmDelete: 'Confirmer',
repoCount: 'aucun dépôt | 1 dépôt | {n} dépôts',
dashboard: 'Tableau de bord',
missingRepo: 'Dépôt indisponible',
removeFromGroup: 'Retirer du groupe',
sessionsActive: 'aucune session active | 1 session active | {n} sessions actives',
viewList: 'Dépôts',
viewGrid: 'Terminaux',
gridEmpty: 'Aucune session active dans ce groupe.',
gridCapped: '{shown} sessions affichées sur {total} — fermez des terminaux pour voir le reste.',
newFeature: 'Nouvelle feature cross-repo',
},
crossRepo: {
title: 'Nouvelle feature cross-repo',
intro: 'Crée le même worktree dans les dépôts sélectionnés, en une seule action.',
branchLabel: 'Nom de branche',
branchPlaceholder: 'feature/…',
newBranch: 'créer la branche',
baseRefLabel: 'Réf. de base (optionnel)',
startLabel: 'Démarrer une session',
startNone: 'aucune session',
reposLabel: 'Appliquer à',
create: 'Créer dans {n} dépôts',
creating: 'Création…',
retryFailed: 'Réessayer les échecs',
close: 'Fermer',
pending: 'en cours…',
ok: 'créé',
error: 'échec',
},
repos: {
add: 'Ajouter un repo',