feat(onboarding): fresh installs start with detected providers + welcome card#830
Merged
Conversation
There was a problem hiding this comment.
robinebers has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit cd6bc25. Configure here.
…ome card New installs no longer enable all nine providers: first launch seeds Claude/Codex/Cursor synchronously, probes each provider's local credentials (files/keychain only, no network), and switches to exactly the detected set — falling back to the starter trio when nothing is found. A one-time dismissible welcome card points new users at Customize. Fresh installs persist an enabled-list (openusage.enabledProviders.v1) so future providers default off for them, while existing installs keep the legacy disabled-list semantics untouched and never see any of this. Co-authored-by: Cursor <cursoragent@cursor.com>
… main PRs #827 (drops ccusage) and #828 (adds this test using the old ccusage-based ClaudeProvider initializer) merged past each other, so main's CI is red: the test still passed the removed ccusageRunner: argument. Construct the provider with the current initializer instead. Co-authored-by: Cursor <cursoragent@cursor.com>
cd6bc25 to
e26b1c8
Compare
There was a problem hiding this comment.
robinebers has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
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.

Approved issue
Part of #626 (first-launch onboarding) — delivers the minimal first-launch experience; contextual tips remain open.
TL;DR
Fresh installs no longer light up all nine providers. First launch detects which AI tools actually have credentials on the Mac and enables only those (falling back to Claude, Codex, Cursor), with a one-time dismissible welcome card pointing at Customize. Existing installs are completely untouched.
What was happening
What this changes
FirstRunSeeder): on a genuinely fresh install (empty defaults domain, checked before migrations run), Claude/Codex/Cursor are enabled immediately, then each provider's local credentials are probed asynchronously and the enabled set switches to exactly the detected providers. No detections → the starter trio stays. A toggle the user flips during the probe wins over detection.ProviderRuntimegainshasLocalCredentials(); every provider implements it by reusing the same auth-store loading (config files, Keychain, SQLite, env keys) as itsrefresh()— local checks only, no network calls.openusage.enabledProviders.v1(providers not in the list are off), so future providers default to off for them. Installs with existing settings keep the legacy disabled-list semantics — their setup and upgrade behavior don't change.dashboard.md,menu-bar.md,settings.md,adding-a-provider.md,AGENTS.md) — including the new provider checklist item forhasLocalCredentials().Heads-up
Tests
FirstRunSeederTests(sync fallback, async detection, empty detection, upgrade no-op, idempotency, user-toggle precedence, hint persistence) and expandedProviderEnablementStoreTestsfor the enabled-list mode.swift testpasses locally; manual verification with a wiped defaults domain (fresh install seeds + shows card) and with existing defaults (nothing changes, no card).Screenshots
First launch on a Mac where only Claude was detected:
Made with Cursor