feat(launcher): release notes, and a shipped build that stops fighting the user - #615
Merged
Merged
Conversation
…g the user
Four things the launcher was missing or getting wrong, plus the consistency
work that fell out of fixing them.
**Release notes.** `changelog/<version>.json`, one file per version, bilingual
per entry — the GitHub Release body is generated across the whole monorepo and
is mostly other packages' PRs, so it can never be shown to launcher users, and
a shared CHANGELOG.md would conflict in every parallel PR. Bundled at build
time, so the notes work offline and can never describe a version other than the
one running. Opens once on the first launch after an update; a fresh install is
recorded silently, because someone who has never run this app does not need to
be told what changed in it. Settings → Updates keeps them reachable. CI fails a
`launcher-v*` tag whose version has no notes, or whose notes are malformed.
**Reload is gone from shipped builds.** macOS kept Electron's default menu, so
View → Reload shipped with Cmd+R bound to it: one keystroke that throws away
install progress, a half-finished agent login or an unsent message. Packaged
macOS builds get a menu without the developer items (Edit and Window stay —
Cmd+C has to work), and `before-input-event` blocks Cmd/Ctrl+R and F5 as well,
so a future menu item cannot quietly bind them again. Development is untouched.
**A workspace created in the launcher now appears in the launcher.** The core's
`createWorkspace` only POSTs /v1/workspaces and returns the credentials —
persisting is the caller's job, which is why its own CLI prints the token from
`workspace create` and calls `addNetwork` from `workspace join`. The launcher
never did the second half, so a created workspace existed on the server, showed
its slug and token, and then failed to appear in the list the dialog had just
promised to add it to. Also: creating twice is no longer possible (the success
state is terminal, and a ref latch closes the double-click window `disabled`
leaves open), and an AbortError from the connector's own deadline reads as a
timeout instead of "The operation was aborted".
**The launcher's own local data has controls.** Theme, accent, skin and the
rest live in localStorage because they must be read before the first paint —
which meant they survived "Reset all settings" and even a reinstall, and the
startup splash came back in a colour the user thought they had thrown away.
Settings → Data can now clear the cache and reset appearance and interface
state; the reset also repairs the accent mirror in settings.json that the
splash reads.
Consistency work, all of it drift found while doing the above:
- One action, one label, one icon. "Add workspace", "New agent" and the rest
are single entries under `common.actions` that every entry point quotes;
the "your first X" variants and their duplicate keys are gone. The dashboard
and command-palette entry points now open the door their label names — the
palette's "new workspace" only switched tabs and created nothing.
- One empty state. Seven of them, each previously a different subset of the
shadcn primitives, are now `EmptyState`: icon, title, sentence, one action.
Each of the three reasons a list can be empty gets its own way out.
- One toolbar layout. Four list pages had four (`mb-4` vs `mb-5`, one row vs
two, `size="sm"` controls vs default); `PageToolbar` holds it now.
- The launcher quotes the workspace's menu names ("Connect Agent → Nodes")
in six strings; the workspace is bilingual too, so those are now shared
terms resolved per language. A test asserts every `$t()` reference points at
a real key — a broken one renders the key name into the UI and throws
nothing.
- Pairing copy said a second code moves the device between workspaces. That
stopped being true when memberships became additive.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Four things the launcher was missing or getting wrong, plus the consistency work that fell out of fixing them. Bumps the launcher to 0.9.9.
Release notes (What's new)
packages/launcher/changelog/<version>.json, one file per version, both languages per entry. The GitHub Release body is generated across the whole monorepo and is mostly other packages' PRs, so it can never be shown to launcher users; a sharedCHANGELOG.mdwould conflict in every parallel PR. Format and rules are documented inchangelog/README.md.check-release-notesCI job fails alauncher-v*tag whose version has no notes, whose notes are malformed, or whosepackage.jsonversion disagrees with the tag. Run locally withnpm run check:changelog.Remote distribution was considered and deliberately skipped;
changelog/README.mdrecords the one trap for whoever adds it later (thestable/prefix is anaws s3 sync --deletetarget, so history cannot live there).Reload is gone from shipped builds
macOS kept Electron's default menu, so View → Reload shipped with Cmd+R bound to it — one keystroke that throws away install progress, a half-finished agent login or an unsent message. Packaged macOS builds now get a menu without the developer items (Edit and Window stay; Cmd+C has to work), and
before-input-eventblocks Cmd/Ctrl+R, Cmd/Ctrl+Shift+R and F5 as well, so a future menu item cannot quietly bind them again. Development is untouched.isReloadShortcutis unit-tested per platform.A workspace created in the launcher now appears in the launcher
The core's
createWorkspaceonly POSTs/v1/workspacesand returns the credentials — persisting is the caller's job, which is why the core's own CLI prints the token fromworkspace createand callsaddNetworkfromworkspace join. The launcher never did the second half, so a created workspace existed on the server, showed its slug and token, and then failed to appear in the list the dialog had just promised to add it to. It now registers the result exactly like the paste and pairing paths (addNetworkis idempotent, so re-adding an existing one is a no-op).Also in that dialog:
disabled={busy}leaves open for one render.AbortErrorfrom the connector's own request deadline now reads as a timeout instead of "The operation was aborted".The launcher's own local data has controls
Theme, accent, skin and the rest live in localStorage because they must be read before the first paint — which meant they survived "Reset all settings" and even a reinstall, and the startup splash came back in a colour the user thought they had thrown away. Settings → Data can now clear the Chromium cache and reset appearance and interface state; the reset also repairs the accent mirror in
settings.jsonthat the splash reads. The UI language, workspace favourites and onboarding progress are deliberately left alone.Consistency work
All of it drift found while doing the above:
common.actionsthat every entry point quotes; the "your first X" variants and their duplicate keys are gone. Entry points now open the door their label names — the command palette's "new workspace" only switched tabs and created nothing, and the dashboard's agents card went to the marketplace while the button beside it opened the new-agent dialog.EmptyState: icon, title, sentence, one action. Each of the three reasons a list can be empty gets its own way out (create / clear search / show all).mb-4vsmb-5, one row vs two,size="sm"controls vs default heights);PageToolbarholds it now.$t()reference points at a real key: a broken one renders the key name into the UI and throws nothing.Verification
npm run typecheck,npm test(260 tests, 25 files — new coverage for the reload shortcut, changelog selection, local-data reset and i18n nesting),npm run build, andnpm run check:changelogall pass.Not self-tested in a running app: the visual changes need a look, in particular the four unified toolbars at the 1200px minimum window width, where the Agents page carries the most controls.
🤖 Generated with Claude Code