Un terminal pouvait rester tout noir alors que sa session tournait. Le PTY était vivant et avait bien écrit sa sortie : la panne était dans le transport. Le replay d'attache est une frame BINAIRE, mais un client n'apprend son numéro de canal qu'avec le message `attached` ; le serveur envoyait le replay AVANT, donc tout client le jetait sur un canal inconnu. Rien n'était peint, et un TUI au repos (Claude à son prompt) ne réémet jamais rien de lui-même. `attach()` renvoie désormais le replay et la gateway l'émet APRÈS `attached` : un seul correctif serveur répare le web, l'app de bureau et l'extension VS Code, qui portaient le même défaut client. Le resize de l'attache masquait le bug en provoquant un SIGWINCH, d'où son apparence intermittente. Seconde moitié du symptôme (« je tape et rien ne se passe ») : le dock montait avant la liste des sessions, en déduisait « non attachable » et s'attachait en observateur, à vie et en silence. Un pane n'attache plus avant de connaître sa session (`sessions.loaded`). Attaches sans écran : le message `attach` accepte un `screen` optionnel (défaut true). Un client qui n'affiche rien et veut seulement répondre à un dialogue ne prend plus le contrôle de la session, ne lui impose plus ses dimensions (ce qui figeait la géométrie du vrai terminal) et ne reçoit plus le flux pour le jeter. Rendre les pannes visibles : la raison d'un exit est écrite dans le terminal (`[arboretum] bash exited with code 3`) avant le détachement ; un repaint est forcé si rien n'arrive 1,2 s après l'attache, puis annoncé avec « Refresh screen » ; les refus de canal remontent à l'écran au lieu d'un console.warn ; le chemin du CLI claude est revalidé (périmé après une bascule nvm/asdf, le PTY mourait sans un octet). Colonnes de terminaux : le dock devient une rangée de colonnes redimensionnables (3 max), chacune avec ses onglets. Algèbre pure dans lib/dock-model.ts, cinq invariants documentés, ratios plutôt que pixels. `dockSessionIds` et `activeDockSessionId` deviennent des computed dérivés : aucun consommateur ni test existant ne change. Alt+clic ouvre à côté depuis les quatre panneaux. Le plafond de hauteur du dock suit le viewport au lieu d'un 640 px figé. Correctif préexistant au passage : PanelSplitter passait ses bornes par valeur, figées au premier rendu, alors que le clavier les relisait. Portée git : la vue Changements suit le worktree du terminal focalisé, ou tous les dépôts de son groupe pour une session de groupe, avec « tout voir » à un clic. L'index Git de la sidebar reste global (c'est la sortie d'une portée étroite) et le badge d'activité aussi (il sert à signaler le travail qu'on ne regarde pas). Seul le TERMINAL impose le contexte : le repli sur l'onglet éditeur, essayé d'abord, rétrécissait la vue multi-projet dès qu'on ouvrait un fichier. Vérifications : acceptance-p17.mjs prouve l'ordre des trames sur un vrai WebSocket (avec l'ancien ordre : 0 octet rejoué, échec), verify-terminals.mjs prouve par interaction réelle que le terminal peint, que deux colonnes coexistent, que la frappe atteint le bon PTY (fichier témoin par cwd) et que la vue suit le terminal.
Arboretum for VS Code
Pilot your git worktrees and Claude Code sessions from inside VS Code: a real native integration on top of the Arboretum daemon, not a webview.
- Live tree of Repositories → Worktrees → Sessions (and a Groups view), updated in real time over the daemon's WebSocket.
- Native terminals: attach to any session in a real VS Code terminal (a
Pseudoterminalbridges the daemon's PTY): you get VS Code's own rendering, scrollback, copy/paste and links for free. - Waiting alerts: a status-bar counter and native notifications when a Claude session is waiting for
input: answer Yes/No without even opening the terminal (uses the daemon's
answercommand). - Git mutations from the tree: create worktree, commit, push, fetch, pull, promote to main, with a detailed git status on each worktree (staged / unstaged / conflicts and the last commit subject).
- Open Worktree IDE: jump from any worktree into the multi-project IDE (unified project / worktree / session tree, tabbed Monaco editor with inline diffs, docked terminals), in the browser or the native desktop app. The extension stays a lightweight visual worktree manager: the heavy editing lives in the IDE.
- Workspace-aware: the worktree matching your open folder is highlighted; start a session or create a worktree for the current folder in one command.
Requirements
- A running Arboretum daemon (
npx @johanleroy/git-arboretum, or installed as a user service viaarboretum install). The extension is a client: it does not start the daemon. - An access token. The bootstrap token is printed once on first daemon start; you can also create one in the Arboretum dashboard (Settings → Tokens).
Getting started
- Start the daemon and copy a token.
- In VS Code, run Arboretum: Sign In (Command Palette) and paste the token. The token is validated against the daemon and stored in VS Code's encrypted SecretStorage.
- The Arboretum view container appears in the Activity Bar with the Repositories and Groups trees.
Settings
| Setting | Default | Description |
|---|---|---|
arboretum.url |
http://127.0.0.1:7317 |
Base URL of the daemon (REST + WebSocket). |
arboretum.showExternalSessions |
false |
Also show Claude sessions started outside Arboretum (CLI). |
arboretum.showArchivedSessions |
false |
Also show finished sessions auto-archived after their retention window. |
arboretum.notifyOnWaiting |
true |
Native notification when a session starts waiting for input. |
The extension authenticates with Authorization: Bearer <token> on both REST and the WebSocket upgrade.
For remote access, point arboretum.url at your Tailscale Serve URL (https://…): the WebSocket is
derived automatically (wss://).
Building & packaging (private VSIX)
The extension is bundled with esbuild (@arboretum/shared is inlined → the VSIX is self-contained).
# from the monorepo root
npm install
npm run build:vscode # builds @arboretum/shared then bundles the extension
cd packages/vscode && npx @vscode/vsce package --no-dependencies
# → git-arboretum-<version>.vsix
Install it with Extensions: Install from VSIX… in the Command Palette, or:
code --install-extension git-arboretum-<version>.vsix # also: codium / cursor
Other distribution channels (optional)
- Open VSX (VSCodium, Cursor, Windsurf):
npx ovsx publish *.vsix -p <token>after creating an Open VSX account and namespace. - VS Code Marketplace: create an Azure DevOps publisher + PAT, then
npx @vscode/vsce publish.
A Gitea Actions workflow packages the VSIX automatically on a vscode-vX.Y.Z tag (see
.gitea/workflows/vscode-release.yml) and attaches it to the release.
Security
The extension never weakens the daemon's security model: it speaks the same authenticated protocol as the
web dashboard. A Node client sends no Origin header, so it passes the daemon's strict Origin check while
still requiring a valid token.