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

@@ -186,6 +186,19 @@ const fr: typeof en = {
externalSessions: 'externes',
showExternalSessions: 'Afficher les sessions externes ({n})',
},
project: {
new: 'Nouveau projet',
title: 'Nouveau projet',
intro: 'Crée un nouveau dossier sous la racine choisie, puis y lance une session.',
nameLabel: 'Nom du projet',
namePlaceholder: 'mon-projet',
rootLabel: 'Dossier racine',
rootPlaceholder: '/chemin/absolu/racine',
gitInit: 'Initialiser un dépôt git (git init)',
commandLabel: 'Commande',
create: 'Créer',
creating: 'Création…',
},
terminal: {
observer: 'observateur (lecture seule)',
sessionEnded: 'Session terminée',
@@ -197,6 +210,8 @@ const fr: typeof en = {
maximize: 'Agrandir',
restore: 'Réduire',
openFullscreen: 'Ouvrir en plein écran',
group: 'Groupe',
covers: 'couvre',
},
push: {
enable: 'Activer les notifications',
@@ -340,6 +355,7 @@ const fr: typeof en = {
groupDeleted: 'Groupe supprimé',
groupSessionLaunched: 'Session de groupe démarrée',
groupSessionPartial: 'Session de groupe démarrée ({n} dépôt(s) ignoré(s))',
projectCreated: 'Projet créé',
genericError: 'Une erreur est survenue',
dismiss: 'Fermer',
},