release: git-arboretum 3.3.0 (« Démarrer le projet » : lancement multi-terminaux), vscode 0.4.0, desktop 0.1.3
CI / Build & test (Node 22) (push) Successful in 10m17s
CI / Build & test (Node 24) (push) Successful in 10m13s
CI / No em/en dashes (push) Successful in 4s
Deploy site (production) / build-and-deploy (push) Successful in 24s
Release / Publish to Gitea npm registry (push) Successful in 10m17s
VSCode Release / Package VSIX (push) Successful in 9m39s
Desktop Release / Build Linux (AppImage + deb) (push) Successful in 15m41s
CI / Pack & boot smoke (Node 22) (push) Successful in 10m3s

« Démarrer le projet » : un repo définit une fois ses commandes de démarrage
(serveur de dev, API, base de données), un clic ouvre un terminal PTY par
commande dans le dock IDE.

Serveur (additif, PROTOCOL_VERSION inchangé) :
- LaunchCommand[] persistées sur repos.launch_commands (migration 13) ; champ additif SessionSummary.launchRunId.
- POST /repos/:id/launch : résolution du worktree côté serveur, cwd de commande borné (anti-traversal), commandIds outrepasse enabled.
- GET /repos/:id/launch/detect : détection package.json / Procfile / docker-compose.
- Shell de login interactif ($SHELL -l -i, charge le PATH nvm/asdf) + auto-type de la commande ; le shell survit à la commande (échec visible).

Web : LaunchProjectModal + actions (ProjectTreeNode, SessionsPanel, CommandPalette), stores sessions/worktrees, i18n EN/FR.

Alignement du reste du projet :
- Extension VS Code 0.4.0 : commande Start Project (repo/worktree), Stop Launch, badge « launch » dans l'arbre, méthode REST startLaunch.
- Site vitrine : 16e feature card (Rocket) + section showcase « Start the project » (mockup fidèle au modal), i18n EN/FR.
- Documentation : README (EN + FR), help-content (EN + FR), CHANGELOGs server + vscode.

Vérifié : 430 tests, typecheck, build (web + site + vscode), acceptance-p13 ALL GREEN, VSIX packagé, garde anti-tirets, vérif visuelle du site (thèmes clair et sombre).
This commit is contained in:
2026-07-21 13:54:16 +02:00
parent 7327407193
commit a7e04278fd
39 changed files with 1226 additions and 25 deletions
+59
View File
@@ -236,6 +236,21 @@ export function registerCommands(context: vscode.ExtensionContext, deps: Command
if (group) void startGroupSessionFlow(deps, group);
});
// ---- « Démarrer le projet » (lancement multi-terminaux) ----
cmd('arboretum.startProject', (node) => {
const wt = asWorktree(node as AnyNode);
if (wt) {
void startProjectFlow(deps, wt.repoId, { worktreePath: wt.worktree.path });
return;
}
const repo = asRepo(node as AnyNode);
if (repo) void startProjectFlow(deps, repo.id, {});
});
cmd('arboretum.stopLaunch', (node) => {
const s = asSession(node as AnyNode);
if (s?.launchRunId) void stopLaunchFlow(deps, s.launchRunId);
});
// ---- conscience du workspace (Phase D) ----
cmd('arboretum.startSessionHere', () => {
const repoId = workspace.currentRepoId();
@@ -331,3 +346,47 @@ async function startGroupSessionFlow(deps: CommandDeps, group: GroupSummary): Pr
}
});
}
/**
* Lance les commandes de démarrage du repo (un terminal natif par commande activée). L'édition des
* commandes reste dans l'IDE web : si aucune n'est configurée, on propose de l'ouvrir.
*/
async function startProjectFlow(
deps: CommandDeps,
repoId: string,
body: { worktreePath?: string },
): Promise<void> {
await run('start project', async () => {
const res = await deps.rest.startLaunch(repoId, body);
for (const s of res.sessions) deps.terminals.open(s, 'interactive');
if (res.sessions.length === 0) {
const OPEN = 'Open web IDE';
const pick = await vscode.window.showInformationMessage(
'Arboretum: no launch commands configured for this project. Define them in the web IDE.',
OPEN,
);
if (pick === OPEN) void vscode.env.openExternal(vscode.Uri.parse(deps.rest.url));
return;
}
if (res.skipped.length > 0) {
void vscode.window.showWarningMessage(
`Arboretum: ${res.skipped.length} command(s) skipped: ${res.skipped.map((s) => s.reason).join('; ')}`,
);
}
});
}
/** Arrête d'un coup tous les terminaux vivants d'un même lancement (partageant le launchRunId). */
async function stopLaunchFlow(deps: CommandDeps, launchRunId: string): Promise<void> {
const live = deps.store.allSessions().filter((s) => s.live && s.launchRunId === launchRunId);
if (live.length === 0) return;
const ok = await vscode.window.showWarningMessage(
`Stop all ${live.length} launch terminal(s)?`,
{ modal: true },
'Stop all',
);
if (ok !== 'Stop all') return;
await run('stop launch', async () => {
await Promise.all(live.map((s) => deps.rest.killSession(s.id)));
});
}