Skip to content

feat(launcher): release notes, and a shipped build that stops fighting the user - #615

Merged
Ashin-LX-98 merged 1 commit into
developfrom
feat/launcher-polish-whats-new
Aug 13, 2026
Merged

feat(launcher): release notes, and a shipped build that stops fighting the user#615
Ashin-LX-98 merged 1 commit into
developfrom
feat/launcher-polish-whats-new

Conversation

@Ashin-LX-98

Copy link
Copy Markdown
Collaborator

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 shared CHANGELOG.md would conflict in every parallel PR. Format and rules are documented in changelog/README.md.

  • 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 — someone who has never run this app does not need to be told what changed in it. Held back while onboarding or the guided tour is on screen (the tour's spotlight paints above a dialog).
  • Settings → Updates keeps them reachable afterwards.
  • A new check-release-notes CI job fails a launcher-v* tag whose version has no notes, whose notes are malformed, or whose package.json version disagrees with the tag. Run locally with npm run check:changelog.

Remote distribution was considered and deliberately skipped; changelog/README.md records the one trap for whoever adds it later (the stable/ prefix is an aws s3 sync --delete target, 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-event blocks Cmd/Ctrl+R, Cmd/Ctrl+Shift+R and F5 as well, so a future menu item cannot quietly bind them again. Development is untouched. isReloadShortcut is unit-tested per platform.

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 the core's 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. It now registers the result exactly like the paste and pairing paths (addNetwork is idempotent, so re-adding an existing one is a no-op).

Also in that dialog:

  • Creating twice is no longer possible: the success state is terminal (primary becomes Done, name field locks), and a ref latch closes the double-click window that disabled={busy} leaves open for one render.
  • An AbortError from 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.json that 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:

  • One action, one label, one icon. "Add workspace", "New agent" and friends are single entries under common.actions that 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.
  • 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 (create / clear search / show all).
  • One toolbar layout. Four list pages had four (mb-4 vs mb-5, one row vs two, size="sm" controls vs default heights); PageToolbar holds it now.
  • Workspace menu names are translated. The launcher quotes the workspace's own menu ("Connect Agent → Nodes") in six strings, and the workspace is bilingual too — 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 corrected. It still said a second code moves the device between workspaces, which stopped being true when memberships became additive.
  • Confirm dialogs that stack two blocks (an opt-in and the warning it unlocks) had no gap between them at all.
  • Destructive entry points take the openagents skin's frame like every other control, in danger colours — bare red text among framed buttons read as unstyled rather than quiet.

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, and npm run check:changelog all 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

…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.
@vercel

vercel Bot commented Aug 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
openagents-workspace Ready Ready Preview Aug 13, 2026 11:53am

Request Review

@Ashin-LX-98
Ashin-LX-98 merged commit 30ba67e into develop Aug 13, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant