namespace ClaudeDo.Releases; public readonly record struct VersionCompareResult(bool IsNewer, bool Unparseable); public static class VersionComparer { public static VersionCompareResult Compare(string latest, string current) { var unparseable = !Version.TryParse(CoreVersion(latest), out var lv) | !Version.TryParse(CoreVersion(current), out var cv); if (unparseable) return new VersionCompareResult(false, true); return new VersionCompareResult(lv > cv, false); } // Reduce a tag/version to its numeric core: drop a leading "v", MinVer build // metadata ("+sha"), and any SemVer prerelease suffix ("-alpha") — none of // which System.Version can parse. So "v1.0.2-alpha+abc" -> "1.0.2". private static string CoreVersion(string value) => (value ?? "").TrimStart('v', 'V').Split('+')[0].Split('-')[0]; }