feat(groups): session de groupe au parent commun + redirection vers le terminal

Le cwd d'une session de groupe devient le PARENT COMMUN des répertoires
couverts (racine neutre, chemins relatifs cross-repo naturels) au lieu du
premier repo arbitraire ; chaque repo reste relié en --add-dir. Garde-fou :
si le parent commun est la racine du FS, on retombe sur le premier répertoire.
Nouveau module pur resolveGroupCwd (core/group-session.ts). Côté web, un
lancement réussi redirige vers le terminal plein écran de la session, avec
un toast (succès ou couverture partielle).
This commit is contained in:
2026-06-22 14:41:15 +02:00
parent 4e3b1f5604
commit 1b57c3801c
7 changed files with 107 additions and 5 deletions

View File

@@ -13,6 +13,7 @@ import type { WorktreeManager } from '../core/worktree-manager.js';
import type { PtyManager } from '../core/pty-manager.js';
import type { Db } from '../db/index.js';
import { recordAudit } from '../core/audit-log.js';
import { resolveGroupCwd } from '../core/group-session.js';
import { sendManagerError } from './repos.js';
export function registerGroupRoutes(
@@ -137,13 +138,14 @@ export function registerGroupRoutes(
if (!dirs.includes(match.path)) dirs.push(match.path);
}
const [primary, ...rest] = dirs;
if (primary === undefined) {
if (dirs.length === 0) {
return reply.status(400).send({ error: { code: 'BAD_REQUEST', message: 'no directory to span (group has no resolvable worktree)' } });
}
// cwd = parent commun des repos couverts, chacun relié en --add-dir (P6). Voir resolveGroupCwd.
const { cwd, addDirs } = resolveGroupCwd(dirs);
try {
const session = manager.spawn({ cwd: primary, addDirs: rest, command, groupId: id });
const session = manager.spawn({ cwd, addDirs, command, groupId: id });
recordAudit(db, {
actor: req.authContext?.tokenId ?? 'unknown',
action: 'group.session.create',