Releasing the macOS bar app was fully manual (run package_app.sh on a Mac, then gh release upload --clobber), so Swift-side changes never reached users until someone remembered to rebuild and re-upload the floating ccs-bar-latest asset. Add a tightly-scoped Bar Release workflow that does it automatically: - triggers ONLY on push to main touching macos-bar/**, or manual dispatch, so regular PRs, dev pushes, and non-bar changes never start it - runs ONLY on the dedicated self-hosted macOS runner (label ccs-bar); the Linux CI runners never match it and it never competes for them - least-privilege contents:write, single-flight via concurrency Version is sourced from a new macos-bar/VERSION single-line file (the workflow reads it; the asset is always the latest build regardless). package_app.sh now defaults to that file when no version arg is passed, so the local manual path and CI share one source of truth. Documents the release process in docs/ccs-bar.md.
CCS Bar (macOS)
Native SwiftUI menu bar app for CCS. A thin client of the CCS local web-server: it glances per-account quota, cost and tier, and performs account control (pause/resume, set default, solo, tier-lock) from the menu bar.
The app never talks to a provider directly. Every call goes to localhost, and
CCS performs any provider fetch server-side. Opening the menu fires a debounced
force-refresh so the glance reflects live data without blocking the UI.
Layout
Sources/CCSBarCore— pure Foundation logic (no SwiftUI): API client, discovery handshake, models, formatting, refresh debounce. Fully unit-tested.Sources/CCSBarApp— SwiftUIMenuBarExtraapp: view-model + views.Sources/CCSBarCheck— runnable assert harness used in place of XCTest (XCTest ships with full Xcode; this builds on a CommandLineTools toolchain).
Build and test
Requires a Swift 5.9+ toolchain (CommandLineTools is enough; full Xcode not required for build/test).
swift build # build all targets, including the app
swift run ccs-bar-check # run the logic tests (exits non-zero on failure)
Discovery
The app reads ~/.ccs/bar.json (written by ccs bar launch):
{ "baseUrl": "http://127.0.0.1:3000", "port": 3000, "authMode": "loopback" }
v1 supports authMode: "loopback" only (dashboard auth disabled, localhost).
Packaging
Scripts/package_app.sh assembles CCS Bar.app from a release build and signs
it. v1 uses ad-hoc signing (CCS_BAR_SIGNING=adhoc, the default); users open it
the first time via right-click then Open, or clear quarantine with
xattr -dr com.apple.quarantine "/Applications/CCS Bar.app". Developer ID
signing + notarization (CCS_BAR_SIGNING=developer-id) is the public-launch
path and is not required for ad-hoc distribution.