model-sync: 同步 opencode.json(provider+MCP) 与 mcpcfg 路径转 WSL,修 mcpcfg 正则转义 bug
This commit is contained in:
+32
-18
@@ -66,13 +66,17 @@ PLUGINS = [
|
|||||||
"/root/.config/opencode/plugins/model-manager.ts"),
|
"/root/.config/opencode/plugins/model-manager.ts"),
|
||||||
(os.path.join(HOME, ".config", "opencode", "mcpcfg.txt"),
|
(os.path.join(HOME, ".config", "opencode", "mcpcfg.txt"),
|
||||||
"/root/.config/opencode/mcpcfg.txt"),
|
"/root/.config/opencode/mcpcfg.txt"),
|
||||||
# ── 2026-10-20 治本:provider 配置同步(替代 model-manager 压制清单)──
|
# ── 2026-10-20 治本:provider + MCP 配置同步(替代 model-manager 压制清单)──
|
||||||
# cc-switch 把活跃 provider(如 agnes)注入到 opencode.json.2;
|
# 事实定论(用户纠正):
|
||||||
# 把整个 opencode.json.2 推给 WSL,让 WSL OC 读到一致的 provider 状态。
|
# ① cc-switch 只往 opencode.json 写(增删模型时写 provider 字段),完全不碰 opencode.json.2
|
||||||
# 同步后 WSL 侧的 model-manager 不再需要 removed/disabled 清单压制 agnes,
|
# ② opencode.json.2 是用户自己从 opencode.json 复制来的副本,给 ai-mcp 对调机制用,非 cc-switch 管
|
||||||
# 因为 cc-switch 删 agnes → Win opencode.json.2 更新 → WSL 同步 → agnes 消失。
|
# ③ MCP server 手动加在 opencode.json,不能用 cc-switch 添加
|
||||||
(os.path.join(HOME, ".config", "opencode", "opencode.json.2"),
|
# 同步策略:
|
||||||
"/root/.config/opencode/opencode.json.2"),
|
# 推 opencode.json -> /root/.config/opencode/opencode.json(provider + MCP 完整同步)
|
||||||
|
# cc-switch 删/加模型改 opencode.json.provider -> 收尸同步 -> WSL 一致,无需手动压制
|
||||||
|
# 注意:opencode.json 不能进 build_plugin_blob 的「Win 路径转 WSL 路径」逻辑(provider 是相对 key,无绝对路径)
|
||||||
|
(os.path.join(HOME, ".config", "opencode", "opencode.json"),
|
||||||
|
"/root/.config/opencode/opencode.json"),
|
||||||
(os.path.join(HOME, ".config", "opencode", "model-manager.cfg.json"),
|
(os.path.join(HOME, ".config", "opencode", "model-manager.cfg.json"),
|
||||||
"/root/.config/opencode/model-manager.cfg.json"),
|
"/root/.config/opencode/model-manager.cfg.json"),
|
||||||
]
|
]
|
||||||
@@ -122,29 +126,39 @@ def read_win_data():
|
|||||||
|
|
||||||
|
|
||||||
def build_plugin_blob():
|
def build_plugin_blob():
|
||||||
"""Win 生效份插件 + opencode.json.2 -> {dst_path: base64}。
|
"""Win 生效份插件 + opencode.json -> {dst_path: base64}。
|
||||||
|
|
||||||
额外:把 WSL 侧 model-manager 压制清单(removed/disabled/stoplist.bak)重置为空,
|
mcpcfg.txt 特殊处理:把 Win 绝对路径(反斜杠)转 WSL 绝对路径。
|
||||||
因为 opencode.json.2 里 provider 已同步到 WSL,不再需要靠压制清单删厂商。
|
model-manager 压制清单:Win 原样推(Win 空则 WSL 也空)。
|
||||||
若 Win 侧清单非空(比如用户还在用 model-manager 手动压制某厂商),
|
注意:opencode.json 的 provider 是相对 key(如 '1'),无绝对路径,直接 base64 推。
|
||||||
则把 Win 的清单同步过去,保持两边压制行为一致。
|
|
||||||
"""
|
"""
|
||||||
blob = {}
|
blob = {}
|
||||||
|
# Win 侧 mcpcfg.txt 里是 C://Users//ypshidifu//.config//opencode// 前缀(单反斜杠)
|
||||||
|
win_prefix_bk = "C:" + chr(92) + "Users" + chr(92) + "ypshidifu" + chr(92) + ".config" + chr(92) + "opencode" + chr(92)
|
||||||
|
win_prefix_sl = "C:/Users/ypshidifu/.config/opencode/"
|
||||||
|
wsl_prefix = "/root/.config/opencode/"
|
||||||
for src, dst in PLUGINS:
|
for src, dst in PLUGINS:
|
||||||
if not os.path.exists(src):
|
if not os.path.exists(src):
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
blob[dst] = base64.b64encode(open(src, "rb").read()).decode("ascii")
|
data = open(src, "rb").read()
|
||||||
|
# mcpcfg.txt:Win 路径前缀 -> WSL 路径前缀
|
||||||
|
if os.path.basename(src) == "mcpcfg.txt":
|
||||||
|
text = data.decode("utf-8")
|
||||||
|
text = text.replace(win_prefix_bk, wsl_prefix)
|
||||||
|
text = text.replace(win_prefix_sl, wsl_prefix)
|
||||||
|
data = text.encode("utf-8")
|
||||||
|
blob[dst] = base64.b64encode(data).decode("ascii")
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
# 把 model-manager 压制清单也同步(Win 非空就推,空就推空,保证 WSL 与 Win 对齐)
|
# model-manager 压制清单(Win 原样推,Win 空则 WSL 也空)
|
||||||
for fname in ["model-manager.removed.json", "model-manager.disabled.json",
|
for fname in ["model-manager.removed.json", "model-manager.disabled.json",
|
||||||
"model-manager.stoplist.bak.json"]:
|
"model-manager.stoplist.bak.json"]:
|
||||||
src = os.path.join(HOME, ".config", "opencode", fname)
|
fsrc = os.path.join(HOME, ".config", "opencode", fname)
|
||||||
dst = "/root/.config/opencode/" + fname
|
fdst = "/root/.config/opencode/" + fname
|
||||||
if os.path.exists(src):
|
if os.path.exists(fsrc):
|
||||||
try:
|
try:
|
||||||
blob[dst] = base64.b64encode(open(src, "rb").read()).decode("ascii")
|
blob[fdst] = base64.b64encode(open(fsrc, "rb").read()).decode("ascii")
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
return blob
|
return blob
|
||||||
|
|||||||
Reference in New Issue
Block a user