From 8545cbd3582d09e5328b63db31dd9d1ac40a0f5d Mon Sep 17 00:00:00 2001 From: huohua-dev <258873123+huohua-dev@users.noreply.github.com> Date: Tue, 24 Mar 2026 10:40:12 +0800 Subject: [PATCH] fix(macos): strip "OpenClaw " prefix before parsing gateway version `openclaw --version` outputs "OpenClaw 2026.x.y-z" but readGatewayVersion() passed the full string to Semver.parse(), which failed on the "OpenClaw " prefix. This caused the app to fall back to reading package.json from a local source checkout (~/Projects/openclaw), reporting a false version mismatch. Strip the product name prefix before parsing so the installed CLI version is correctly recognized. --- apps/macos/Sources/OpenClaw/GatewayEnvironment.swift | 7 ++++++- .../Tests/OpenClawIPCTests/GatewayEnvironmentTests.swift | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/macos/Sources/OpenClaw/GatewayEnvironment.swift b/apps/macos/Sources/OpenClaw/GatewayEnvironment.swift index 0586e19ff70..eece8b5bf4a 100644 --- a/apps/macos/Sources/OpenClaw/GatewayEnvironment.swift +++ b/apps/macos/Sources/OpenClaw/GatewayEnvironment.swift @@ -317,8 +317,13 @@ enum GatewayEnvironment { bin=\(binary, privacy: .public) """) } - let raw = String(data: data, encoding: .utf8)? + var raw = String(data: data, encoding: .utf8)? .trimmingCharacters(in: .whitespacesAndNewlines) + // `openclaw --version` outputs "OpenClaw 2026.x.y"; strip the product prefix + // so Semver.parse receives only the version token. + if let r = raw, r.lowercased().hasPrefix("openclaw ") { + raw = String(r.dropFirst("openclaw ".count)) + } return Semver.parse(raw) } catch { let elapsedMs = Int(Date().timeIntervalSince(start) * 1000) diff --git a/apps/macos/Tests/OpenClawIPCTests/GatewayEnvironmentTests.swift b/apps/macos/Tests/OpenClawIPCTests/GatewayEnvironmentTests.swift index 8d4e2004bcc..58a83a51545 100644 --- a/apps/macos/Tests/OpenClawIPCTests/GatewayEnvironmentTests.swift +++ b/apps/macos/Tests/OpenClawIPCTests/GatewayEnvironmentTests.swift @@ -19,6 +19,9 @@ struct GatewayEnvironmentTests { #expect(Semver.parse("invalid") == nil) #expect(Semver.parse("1.2") == nil) #expect(Semver.parse("1.2.x") == nil) + // Product-prefixed output from `openclaw --version` should NOT parse as semver + // (the prefix must be stripped by the caller, not the parser). + #expect(Semver.parse("OpenClaw 2026.3.23-1") == nil) } @Test func `semver compatibility requires same major and not older`() {