Skip to content

v0.30.0

Choose a tag to compare

@errhythm errhythm released this 21 Aug 10:14
· 65 commits to main since this release
1e56077

The interactive dashboard now shows both providers at once. Until now the TUI could only show one at a time: a "Provider: …" submenu flipped a mode flag, rebuilt the data source and blanked the view, so you saw Claude Code or Codex and had to remember which. ccswap list printed both, but as a one-shot table whose Codex half carried no usage at all.

Added

  • One dashboard, both providers, in labelled sections. Each provider's active account renders full-size with its usage bars; its other accounts sit under it as one-line minis. Codex's own window set (Weekly, banked resets) reads naturally next to Claude's 5h/7d, $$ spend and per-model scoped windows — the bar renderer only ever drew the windows an account actually has, so both shapes were already supported.
  • Actions route to the row you are on. Switch, add, remove and disable/enable all dispatch to the provider of the highlighted account. The provider is carried on the row itself and resolved through a single lookup, so it cannot be lost or defaulted between what you see and what happens. The "Provider: …" mode toggle is gone; nothing in the dashboard is in a mode any more.
  • A divider between the Claude Code and Codex groups on the switch and watch screens, drawn by the same helper the dashboard headers use so the two surfaces cannot drift. It is a non-selectable row — the cursor skips it, including when wrapping past either end of the list.
  • Auto-switch stays per-provider and now asks which one to drive, opening directly when only one provider has accounts.

Fixed

  • An empty provider no longer blanks the whole panel. The zero-accounts branch was a single early return covering the entire view, so once a second provider existed, having no Codex accounts would have taken your Claude accounts down with it. Empty providers are now simply hidden — a Claude-only install looks exactly as it did.
  • A provider whose snapshot fails no longer sticks on "loading…" forever. A malformed Codex sequence.json used to leave the panel permanently in its loading state. The failing provider now shows its error inside its own section and the other keeps painting; a Codex failure can neither blank nor delay the Claude half, since each provider refreshes on its own worker.
  • Usage refreshes no longer interfere across providers. Refresh state is per-provider throughout: previously-shared flags meant a slow Codex pass could suppress Claude's fetch lane and silently stop its usage from updating, and the auto-switch view could leave the other provider with no fetcher at all.
  • Rows are identified by provider and slot. Both providers number their slots from 1, so single-number keys crossed rows — the wrong account's row could flash on a refresh, and the cursor could open on the wrong provider's active account.

Notes

  • No change to stored data, credentials, or on-disk layout, and none to ccswap list, ccswap list --json, or the menu bar — this release is confined to the TUI. The account read model is untouched, which is what keeps a Codex row from ever being mistaken for a Claude one.
  • Version follows the semver convention adopted in 0.28.0: minor, for a feature plus a user-visible behavior change.
  • Suite: 2161 passed, 3 skipped.