@@ -16,12 +16,13 @@ import (
1616 "github.com/CircleCI-Public/chunk-cli/internal/github"
1717 hc "github.com/CircleCI-Public/chunk-cli/internal/httpcl"
1818 "github.com/CircleCI-Public/chunk-cli/internal/iostream"
19+ "github.com/CircleCI-Public/chunk-cli/internal/oauth"
1920 "github.com/CircleCI-Public/chunk-cli/internal/tui"
2021 "github.com/CircleCI-Public/chunk-cli/internal/ui"
2122)
2223
2324const (
24- suggestionCircleCIAuth = "Set " + config .EnvCircleToken + " or run 'chunk auth set circleci '."
25+ suggestionCircleCIAuth = "Set " + config .EnvCircleToken + " or run 'chunk auth login '."
2526 suggestionAnthropicAuth = "Set " + config .EnvAnthropicAPIKey + " or run 'chunk auth set anthropic'."
2627 suggestionGitHubAuth = "Set " + config .EnvGitHubToken + " or run 'chunk auth set github'."
2728)
@@ -64,30 +65,56 @@ func ensureCircleCIClient(ctx context.Context, cmd *cobra.Command, rc config.Res
6465 }
6566
6667 streams .ErrPrintln ("" )
67- streams .ErrPrintln (ui .Bold ("CircleCI token required" ))
68- streams .ErrPrintln ("Create a token at https://app.circleci.com/settings/user/tokens" )
69- streams .ErrPrintln ("Don't have an account? Sign up at https://app.circleci.com/signup" )
68+ streams .ErrPrintln (ui .Bold ("CircleCI authentication required" ))
7069 printSaveHint (streams , "Token" , insecureStorage )
7170 streams .ErrPrintln ("" )
7271
73- token , err := prompter ("CircleCI Token" )
74- if err != nil {
75- if errors .Is (err , tui .ErrNoTTY ) {
72+ choice , selectErr := tui .SelectFromList ("How would you like to authenticate?" , []string {
73+ "Log in via browser (recommended)" ,
74+ "Enter a token manually" ,
75+ })
76+ if selectErr != nil {
77+ if errors .Is (selectErr , tui .ErrNoTTY ) {
7678 return nil , newUserError ("CircleCI token required." ).
7779 withCode ("auth.circleci_token_required" ).
7880 withSuggestion (suggestionCircleCIAuth ).
7981 withExitCode (ExitAuthError ).
80- wrap (err )
82+ wrap (selectErr )
8183 }
82- return nil , err
84+ return nil , selectErr
8385 }
84- token = strings .TrimSpace (token )
85- if token == "" {
86- return nil , newUserError ("CircleCI token required." ).
87- withCode ("auth.circleci_token_required" ).
88- withSuggestion (suggestionCircleCIAuth ).
89- withExitCode (ExitAuthError ).
90- wrapMsg ("empty token entered" )
86+
87+ var token string
88+ switch choice {
89+ case 0 :
90+ token , err = oauth .Login (ctx , oauth.LoginConfig {
91+ BaseURL : rc .CircleCIBaseURL ,
92+ }, streams .Err )
93+ if err != nil {
94+ return nil , fmt .Errorf ("oauth login: %w" , err )
95+ }
96+ case 1 :
97+ streams .ErrPrintln ("Create a token at https://app.circleci.com/settings/user/tokens" )
98+ streams .ErrPrintln ("" )
99+ token , err = prompter ("CircleCI Token" )
100+ if err != nil {
101+ if errors .Is (err , tui .ErrNoTTY ) {
102+ return nil , newUserError ("CircleCI token required." ).
103+ withCode ("auth.circleci_token_required" ).
104+ withSuggestion (suggestionCircleCIAuth ).
105+ withExitCode (ExitAuthError ).
106+ wrap (err )
107+ }
108+ return nil , err
109+ }
110+ token = strings .TrimSpace (token )
111+ if token == "" {
112+ return nil , newUserError ("CircleCI token required." ).
113+ withCode ("auth.circleci_token_required" ).
114+ withSuggestion (suggestionCircleCIAuth ).
115+ withExitCode (ExitAuthError ).
116+ wrapMsg ("empty token entered" )
117+ }
91118 }
92119
93120 streams .ErrPrintln (ui .Dim ("Validating CircleCI token..." ))
0 commit comments