From 95f0e0189fa0a165ef913ce4ab520f11889da4a7 Mon Sep 17 00:00:00 2001
From: Johan LEROY
Date: Wed, 17 Jun 2026 14:22:17 +0200
Subject: [PATCH] =?UTF-8?q?docs:=20README=20en=20fran=C3=A7ais=20(README.f?=
=?UTF-8?q?r.md)=20+=20s=C3=A9lecteur=20de=20langue?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- ajoute une traduction française complète du README
- lien de langue (English ⇄ Français) en tête des deux fichiers
- corrige une référence résiduelle `npx git-arboretum` → `@johanleroy/git-arboretum`
Co-Authored-By: Claude Opus 4.8 (1M context)
---
README.fr.md | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++
README.md | 6 +-
2 files changed, 215 insertions(+), 1 deletion(-)
create mode 100644 README.fr.md
diff --git a/README.fr.md b/README.fr.md
new file mode 100644
index 0000000..96332d2
--- /dev/null
+++ b/README.fr.md
@@ -0,0 +1,210 @@
+
+
+
+
+
+ Un dashboard web auto-hébergé pour vos worktrees git et les sessions Claude Code qui tournent dessus — depuis n'importe quel appareil.
+
+
+
+ English · Français
+
+
+**Statut : MVP.** Le dashboard worktree-first, la découverte et la reprise de sessions, le cycle de vie des worktrees multi-repo, les états de session en temps réel, le terminal web et la supervision mobile (PWA installable, Web Push quand une session vous attend, valider/refuser sans ouvrir de terminal) sont implémentés et testés.
+
+---
+
+## Le problème
+
+Travailler avec des agents de code IA a changé notre usage de git : une feature = un worktree = une session Claude Code, plusieurs en parallèle. Mais l'outillage n'a pas suivi :
+
+- `git worktree list` sur plusieurs repos est fastidieux, les worktrees s'accumulent, chacun a besoin de ses `node_modules` et `.env`.
+- Les sessions Claude Code sont éparpillées : certaines tournent dans des terminaux, d'autres sont reprenables depuis l'historique, sans vue consolidée de *celle qui attend votre intervention*.
+- Quand vous vous éloignez de votre poste, une session bloquée sur une demande de permission reste bloquée.
+
+## Ce que fait Arboretum
+
+Un unique daemon Node.js que vous lancez sur votre machine de dev (`npx @johanleroy/git-arboretum`), servant une interface web utilisable depuis votre ordinateur, téléphone ou tablette :
+
+- **Dashboard worktree-first, multi-repo** — chaque worktree de chaque repo enregistré, avec son état git (branche, ahead/behind, fichiers modifiés) *et* l'état de sa session Claude Code (busy / en attente d'entrée / idle / reprenable).
+- **Cycle de vie complet des worktrees** — créer (avec des hooks post-création par repo : `npm ci`, copie de `.env`…), adopter des worktrees créés à la main, supprimer avec garde-fous, élaguer les orphelins.
+- **Découverte & reprise de sessions** — les sessions lancées dans votre propre terminal apparaissent automatiquement ; reprenez les sessions mortes, observez ou forkez les vivantes. Ne corrompt jamais une session vivante.
+- **Terminal web** — terminal xterm.js complet vers chaque session managée, qui survit aux déconnexions du navigateur.
+- **Supervision depuis votre téléphone** — PWA installable avec notifications push quand une session vous attend ; validez ou refusez une demande sans ouvrir de terminal.
+
+---
+
+## Prérequis
+
+- **Node.js ≥ 22.16** — requis, pas seulement recommandé. Arboretum persiste son état avec `node:sqlite` (`DatabaseSync`), natif et stable seulement à partir de cette version. (`.nvmrc` fixe `22`.)
+- **Le CLI `claude`** sur votre `PATH` si vous voulez qu'Arboretum lance et gère des sessions Claude Code. Arboretum enveloppe le CLI interactif que vous utilisez déjà — installez-le et authentifiez-le comme d'habitude.
+- Un **dépôt git** (ou plusieurs) que vous voulez gérer.
+
+## Démarrage rapide
+
+### Le lancer (recommandé)
+
+Arboretum est publié sur un registre npm Gitea privé. Pointez le scope `@johanleroy` dessus une fois par machine — ajoutez à `~/.npmrc` :
+
+```
+@johanleroy:registry=https://git.lidge.fr/api/packages/johanleroy/npm/
+//git.lidge.fr/api/packages/johanleroy/npm/:_authToken=
+```
+
+(La ligne `_authToken` n'est nécessaire que si le paquet est privé.) Puis lancez-le depuis n'importe où :
+
+```bash
+npx @johanleroy/git-arboretum
+```
+
+Au premier démarrage, Arboretum affiche un **token d'accès** unique et l'URL à ouvrir :
+
+```
+┌──────────────────────────────────────────────────────────────────┐
+│ First start — your access token (shown once, store it safely): │
+└──────────────────────────────────────────────────────────────────┘
+
+
+
+ Login at: http://127.0.0.1:7317/
+```
+
+Ouvrez l'URL, collez le token pour vous connecter, et c'est parti. Le token est stocké **hashé** — il n'est affiché qu'une seule fois, alors gardez-le en lieu sûr (un gestionnaire de mots de passe). Vous pourrez gérer vos tokens plus tard depuis les **Réglages**.
+
+### Lancer depuis les sources
+
+```bash
+git clone https://git.lidge.fr/johanleroy/arboretum.git
+cd arboretum
+nvm use # ou assurez-vous d'avoir Node ≥ 22.16
+npm install
+npm run build # build shared → server → web (l'ordre compte)
+node packages/server/dist/index.js
+```
+
+## Utiliser Arboretum
+
+1. **Ajoutez un dépôt.** Depuis le dashboard, enregistrez un repo git local par son chemin. Configurez éventuellement des **hooks post-création** (ex. `npm ci`, `cp ../.env .env`) exécutés automatiquement à chaque création d'un nouveau worktree pour ce repo.
+2. **Créez ou adoptez des worktrees.** Créez un nouveau worktree + branche en un clic (les hooks s'exécutent pour vous), ou adoptez un worktree créé à la main. Chaque worktree affiche sa branche, son ahead/behind et son nombre de fichiers modifiés.
+3. **Démarrez ou reprenez une session.** Lancez une session Claude Code sur un worktree, ou reprenez-en une démarrée dans votre terminal — Arboretum découvre les sessions existantes automatiquement et les reprend toujours dans leur répertoire de travail d'origine.
+4. **Suivez les états en direct.** Chaque session indique si elle est *busy*, *en attente de votre entrée* ou *idle*. Ouvrez le **terminal web** pour interagir directement ; il survit aux déconnexions du navigateur (fermer l'onglet ne tue pas la session).
+5. **Supervisez depuis votre téléphone.** Installez la PWA, et quand une session bascule en *attente*, vous recevez une notification push. Validez ou refusez la demande directement depuis l'interface de notification — sans terminal.
+
+## Accès distant depuis votre téléphone
+
+Arboretum se bind sur `127.0.0.1` par défaut et **refuse** de se binder sur une adresse non-loopback sans dérogation explicite. La façon recommandée (et sûre) de l'atteindre depuis d'autres appareils est **[Tailscale Serve](https://tailscale.com/kb/1242/tailscale-serve)** — HTTPS valide, identité tailnet, aucun port ouvert :
+
+```bash
+# Expose le daemon local en HTTPS dans votre tailnet
+tailscale serve --bg 7317
+```
+
+Puis démarrez Arboretum en autorisant l'origine de votre tailnet (le check Origin strict doit la connaître) :
+
+```bash
+npx @johanleroy/git-arboretum --allow-origin https://..ts.net
+```
+
+Ouvrez `https://..ts.net` depuis n'importe quel appareil de votre tailnet. **Web Push exige HTTPS**, donc Tailscale Serve (ou un autre front HTTPS) est aussi ce qui active les notifications mobiles. Sur **iOS**, installez d'abord l'app à l'écran d'accueil, puis autorisez les notifications.
+
+> ⚠️ Un terminal web, c'est de l'exécution de code à distance **par conception**. N'exposez jamais Arboretum directement sur l'internet public.
+
+## Le faire tourner en service d'arrière-plan
+
+Pour un daemon qui survit à la déconnexion et redémarre au boot, lancez-le via un **service systemd utilisateur**. Installez une version figée globalement (`npm i -g @johanleroy/git-arboretum`), puis créez `~/.config/systemd/user/arboretum.service` :
+
+```ini
+[Unit]
+Description=Arboretum — git worktree & Claude Code dashboard
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+ExecStart=%h/.local/bin/arboretum --port 7317 --allow-origin https://MACHINE.TAILNET.ts.net
+Restart=on-failure
+RestartSec=5
+KillSignal=SIGTERM
+TimeoutStopSec=10
+Environment=NODE_ENV=production
+
+[Install]
+WantedBy=default.target
+```
+
+```bash
+which arboretum # ajustez ExecStart au vrai chemin si besoin
+systemctl --user daemon-reload
+systemctl --user enable --now arboretum
+loginctl enable-linger "$USER" # démarre le service au boot, sans session ouverte
+journalctl --user -u arboretum -f # logs
+```
+
+> Le **token d'accès** unique n'est affiché qu'au tout premier démarrage (base vierge). En service, récupérez-le depuis `journalctl`, ou faites un lancement manuel avant d'activer le service. Le token est hashé et n'est jamais réaffiché.
+
+## Configuration
+
+Toutes les options sont des flags CLI :
+
+| Flag | Défaut | Description |
+|---|---|---|
+| `--port ` | `7317` | Port d'écoute. |
+| `--bind ` | `127.0.0.1` | Adresse de bind. Une adresse non-loopback est refusée sauf si `--i-know-this-exposes-a-terminal` est défini. |
+| `--allow-origin ` | — | Origine `Origin` autorisée supplémentaire (répétable). Nécessaire pour l'accès Tailscale/HTTPS. |
+| `--db ` | `/arboretum.db` | Chemin de la base SQLite. |
+| `--vapid-contact ` | `mailto:arboretum@localhost` | Sujet de contact VAPID pour le Web Push. |
+| `--print-token` | `false` | Indication sur le réaffichage du token (les tokens sont hashés et ne peuvent pas être réaffichés). |
+| `--i-know-this-exposes-a-terminal` | `false` | Reconnaître le bind sur une adresse non-loopback. **À éviter** — préférez Tailscale Serve. |
+
+L'état (la base SQLite) vit dans `$XDG_DATA_HOME/arboretum` (par défaut `~/.local/share/arboretum`).
+
+## Modèle de sécurité
+
+Un terminal web, c'est de l'exécution de code à distance *par conception*. Les garde-fous d'Arboretum sont structurants :
+
+- Se bind sur `127.0.0.1` par défaut ; refuse les binds non-loopback sans flag explicite.
+- Authentifie **chaque** requête `/api/**` **et** chaque upgrade `/ws` avec des tokens révocables, et applique un **check `Origin` strict** (le cookie `SameSite=Strict` ne couvre pas les upgrades WebSocket — c'est le garde-fou anti cross-site hijacking).
+- Les tokens sont stockés **hashés** (sha256) et comparés en temps constant ; le bootstrap token n'est affiché qu'une seule fois. Le cookie de session est un payload signé HMAC. Le login est rate-limité avec backoff exponentiel.
+
+La façon recommandée d'atteindre Arboretum depuis d'autres appareils est Tailscale Serve (HTTPS valide, identité tailnet, aucun port ouvert). Ne l'exposez jamais directement sur internet.
+
+## Ce qui le distingue
+
+| | Arboretum | GitKraken Agent Mode / Conductor / Nimbalyst | Happy / CloudCLI | Anthropic Remote Control |
+|---|---|---|---|---|
+| Interface web, tout appareil | ✅ | ❌ apps desktop | ✅ | ✅ |
+| Gestion visuelle des worktrees (multi-repo) | ✅ | ✅ (mono-repo, desktop) | ❌ | ❌ |
+| Découvre & reprend les sessions de terminal *existantes* | ✅ | ❌ | partiel | ❌ |
+| 100 % auto-hébergé — zéro trafic via des serveurs tiers | ✅ | ✅ | serveur relais | ❌ relayé via Anthropic |
+| Linux-first | ✅ | variable | ✅ | l'app desktop n'a pas de build Linux |
+| Open source | MIT | ❌ / partiel | MIT / AGPL | ❌ |
+
+Le Remote Control d'Anthropic est excellent pour piloter *une* session depuis votre téléphone. Arboretum est la couche qu'il ne fournit pas : le tableau consolidé et auto-hébergé de tous vos worktrees et sessions, à travers tous vos repos.
+
+## Une note sur l'usage de Claude
+
+Arboretum enveloppe le CLI Claude Code **interactif** dans un PTY — la même chose que vous lancez dans votre terminal, affichée dans votre navigateur. Il n'utilise pas l'Agent SDK ni le mode headless. Les politiques d'usage d'Anthropic autour de l'usage programmatique peuvent évoluer ; Arboretum suivra les sorties du CLI et documentera tout impact de façon transparente.
+
+## Développement
+
+Arboretum est un monorepo npm workspaces : `@arboretum/shared` (protocole WS/REST, source de vérité), `@johanleroy/git-arboretum` (le daemon Fastify, le paquet publié) et `@arboretum/web` (la SPA Vue 3).
+
+```bash
+npm run build # build shared → server → web (l'ordre compte)
+npm run typecheck # tsc -b shared + server
+npm test # vitest sur les packages
+npm run dev:server # daemon en watch
+npm run dev:web # serveur de dev Vite (proxifie /api et /ws vers le daemon sur :7317)
+```
+
+Scripts d'acceptation end-to-end (lancez `npm run build` d'abord) :
+
+```bash
+node packages/server/scripts/acceptance-p1.mjs # cœur : daemon + client WS réel
+node packages/server/scripts/acceptance-p2.mjs # découverte & reprise de sessions
+node packages/server/scripts/acceptance-p3.mjs # worktrees & corrélation de sessions
+node packages/server/scripts/acceptance-p4.mjs # Web Push + commande WS `answer`
+```
+
+## Licence
+
+MIT — voir [LICENSE](LICENSE).
diff --git a/README.md b/README.md
index fe9614e..10ae5da 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,10 @@
A self-hosted web dashboard for your git worktrees and the Claude Code sessions running on them — from any device.
+
+ English · Français
+
+
**Status: MVP.** The worktree-first dashboard, session discovery & resume, multi-repo worktree lifecycle, live session states, the web terminal, and mobile supervision (installable PWA, Web Push when a session needs you, approve/deny without opening a terminal) are implemented and tested.
---
@@ -20,7 +24,7 @@ Working with AI coding agents changed how we use git: one feature = one worktree
## What Arboretum does
-A single Node.js daemon you run on your dev machine (`npx git-arboretum`), serving a web UI usable from your desktop, phone or tablet:
+A single Node.js daemon you run on your dev machine (`npx @johanleroy/git-arboretum`), serving a web UI usable from your desktop, phone or tablet:
- **Worktree-first, multi-repo dashboard** — every worktree of every registered repo, with its git state (branch, ahead/behind, dirty files) *and* the state of its Claude Code session (busy / waiting for input / idle / resumable).
- **Full worktree lifecycle** — create (with per-repo post-create hooks: `npm ci`, copy `.env`…), adopt worktrees created by hand, delete with guardrails, prune orphans.