From c3b819b85b6e7800bc744526b00c558886fcfd63 Mon Sep 17 00:00:00 2001 From: Tristan Cartledge Date: Fri, 23 Oct 2026 10:48:47 +1000 Subject: [PATCH] fix(cli): return structured results from configure and auth login/logout in machine output modes --- .changesets/1792716414-5d8f721c.yaml | 10 ++++++++++ templates/templates/cli/auth.go.stmpl | 16 ++++++++++++++++ templates/templates/cli/configure.go.stmpl | 12 ++++++++++++ zSDKs/sdk-cli/.speakeasy/gen.lock | 4 ++-- zSDKs/sdk-cli/internal/cli/auth.go | 14 ++++++++++++++ zSDKs/sdk-cli/internal/cli/configure.go | 9 ++++++++- 6 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 .changesets/1792716414-5d8f721c.yaml diff --git a/.changesets/1792716414-5d8f721c.yaml b/.changesets/1792716414-5d8f721c.yaml new file mode 100644 index 00000000..75129f47 --- /dev/null +++ b/.changesets/1792716414-5d8f721c.yaml @@ -0,0 +1,10 @@ +id: 1792716414-5d8f721c +features: + - core +targets: + - cli +type: fix +bump: patch +description: configure, auth login and auth logout return a structured result in machine output modes instead of plain text +author: TristanSpeakEasy +date: "2026-10-23" diff --git a/templates/templates/cli/auth.go.stmpl b/templates/templates/cli/auth.go.stmpl index 5714c6dd..66e18751 100644 --- a/templates/templates/cli/auth.go.stmpl +++ b/templates/templates/cli/auth.go.stmpl @@ -4,6 +4,7 @@ {{- addImport "internal/flagutil" true -}} {{- if templateHasSecuritySchemeGroups}}{{- addImport "internal/interactive" true -}}{{- addImport "internal/forms" true -}}{{- end}} {{- addImport "fmt" -}} +{{- addImport "internal/output" true -}} package cli {{genImports}} @@ -123,6 +124,14 @@ func runAuthLoginCmd(cmd *cobra.Command, args []string) error { return fmt.Errorf("failed to save configuration: %w", err) } + if output.IsMachineMode(cmd) { + return output.LocalResult(cmd, map[string]any{ + "config_file": config.GetConfigPath(), + {{- if hasSecretCLIFields}} + "keychain_stored": keychainStored, + {{- end}} + }) + } out := cmd.OutOrStdout() {{- if hasSecretCLIFields}} if keychainStored { @@ -149,6 +158,13 @@ func runAuthLogoutCmd(cmd *cobra.Command, args []string) error { return fmt.Errorf("failed to save configuration: %w", err) } + if output.IsMachineMode(cmd) { + return output.LocalResult(cmd, map[string]any{ + "config_file": config.GetConfigPath(), + "cleared": true, + "keychain_cleared": config.KeyringAvailable(), + }) + } out := cmd.OutOrStdout() if !config.KeyringAvailable() { fmt.Fprintln(out, "Authentication credentials have been cleared from the config file; the OS keychain was skipped, so credentials stored there (if any) were kept.") diff --git a/templates/templates/cli/configure.go.stmpl b/templates/templates/cli/configure.go.stmpl index c5bc9654..ef2865a2 100644 --- a/templates/templates/cli/configure.go.stmpl +++ b/templates/templates/cli/configure.go.stmpl @@ -171,6 +171,18 @@ func runConfigureCmd(cmd *cobra.Command, args []string) error { return fmt.Errorf("failed to save configuration: %w", err) } + {{- if isAnyInteractiveEnabled}} + if output.IsMachineMode(cmd) { + result := map[string]any{"config_file": config.GetConfigPath()} + {{- if hasSecretCLIFields}} + result["keychain_stored"] = keychainStored + {{- end}} + if len(cleared) > 0 { + result["cleared"] = cleared + } + return output.LocalResult(cmd, result) + } + {{- end}} out{{if isAnyInteractiveEnabled}} :{{end}}= cmd.OutOrStdout() {{- if hasSecretCLIFields}} if keychainStored { diff --git a/zSDKs/sdk-cli/.speakeasy/gen.lock b/zSDKs/sdk-cli/.speakeasy/gen.lock index a41727f6..fef7e72f 100644 --- a/zSDKs/sdk-cli/.speakeasy/gen.lock +++ b/zSDKs/sdk-cli/.speakeasy/gen.lock @@ -60,13 +60,13 @@ trackedFiles: go.mod: last_write_checksum: sha1:15ced474cbb1ec803f17960c0b73f10ea969c22a internal/cli/auth.go: - last_write_checksum: sha1:288aa0138da525e34004083060372df173caeefb + last_write_checksum: sha1:ac2cabededc8068cd6066f1c61f1df71e7e70f7a internal/cli/binaryandstringupload.go: last_write_checksum: sha1:20d8028b7618e73dcf1763372f9145ea325b32b0 internal/cli/chat.go: last_write_checksum: sha1:9a9077f9bd0eb3ef19d36d461243215c50f3442b internal/cli/configure.go: - last_write_checksum: sha1:ee8e247c4e7da6ebbf9e20bc80bee879f3bc176a + last_write_checksum: sha1:e96c0c4af024a3f93fe4a854cce5d3809a9ba448 internal/cli/createuser.go: last_write_checksum: sha1:5b60000059db85dcf4c90f5e67c37b7fff3cf852 internal/cli/createwithunion.go: diff --git a/zSDKs/sdk-cli/internal/cli/auth.go b/zSDKs/sdk-cli/internal/cli/auth.go index 68e8c513..6a5c0958 100644 --- a/zSDKs/sdk-cli/internal/cli/auth.go +++ b/zSDKs/sdk-cli/internal/cli/auth.go @@ -10,6 +10,7 @@ import ( "openapi/internal/flagutil" "openapi/internal/forms" "openapi/internal/interactive" + "openapi/internal/output" ) // initAuthCmd registers the auth command group with login, whoami, and logout subcommands. @@ -431,6 +432,12 @@ func runAuthLoginCmd(cmd *cobra.Command, args []string) error { return fmt.Errorf("failed to save configuration: %w", err) } + if output.IsMachineMode(cmd) { + return output.LocalResult(cmd, map[string]any{ + "config_file": config.GetConfigPath(), + "keychain_stored": keychainStored, + }) + } out := cmd.OutOrStdout() if keychainStored { fmt.Fprintln(out, "Secret credentials stored in OS keychain") @@ -492,6 +499,13 @@ func runAuthLogoutCmd(cmd *cobra.Command, args []string) error { return fmt.Errorf("failed to save configuration: %w", err) } + if output.IsMachineMode(cmd) { + return output.LocalResult(cmd, map[string]any{ + "config_file": config.GetConfigPath(), + "cleared": true, + "keychain_cleared": config.KeyringAvailable(), + }) + } out := cmd.OutOrStdout() if !config.KeyringAvailable() { fmt.Fprintln(out, "Authentication credentials have been cleared from the config file; the OS keychain was skipped, so credentials stored there (if any) were kept.") diff --git a/zSDKs/sdk-cli/internal/cli/configure.go b/zSDKs/sdk-cli/internal/cli/configure.go index f7ca0678..ffcd6e41 100644 --- a/zSDKs/sdk-cli/internal/cli/configure.go +++ b/zSDKs/sdk-cli/internal/cli/configure.go @@ -445,7 +445,14 @@ func runConfigureCmd(cmd *cobra.Command, args []string) error { if err := config.SaveConfig(cfg); err != nil { return fmt.Errorf("failed to save configuration: %w", err) } - + if output.IsMachineMode(cmd) { + result := map[string]any{"config_file": config.GetConfigPath()} + result["keychain_stored"] = keychainStored + if len(cleared) > 0 { + result["cleared"] = cleared + } + return output.LocalResult(cmd, result) + } out := cmd.OutOrStdout() if keychainStored { fmt.Fprintln(out, "Secret credentials stored in OS keychain")