Le desktop 0.2.4 embarque le daemon 3.7.0 et livre aussi les garde-fous de démarrage déjà sur main (dialogue d'échec, reprise d'un daemon orphelin, redémarrage après mise à jour installée à chaud).
14 KiB
Changelog
Notable changes to @johanleroy/git-arboretum (the Arboretum daemon). The VS Code
extension keeps its own changelog in packages/vscode/CHANGELOG.md.
3.7.0
Terminals stop going black, and they now sit side by side. Files and commits follow the terminal you are actually looking at. Fully additive, no protocol version bump.
- A terminal could stay completely black while its session was alive and running. The attach
replay is a binary frame, but a client only learns its channel number from the
attachedmessage. The server sent the replay first, so every client dropped it on an unknown channel: nothing was painted, and a resting TUI (Claude at its prompt) never emits anything on its own.attachedis now sent before the replay, which fixes the web app, the desktop app and the VS Code extension at once. A resize on attach used to hide the bug by triggering a repaint through SIGWINCH, which is why it looked intermittent. - Screen-less attachments.
attachaccepts an optionalscreenflag (defaulttrue). Withscreen: false, a client that only wants to answer a dialog no longer takes control of the session, no longer forces its own dimensions onto the PTY (which used to freeze the real terminal's geometry) and no longer receives the output stream just to throw it away. - The reason a session died is now visible in the terminal: a last line,
[arboretum] claude exited with code 1, is written to the stream before clients are detached. A process that died at spawn time used to leave nothing but an empty screen. - A stale Claude CLI path is re-resolved. The resolved binary was cached for the lifetime of the daemon; after an nvm or asdf switch it pointed at a file that no longer existed, and the PTY died without a single byte of output.
- Terminal columns. The dock holds up to three resizable columns, each with its own tabs. Alt+click a session (tree, panels, attention list) or use the tab button to open it beside the current one. Keystrokes always go to the focused column. The dock's height ceiling now follows the viewport instead of a fixed 640 px, and opening the dock gives it a usable height.
- Changes are scoped to the focused terminal. The Changes view shows the worktree of the terminal you are working in, or every repo of its group for a group session, with a one-click "show every project" toggle. The Git index in the sidebar stays global on purpose: it is the way out of a narrow scope. The activity-bar badge stays global too: it exists to surface work you are not looking at.
3.6.0
Files open again, and uncommitted work gets a real surface: one block per project, in the centre of the IDE. Fully additive, no protocol version bump.
- Opening a file showed an empty page. The container of the single Monaco instance lived inside a
v-if, so mounting the IDE with no open tab (first use, or after closing everything) bailed out silently and the editor was never created: the first file you opened rendered nothing, with no spinner and no error. The container is now always mounted and the editor is created on demand. Closing the last tab no longer destroys it either. - The editor now says when it cannot load. A missing editor chunk (a stale
index.htmlafter an update, a network drop) used to be memoized as a permanent failure, silently, for the whole session. It reports the failure, offers Retry and Reload page, and shows a loading state while the chunk and the file are fetched. A file that disappears under the editor is reported instead of being swallowed. - No more console errors when opening TypeScript. Only the base worker was provided, so the TypeScript language service kept calling a worker that did not implement its methods, throwing on every single file open. The language workers are shipped now (loaded on demand). Semantic diagnostics stay off on purpose: with no tsconfig and no node_modules, they would invent errors.
- Changes: your uncommitted work, per project, in the centre. Two buttons on the right of the tab bar switch the centre between Files and Changes. Changes shows one block per worktree across every open project, each with its staged and unstaged files, its diff unfolded in place, its commit, push, fetch and pull, and its own history. The Git panel in the sidebar becomes the index: what each project is worth at a glance, one click to open the matching block. The activity bar badge finally counts the worktrees that need attention.
- Push and commit buttons tell the truth. Push was enabled with nothing to push and disabled when merely behind; it now follows what git will actually do. Amending just a message is allowed, as the server already did. A rebase is offered as soon as the branch is behind, not only after a fast-forward fails.
- Commit, fetch and push refresh what they change. They only broadcast a worktree update, so the "n unpushed" counter stayed stale right after a push, and files just committed were still listed.
- On mobile, tapping a file in the explorer now brings the editor to the front, and the Git tab opens the Changes view (the sidebar index is a desktop affordance).
3.5.1
Completes the terminal copy & paste of 3.5.0, which only worked in a browser.
- Copy & paste inside the desktop app. In the Electron renderer,
navigator.clipboardrejects withNotAllowedErrorfor reads AND writes, so 3.5.0's copy silently did nothing there, exactly where the problem had been reported. Clipboard access now goes through a cascade: the desktop app's own bridge first (IPC to Electron'sclipboardmodule, exposed by the preload), thennavigator.clipboard, thendocument.execCommand('copy')for writes, which also covers plain-HTTP access over a LAN where the Clipboard API is unavailable.
3.5.0
Fixes a black screen after every update, gives the web terminal a working copy & paste, and lets you browse a group's files without leaving the Groups panel. Fully additive, no protocol version bump.
- No more black screen after an update. The embedded SPA is served by
@fastify/static, whose weak etag derives from size + mtime, andnpm packpins the mtime of every file in the tarball to a constant (1985-10-26). Two differentindex.htmlof equal size therefore shared an etag: clients got a304 Not Modifiedand kept an index referencing/assets/<hash>files that no longer existed. The fallback route then answered those module requests withindex.htmlastext/html, the browser refused the script, and nothing painted.index.htmland every other unhashed file are now servedno-storewith conditional validation disabled, so a client holding a stale copy repairs itself; hashed/assets/are servedimmutablefor a year. - Copy & paste in the terminal. xterm's selection is not a DOM selection, so the native Copy (the
Electron Edit menu, the browser context menu) had nothing to copy and terminal output could not be
retrieved at all.
Ctrl+Shift+C/Ctrl+Shift+V(Cmd+C/Cmd+Von macOS, plusCtrl+Insert/Shift+Insert) now copy the selection and paste the clipboard, and the DOMcopyevent is intercepted so the native Copy works too.Ctrl+Cis deliberately untouched: it stays SIGINT. - Theme applied before the first paint again. The anti-FOUC script was inline in
index.html, which the daemon's own CSP (script-src 'self') refused to execute; it moved to/theme-boot.js. - Browse files from the Groups panel. A group's worktrees expand into their file tree, the same component and the same expansion state as the Explorer, and those worktrees are now watched for real-time changes too.
- Sources are text again. Three files embedded a literal NUL byte in a string separator, which made
git and grep treat them as binary: their diffs were unreviewable and the
lint-dashesCI guard (git grep -I) silently skipped them. Escaped as\0, same runtime value.
3.4.0
Visibility release: the real-time machinery is now actually armed, worktrees show what they are worth, and history is served. Fully additive, no protocol version bump.
- Real-time that no longer depends on which panel is open. A live session now pins the FS watcher of
its worktree, so a worktree an agent is writing into refreshes on its own even when nobody is looking at
it (
pinSessionexisted but was never called). On the client side,watchsubscriptions moved out of the Git panel, which was unmounted as soon as you left its tab, taking the app's only subscription with it; they now follow what you actually look at (active worktree plus expanded repositories). - Reconnection no longer loses state. The protocol replays nothing, so every event missed during a WebSocket outage was lost for good. The client reloads repos, worktrees, sessions and settings whenever the connection comes back.
- Session correlation by containment. A terminal started in a subdirectory of a worktree (which
"Start the project" allows) and a group session covering a worktree through
--add-dirare now listed under that worktree, instead of vanishing from the tree. The rule lives in@arboretum/shared, shared by the daemon, the web UI and the VS Code extension; the most specific worktree wins. - History API.
GET /api/v1/repos/:id/worktrees/logserves the branch commits with the count of unpushed ones, andGET .../worktrees/diff?commit=<hash>the full diff of a commit (hash strictly validated, same size limits as file diffs). The UI unfolds them in place under the Git panel. - Full git counters where they matter.
ahead/behind, staged, unstaged and conflict counts were only visible in the status bar, for the active worktree. They are now on every worktree row of the tree and of the Groups panel, with upstream and last commit in the tooltip.locked,prunableand an invalid repository are surfaced too. - Groups show their composition. A group lists its repositories with their worktrees and git state, its sessions (live and recent) and the directories a group session spans. Its colour tints those repos in the explorer.
- Actionable
403 BAD_ORIGIN. The error now names the exact--allow-originflag to add, and logs it. It is the first wall of any LAN or reverse-proxy access. - Windows support in the daemon.
where.exefor CLI discovery, PowerShell as the project launch shell, a.cmdaskpass so token-based HTTPS clone/push works,taskkill /Tfor process-tree termination,%APPDATA%for the data directory, andarboretum installregistering a scheduled task. - UI fixes. Error toasts were painted behind modals (they are sticky, so they piled up invisible); on mobile, opening a terminal or switching activity had no visible effect; the dock could push the status bar out of the viewport; panels showed "nothing here" instead of a loading or error state; modals had no dialog role, focus trap or focus restore; the splitters are now keyboard operable; diff line numbers stay pinned while scrolling.
3.3.0
"Start the project": boot a project's long-running commands (dev server, API, database) in one click. Fully additive, no protocol or API change.
- Launch commands per repo. A repo now carries reusable start commands (label, shell command, optional subdirectory), persisted as JSON and edited from the dashboard. They can be auto-detected from
package.jsonscripts, aProcfileor adocker-composefile. - One terminal per command.
POST /api/v1/repos/:id/launchresolves the target worktree server-side (the client never passes a raw path) and opens one managed terminal per enabled command, all sharing a launch run id so you can stop the whole set in one action. Each command runs in your interactive login shell (sonpm,docker, nvm/asdf are onPATH) and the shell stays live after the command exits, keeping failures on screen. - Surfaces. Start a project from a repo or worktree menu, the sessions panel or the command palette. The VS Code extension exposes it too (see its changelog).
3.2.0
Visual overhaul: the web UI adopts the "Emerald" design system and gains a full theme system. No protocol or API change (fully additive, backward compatible).
- Light and dark themes. A
light/dark/systemtoggle (in the activity bar and in Settings), remembered across sessions and applied before the first paint (no flash of the wrong theme). The Monaco editor, the xterm terminals (now with a full 16-color ANSI palette) and the diffs all re-theme live. - Emerald design language. Self-hosted Inter + JetBrains Mono, an emerald accent, consistent rounded corners, mono status pills and dots, refined focus and text selection, thin scrollbars, and a terminal signature motif.
- Marketing site aligned. git-arboretum.com now mirrors the app: the same tokens, fonts and theme toggle, with up-to-date IDE mockups.
3.1.0
- The IDE becomes the single shell of the web UI; the legacy worktree-first dashboard is retired as the default surface (still reachable at
/dashboard). - Desktop app metadata fixes (window logo on Debian / Wayland).
3.0.0
- Multi-project IDE milestone: one workspace (route
/ide, the default on desktop) holding every open project at once, a unified project / worktree / session tree, a tabbed Monaco editor with inline diffs, docked session terminals, and Git / Sessions / Groups panels. Ships as a native Electron desktop app (Linux, Windows, macOS) alongside the same web UI.
2.0.0
- "Real worktree IDE" foundations: a pure git engine, a real-time file-system watcher, the file API, selective staging / discard / amend / fetch / pull, automatic session archival, real-time settings sync, and encrypted remote git services (GitHub / GitLab / Gitea) with HTTPS clone.