feat: création de projet (nouveau dossier + session) & en-tête de session enrichi

- POST /api/v1/projects : crée <root>/<name> (mkdir non récursif, 409 si existant),
  git init optionnel, puis lance une session dedans. Anti-traversal sur le nom (core/project.ts).
- Web : NewProjectModal (racine préremplie scanRoots[0], case git init) + bouton dans SessionsListView.
- SessionContextBar : badge du groupe (cliquable) + repos couverts avec leur branche dans l'en-tête
  de session ; session simple = repo+branche déduits du cwd.
- 14 tests (unitaires + route).
This commit is contained in:
2026-06-23 18:52:22 +02:00
parent 06a400acc7
commit 8b9060e0c0
14 changed files with 571 additions and 2 deletions

View File

@@ -47,6 +47,29 @@ export interface CreateSessionRequest {
/** binaire à lancer — défaut "claude" ; "bash" sert aux tests d'acceptation sans quota */
command?: 'claude' | 'bash';
}
/**
* POST /api/v1/projects — crée un NOUVEAU dossier de projet `<root>/<name>` (le serveur ne crée
* jamais de dossier ailleurs) puis y lance une session. Le `git init` est optionnel (case à cocher).
* Réponse : `CreateProjectResponse`.
*/
export interface CreateProjectRequest {
/** racine absolue où créer le projet (doit déjà exister). */
root: string;
/** nom du dossier de projet : un seul segment, sans séparateur ni `..`. */
name: string;
/** true → `git init` dans le nouveau dossier avant la session (défaut false). */
gitInit?: boolean;
/** binaire à lancer — défaut "claude" ; "bash" sert aux tests sans quota. */
command?: 'claude' | 'bash';
}
export interface CreateProjectResponse {
session: SessionSummary;
/** chemin absolu du dossier de projet créé. */
path: string;
/** true si `git init` a réellement été exécuté. */
gitInitialized: boolean;
}
export interface SessionsListResponse {
sessions: SessionSummary[];
}