Duke Yin's Technology database

Windows10使用OpenCode Desktop自带CLI配置指南

适用场景:只安装 OpenCode Desktop(桌面版),不安装 npm 版 OpenCode;在 CMD、PowerShell、Git Bash 中直接使用 opencode 命令。如果系统里已经装过 npm 版 OpenCode,先卸载它。

本文以默认的“当前用户”安装方式为例,桌面版路径为: %LOCALAPPDATA%\Programs\@opencode-aidesktop


1. 原理说明

OpenCode Desktop 安装目录里自带了一份 CLI 二进制:

%LOCALAPPDATA%\Programs\@opencode-aidesktop\resources\opencode-cli.exe

这个路径是稳定的,桌面版升级时会原地替换文件,路径不变。

桌面版运行时,还会把 CLI 复制到带版本号的目录:

%APPDATA%\ai.opencode.desktop\cli\<版本>-<架构>\opencode-cli.exe

例如:

%APPDATA%\ai.opencode.desktop\cli\2.2.6-x64\opencode-cli.exe

不要把这个带版本号的路径写进 PATH 或 shim,因为桌面版每次升级,2.2.6-x64 这段都会变,命令会失效。

另一个问题:桌面版自带的文件叫 opencode-cli.exe,不是 opencode.exe,所以不能只把目录加进 PATH 就得到 opencode 命令。需要创建一个名为 opencode 的转发脚本(shim)。


2. 前置检查

打开 PowerShell,确认桌面版和自带 CLI 是否存在:

# 检查桌面版自带 CLI
Test-Path "$env:LOCALAPPDATA\Programs\@opencode-aidesktop\resources\opencode-cli.exe"

# 查看 CLI 版本
& "$env:LOCALAPPDATA\Programs\@opencode-aidesktop\resources\opencode-cli.exe" --version

# 查看桌面版记录的 CLI 版本
Get-Content "$env:LOCALAPPDATA\Programs\@opencode-aidesktop\resources\opencode-cli.version"

预期输出类似:

True
opencode v2.2.6
2.2.6

同时检查系统里现有的 opencode 来源:

Get-Command opencode -All -ErrorAction SilentlyContinue | Format-List Name,CommandType,Source
where.exe opencode
npm ls -g --depth=0

如果 npm ls -g --depth=0 里出现 @opencode/cli,说明装了 npm 版,继续下一步卸载。


3. 卸载 npm 版 OpenCode

3.1 执行卸载

npm uninstall -g @opencode/cli

3.2 确认卸载结果

npm ls -g --depth=0

正常情况下只会剩下 npm 自己,例如:

