From a4065b675b5826122eb75863111fba8543a01949 Mon Sep 17 00:00:00 2001 From: Nikhil Kulkarni Date: Tue, 2 Jun 2026 13:20:00 +0530 Subject: [PATCH] fix(opencode): accept provider arg in providers logout command `opencode providers logout ` was silently showing help text instead of logging out because the command had no positional defined, so yargs treated the argument as unrecognised. Add a `[provider]` positional matching the existing `login` command pattern. When supplied, match by provider ID or display name (case-insensitive) and remove directly; fall back to the interactive select prompt when omitted. Co-Authored-By: Claude Sonnet 4.6 --- packages/opencode/src/cli/cmd/providers.ts | 38 ++++++++++++++----- .../__snapshots__/help-snapshots.test.ts.snap | 11 ++++-- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/packages/opencode/src/cli/cmd/providers.ts b/packages/opencode/src/cli/cmd/providers.ts index 560781ef0e43..ebfdcdf75471 100644 --- a/packages/opencode/src/cli/cmd/providers.ts +++ b/packages/opencode/src/cli/cmd/providers.ts @@ -486,11 +486,16 @@ export const ProvidersLoginCommand = effectCmd({ }) export const ProvidersLogoutCommand = effectCmd({ - command: "logout", + command: "logout [provider]", describe: "log out from a configured provider", // Removes a global auth credential; no project instance needed. instance: false, - handler: Effect.fn("Cli.providers.logout")(function* (_args) { + builder: (yargs) => + yargs.positional("provider", { + describe: "provider id or name to log out from (skips provider selection)", + type: "string", + }), + handler: Effect.fn("Cli.providers.logout")(function* (args) { const authSvc = yield* Auth.Service const modelsDev = yield* ModelsDev.Service @@ -502,14 +507,27 @@ export const ProvidersLogoutCommand = effectCmd({ return } const database = yield* modelsDev.get() - const selected = yield* Prompt.select({ - message: "Select provider", - options: credentials.map(([key, value]) => ({ - label: (database[key]?.name || key) + UI.Style.TEXT_DIM + " (" + value.type + ")", - value: key, - })), - }) - yield* Effect.orDie(authSvc.remove(yield* promptValue(selected))) + + if (args.provider) { + const match = credentials.find( + ([key]) => key === args.provider || database[key]?.name?.toLowerCase() === args.provider.toLowerCase(), + ) + if (!match) return yield* fail(`Unknown provider "${args.provider}"`) + yield* Effect.orDie(authSvc.remove(match[0])) + yield* Prompt.outro("Logout successful") + return + } + + const provider = yield* promptValue( + yield* Prompt.select({ + message: "Select provider", + options: credentials.map(([key, value]) => ({ + label: (database[key]?.name || key) + UI.Style.TEXT_DIM + " (" + value.type + ")", + value: key, + })), + }), + ) + yield* Effect.orDie(authSvc.remove(provider)) yield* Prompt.outro("Logout successful") }), }) diff --git a/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap b/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap index 83456b98b7df..0f694823f66d 100644 --- a/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap +++ b/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap @@ -149,9 +149,9 @@ exports[`opencode CLI help-text snapshots every documented command emits stable manage AI providers and credentials Commands: - opencode providers list list providers and credentials [aliases: ls] - opencode providers login [url] log in to a provider - opencode providers logout log out from a configured provider + opencode providers list list providers and credentials [aliases: ls] + opencode providers login [url] log in to a provider + opencode providers logout [provider] log out from a configured provider Options: -h, --help show help [boolean] @@ -504,10 +504,13 @@ Options: `; exports[`opencode CLI help-text snapshots every documented command emits stable help text: opencode providers logout --help 1`] = ` -"opencode providers logout +"opencode providers logout [provider] log out from a configured provider +Positionals: + provider provider id or name to log out from (skips provider selection) [string] + Options: -h, --help show help [boolean] -v, --version show version number [boolean]