feat(groups): session Claude unique par groupe via --add-dir (P6)
All checks were successful
Deploy site (production) / build-and-deploy (push) Successful in 21s

Un groupe lance désormais UNE seule session Claude couvrant tous ses
repos/worktrees (--add-dir) au lieu d'une session par repo, pour
travailler en simultané dans une conversation partagée. Le transport WS,
le flow control et l'attach sont inchangés (toujours 1 session, 1 channel).

- shared: SessionSummary.addedDirs/groupId (champs additifs optionnels) ;
  CreateGroupSessionRequest / GroupSessionResponse.
- server: --add-dir dans claude-launcher ; spawn({addDirs,groupId}) +
  persistance (migration #8 : sessions.added_dirs/group_id) ;
  POST /api/v1/groups/:id/session (résolution des dirs cote serveur) ;
  resume re-relie les dirs ; deleteGroup nullifie group_id.
- web: GroupSessionModal (modes feature / checkouts principaux) ;
  createGroupFeature/createGroupSession ; badge « groupe · N depots » ;
  sessionsInGroup dedupliquee.
- site: textes EN/FR « une seule session Claude » + diagramme hub.
- tests: claude-launcher, pty-manager (groupe), group-manager ;
  acceptation P5 etendue (session de groupe multi-repo). 272 tests verts.
This commit is contained in:
2026-06-22 10:06:23 +02:00
parent ca6700d6ce
commit c6ea9f7930
23 changed files with 619 additions and 226 deletions

View File

@@ -96,25 +96,29 @@ export default {
viewGrid: 'Terminals',
gridEmpty: 'No active session in this group.',
gridCapped: 'Showing {shown} of {total} sessions — close some terminals to see the rest.',
newFeature: 'New cross-repo feature',
newFeature: 'New group session',
spanBadge: 'group · {n} repo | group · {n} repos',
},
crossRepo: {
title: 'New cross-repo feature',
intro: 'Create the same worktree across the selected repos, in one action.',
title: 'New group session',
intro: 'Launch one Claude session that spans every repo in this group — a single conversation across all of them.',
modeLabel: 'Directories',
modeFeature: 'New branch in each repo',
modeMain: 'Main checkouts',
branchLabel: 'Branch name',
branchPlaceholder: 'feature/…',
newBranch: 'create branch',
baseRefLabel: 'Base ref (optional)',
startLabel: 'Start session',
startNone: 'no session',
reposLabel: 'Apply to',
create: 'Create across {n} repos',
creating: 'Creating…',
retryFailed: 'Retry failed',
commandLabel: 'Session',
reposLabel: 'Repos in this session',
launch: 'Launch session',
launching: 'Launching…',
close: 'Close',
pending: 'pending…',
ok: 'created',
ok: 'worktree created',
error: 'failed',
skippedLabel: 'skipped',
done: 'Group session started.',
sessionFailed: 'Could not start the session.',
},
repos: {
add: 'Add repo',

View File

@@ -98,25 +98,29 @@ const fr: typeof en = {
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',
newFeature: 'Nouvelle session de groupe',
spanBadge: 'groupe · {n} dépôt | groupe · {n} dépôts',
},
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.',
title: 'Nouvelle session de groupe',
intro: 'Lance UNE session Claude couvrant tous les dépôts du groupe — une seule conversation reliant lensemble.',
modeLabel: 'Répertoires',
modeFeature: 'Nouvelle branche dans chaque dépôt',
modeMain: 'Checkouts principaux',
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',
commandLabel: 'Session',
reposLabel: 'Dépôts de la session',
launch: 'Lancer la session',
launching: 'Lancement…',
close: 'Fermer',
pending: 'en cours…',
ok: 'créé',
ok: 'worktree créé',
error: 'échec',
skippedLabel: 'ignoré',
done: 'Session de groupe démarrée.',
sessionFailed: 'Impossible de démarrer la session.',
},
repos: {
add: 'Ajouter un repo',