C:\Users\<用户名>\AppData\Roaming\npm
`-- npm@11.19.0

3.3 清理残留(可选)

如果之前安装过程中断过,可能在 %APPDATA%\npm 留下临时的 shim 文件,例如:

.opencode-YvySKsRm
.opencode.cmd-U9bdMxHM
.opencode.ps1-YdoRpeH4
opencode
opencode.cmd
opencode.ps1
opencode2
opencode2.cmd
opencode2.ps1

先查看:

Get-ChildItem "$env:APPDATA\npm" -Force | Where-Object Name -like '*opencode*'

确认没有其他程序在使用后,再删除:

Remove-Item "$env:APPDATA\npm\opencode*" -Force -ErrorAction SilentlyContinue
Remove-Item "$env:APPDATA\npm\.opencode*" -Force -ErrorAction SilentlyContinue
Remove-Item "$env:APPDATA\npm\node_modules\@opencode" -Recurse -Force -ErrorAction SilentlyContinue

删除后再次确认:

Get-Command opencode -All -ErrorAction SilentlyContinue

此时应该找不到 opencode,这是正常的,下一步会创建桌面版的 shim。


4. 创建 shim

shim 统一放到:

%USERPROFILE%\.opencode\bin

这个目录也是 OpenCode 官方安装脚本默认使用的目录。

下面的 shim 内容按默认安装路径 %LOCALAPPDATA%\Programs\@opencode-aidesktop 编写。如果你的 OpenCode Desktop 安装在其他位置,请把 shim 里的路径替换成实际路径(查找方法见 11.4)。

4.1 创建目录

$dir = "$env:USERPROFILE\.opencode\bin"
New-Item -ItemType Directory -Force -Path $dir | Out-Null

4.2 创建 opencode.cmd(供 CMD 使用)

@'
@echo off
"%LOCALAPPDATA%\Programs\@opencode-aidesktop\resources\opencode-cli.exe" %*
exit /b %errorlevel%
'@ | Set-Content -Path "$dir\opencode.cmd" -Encoding ASCII

4.3 创建 opencode.ps1(供 PowerShell 使用)

@'
$exe = Join-Path $env:LOCALAPPDATA 'Programs\@opencode-aidesktop\resources\opencode-cli.exe'
if ($MyInvocation.ExpectingInput) {
  $input | & $exe @args
} else {
  & $exe @args
}
exit $LASTEXITCODE
'@ | Set-Content -Path "$dir\opencode.ps1" -Encoding ASCII

4.4 创建 opencode(供 Git Bash 使用,可选)

@'
#!/bin/sh
if command -v cygpath >/dev/null 2>&1; then
  LOCALAPPDATA="$(cygpath -u "$LOCALAPPDATA")"
fi
exec "$LOCALAPPDATA/Programs/@opencode-aidesktop/resources/opencode-cli.exe" "$@"
'@ | Set-Content -Path "$dir\opencode" -Encoding ASCII

创建完成后目录内容应为:

opencode
opencode.cmd
opencode.ps1

5. 把 shim 目录加入用户 PATH

推荐放在用户 PATH 的最前面,确保优先于可能残留的 npm 目录。

5.1 PowerShell 方式

$dir = "$env:USERPROFILE\.opencode\bin"
$old = [Environment]::GetEnvironmentVariable('Path', 'User')
if ($null -eq $old) { $old = '' }

# 去重,并放到最前面
$parts = @($old -split ';' | Where-Object { $_ -and $_ -ne $dir })
$new = (@($dir) + $parts) -join ';'

[Environment]::SetEnvironmentVariable('Path', $new, 'User')

# 让当前窗口立即生效(新窗口会自动读取)
$env:PATH = $dir + ';' + $env:PATH

5.2 图形界面方式(等效)

  1. 按 Win + R,输入 sysdm.cpl 回车。
  2. 选择“高级” → “环境变量”。
  3. 在上方“用户变量”里选中 Path,点击“编辑”。
  4. 点击“新建”,输入:%USERPROFILE%\.opencode\bin
  5. 选中这一项,点击“上移”,移到最顶部。
  6. 连续点击“确定”保存。

注意:改的是“用户变量”里的 Path,不是“系统变量”。


6. 验证

必须新开一个终端窗口(已经打开的窗口不会自动读取新的 PATH)。

PowerShell

Get-Command opencode -All | Format-List Name, CommandType, Source
opencode --version

预期:

Name        : opencode.ps1
CommandType : ExternalScript
Source      : C:\Users\<用户名>\.opencode\bin\opencode.ps1

opencode v2.2.6

CMD

where opencode
opencode --version

预期能找到 ...\.opencode\bin\opencode.cmd,并且版本与桌面版一致。

Git Bash(可选)

which opencode
opencode --version

7. 一次完成全部步骤(可选脚本)

如果是从零开始配置,可以直接把下面整段脚本保存为 install-opencode-cli.ps1,用 PowerShell 运行。

$ErrorActionPreference = 'Stop'

$exe = Join-Path $env:LOCALAPPDATA 'Programs\@opencode-aidesktop\resources\opencode-cli.exe'
if (-not (Test-Path $exe)) {
    throw "未找到桌面版 CLI:$exe。请确认 OpenCode Desktop 已安装,或修改脚本中的路径。"
}

$dir = Join-Path $env:USERPROFILE '.opencode\bin'
New-Item -ItemType Directory -Force -Path $dir | Out-Null

@'
@echo off
"%LOCALAPPDATA%\Programs\@opencode-aidesktop\resources\opencode-cli.exe" %*
exit /b %errorlevel%
'@ | Set-Content -Path "$dir\opencode.cmd" -Encoding ASCII

@'
$exe = Join-Path $env:LOCALAPPDATA 'Programs\@opencode-aidesktop\resources\opencode-cli.exe'
if ($MyInvocation.ExpectingInput) {
  $input | & $exe @args
} else {
  & $exe @args
}
exit $LASTEXITCODE
'@ | Set-Content -Path "$dir\opencode.ps1" -Encoding ASCII

@'
#!/bin/sh
if command -v cygpath >/dev/null 2>&1; then
  LOCALAPPDATA="$(cygpath -u "$LOCALAPPDATA")"
fi
exec "$LOCALAPPDATA/Programs/@opencode-aidesktop/resources/opencode-cli.exe" "$@"
'@ | Set-Content -Path "$dir\opencode" -Encoding ASCII

$old = [Environment]::GetEnvironmentVariable('Path', 'User')
if ($null -eq $old) { $old = '' }
$parts = @($old -split ';' | Where-Object { $_ -and $_ -ne $dir })
[Environment]::SetEnvironmentVariable('Path', (@($dir) + $parts) -join ';', 'User')

$env:PATH = $dir + ';' + $env:PATH
Write-Host "已创建 shim:$dir"
Write-Host "请新开一个终端,然后执行:opencode --version"

8. 更新策略与限制

8.1 opencode update 不会更新桌面版 CLI

桌面版 CLI 不属于 npm、pnpm、bun、brew、winget、curl 等任何一种可识别的安装方式。执行:

opencode update

会提示:

could not detect the installation method. update with your package manager or download the latest release.

后台自动更新检查也会跳过(update skipped: installation method not found)。

8.2 正确更新方式

通过 OpenCode Desktop 自身的更新功能升级桌面版。升级完成后:

  • resources\opencode-cli.exe 会被替换为新版本;
  • 我们的 shim 指向的是这个稳定路径,所以 opencode 会自动变成新版本;
  • 可以用下面的命令确认:
opencode --version
Get-Content "$env:LOCALAPPDATA\Programs\@opencode-aidesktop\resources\opencode-cli.version"

两个版本号应当一致。


9. 副作用与注意事项

  1. CLI 版本跟随桌面版 CLI 不再独立更新,桌面版是什么版本,命令行就是什么版本。如果桌面版关闭了自动更新,CLI 也会停留在旧版本。
  2. 不要指向带版本号的目录 不要使用: %APPDATA%\ai.opencode.desktop\cli\2.2.6-x64\opencode-cli.exe 桌面版升级后这个路径会失效。始终使用: %LOCALAPPDATA%\Programs\@opencode-aidesktop\resources\opencode-cli.exe
  3. 不要同时保留 npm 版 两个版本会共用同一份配置和数据目录: %USERPROFILE%\.config\opencode %USERPROFILE%\.local\share\opencode 版本不一致时可能出现数据库或协议不兼容。建议只保留一种。
  4. 桌面版升级时不要长期占用 CLI 文件 如果 opencode 正在后台长期运行,桌面版更新替换 resources\opencode-cli.exe 时可能遇到文件占用。更新前关闭终端里正在运行的 opencode 即可。
  5. 卸载桌面版后命令会消失 这是预期行为。opencode uninstall 对桌面版二进制通常也无法识别安装方式,应该通过 Windows 的“应用和功能”或桌面版自带卸载程序卸载。
  6. 桌面版内置的 “Install CLI” 目前仅 macOS 可用 桌面版代码里有 “Install CLI” 功能,但菜单项被限定为 macOS。Windows 上需要按本文手动创建 shim。

10. 回退到 npm 版

如果以后想重新使用 npm 版:

npm install -g @opencode/cli

然后从用户 PATH 中移除 %USERPROFILE%\.opencode\bin,或者直接删除该 shim 目录:

Remove-Item "$env:USERPROFILE\.opencode\bin" -Recurse -Force

再新开终端验证:

where.exe opencode
opencode --version

npm 版安装后,opencode update 可以正常识别 npm 安装方式并执行更新。


11. 常见问题排查

11.1 新终端里仍然提示找不到 opencode

# 查看 PATH 中是否包含 shim 目录
$env:PATH -split ';' | Select-String '\.opencode\\bin'

# 查看命令解析情况
Get-Command opencode -All -ErrorAction SilentlyContinue
where.exe opencode

常见原因:

  • 没有新开终端;
  • PATH 加到了“系统变量”而不是“用户变量”;
  • shim 目录被放在了 npm 目录后面,旧的 npm shim 抢先命中。

11.2 版本不是桌面版的版本

Get-Command opencode -All | Format-List Name, Source

如果仍然指向 %APPDATA%\npm\opencode.ps1 等旧 shim,说明 npm 版没卸载干净,或者 PATH 顺序不对。

11.3 PowerShell 提示脚本被禁止运行

如果 opencode.ps1 被执行策略拦截,可以:

  • 临时改用 CMD 的 opencode.cmd;
  • 或者只为当前用户放宽策略:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

11.4 桌面版安装在其他位置

如果桌面版不是默认的当前用户安装路径,先找到真实路径:

Get-Process OpenCode -ErrorAction SilentlyContinue |
  Select-Object -ExpandProperty Path

或者搜索:

Get-ChildItem "$env:LOCALAPPDATA\Programs", "$env:ProgramFiles" -Recurse `
  -Filter 'opencode-cli.exe' -ErrorAction SilentlyContinue |
  Select-Object FullName

然后把 shim 里的路径替换成实际路径。

11.5 resources\opencode-cli.exe 不存在

极少数情况下,桌面版可能只保留了带版本号的运行副本。可以先查看:

Get-ChildItem "$env:APPDATA\ai.opencode.desktop\cli" -Directory |
  Sort-Object Name -Descending |
  Select-Object -First 1

然后把 shim 指向该目录下的 opencode-cli.exe。但这种方式在桌面版升级后需要同步修改 shim,只作为临时方案。


12. 最终文件清单

%USERPROFILE%\.opencode\bin\opencode
%USERPROFILE%\.opencode\bin\opencode.cmd
%USERPROFILE%\.opencode\bin\opencode.ps1

用户 PATH 最前面新增:

%USERPROFILE%\.opencode\bin

实际执行的程序:

%LOCALAPPDATA%\Programs\@opencode-aidesktop\resources\opencode-cli.exe

最终效果:

PS> opencode --version
opencode v2.2.6

版本号以你当前安装的 OpenCode Desktop 为准。

# #

发布评论

评论

标注 * 的为必填项。