Installer une nouvelle version remplace les fichiers sur disque mais ne touche
pas le process en cours : l'ancienne instance gardait le port 7317, la version
fraîchement installée mourait sur EADDRINUSE avant son handshake, et le shell se
contentait d'un console.error suivi d'un app.quit(). Depuis le lanceur, cliquer
l'icône ne produisait donc rien du tout.
- Tout échec de démarrage ouvre un dialogue Retry / Show log / Quit
(start-failure.ts, texte pur et testé) et la sortie du daemon est conservée
dans <userData>/logs/daemon.log. Une mort du daemon APRÈS le handshake propose
de le relancer, au lieu de laisser une fenêtre morte à l'écran.
- Le port est diagnostiqué avant le spawn (port-guard.ts, empreinte
{pid, ownerPid, port}) : un daemon orphelin, dont l'Electron est mort, est
repris (SIGTERM puis SIGKILL, en attendant un bind réellement possible) ;
une instance vivante ou un tiers (service, npx) est annoncé avec l'action qui
débloque, et jamais tué. La reprise exige deux preuves, l'empreinte orpheline
ET l'identité du process (ps -ww), car un pidfile périmé peut désigner un pid
recyclé entre-temps par un programme quelconque.
- Une mise à jour installée à chaud est signalée avec « Restart now »
(upgrade-watch.ts), qui arrête le daemon avant app.relaunch() ; sans quoi le
lock d'instance unique renvoyait silencieusement sur la fenêtre de l'ancienne
version, et on croyait avoir migré.
- ARBORETUM_DESKTOP_PORT pour cohabiter avec un Arboretum qui occupe 7317 en
permanence (service installé, ou daemon lancé en terminal).
24 tests dans packages/desktop/test, et quatre scénarios rejoués en dev sous
xvfb-run avec profil isolé : port tenu par un tiers, orphelin repris puis SPA
servie, instance vivante laissée intacte, pid recyclé épargné.
103 lines
6.3 KiB
Markdown
103 lines
6.3 KiB
Markdown
# Changelog
|
||
|
||
Notable changes to the Arboretum desktop app (`packages/desktop`). The daemon and the VS Code
|
||
extension keep their own changelogs in `packages/server/CHANGELOG.md` and
|
||
`packages/vscode/CHANGELOG.md`.
|
||
|
||
## Unreleased
|
||
|
||
- **The app could refuse to start after an update, silently.** Installing a new version replaces the
|
||
files on disk but leaves the running app alone: its daemon kept port 7317, so the version you just
|
||
installed hit `EADDRINUSE`, its daemon died before the handshake, and the shell logged the failure to a
|
||
console nobody sees and quit. Clicking the launcher appeared to do nothing at all. Three fixes:
|
||
- **Every start-up failure now opens a dialog** with *Retry / Show log / Quit* instead of vanishing,
|
||
and the daemon's output is kept in `<userData>/logs/daemon.log`. A daemon that dies *after* start-up
|
||
is reported too, with an offer to restart it, instead of leaving a dead window on screen.
|
||
- **A busy port is diagnosed, not just fatal** (`src/main/port-guard.ts`). The daemon we spawn is
|
||
recorded in `<userData>/daemon/daemon.json`, so an *orphaned* daemon (its Electron gone after a
|
||
crash, a `kill -9` or an upgrade) is reclaimed - SIGTERM then SIGKILL, waiting for the port to be
|
||
effectively free - while a live sibling instance or third-party server is reported with the action
|
||
that unblocks it, and never killed.
|
||
- **An update installed while the app runs is announced** (`src/main/upgrade-watch.ts`). Until now the
|
||
single-instance lock quietly routed you back to the old version's window; the shell now notices its
|
||
own binary changed on disk and offers *Restart now*, which stops the daemon before relaunching.
|
||
- **`ARBORETUM_DESKTOP_PORT`** picks another port, for machines where a service or terminal daemon owns
|
||
7317 permanently.
|
||
|
||
## 0.2.3
|
||
|
||
Ships the daemon 3.6.0. Files open again (the editor area could stay blank), and uncommitted work
|
||
gets a real surface in the centre of the IDE: one block per project, with staging, commit and push.
|
||
The Electron shell itself is unchanged.
|
||
|
||
## 0.2.2
|
||
|
||
- **Clipboard bridge.** The renderer cannot use `navigator.clipboard` (Electron rejects it with
|
||
`NotAllowedError`), so copying a terminal selection did nothing in the app even after 0.2.1. The
|
||
preload now exposes `arboretumDesktop.clipboard`, relaying to Electron's `clipboard` module over IPC
|
||
(read and write, writes capped at 1M chars). Ships the daemon 3.5.1, whose SPA uses that bridge first.
|
||
|
||
## 0.2.1
|
||
|
||
Ships the daemon 3.5.0, which fixes the black window seen after updating the app.
|
||
|
||
- **Black window after an update, fixed.** The window loaded an `index.html` kept from the previous
|
||
version (revalidated as `304` because the tarball mtime is constant, so the etag did not change) whose
|
||
`/assets/<hash>` files no longer existed. Nothing painted. If you hit it before updating, the app
|
||
repairs itself now; clearing `~/.config/Arboretum/Partitions/arboretum/Cache` was the manual fix.
|
||
- **Copy & paste in session terminals.** `Ctrl+Shift+C` / `Ctrl+Shift+V` (`Cmd+C` / `Cmd+V` on macOS);
|
||
the Edit menu's Copy also works on a terminal selection now. `Ctrl+C` still interrupts.
|
||
- Browse the files of a group's worktrees straight from the Groups panel.
|
||
|
||
The Electron shell itself is unchanged.
|
||
|
||
## 0.2.0
|
||
|
||
Distribution release: the Linux launcher icon finally shows up, Windows becomes a first-class target,
|
||
and the embedded runtime loses a third of its weight.
|
||
|
||
- **Launcher icon fixed (Linux).** Earlier packages installed a single 895×895 icon. That size is not
|
||
declared in `hicolor/index.theme`, so by the freedesktop spec every desktop environment ignored it and
|
||
the launcher fell back to a generic icon. The build now generates the standard set (16 → 512) plus a
|
||
proper `.ico` for Windows, and forces `executableName: arboretum` (the scoped package name was
|
||
producing `@arboretumdesktop` as binary, `.desktop` file and icon name).
|
||
- **Package metadata.** A non-empty short description in `apt show` (`deb.synopsis` was missing),
|
||
`Section: devel` instead of `default`, a single-line `Comment` in the desktop entry (it was multi-line,
|
||
hence invalid), plus `GenericName` and `Keywords` for search.
|
||
- **Windows.** Build scripts run on a Windows host again (`npm`/`npx` are `.cmd` shims that
|
||
`execFileSync` cannot resolve; the Node extraction used `unzip` and `bash -c cp/rm`, none of which
|
||
exist there). The daemon side gained what it needed to actually work: `where.exe` to find the Claude
|
||
CLI, PowerShell as the launch shell, a `.cmd` askpass so HTTPS clone/push with a token works, and
|
||
`taskkill /T` so stopping a terminal takes its whole process tree down. CI has a `windows-latest` job,
|
||
enabled by the `ENABLE_WINDOWS_BUILD` repository variable, see `docs/CI_RUNNERS.md`.
|
||
- **Auto-update repaired.** Shipped binaries point at a `desktop-latest` release that never existed, so
|
||
no client could ever see an update. The release workflow now recreates that floating release on every
|
||
version and attaches the `latest*.yml` files and installers to it, with `.blockmap`s for differential
|
||
updates and `SHA256SUMS`.
|
||
- **Smaller download.** The bundled Node runtime is pruned to the binary and its licence (no headers, no
|
||
docs, no `npm`/`corepack`): ~205 MB → ~118 MB. Nothing at runtime used them, the daemon's dependencies
|
||
being installed at build time.
|
||
- **macOS integration.** An application menu (without it ⌘C / ⌘V / ⌘A were not bound anywhere in the
|
||
app), `app.on('activate')` so the Dock icon brings back a hidden window, and a monochrome template tray
|
||
icon that follows the menu-bar theme.
|
||
- **PATH enrichment on Windows.** `%LOCALAPPDATA%\Programs` and `%APPDATA%\npm` are added to the daemon's
|
||
PATH, where the Claude CLI and global npm binaries live (this was POSIX-only).
|
||
|
||
## 0.1.3
|
||
|
||
Ships the 3.3.0 daemon ("Start the project": launch commands and multi-terminal boot).
|
||
|
||
## 0.1.2
|
||
|
||
Ships the 3.2.0 daemon (Emerald visual overhaul, light and dark themes).
|
||
|
||
## 0.1.1
|
||
|
||
- Fixed the missing window/launcher logo under Debian and Wayland by pinning the runtime app id
|
||
(`app.setName('Arboretum')`) to the `StartupWMClass` written in the desktop entry.
|
||
|
||
## 0.1.0
|
||
|
||
First desktop release: an Electron shell that runs the daemon as a child process and opens its UI
|
||
already authenticated, with a bundled Node runtime, a tray icon, launch-at-login and auto-update.
|