feat(desktop): add native macOS usage status bar - #827
Merged
Conversation
Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Codex account tags accept camelCase apiKey + amazonBedrock and degrade decode failures to no label; MiniMax fans out to the documented www.minimax.io host via a tested helper; z.ai maps data.level as a plan label; Amp adopts one displayText parser with a semantic StatusSlot::Daily glance and detail-only workspace credit bounds. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Shared jackin-core `claude_keychain_scope` derives the generic-password service from the effective CLAUDE_CONFIG_DIR (default bare service, custom sha256-suffixed) and is reused by instance provisioning and the usage probe. Claude resolution reads the Keychain before file/env, serializes reads, caches explicit denial as terminal per service, and classifies a typed UsageSnapshotPolicy (Shared or LocalOnly for denial/missing/anonymous) that blocks cached-quota restoration, shared coordination, persistence, and account materialization; the host snapshot/account-list boundaries return only the live local view for local-only scopes. Adds security-framework (macOS-only), spec-scenario tests, and operator/contributor docs. Partial: Swift off-main bridge serializer and full flight/coordination hardening remain (see hub row 002). Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…ain actor PresentationStore routes every UsageMenuBarBridge call through a new RefreshScheduler that runs bridge work on one serial background queue, so a macOS Keychain consent sheet during a Claude refresh can never freeze @mainactor or queue a prompt storm. Adds isOpening cold-open coalescing, a single coalesced refresh task, non-blocking shutdown handoff in applicationWillTerminate, and a DesktopArchitectureLint check that PresentationStore makes no direct bridge calls. Completes plan 002 (hub row DONE); XCTest suites deferred to a full-Xcode environment. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…tter Plan 005 Step 1: Rust owns semantic segment choice/order via usage_bucket_presentation + usage_display_status_label in jackin-usage; the Capsule usage dialog now only prepends its TUI meter, keeping output byte-identical. Adds a balance-only limit-label seam (for Grok prepaid, plan 003) and FocusedUsageView::is_refreshing_placeholder() so host DTO code has one machine predicate. 9 new tests. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Plan 005 Step 2: HostProviderGlanceRow + HostUsageRuntime::provider_glance_rows() return detected providers in the canonical DESKTOP_PROVIDER_ORDER, each a selected-account-aware row that selects the semantic Weekly bucket (Daily for Amp), shows a Rust-formatted percent or '–', dims stale/error, and honors a re-detection/refreshing-retention state machine. Adds HostProbePolicy (smoke-mode defense in depth). 15 host tests. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…n contract over UniFFI Plan 005 Steps 3-4: ProviderGlanceRowDto + UsageMenuBarBridge::provider_glance_rows() (Swift providerGlanceRows()) mirror the Rust glance rows; QuotaBucketDto gains the Rust-owned remaining_label/display_segments/display_label/meter_percent; OpenConfig.allow_live_probes maps to HostProbePolicy. UniFFI bindings regenerated; Swift passes allowLiveProbes. Verified via cargo xtask desktop test (exit 0). Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…dation shipped) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…entationStore Plan 005 Step 5 (projection): PresentationStore publishes GlanceProviderRow list from bridge.providerGlanceRows() (via the off-main RefreshScheduler batch) and carries the Rust-owned bucket presentation (remainingLabel/displaySegments/displayLabel/meterPercent) on BucketRow — all rendered verbatim, no computed usage in Swift. AppKit status-item lifecycle + legacy-control removal (Step 5 remainder + Step 6) still pending. swift build clean. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…uota bounds Plan 003: replace the obsolete top-level Grok billing decoder with the current nested config (preferred creditUsagePercent/currentPeriod, fallback monthlyLimit/used/billingPeriod), emit one Weekly headline with pace when a positive window is derivable, expose prepaid-balance + on-demand cap/used as limits-only quota bounds, and take the plan label from the server-resolved subscription_tier — retiring the auth_mode SuperGrok heuristic. 11 grok tests. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Plan 004: append `· Runs out in <duration>` when the linear-from-window-start projection runs out before the reset, using exact i128 cross-products (float delta stays display-only). Separator and the three provider call sites are unchanged, so the TUI and Swift pace splitters pick it up with zero edits. 8 new pace tests + updated deficit expectation. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Plan 005 Step 6 (pure seam): desktopProviderIconKeys + desktopProviderSystemImage(iconKey:) reject opencode/unknown and delegate to the existing SF-Symbol mapping — the icon domain the AppKit status items (and plans 006/007/008) consume. Verified by StatusItemChipHarness (swift run, ALL PASS). The AppKit StatusBarController/@main lifecycle rewrite is the remaining Step 6 work. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…PresentationStore Plan 005 Step 5.6-5.7: statusBarShowsValues (screen-share privacy flag that hides but never replaces a Rust label), PresentationStore.LaunchConfiguration (.production / .ephemeralSmoke) with a pure resolve(environment:homeDirectory:), and an ephemeral openSmoke that opens an isolated path with live probes disabled and applies snapshots once (no polling) — the seams the AppKit lifecycle + launch-smoke tool consume. swift build clean. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…er status-item lifecycle Plan 005 Step 6: an @main AppKit bootstrap + StatusBarController reconciles one NSStatusItem per Rust glance row (canonical order, in-place update, create/remove by id, empty-set jackin❯ fallback) and hosts one transient NSPopover; StatusItemRendering displays the Rust barLabel verbatim (template icon via the desktopProviderSystemImage seam, no severity tint/meter/percent). DesktopAppDelegate owns the store + controller and shuts down once on terminate. Parity harness updated to the new model. Verified: swift build + cargo xtask desktop test (exit 0, both harnesses ALL PASS). Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…bar shipped) The Rust seven-provider glance contract + AppKit NSStatusItem lifecycle are implemented, gate-green, and runtime-verified (desktop build + ephemeral launch smoke). Legacy membership-toggle removal deferred to plan 006 (popover redesign owns PopoverRoot/SettingsView). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…entationStore Plan 006 Step 1: popoverSelection and refreshInProgress @published state. refreshInProgress is set only around explicit refresh requests (manual/all-surface), never around open/poll/settings/account/shutdown commands, and never clears glance rows or surfaces — the spinner signal for the redesigned popover/footer. swift build clean. (Scheduler activity is emitted from the refresh call sites rather than a generic-queue callback, matching this repo's generic RefreshScheduler.) Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…tabs + footer Plan 006 Steps 2-3: PopoverTabGrid (Overview + one tab per Rust glance row), PopoverOverviewTab (one row per provider), PopoverProviderTab (header + account chips + generic displaySegments bucket path, onOpenUsageWindow seam for plan 007), and PopoverFooter (Refresh/⌘R with refreshInProgress spinner). PopoverRoot composes them and drops the legacy openWindow/SettingsLink/setEnabled/agentTileGrid — all display-only, every value/order/segment from Rust. Parity harness updated. Verified: swift build + cargo xtask desktop test (harnesses ALL PASS) + desktop build + ephemeral launch smoke (redesigned popover app runs). Deviation: SwiftUI PNG render-snapshot XCTests unavailable on CLT-only host. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
…n shipped) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Wire plan 007 window entry paths: a pure StatusItemMenuModel/StatusItemMenuRouter in the bridge, an AppKit StatusItemMenu building the static three-row context menu (Open Usage Window / Refresh / Quit), StatusBarController.handleClick splitting right-click (menu) from left-click (popover), and a lazy UsageWindowController owning the single Usage window focused via selectUsageSurface. Provider-header clicks route the 006 onOpenUsage seam to the window and dismiss the popover; the menu Refresh row calls the same forced refreshAll() the footer uses. Verified via desktop test (menu-model/router checks added to StatusItemChipHarness), desktop build + ephemeral launch smoke, desktop verify, ci --fast, and the docs build + audits. Deviation: model/router XCTest suites replaced by runnable harness checks (XCTest unavailable on the CLT-only host). Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Collapse the dual provider-detail presentation into one Rust-owned model. jackin-protocol gains UsageDetailPresentation/UsageDetailRow/UsagePresentationLine/UsageDetailRowKind; jackin-usage adds usage_detail_presentation(&FocusedUsageView) building the fixed-order rows (metadata, position-based bucket:<i>, optional detail) with grouped layout_lines and a joined display_label. The Capsule usage dialog now maps those rows to ContainerInfoRows (output byte-identical), FFI exposes UsageViewDto.detail_presentation, and a new pure UsageWindowModel (bridge target) resolves the Rust sidebar order + incoming usageSelection. The three Usage-window views render the rows/lines mechanically — no Swift split/join/reorder or invented field copy. Verified via desktop test (nextest + all three harnesses) + desktop build + verify + ephemeral launch smoke; Rust/FFI/Capsule nextest + clippy green; regenerated bindings left the generated C header/modulemaps byte-identical. Deviations: UsageWindowModelTests/ArchitectureTests authored but XCTest is unavailable on this Command-Line-Tools-only host, so behavior is executed by the runnable harnesses (StatusItemChipHarness, DesktopParityMatrixHarness, DesktopArchitectureLint); the parity harness's 8 obsolete OpenUsage Usage-window assertions were updated to the new Rust-detail-row model. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Design-polish audit: Liquid Glass (macOS 26 gate + glassEffect) and system-material fallbacks are already confined to GlassFallbacks.swift, and every surface routes chrome via glass helpers / content via standard-material helpers, so no surface file changed. Lock the invariant with three source-confinement tests in ArchitectureTests.swift (glassEffect, system materials, and forbidden limits-only display literals). The limits-only sweep is clean and the Capsule-design audit found every surface matching (severity tint, Rust field order, dimmed-stale degradation) with zero D7 escalations. Verified via desktop test (nextest + all three harnesses) + desktop build + verify + ephemeral launch smoke. Deviation: the three new XCTests cannot run on this Command-Line-Tools-only host (no XCTest); confinement is enforced here by the runnable DesktopArchitectureLint/DesktopParityMatrixHarness gates and the source greps. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Brand-correct the generated Homebrew cask stanzas (the only in-scope release.yml edit): name becomes the canonical jackin❯ Desktop and desc states subscription usage limits (N3-safe, drops bare-jackin brand prose). The cask token jackin-desktop, file name, and app "JackinDesktop.app" stanza are identifiers and stay unchanged. Cask renders Syntax OK under ruby -c; actionlint passes; release_state reconciliation fixtures green. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
New scripts/desktop-install-proof.sh verifies a published jackin-desktop cask on a Mac without the repo: cask install, app presence, Gatekeeper notarized-Developer-ID acceptance, staple, signature, version match, and menu-bar launch liveness, with a MANUAL clause for credentialed provider-data confirmation and a numbered manual fallback. Lints clean (shellcheck, bash -n); no-arg run exits nonzero with usage before touching brew. End-to-end execution is deferred to the first published release. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
… work Regenerate the telemetry error-ownership census (line numbers shifted by the jackin-usage edits in plans 001–008) and update ratchet.toml budgets for the intentional growth this desktop program introduced: the four usage/protocol README doc-byte budgets rise for the newly documented FFI/detail-presentation APIs, jackin-usage gains a cast_precision_loss@1 budget row for the plan-003 Grok cents→f64 expect, and the cast_sign_loss (12→11) and wildcard_imports (7→6) budgets shrink to match the current jackin-usage source. cargo xtask lint --strict now exits 0. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Plan 010's secret-free distribution work landed (cask brand-fix + install-proof script) but the plan ends BLOCKED per its deferred-STOP: the release-macos environment has zero Apple Developer ID secrets/variables, which only the operator can provision (bootstrap Path A). The validate CI dispatch additionally hit a pre-existing base-branch mise.lock/cosign infra bug before the cask job ran. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Two pre-existing base-branch CI blockers surfaced by the desktop program's ci --fast gate, both orthogonal to the desktop feature: (1) reuse-compliance.yml referenced the runner context in a job-level env: (invalid — runner is unavailable there; actionlint flagged 6 hits), which blocked cargo xtask ci --fast; move the MISE_* vars to the reuse-lint step env (where the mise shims need them and runner context is valid), behavior-preserving. (2) mise.toml pins cosign 3.1.2 but mise.lock still held 3.1.1, so locked-mode mise refused to install it and the release.yml validate lane failed at jdx/mise-action; regenerate the cosign lock entry (9 platforms) to 3.1.2. actionlint is now fully clean and cargo xtask lint --strict is green. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Both validate dispatches failed on pre-existing base-branch release.yml infra (cosign lockfile drift, fixed; missing cargo-nextest in the GitHub-lane app job, out of the cask-heredoc scope). Plan 010 stays BLOCKED on absent Apple secrets; the reconciliation fixtures pass locally and the goal's local ci --fast + desktop test gates are green. Co-authored-by: Codex <codex@openai.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
… jackin-desktop Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Compile Keychain-only paths on their owning platform, align the cold-launch architecture assertion with the AppKit delegate, and bump the changed jackin-dev artifact. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Pin the unused sccache retention setting so Velnor can validate the nested action, and refresh the telemetry ownership census after the desktop source shift. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Absorb transient GitHub API timeouts in the shared artifact downloader so Velnor fan-out jobs do not fail before tests start. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Avoid one GitHub API request per Velnor test job by restoring the dependency artifact through the supported download action; retain retried API lookup only as the cross-run fallback. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Limit the reusable test matrix to four jobs so artifact transport, disk, and network use cannot stampede the Velnor host. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Remove crate tests from artifact-service availability by compiling the small CI driver from locked, host-warmed inputs; non-Velnor lanes retain artifact reuse. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Preserve deterministic result artifact names while bypassing unavailable GitHub API lookups on Velnor; crate tests now remain entirely offline until optional result publication. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Describe the license identifier without embedding a parseable header directive in Markdown prose. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Avoid nested fromJSON matrix expressions that Velnor cannot interpolate; parse the reusable workflow JSON input with jq before producing cache and result keys. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Velnor has no reliable GitHub artifact API egress. Avoid selecting remote target seeds so its crate matrix cannot enter the download path. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Keep the protocol API comment accepted by the repository source spelling gate. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Velnor does not reliably evaluate contains/fromJSON step predicates. Use explicit package case dispatch so binary-only crates skip doctests and optional checks run only for their declared package sets. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Velnor builds CI tooling locally and therefore has no downloaded-action CI_CARGO_FUZZ export. The locked mise tool is already on PATH, so use its stable cargo subcommand interface. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Velnor jobs cannot reliably consume GitHub artifacts and each package writer packed another multi-gigabyte Cargo target. Disable Velnor publication; GitHub-hosted writers retain verified cross-run transport. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
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.
Summary
Completes the jackin❯ Desktop — agent usage macOS status bar roadmap program. Operators get one native status item per detected provider, a limits-only Agent Usage glance popover, and a Capsule-parity Usage window, all driven by Rust-owned provider data and presentation.
What ships
Behavior changes
What this addresses
Hard rule: limits only
Every jackin❯ usage surface presents provider-supplied subscription or quota bounds only. Token unit prices, session-cost estimates, aggregate-spend rankings, and historical usage or spend trends are forbidden; the architecture harnesses enforce this boundary.
Not included
Verify locally
Checkout
Paste this first to bypass the
tirithpaste scanner for the rest of the session:export TIRITH=0Then paste the checkout block:
jackin-dev pr syncclones or refreshes the PR checkout, checks out the PR's real head branch, builds the localjackinbinary, copies live config into the PR bundle, creates empty PR-scoped state, writesenv.sh, builds and exports a localJACKIN_CAPSULE_BINwhen the changed workspace package is in thejackin-capsuledependency closure, and auto-builds the PR construct image when the changed files require it. Aftersource "$(jackin-dev pr path 827)/env.sh",echo "$JACKIN_CAPSULE_BIN"is set only when the PR requires a local capsule, andecho "$JACKIN_CONSTRUCT_IMAGE"is set only for PRs whose diff requires a local construct image.Static checks
Rust and Desktop tests
cargo xtask ci --fast cargo xtask desktop testThe aggregate gate covers workspace correctness, while the Desktop gate exercises provider/FFI behavior and the native architecture, status-item, and parity harnesses.
Docs checks
User smoke — jackin❯ Desktop
Apple Silicon macOS with full Xcode preferred; Command Line Tools can run the repository harness lane.
After launch:
Quit after the smoke:
jackin-capsule smoke
jackin load the-architect . --debugInside the container, verify:
jackin❯ [<agent-name>]jackin usage <instance-or-container> verify --debugfrom the prepared checkout and record whether every provider row passes.Documentation
( cd docs bun install --frozen-lockfile bun run dev )Vite serves at
http://localhost:3000/. Pages to walk:http://localhost:3000/guides/macos-usage-menu-bar/
UPDATED operator guide. Confirm installation boundary, local build flow, credentials, per-provider status items, popover interactions, Usage window, multi-account behavior, and privacy wording.
http://localhost:3000/reference/adrs/adr-011-native-macos-usage-menu-bar/
UPDATED ADR. Confirm the Rust-owned presentation and display-only Swift contract reflects the shipped multi-item design.
http://localhost:3000/roadmap/native-macos-usage-menu-bar/
UPDATED prior-program record. Confirm it is clearly superseded by the completed jackin❯ Desktop program and no longer presents stale implementation work.
http://localhost:3000/roadmap/
UPDATED roadmap overview. Confirm the native macOS usage-menu-bar item appears in the completed section.
Migration notes
None. jackin❯ Desktop remains pre-release; public notarized distribution is not activated by this pull request.