Conversation
Running `brv login` with no flags now opens a browser for OAuth instead of rejecting with "Missing required flag api-key". This matches the TUI `/login` slash command and removes the copy/paste-from-settings-page step that users kept getting stuck on. `--api-key` is still accepted (and required in non-interactive shells, with a clear fail-fast message pointing at the docs) so CI and scripts continue to work unchanged. OAuth errors now route through formatConnectionError on the same path as api-key errors, so users get "Daemon failed to start automatically..." instead of raw transport messages.
Providers already ship a one-line description via ProviderDTO; surface it alongside the name in ByteRover [byterover] (current) OpenRouter [openrouter] Anthropic [anthropic] OpenAI [openai] Google Gemini [google] xAI (Grok) [xai] Groq [groq] Mistral [mistral] DeepInfra [deepinfra] Cohere [cohere] Together AI [togetherai] Perplexity [perplexity] Cerebras [cerebras] Vercel [vercel] MiniMax [minimax] GLM (Z.AI) [glm] Moonshot AI (Kimi) [moonshot] OpenAI Compatible [openai-compatible] and the web provider-picker dialog so users can pick by capability, not just by brand recognition. - oclif: second dim-indented line under each provider, skipped when empty - web picker: single-line truncated tagline under the name with title hover for the full string; uniform 2-line rows match the pattern used by Vercel/Raycast/GitHub Marketplace for dense lists - registry: trim two verbose descriptions (byterover, openai-compatible) that overflowed the picker's 1-line budget
- Encapsulate test `interactive` flag behind `setInteractive()` now that the field is protected on the test subclass - Null out the OAuth timer after clearTimeout so the catch block can skip its redundant clear (intent, not behavior) - Route JSON errors through formatConnectionError too, so automation consumers get the same "Daemon failed to start automatically…" hints that text mode already showed
…out user
AuthLoginCompletedEvent.user is optional, so a {success: true} event
without a user object used to print "Logged in as undefined" in text mode
(and drop userEmail silently from the JSON envelope).
emitSuccess now falls back to "Logged in successfully" when userEmail is
absent. Added a regression test covering {success: true, user: undefined}.
|
Claude finished @wzlng's task in 2m 25s —— View job PR Review: feat/ENG-2354
SummaryOverall score: 4/5 This is a well-executed feature. The OAuth-first login flow is cleanly decomposed, the race condition is handled correctly (subscribe-before-request), timer cleanup on error is thorough, and test coverage is comprehensive — including non-interactive shells, timeouts, and the "undefined user" edge case. The refactor to Findings
Strengths
|
Rename 'isInteractive()' to 'canOpenBrowser()' and reject sessions where SSH_CONNECTION, SSH_CLIENT, or SSH_TTY is set. TTY presence alone let 'brv login' ask the daemon to open a browser on a remote VPS that the user could never see; matches the detection used by sindresorhus/is-in-ssh. Updates the guard's error message and test overrides accordingly.
|
Claude finished @wzlng's task in 2m 24s —— View job PR Review: feat/ENG-2354
SummaryOverall score: 4/5 Well-structured PR. The OAuth-first login flow is cleanly decomposed ( Findings
Strengths
|
No description provided.