release: git-arboretum 3.3.0 (« Démarrer le projet » : lancement multi-terminaux), vscode 0.4.0, desktop 0.1.3
All checks were successful
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

View File

@@ -1,5 +1,5 @@
// Types REST partagés (préfixe /api/v1).
import type { CloneOperation, GroupSummary, PostCreateHook, RepoSummary, SessionSummary, SettingsBroadcast, WorktreeSummary } from './protocol.js';
import type { CloneOperation, GroupSummary, LaunchCommand, PostCreateHook, RepoSummary, SessionSummary, SettingsBroadcast, WorktreeSummary } from './protocol.js';
export interface ApiError {
error: { code: string; message: string; details?: unknown };
@@ -99,6 +99,8 @@ export interface CreateRepoRequest {
label?: string;
postCreateHooks?: PostCreateHook[];
preTrust?: boolean;
/** commandes de démarrage du projet (« Démarrer le projet »). */
launchCommands?: LaunchCommand[];
}
export interface UpdateRepoRequest {
label?: string;
@@ -106,6 +108,8 @@ export interface UpdateRepoRequest {
preTrust?: boolean;
/** true = masquer le repo (exclu du dashboard, conservé en DB) ; false = ré-afficher. */
hidden?: boolean;
/** commandes de démarrage du projet (« Démarrer le projet »). */
launchCommands?: LaunchCommand[];
}
/** Résultat d'un scan de découverte (POST /api/v1/repos/discover). */
@@ -313,6 +317,31 @@ export interface StartRepoSessionRequest {
newBranch?: boolean;
}
// ---- « Démarrer le projet » : lancement multi-terminaux ----
/**
* POST /api/v1/repos/:id/launch : lance un terminal par commande de démarrage activée du repo.
* Le worktree cible est résolu côté serveur (le client ne passe jamais de chemin absolu brut) :
* `worktreePath` prioritaire, sinon worktree de `branch`, sinon checkout principal.
*/
export interface StartLaunchRequest {
/** worktree cible (chemin absolu d'un worktree connu du repo) ; défaut : checkout principal. */
worktreePath?: string;
/** alternative à `worktreePath` : worktree portant cette branche. */
branch?: string;
/** ids des commandes à lancer (défaut : toutes les commandes activées du repo). */
commandIds?: string[];
}
export interface StartLaunchResponse {
/** un terminal (session managée) par commande lancée, partageant le même launchRunId. */
sessions: SessionSummary[];
/** commandes non lancées (répertoire cible introuvable, cwd invalide…). */
skipped: Array<{ id: string; reason: string }>;
}
/** GET /api/v1/repos/:id/launch/detect : suggestions de commandes détectées dans le projet. */
export interface DetectLaunchResponse {
suggestions: LaunchCommand[];
}
// ---- Groupes de travail (P5) ----
export interface GroupsListResponse {
groups: GroupSummary[];

View File

@@ -122,6 +122,9 @@ export interface SessionSummary {
addedDirs?: string[];
/** groupe propriétaire d'une session de groupe (couvre plusieurs repos) ; null/absent sinon. */
groupId?: string | null;
// ---- Lancement de projet multi-terminaux (additif) ----
/** identifiant partagé par tous les terminaux d'un même « Démarrer le projet » ; null/absent sinon. */
launchRunId?: string | null;
// ---- Masquage (additif) ----
/** true = session découverte masquée par l'utilisateur (exclue de la liste sauf includeHidden). */
hidden?: boolean;
@@ -139,6 +142,22 @@ export interface PostCreateHook {
enabled: boolean;
}
/**
* Commande de démarrage d'un projet (« Démarrer le projet ») : une commande shell longue durée
* lancée dans un terminal PTY managé (serveur front, back, base…). Plusieurs commandes activées
* = plusieurs terminaux ouverts d'un seul geste. Persistée en JSON sur le repo.
*/
export interface LaunchCommand {
id: string;
/** libellé court affiché dans l'onglet du terminal (ex. « web », « api »). */
label: string;
/** commande shell auto-tapée dans un shell de login interactif (ex. `npm run dev`). */
run: string;
/** sous-répertoire relatif au worktree où exécuter la commande (borné, jamais hors du worktree). */
cwd?: string;
enabled: boolean;
}
export interface RepoSummary {
id: string;
/** chemin absolu de la racine du repo (main worktree). */
@@ -146,6 +165,8 @@ export interface RepoSummary {
label: string;
defaultBranch: string | null;
postCreateHooks: PostCreateHook[];
/** commandes de démarrage du projet (« Démarrer le projet ») ; [] si aucune définie. */
launchCommands: LaunchCommand[];
/** pré-écrire hasTrustDialogAccepted dans ~/.claude.json à la création d'un worktree. */
preTrust: boolean;
createdAt: string;