WSL 与 Windows 双环境 OpenCode 配置同步

WSL 与 Windows 双环境 OpenCode 配置同步实践 背景 在 WSL 和 Windows 双环境下使用 OpenCode 时,希望两边配置和会话数据能够同步,避免手动切换环境时丢失上下文。 主要分为两块:配置目录同步和会话数据库同步。把步骤直接丢给agent应该就能搞定了。 一、配置...
WSL 与 Windows 双环境 OpenCode 配置同步
WSL 与 Windows 双环境 OpenCode 配置同步

WSL 与 Windows 双环境 OpenCode 配置同步实践

背景

WSL 和 Windows 双环境下使用 OpenCode 时,希望两边配置和会话数据能够同步,避免手动切换环境时丢失上下文。

主要分为两块:配置目录同步和会话数据库同步。把步骤直接丢给agent应该就能搞定了。

一、配置文件同步

OpenCode 的配置目录位于 ~/.config/opencode/,包含:

  • opencode.json - 主配置(provider、model、MCP)
  • AGENTS.md - 全局规则
  • hooks/ - 钩子脚本
  • agents/ - Agent 定义
  • command/ - 斜杠命令

方案:符号链接,WSL 直接指向 Windows 配置目录

ln -s /mnt/c/Users/用户名/.config/opencode ~/.config/opencode
ln -s /mnt/c/Users/用户名/.config/opencode ~/.opencode

优点:

  • 修改任意一边自动同步
  • 无需手动维护

注意:

  • AGENTS.md 如果包含了操作系统相关的内容,需要修改为跨平台描述

二、会话数据库同步(失败 → 改进方案)

初期尝试:符号链接同步数据库

数据库位置:~/.local/share/opencode/opencode.db(SQLite)

ln -s /mnt/c/Users/用户名/.local/share/opencode ~/.local/share/opencode

遇到的问题

问题 1:SQLite 跨系统锁定冲突

  • Windows 和 WSL 同时运行 OpenCode 时,数据库被锁定
  • WSL 访问时报 disk I/O error
  • SQLite 的 WAL 文件机制不支持跨文件系统并发

问题 2:路径格式混乱导致递归拼接

  • Windows 使用 \ 分隔符,WSL 使用 /
  • OpenCode 解析路径时反复叠加,产生错误路径:
    /home/用户名/\home\用户名\\home\用户名\\home\用户名\C:\Users\用户名
    
  • 数据库中出现多条错误 session 记录

解决方案:独立数据库 + 手动同步脚本

由于 SQLite 不支持跨系统同时访问,最终采用独立数据库 + 切换前同步方案:

1. 恢复 WSL 独立数据库

步骤略

2. 创建同步脚本 ~/.local/bin/opencode-sync

#!/bin/bash
WINDOWS_DB="/mnt/c/Users/用户名/.local/share/opencode/opencode.db"
WSL_DB="$HOME/.local/share/opencode/opencode.db"

check_process() {
    # 检查 WSL 进程(排除同步脚本自身)
    local opencode_procs=$(ps aux | grep -E "node|bun" | grep "opencode-ai" | grep -v grep | wc -l)
    if [ "$opencode_procs" -gt 0 ]; then
        echo "错误: WSL opencode 正在运行"
        return 1
    fi
    # 检查 Windows 进程
    local win_procs=$(powershell.exe -Command "(Get-Process opencode -ErrorAction SilentlyContinue).Count" 2>/dev/null | tr -d '\r\n')
    if [ "$win_procs" != "" ] && [ "$win_procs" -gt 0 ]; then
        echo "错误: Windows opencode 正在运行"
        return 1
    fi
    return 0
}

case "$1" in
    "push")   # WSL → Windows
        check_process || exit 1
        cp "$WSL_DB" "$WINDOWS_DB"
        rm -f "/mnt/c/Users/kirafishy/.local/share/opencode/opencode.db-wal"
        ;;
    "pull")   # Windows → WSL
        check_process || exit 1
        cp "$WINDOWS_DB" "$WSL_DB"
        rm -f "$HOME/.local/share/opencode/opencode.db-wal"
        ;;
    "auto")   # 自动判断方向
        check_process || exit 1
        # 比较修改时间,从较新的同步到较旧的
        ;;
    "status") # 查看状态
        ;;
esac

## 三、自动同步 Wrapper

为避免每次手动执行同步,创建 wrapper 脚本:

**`~/.local/bin/opencode-wrapper`**

```bash
#!/bin/bash
OPENCODE_REAL="$HOME/.bun/bin/opencode"
SYNC_SCRIPT="$HOME/.local/bin/opencode-sync"

# 使用 trap 确保退出时同步(包括 Ctrl+C)
cleanup() {
    echo ""
    echo ">>> 正在推送数据到 Windows..."
    "$SYNC_SCRIPT" push 2>/dev/null
}
trap cleanup EXIT

# 启动前同步
echo ">>> 正在同步数据..."
"$SYNC_SCRIPT" pull 2>/dev/null

# 运行 opencode
"$OPENCODE_REAL" "$@"

集成到 bashrc

alias opencode='$HOME/.local/bin/opencode-wrapper'

工作流程

启动 → pull (Windows→WSL) → 运行 opencode → 退出 → push (WSL→Windows)
       ↑                           ↑
       包括 Ctrl+C 也触发 push (trap EXIT)

四、数据库清理

步骤略

五、最终架构

组件 同步方式 说明 配置文件 (~/.config/opencode) 符号链接 实时同步 会话数据库 (~/.local/share/opencode/opencode.db) 手动/自动脚本 切换环境前同步 wrapper (opencode-wrapper) 自动触发 运行 opencode 时自动同步

六、经验教训

  1. SQLite 不支持跨系统并发:WSL 和 Windows 通过 /mnt/c 访问同一个 SQLite 文件会有锁定冲突,不要尝试符号链接同步数据库

  2. 进程检测要精确pgrep -f "opencode" 会匹配脚本自身,需要更精确的匹配条件

  3. Ctrl+C 退出仍需同步:因为用到了佬友开发的Web UI:[开源自荐] OpenCodeUI (opencode webui) 。所以需要使用 trap EXIT 捕获所有退出方式,包括信号中断。

  4. 路径格式差异:Windows \ 和 WSL / 混合可能导致解析错误,切换环境时要注意

七、使用指南

# 手动同步
opencode-sync pull   # 切换到 WSL 前,从 Windows 拉取
opencode-sync push   # 离开 WSL 前,推送到 Windows
opencode-sync auto   # 自动判断方向
opencode-sync status # 查看状态

# 自动同步(推荐)
source ~/.bashrc     # 加载 alias
opencode serve ...   # 自动 pull → 运行 → 退出自动 push

3 个帖子 - 3 位参与者

阅读完整话题

来源: linux.do查看原文