fix: 从 package.json 读取完整版本号修复汉化版更新误报

汉化版 CLI --version 输出不含 -zh.X 后缀,导致永远提示有更新。
改为从 npm 包 package.json 读取完整版本号。
This commit is contained in:
晴天
2026-02-28 14:31:10 +08:00
parent a5c7760f25
commit 1d64fdcce7

View File

@@ -74,19 +74,27 @@ pub fn write_mcp_config(config: Value) -> Result<(), String> {
}
/// 获取本地安装的 openclaw 版本号
/// 优先从 npm 包的 package.json 读取含完整后缀fallback 到 CLI
fn get_local_version() -> Option<String> {
let output = Command::new("openclaw")
.arg("--version")
.output()
.ok()?;
// 通过 symlink 找到包目录,读 package.json 的 version
if let Ok(target) = fs::read_link("/opt/homebrew/bin/openclaw") {
let pkg_json = PathBuf::from("/opt/homebrew/bin")
.join(&target)
.parent()?
.join("package.json");
if let Ok(content) = fs::read_to_string(&pkg_json) {
if let Some(ver) = serde_json::from_str::<Value>(&content)
.ok()
.and_then(|v| v.get("version")?.as_str().map(String::from))
{
return Some(ver);
}
}
}
// fallback: CLI 输出
let output = Command::new("openclaw").arg("--version").output().ok()?;
let raw = String::from_utf8_lossy(&output.stdout).trim().to_string();
// 格式可能是 "openclaw 2026.2.23" 或纯版本号
let version = raw
.split_whitespace()
.last()
.filter(|s| !s.is_empty())
.map(String::from)?;
Some(version)
raw.split_whitespace().last().filter(|s| !s.is_empty()).map(String::from)
}
/// 从 npm registry 获取最新版本号,超时 5 秒