namespace ClaudeDo.Releases; public sealed record ReleaseAsset(string Name, string BrowserDownloadUrl, long Size); public sealed record GiteaRelease( string TagName, string Name, IReadOnlyList Assets); public interface IReleaseClient { Task GetLatestReleaseAsync(CancellationToken ct); Task DownloadAsync(string url, string destPath, IProgress progress, CancellationToken ct); }