From 3a08dcaeb1ebc9deff77aa68e918f3be67f22972 Mon Sep 17 00:00:00 2001 From: Sisyphus Date: Mon, 29 Dec 2025 10:34:11 +0900 Subject: [PATCH] fix: detect opencode-desktop binary in installer (#313) --- src/cli/config-manager.ts | 51 +++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/src/cli/config-manager.ts b/src/cli/config-manager.ts index 4d2bac8..241d650 100644 --- a/src/cli/config-manager.ts +++ b/src/cli/config-manager.ts @@ -10,6 +10,8 @@ const OPENCODE_JSONC = join(OPENCODE_CONFIG_DIR, "opencode.jsonc") const OPENCODE_PACKAGE_JSON = join(OPENCODE_CONFIG_DIR, "package.json") const OMO_CONFIG = join(OPENCODE_CONFIG_DIR, "oh-my-opencode.json") +const OPENCODE_BINARIES = ["opencode", "opencode-desktop"] as const + const CHATGPT_HOTFIX_REPO = "code-yeongyu/opencode-openai-codex-auth#fix/orphaned-function-call-output-with-tools" export async function fetchLatestVersion(packageName: string): Promise { @@ -204,31 +206,38 @@ export function writeOmoConfig(installConfig: InstallConfig): ConfigMergeResult } } -export async function isOpenCodeInstalled(): Promise { - try { - const proc = Bun.spawn(["opencode", "--version"], { - stdout: "pipe", - stderr: "pipe", - }) - await proc.exited - return proc.exitCode === 0 - } catch { - return false +interface OpenCodeBinaryResult { + binary: string + version: string +} + +async function findOpenCodeBinaryWithVersion(): Promise { + for (const binary of OPENCODE_BINARIES) { + try { + const proc = Bun.spawn([binary, "--version"], { + stdout: "pipe", + stderr: "pipe", + }) + const output = await new Response(proc.stdout).text() + await proc.exited + if (proc.exitCode === 0) { + return { binary, version: output.trim() } + } + } catch { + continue + } } + return null +} + +export async function isOpenCodeInstalled(): Promise { + const result = await findOpenCodeBinaryWithVersion() + return result !== null } export async function getOpenCodeVersion(): Promise { - try { - const proc = Bun.spawn(["opencode", "--version"], { - stdout: "pipe", - stderr: "pipe", - }) - const output = await new Response(proc.stdout).text() - await proc.exited - return proc.exitCode === 0 ? output.trim() : null - } catch { - return null - } + const result = await findOpenCodeBinaryWithVersion() + return result?.version ?? null } export async function addAuthPlugins(config: InstallConfig): Promise {