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 ────────────────────────────────────────────────