【旧】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是最好用的(虽然也有一些问题)
关于rules.md和skills.md的说明
通常,任何ai agent或者harness(比如opencode,cline,codex或者claude code之类的)肯定是可以自己配置规范文档(rules.md)和特殊技能(skills.md)的路径的。
对于一个项目,保证所有开发者的所有ai agent使用同一份rules.md是十分重要的!否则一致性无法保证,沟通成本会上升!
- rules.md:任何对话或者任务执行中,一定会在对话的一开始就作为补充上下文送入ai
- skill.md:(技能,往往是告诉ai具体的一些操作步骤的,可以看作rules的一种特殊情况)这类信息往往只给ai提供一个索引(通常只有文件名),ai会按照当前任务猜测是否需要查看相关内容,然后主动查看。
rules.md
当应该作为skill存储的规则本身其实不长的情况下,其实不建议将他们作为skill.md存储,因为本身不长,你直接放到全局的rules里面,每次请求的上下文其实不会很大(我目前只有20k不到),而且你固定后,会每次都命中kv cache是十分便宜的。因此,对于特定项目,我将所有规则文档都放到了rules下面。
项目规则
配置项目规则之后,大家的ai就都能看见一样的约束了,更改rules所有人的ai是会被一起影响的(因此一致性会得到保证,并且代码质量和可维护性会提升。同时你们也会发现这个东西实际上很重要,不能乱改,所以你们合并后我会仔细查看审阅下,看看这些rules.md是否必要,合适,缺少或者多余)。项目规则需要保持针对每一个项目,所有人是完全一致的。这个东西不要自定义。
全局规则
有些东西是任意项目或者代码工程都适用的,不管是不同项目,还是自己平时写着玩的东西。这个东西会在所有 AI Agent 工作时被送入上下文,而不是打开某一个项目文件夹时才送入该项目的项目规则。因此这个东西最好记录一些大而全的规则,比如文档或者自动测试指令之类的。如果你的系统有一些必要的配置,其实也应该写到这里(系统特殊环境等经验)。
因此全局规则不应该保证所有人一致,必须自定义之后,仅给自己配置,而非给项目配置。全局规则往往由 AI Agent 自己定义,存储到某个位置,通常是用户路径的某个文件夹底下。比如对于OpenCode,他在~/config/opencode/AGENTS.md。codex的你们自己找。
skills.md
skill是具体技能,他不是规则因此无需每次都送入所有上下文到ai,应该仅提供摘要说明(通常就是文件或者文件夹标题)给ai,然后让ai根据当前任务自己评估是否需要查看相关内容。
你应该在配置里填 skills 的父目录(即 OpenCode/skills 这个文件夹路径),而不是某个具体的 .md 文件;OpenCode 会自动扫描该目录下所有符合规范的 skill 文件,但 AI 一开始只”看到”每个 skill 的名称和描述,正文是在被调用时才按需加载进上下文的。
加载原理
OpenCode 对 skill 采用的是元数据广告(advertise)+ 按需加载的机制,而不是把所有 skill 全文塞进系统提示词:
- 启动/每个模型步骤时:OpenCode 只把每个 skill 的 ID、名称和 description 注入模型可见的工具描述里,供模型判断”当前任务是否相关”。skill 正文不会预先加入上下文。
- 模型决定使用某个 skill 时:它调用原生的
skill工具并传入该 skill 的 ID,OpenCode 才会把这份 Markdown 正文(不含 frontmatter)加入对话,同时附带该 skill 的基准目录和最多十个支持文件(scripts、references 等)的路径示例。 - 支持文件不自动读取:如果 skill 里引用了
references/release-policy.md或scripts/changelog.ts,模型会在 skill 指示它去读时才主动读取,不会一次性全部载入。
需要注意:frontmatter 里没写description的 skill 不会被广告给模型,等于模型根本不知道它存在。
OpenCode 默认会自动扫描以下固定位置,如果你的 skills 放在这些地方就完全不需要手动配置:
| 作用域 | 默认路径 |
|---|---|
| 项目级 | .opencode/skills/、.claude/skills/、.agents/skills/ |
| 全局级 | ~/.config/opencode/skills/、~/.claude/skills/、~/.agents/skills/ |
如果你的 skills 放在自定义位置(比如你说的 OpenCode/skills/),就在 opencode.json 或 opencode.jsonc 的 skills 数组里加这个目录 | …参考本文后面的模板就能看懂了 |
几个关键点:
- 相对路径以 OpenCode 的工作目录为基准解析,而不是配置文件所在的目录。所以
./OpenCode/skills是否生效取决于你在哪个目录启动 OpenCode。 ~/OpenCode/skills会展开为当前用户的 home 目录。- 多个配置文件中的
skills数组是叠加关系而非覆盖。
配置方法
OpenCode 在每个 skills 源目录内识别两种形式:
| 形式 | 结构 | 特点 |
|---|---|---|
| 扁平式 | skills/一个具体技能.md(文件直接放在源目录根部) | 简单,但没有独立的基准目录,不会获得邻接文件列表 |
| 目录式(推荐) | skills/一个具体技能/SKILL.md | skill 内引用的相对路径以 SKILL.md 所在目录为基准,可附带 scripts、references 等支持文件 |
所以你的 OpenCode/skills/一个具体技能.md 这种扁平结构是合法的,会被识别为一个 skill。但如果你后续要给某个 skill 配脚本或参考文档,建议改成目录式 | 参考下面的配置 | . |
OpenCode/skills/
├── 一个具体技能.md ← 扁平式,可以直接用
└── git-release/ ← 目录式(推荐)
├── SKILL.md
├── scripts/
│ └── changelog.ts
└── references/
└── release-policy.md
每个 SKILL.md(或扁平的 .md)开头需要 YAML frontmatter,至少写清 name 和 description:
---
name: my-skill
description: 一句话说清楚这个 skill 什么时候该被用,模型靠它做选择
---
# 具体指令正文……
常见踩坑点
- 把具体
.md文件路径填进 skills 数组:配置项要求的是目录(或 HTTP catalog 的 base URL),填单个文件路径不会生效。 - frontmatter 里写了
name但目录名不匹配:skill 的 ID 来自路径(文件名或目录名),frontmatter 的name只是显示标签,两者不一致会导致你用 ID 调用时对不上。 - 目录嵌套层级错了:
SKILL.md必须位于”每个 skill 一个文件夹”的结构里,即skills/<skill-name>/SKILL.md,不能是skills/<skill-name>/sub/SKILL.md之外随意乱放(V2 中SKILL.md可在任意深度被发现,但扁平.md必须在源目录根部)。 - skill 装了但模型不用:大概率是没写
description,或者被opencode/autoinvoke: false或skill权限规则(deny)排除了。
验证方法很简单:把目录配置好后,直接问 agent “你有哪些 skills”,或尝试/skill-id调用,能列出或加载即说明发现成功。
其他配置
你可以把下面的配置复用上, 他们可能有用。当然此处的不一定是最新的,强烈建议直接拿源电脑的~/.config/opencode/*最新的相关配置直接覆盖过去。
AGENTS.md
# 全局规则
## 规则说明
1. 此处的规则必须得到注意!
2. 该规则相较于任何其他规则rules, 或技能skill优先级都更低. 如果冲突,优先遵循项目规则,如果项目规则没提到的,再遵守此处的规则。用户要求是最高优先级,其次是项目目录的规则,最后是这里的。(也就是遇见冲突的提示时,先遵守其他规则)
## 计划与执行说明
1. 尽可能优先在plan时,将任务拆分的非常细致,保证每一次更改只针对一个需求或者在相似的源代码区域,尽量避免一次修改海量代码。
2. 请保持代码风格或行文文风的一致性。
3. 如果需要读取一个文件,那么最好一次读取整个文件,而不是按行一次次的读取文件的某个范围,除非用户手工指定读取的范围行数。
4. 如果项目代码已经存在,那么上下文代码是什么语言就用什么语言。上下文注释是什么语言就用什么语言。请注意一些情况下程序语言和注释语言可能不同。
5. 如无特别说明,从零开始写代码的时候,默认情况下注释和用户交互应该使用中文
6. 功能出现更改或添加的时候,请记得更新readme(如果存在)
7. 计划阶段如果发现了比较严重的问题,以致于修复该问题和完成要求的任务的工作量几乎一个数量级的,应提醒用户现在应该本轮次不添加新功能,先重点修复这个问题,之后再重开会话,继续新增功能的实现。
8. 如果plan模式下,由于只读导致分析计划受阻,可以请求用户临时切换到build模式。(但是仍然是优先计划任务,临时切换到build只是为了查看或者证实一些内容的手段更方便)
## 子任务
1. 如有必要,请使用 subagent 来处理重复、乏味且海量的任务,例如校对,或者逐段落翻译。
2. 使用 subagent 的时候,请注意不要一次启动超过3个subagent以防子任务过多导致系统卡死。
3. 不要乱用subagent,尽量自己亲自看完所有内容,而非拉几个子助理阅读总结。除非翻译之类的明显可以并行执行的任务。
## 自动测试
对于稍微复杂一些的,组件化或者系统化的东西,最好用自动测试来验证功能实现的是正确的。特别简单的修改就无需自动测试了。
1. 实现测试的时候,将测试代码写入一个新的测试脚本文件,然后执行它,而不是直接在终端执行大量的测试代码,除非测试代码很少(比如就两三行或者是一个指令而已)。
2. 所有单元测试等测试代码请保留好,不要用完删除。您应该首先查看当前仓库是否有专门放置单元测试代码的文件夹。
3. 自动测试请按需实现,如果针对简单的代码,或者用户没有明确请求,其实可以不用实现自动测试.
4. 自动测试最好给样例提供注释(因为我们有自动生成文档的代码可以自动生成测试报告,需要用到这些注释)。
## 工具说明
1. 请正确的使用给您提供的tools,mcp服务器。
2. 除非工具无法实现,否则不要使用终端执行命令来查看或修改。必须优先使用内置tools或mcp服务器来实现相关的更改。如果遇见错误,请检查是否正确使用了工具,只有明确无法使用工具处理的情况,或用户明确指定使用命令行终端执行的,才使用终端。
3. 系统是PowerShell,请注意使用正确的命令语法。尤其是应使用`;`替代`&&`来连接命令。
4. 调用playwright_screenshot时,始终将downloadsDir参数设置为 `E:\LLM\playwright_data\cache`
5. 调用playwright时,除非明确指定,否则不要使用无头模式。
6. 如果用户指定下载路径,那么使用playwright时请手工将文件存储到用户指定的位置。
7. 如果你尝试读取查看,或者写入修改当前项目目录以外的文件或者路径(比如用户目录的配置文件或者程序的包之类的),一定会触发用户权限批准请求。因此你在尝试调用之前,需要给出一些必要性说明和目的描述,用户看见了才好给你批准,以防止未授权的意外操作。请勿在不事先提供任何说明的情况下直接尝试读取或者写入项目目录以外的任何文件,否则用户无法确认目的,不会批准请求。
## 文档规范
对于可以独立运行或者明显构成模块的部分,他们如果都是遵循开发规范的,那么肯定都是模块化,组件化的代码。一般将每个程序或者子组件的文档放在各自文件夹底下的readme.md即可。除非额外要求。
1. 章节之间一般无需添加分割线。
2. 章节一般不需要手工编号序号。
最开始合适的位置(一般是摘要之后)需要添加自动目录:
```markdown
段落后空行,然后有以下标记会自动渲染形成目录:
[TOC]
上面这个就是自动目录,很简单,因此无需手写目录。
```
一个好的文档大纲可以参考如下参考大纲:
```markdown
# 标题
一句话介绍或者摘要段落(不需要),描述清楚这个东西解决的现实问题,关键科学技术工程问题,用的什么方法,实现的成果,效用和价值等。
## 快速开始
一个最小测试样例,演示程序如何立刻开始使用
## 详细说明
...
## 系统架构说明
.. 可以用mermaid图之类的方式辅助说明。图注用引用即可。
## 算法说明
.. 如果牵扯算法之类的
## 开发说明
包括环境配置,开发和贡献规则,注意事项,易坑说明,关键细节说明,计划完成的任务,ai开发准则,自动测试实现准则,部署交付准则等,可以分章节如果内容多
## 作者信息
wyb 日期 协议(没有说明则默认无协议,直接不写)
```
## 自进化原则
你在执行的过程中,可能会发现一些因为经验缺乏而犯错的地方,然后你很快就修正并且后续稳定处理。然而,下一次重新开始干活的时候,由于缺失上下文,这种坑仍然会踩第二遍。
因此,作为ai agent,你有义务更新这些类似于应该作为长期记忆的信息到持久化提示词中。也就是每个工程合适的位置下面放置的Markdown文件中。这些Markdown实际上是一种rules.md或者skill.md的存在,每次启动对话和任务,都会默认送入新的ai,因此将重要信息写入这个文件,能让你具备长期记忆,避免由于经验问题的持续犯错。
注意:对于项目的特定经验,有些只是笔记一类的东西,针对特定组件的特定区域描述的,最好通过注释记录到代码中。项目代码库通用的经验最好记录一些通用的规则,比如使用什么环境,注意编译方式之类的,而非大量的细节。
注意:自进化撰写的文档无需遵循上文中的推荐大纲。这个属于ai自己的笔记性质,不是给人类看的文档。
请将那些重要的经验,追加写入到项目根目录下的合适的位置下面放置的Markdown文件中,以提升自己的项目工作经验,在日后更好的完成事项,避免重复性的犯错。
什么是合适的位置?对于全局经验,建议放到每次都会被ai agent自动送入模型上下文的那些路径,也就是全局位置,他们将类似于rules.md的存在。而针对特定开发内容的经验,则适合放入按需提供给ai上下文的路径下,也就是类似于skills.md的存在。
### 适用于整体的项目经验
将整个项目的通用经验记录在类似于rules.md的位置下。优先查看项目目录的以下路径,这是兼容opencode和多种agent插件的常见位置,从第一个往后依次检查并优先写入,如果都不存在则使用第一个:
```text
.agents/*.md
.opencode/*.md
.clinerules/*.md
```
写入的内容就是正常的Markdown文档即可。
### 适用于特定情况的项目经验
如果一些经验不是针对项目全局的,而是项目中特定的算法或者功能组件的,那么建议将其记录为skills.md的存在。优先查看项目目录的以下路径,这是兼容opencode和多种agent插件的常见位置,从第一个往后依次检查并优先写入,如果都不存在则使用第一个:
```text
.agents/skills/*.md
.opencode/skills/*.md
.cline/skills/*.md
.clinerules/skills/*.md
```
对于skills.md,写入的内容相较于普通Markdown文档,还需要多一个元数据,也就是每个文档开头需要 YAML frontmatter,至少写清 name 和 description,类似于:
```markdown
---
name: 该技能或者经验的标题
description: 一句话说清楚这个 skill 什么时候该被用,ai将看到这个摘要并靠它做选择,是否查看整个文档
---
# 具体指令正文……
```
作为skills.md的这部分内容仅在必要时被送入ai,由ai决定是否查看全文。
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\\ngc13\\.config\\opencode\\shell-utf8.cmd",
"instructions": [
"CONTRIBUTING.md",
"docs/guidelines.md",
".agents/*.md",
".opencode/*.md",
".clinerules/*.md"
],
"skills": {
"paths": [
".agents/skills",
".opencode/skills",
".cline/skills",
".clinerules/skills"
],
},
"plugin": [
"opencode-deepseek-thinking-fix",
"opencode-desktop-notify"
],
"mcp": {
"fetch": {
"type": "local",
"command": [
"uvx",
"--with",
"mcp<2.0.0",
"mcp-server-fetch"
],
"timeout": 120000
},
"bing-search": {
"type": "local",
"command": [
"npx",
"-y",
"bing-cn-mcp"
],
"timeout": 120000
},
"playwright": {
"type": "local",
"command": [
"npx",
"-y",
"@playwright/mcp@0.0.79"
],
"timeout": 180000
}
}
}
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"
}
}
}
