Commit graph

1 commit

Author SHA1 Message Date
Pascal André
0aba9f45a7
feat: temporary instances that are kept or discarded when closed (#899)
Refs #889 (étape 1 ; le déplacement d’un projet gardé vers un dossier
choisi reste hors périmètre).

## Comportement
- **Création** : bouton « Nouvelle instance temporaire » sur l’accueil
et commande de palette. CodeNomad crée un dossier vide sous son dossier
de configuration (`temporary-workspaces/<date>-<id>`) et l’ouvre comme
un onglet normal, nommé « Temporaire · HH:MM », avec une icône de
sablier, hors projets récents.
- **Fermeture** (X, Ctrl+W) : dialogue **Garder / Jeter / Annuler**,
puisqu’un onglet temporaire fermé ne pourrait pas être rouvert.
- **Garder** : le dossier et ses conversations deviennent un projet
récent nommé, sur place.
  - **Jeter** : conversations et dossier supprimés.
  - Le clic droit sur l’onglet propose aussi « Garder comme projet ».
- Au redémarrage, l’onglet revient toujours marqué temporaire.

## Mise en œuvre
- Dossier sans Git : OpenCode le range dans le projet « global », mais
CodeNomad filtre déjà les conversations sur le dossier exact, donc rien
ne se mélange.
- Le statut temporaire est l’appartenance à un registre
(`temporary-workspaces.json`), pas l’emplacement ; les entrées dont le
dossier n’existe plus sont oubliées.
- Garde-fous de **Jeter** :
  - seulement les enfants directs enregistrés de la racine temporaire ;
- refus si une conversation tourne ou si le dossier est ouvert dans un
autre onglet ;
  - exécution sous le fence de suppression des worktrees ;
  - conversations supprimées enfants d’abord ;
- workspace fermé avant l’effacement du dossier, avec réessais pour
Windows ;
  - le dossier reste enregistré si l’effacement échoue.
- Le store d’alertes gagne un dialogue de choix générique : Annuler plus
des choix ordonnés, le dernier ayant le focus, et toute fermeture valant
annulation.

## Validation
- Serveur : `temporary-workspaces.test.ts` (4/4) ; 438/439 tests serveur
`workspaces` + `server`. Le seul échec est le test de charge de
`pending-requests`, qui passe seul et est sans lien.
- UI : `temporary-instances.test.ts` (4/4) ; `tab-chrome.test.ts` (6/6,
Electron ignoré), avec marqueur d’onglet, entrée de menu et dialogue de
choix sur les vrais composants ; typecheck et build.
- Natif isolé : `node scripts/test-temporary-workspaces-native.mjs
<CLI>` contre OpenCode 2.0.26 sous Windows.
- **Jeter** supprime conversations parente et enfant, fichiers et
dossier ; une conversation d’un autre dossier survit.
  - **Garder** conserve le dossier et sa conversation.
  - Le PID du daemon isolé reste inchangé.
- Le typecheck serveur n’a que les erreurs préexistantes liées à
`@codenomad/remote-tunnel`, non construit localement.

## Fichiers volumineux touchés
`App.tsx` (~990 lignes), `stores/instances.ts` (~2 340),
`workspaces/manager.ts` (~1 280), `folder-selection-view.tsx` (~1 070),
`stores/preferences.tsx` (~1 480).
2026-10-09 20:59:13 +02:00