diff --git a/CHANGELOG.md b/CHANGELOG.md index f42e85486..ac1b34f96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] +### Fixed +- Onboarding wizard no longer repeats every launch for extension-based providers (e.g. pi-claude-cli) that may not require credentials in auth.json + ## [2.19.0] - 2026-03-16 ### Added diff --git a/src/cli.ts b/src/cli.ts index db17cc1d3..83f8b4de9 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -130,8 +130,11 @@ const authStorage = AuthStorage.create(authFilePath) loadStoredEnvKeys(authStorage) migratePiCredentials(authStorage) +const modelRegistry = new ModelRegistry(authStorage) +const settingsManager = SettingsManager.create(agentDir) + // Run onboarding wizard on first launch (no LLM provider configured) -if (!isPrintMode && shouldRunOnboarding(authStorage)) { +if (!isPrintMode && shouldRunOnboarding(authStorage, settingsManager.getDefaultProvider())) { await runOnboarding(authStorage) // Clean up stdin state left by @clack/prompts. @@ -156,9 +159,6 @@ if (!isPrintMode && process.stdout.columns && process.stdout.columns < 40) { ) } -const modelRegistry = new ModelRegistry(authStorage) -const settingsManager = SettingsManager.create(agentDir) - // --list-models: print available models and exit (no TTY needed) if (cliFlags.listModels !== undefined) { const models = modelRegistry.getAvailable() diff --git a/src/onboarding.ts b/src/onboarding.ts index de4267286..d3668326b 100644 --- a/src/onboarding.ts +++ b/src/onboarding.ts @@ -146,10 +146,13 @@ function isCancelError(p: ClackModule, err: unknown): boolean { * * Returns false (skip wizard) when: * - Any LLM provider is already available via auth.json, env vars, runtime overrides, or fallback auth + * - A default provider is already configured in settings (covers extension-based providers + * that may not require credentials in auth.json) * - Not a TTY (piped input, subagent, CI) */ -export function shouldRunOnboarding(authStorage: AuthStorage): boolean { +export function shouldRunOnboarding(authStorage: AuthStorage, settingsDefaultProvider?: string): boolean { if (!process.stdin.isTTY) return false + if (settingsDefaultProvider) return false // Check if any LLM provider has credentials const hasLlmAuth = LLM_PROVIDER_IDS.some(id => authStorage.hasAuth(id)) return !hasLlmAuth