opencode安装、配置、环境搭建记录(windows)
记录本机(Windows)opencode 及相关插件、MCP 的安装与配置方法, 以便在另一台电脑上复现相同的环境。
目录
结果概览
按照这个文档配置后将会得到的样子:
| 组件 | 版本 | 用途 |
|---|---|---|
| bun | 1.3.14 | opencode 本体的安装器(全局包管理) |
| node | v24.15.0 | 运行 npx 类 MCP / 插件的基础运行时 |
| npm | 12.0.1 | 随 node 附带,配置镜像源 |
| uv / uvx | 0.10.9 | fetch MCP 的运行器 |
| opencode | 1.18.21 | 本体(bun i -g opencode-ai 安装) |
安装位置:
- opencode 本体:
C:\Users\<用户名>\.bun\install\global\node_modules\opencode-ai\ - opencode 命令 shim:
C:\Users\<用户名>\.bun\bin\opencode.exe - 配置目录:
C:\Users\<用户名>\.config\opencode\ - 插件缓存:
C:\Users\<用户名>\.cache\opencode\packages\
新电脑复现步骤(从零开始)
这个是快速操作SOP,详细说明请继续阅读.
- 装 bun:
irm bun.sh/install.ps1 | iex - 装 node + npm(npm 随 node 自带)
- 装 uv:
irm https://astral.sh/uv/install.ps1 | iex - 配 npm 镜像:创建
~/.npmrc,写入registry=https://registry.npmmirror.com - 装 opencode:
bun i -g opencode-ai,验证opencode --version - 复制配置目录:源计算机的
~/.config/opencode/整个复制到目标计算机的C:\Users\<新用户名>\.config\opencode\,并:- 修改
opencode.jsonc中shell字段的路径为当前用户名 - (可选)在目录下执行
npm install以获得插件本地依赖 - 如果没有这个文件,本文后面提供了一些必要的内容以供参考
- 修改
- 首次启动:运行
opencode,按提示登录(opencode auth login) - 验证:
opencode --version显示版本- 进入会话后确认插件生效(DeepSeek 思考标签正常、任务完成有桌面通知)
- 测试三条 MCP(
/mcp查看状态,直接让模型调用 fetch/bing/playwright)
安装步骤
查看凭据
如果你是从另一个电脑希望迁移,那么你试试在源电脑上执行:
opencode auth list
你就能获取到凭据,而无需重新配置了
前置:npm 镜像源(中国网络必需)
本机 C:\Users\<用户名>\.npmrc 内容:
registry=https://registry.npmmirror.com
allow-scripts=bun
registry 指向淘宝镜像,所有 npm/bun 包下载都走它,安装速度大幅提升。
安装 bun
irm bun.sh/install.ps1 | iex
bun 装好后,bun 命令即可用(位于 ~\.bun\bin,安装程序会自动加入 PATH)。
安装 opencode 本体
bun i -g opencode-ai
- 安装产物:
~\.bun\install\global\下的opencode-ai、opencode-windows-x64(平台二进制)、opencode-windows-x64-baseline - 更新版本:重新执行
bun i -g opencode-ai即可 - 验证:
opencode --version(当前 1.18.21)
安装辅助运行时
- uv / uvx (fetch MCP 需要):官方安装脚本
irm https://astral.sh/uv/install.ps1 | iex(或 pip/conda 安装) - node + npm :官网安装包或 nvm-windows
- conda (本机有 miniconda3,opencode 本身不依赖,属于个人工作环境)
配置目录清单(~/.config/opencode/)
| 文件 | 用途 |
|---|---|
opencode.jsonc | 主配置:shell 包装、instructions 注入、插件列表、MCP 列表 |
tui.json | TUI 界面:鼠标支持、attention 通知音效(Windows 系统声音) |
notify.json | desktop-notify 插件的通知配置(弹窗/声音/标题) |
AGENTS.md | 全局规则(对每个会话注入的指令,优先级最高) |
shell-utf8.cmd | UTF-8 shell 包装入口(chcp 65001 + 调 ps1) |
shell-utf8-impl.ps1 | UTF-8 shell 实现(设置 Console 编码后执行命令) |
package.json / package-lock.json | 本地声明插件依赖(@opencode-ai/plugin 类型 + deepseek-thinking-fix) |
.gitignore | 忽略 node_modules 等 |
opencode.jsonc 关键配置
{
"$schema": "https://opencode.ai/config.json",
"shell": "C:\\Users\\<用户名>\\.config\\opencode\\shell-utf8.cmd",
"tui": {
"mouse": true
},
// 兼容cline等
"instructions": [
"CONTRIBUTING.md",
"docs/guidelines.md",
".clinerules/*.md",
".clinerules/**/*.md",
".clinerules/workflows/**/*.md",
".cline/skills/**/*.md",
".cline/skills/*.md"
],
// 必备插件,后文会说明
"plugin": [
"opencode-deepseek-thinking-fix",
"opencode-desktop-notify"
],
// mcp服务器,建议安装这三个,后文会说明
"mcp": {
"fetch": {
"type": "local",
"command": [
"uvx",
"--with",
"mcp<2.0.0",
"mcp-server-fetch"
]
},
"bing-search": {
"type": "local",
"command": [
"npx",
"-y",
"bing-cn-mcp"
]
},
"playwright": {
"type": "local",
"command": [
"npx",
"-y",
"@playwright/mcp@latest"
],
"timeout": 60000
}
}
}
注意:
shell里的路径必须是绝对路径,新电脑上如用户名不同需要修改;instructions引用的是项目级文件(CONTRIBUTING.md 等),对全局会话影响不大,保留即可。
shell 包装(中文乱码解决方案)
问题:Windows 默认代码页(GBK/936)导致 opencode 子进程中文乱码。
解决:参考
修复 opencode 在 Windows 终端下的中文乱码问题 – limitless你可以不用读这个文档,直接按照本文步骤,拿着config直接覆盖过去shell,然后把参考目录的两个文件扔到对应的位置,其实就好了。
插件机制说明
opencode 的 plugin 数组支持直接写 npm 包名,opencode 启动时会自动从 npm
下载并缓存到 ~\.cache\opencode\packages\(无需手工安装)。
| 插件 | 作用 |
|---|---|
opencode-deepseek-thinking-fix | 修复 DeepSeek 思考标签(reasoning content)在会话中的显示问题 |
opencode-desktop-notify | Windows 桌面通知(读取 notify.json 配置弹窗+声音) |
另外 ~/.config/opencode/package.json 也手工声明了一次依赖(含
@opencode-ai/plugin 类型包),用于本地 npm install 后获得插件开发类型支持。
# 在 ~/.config/opencode 下执行(可选,为插件开发/类型支持)
npm install
MCP 服务器配置
三条 MCP 全部配置在 opencode.jsonc 的 mcp 段:
"mcp": {
"fetch": {
"type": "local",
"command": ["uvx", "--with", "mcp<2.0.0", "mcp-server-fetch"]
},
"bing-search": {
"type": "local",
"command": ["npx", "-y", "bing-cn-mcp"]
},
"playwright": {
"type": "local",
"command": ["npx", "-y", "@playwright/mcp@latest"],
"timeout": 60000
}
}
| MCP | 依赖 | 说明 |
|---|---|---|
| fetch | uvx | 网页抓取,mcp<2.0.0 锁定版本 |
| bing-search | npx | 必应中文搜索(bing-cn-mcp 包) |
| playwright | npx + 浏览器 | 浏览器自动化;timeout: 60000 防止超时 |
playwright 使用约定(写入了 AGENTS.md):
downloadsDir用E:\LLM\playwright_data\cache;(⚠提示:举个例子,记得按习惯修改) 默认不使用无头模式。新电脑需按需修改该约定。
注意事项
- bun 全局安装包列表查看:
bun pm ls -g - opencode 更新:
bun i -g opencode-ai(会自动拉最新版) - 若新电脑网络环境不同(非中国大陆),第 4 步镜像可省略或换官方源
另外,不建议鼓捣web ui或者vsc插件,目前都不太稳定(2026年8月23日),官方推荐TUI是最好用的(虽然也有一些问题)
其他配置
你可以把下面的配置复用上, 他们可能有用。当然此处的不一定是最新的,强烈建议直接拿源电脑的~/.config/opencode/*最新的相关配置直接覆盖过去。
AGENTS.md
# 全局规则
## 规则说明
1. 此处的规则必须得到注意!
2. 该规则相较于任何其他规则rules, 或技能skill优先级都更低. 如果冲突,优先遵循项目规则,如果项目规则没提到的,再遵守此处的规则。用户要求是最高优先级,其次是项目目录的规则,最后是这里的。(也就是遇见冲突的提示时,先遵守其他规则)
## 计划与执行说明
1. 尽可能优先在plan时,将任务拆分的非常细致,保证每一次更改只针对一个需求或者在相似的源代码区域,尽量避免一次修改海量代码。
2. 请保持代码风格或行文文风的一致性。
3. 如果需要读取一个文件,那么最好一次读取整个文件,而不是按行一次次的读取文件的某个范围,除非用户手工指定读取的范围行数。
4. 如果项目代码已经存在,那么上下文代码是什么语言就用什么语言。上下文注释是什么语言就用什么语言。请注意一些情况下程序语言和注释语言可能不同。
5. 如无特别说明,从零开始写代码的时候,默认情况下注释和用户交互应该使用中文
6. 功能出现更改或添加的时候,请记得更新readme(如果存在)
## 子任务
1. 如有必要,请使用 subagent 来处理重复、乏味且海量的任务,例如校对,或者逐段落翻译。
2. 使用 subagent 的时候,请注意不要一次启动超过3个subagent以防子任务过多导致系统卡死。
3. 不要乱用subagent,尽量自己亲自看完所有内容,而非拉几个子助理阅读总结。除非翻译之类的明显可以并行执行的任务。
## 自动测试
1. 实现测试的时候,将测试代码写入一个新的测试脚本文件,然后执行它,而不是直接在终端执行大量的测试代码,除非测试代码很少(比如就两三行或者是一个指令而已)。
2. 所有单元测试等测试代码请保留好,不要用完删除。您应该首先查看当前仓库是否有专门放置单元测试代码的文件夹。
3. 自动测试请按需实现,如果针对简单的代码,或者用户没有明确请求,其实可以不用实现自动测试.
## 工具说明
1. 请正确的使用给您提供的tools,mcp服务器。
2. 除非工具无法实现,否则不要使用终端执行命令来查看或修改。必须优先使用内置tools或mcp服务器来实现相关的更改。如果遇见错误,请检查是否正确使用了工具,只有明确无法使用工具处理的情况,或用户明确指定使用命令行终端执行的,才使用终端。
3. 系统是PowerShell,请注意使用正确的命令语法。尤其是应使用`;`替代`&&`来连接命令。
4. 调用playwright_screenshot时,始终将downloadsDir参数设置为 `E:\LLM\playwright_data\cache`
5. 调用playwright时,除非明确指定,否则不要使用无头模式。
6. 如果用户指定下载路径,那么使用playwright时请手工将文件存储到用户指定的位置。
## 自进化原则
你在执行的过程中,可能会发现一些因为经验缺乏而犯错的地方,然后你很快就修正并且后续稳定处理。然而,下一次重新开始干活的时候,由于缺失上下文,这种坑仍然会踩第二遍。
因此,作为ai agent,你有义务更新这些类似于应该作为长期记忆的信息到持久化提示词中。也就是每个工程合适的位置下面放置的Markdown文件中。这些Markdown实际上是一种skill.md的存在,每次启动对话和任务,都会默认送入新的ai,因此将重要信息写入这个文件,能让你具备长期记忆,避免由于经验问题的持续犯错。
请将那些重要的经验,追加写入到项目根目录下的合适的位置下面放置的Markdown文件中,以提升自己的项目工作经验,在日后更好的完成事项,避免重复性的犯错。
什么是合适的位置?优先查看以下路径,这是兼容opencode和多种agent插件的常见位置,从第一个往后依次检查并优先写入,如果都不存在则使用第一个:
```text
.opencode/*.md
.clinerules/*.md
.cline/skills/*.md
```
如果有必要,可以将内容组织为文件夹层次的形式,并在最外层提供说明文档,指定内部的结构,方便调用时查阅。
注意:对于项目的特定经验,有些只是笔记一类的东西,针对特定组件的特定区域描述的,最好通过注释记录到代码中。项目代码库通用的经验最好记录一些通用的规则,比如使用什么环境,注意编译方式之类的,而非大量的细节。
notify.json
{
"events": {
"complete": { "system": true, "sound": false, "popup": false, "titleFlash": false },
"error": { "system": true, "sound": false, "popup": false, "titleFlash": false },
"permission": { "system": true, "sound": false, "popup": false, "titleFlash": false },
"question": { "system": true, "sound": false, "popup": false, "titleFlash": false }
},
"messages": {
"complete": { "title": "OpenCode 完成", "message": "任务已完成:{session}" },
"error": { "title": "OpenCode 出错", "message": "错误:{details}" },
"permission": { "title": "OpenCode 需要授权", "message": "权限请求:{details}" },
"question": { "title": "OpenCode 需要回答", "message": "需要你的回答:{session}" }
},
"sounds": {
"complete": "C:/Windows/Media/Windows Notify System Generic.wav",
"error": "C:/Windows/Media/Windows Error.wav",
"permission": "C:/Windows/Media/Windows Exclamation.wav",
"question": "C:/Windows/Media/Windows Ding.wav"
},
"onlyMainSessions": true
}
opencode.jsonc
{
"$schema": "https://opencode.ai/config.json",
"shell": "C:\\Users\\<用户名>\\.config\\opencode\\shell-utf8.cmd",
"tui": {
"mouse": true
},
"instructions": [
"CONTRIBUTING.md",
"docs/guidelines.md",
".clinerules/*.md",
".clinerules/**/*.md",
".clinerules/workflows/**/*.md",
".cline/skills/**/*.md",
".cline/skills/*.md",
],
"plugin": [
"opencode-deepseek-thinking-fix",
"opencode-desktop-notify"
],
"mcp": {
"fetch": {
"type": "local",
"command": [
"uvx",
"--with",
"mcp<2.0.0",
"mcp-server-fetch"
]
},
"bing-search": {
"type": "local",
"command": [
"npx",
"-y",
"bing-cn-mcp"
]
},
"playwright": {
"type": "local",
"command": [
"npx",
"-y",
"@playwright/mcp@latest"
],
"timeout": 60000
}
}
}
shell-utf8-impl.ps1
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
$argsList = $args
$cmdIdx = [array]::IndexOf($argsList, '-Command')
if ($cmdIdx -lt 0) { $cmdIdx = [array]::IndexOf($argsList, '-c') }
if ($cmdIdx -ge 0 -and $cmdIdx + 1 -lt $argsList.Count) {
Invoke-Expression $argsList[$cmdIdx + 1]
}
shell-utf8.cmd
@echo off
chcp 65001 > nul 2>&1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0shell-utf8-impl.ps1" %*
tui.json
{
"$schema": "https://opencode.ai/tui.json",
"keybinds": {
"app_toggle_paste_summary": "ctrl+o"
},
"attention": {
"enabled": true,
"notifications": true,
"sound": true,
"volume": 0.4,
"sound_pack": "opencode.default",
"sounds": {
"question": "C:/Windows/Media/Windows Ding.wav",
"permission": "C:/Windows/Media/Windows Exclamation.wav",
"error": "C:/Windows/Media/Windows Error.wav",
"done": "C:/Windows/Media/Windows Notify System Generic.wav",
"subagent_done": "C:/Windows/Media/Windows Notify.wav"
}
}
}
