From dbf3a6f5587bd2de77e4c3db7d84de386fc41fbd Mon Sep 17 00:00:00 2001 From: carlos-alm <127798846+carlos-alm@users.noreply.github.com> Date: Wed, 8 Apr 2026 23:10:28 -0600 Subject: [PATCH] fix(native): strip pre-release suffix in semverCompare `semverCompare('3.9.3-dev.6', '3.9.1')` returned -1 (less than) because `Number('3-dev')` is NaN, which the `|| 0` fallback turned into 0, making the comparison `0 < 1`. This caused `shouldSkipNativeOrchestrator` to flag all pre-release builds as "buggy", disabling the native orchestrator fast path introduced in #897. Strip `-` before splitting on `.` so the numeric comparison sees `3.9.3` vs `3.9.1` correctly. --- src/infrastructure/update-check.ts | 6 +++--- tests/unit/update-check.test.ts | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/infrastructure/update-check.ts b/src/infrastructure/update-check.ts index b0199892..d8438088 100644 --- a/src/infrastructure/update-check.ts +++ b/src/infrastructure/update-check.ts @@ -18,11 +18,11 @@ interface UpdateCache { /** * Minimal semver comparison. Returns -1, 0, or 1. - * Only handles numeric x.y.z (no pre-release tags). + * Strips pre-release suffixes (e.g. "3.9.3-dev.6" → "3.9.3") before comparing. */ export function semverCompare(a: string, b: string): -1 | 0 | 1 { - const pa = a.split('.').map(Number); - const pb = b.split('.').map(Number); + const pa = a.replace(/-.*$/, '').split('.').map(Number); + const pb = b.replace(/-.*$/, '').split('.').map(Number); for (let i = 0; i < 3; i++) { const na = pa[i] || 0; const nb = pb[i] || 0; diff --git a/tests/unit/update-check.test.ts b/tests/unit/update-check.test.ts index 46621d8b..abb35aad 100644 --- a/tests/unit/update-check.test.ts +++ b/tests/unit/update-check.test.ts @@ -51,6 +51,15 @@ describe('semverCompare', () => { it('major takes priority over minor and patch', () => { expect(semverCompare('1.9.9', '2.0.0')).toBe(-1); }); + + it('strips pre-release suffixes before comparing', () => { + // 3.9.3-dev.6 should be treated as 3.9.3, which is > 3.9.1 + expect(semverCompare('3.9.3-dev.6', '3.9.1')).toBe(1); + expect(semverCompare('3.9.3-dev.6', '3.9.3')).toBe(0); + expect(semverCompare('3.9.3-dev.6', '3.9.4')).toBe(-1); + // Both sides with pre-release + expect(semverCompare('2.0.0-beta.1', '1.9.9-alpha.3')).toBe(1); + }); }); // ─── checkForUpdates ────────────────────────────────────────────────