export interface GithubReleaseEntry {
    tag: string;
    url: string;
    date?: string;
    bodyMarkdown: string;
}
export declare function fetchReleasesFeed(owner: string, repo: string): Promise<string | undefined>;
export declare function parseReleasesFeed(xml: string): Promise<GithubReleaseEntry[]>;
export declare function renderReleasesAsChangelog(entries: GithubReleaseEntry[]): string;
export interface RepoSlug {
    owner: string;
    repo: string;
}
export declare function parseGithubSlug(url: string | undefined): RepoSlug | undefined;
/**
 * Fetch and render a changelog from GitHub Releases for the given repo.
 * Returns Markdown when at least one real release was found and parsed,
 * otherwise undefined.
 *
 * Reads the public releases.atom feed rather than the /releases REST API on
 * purpose: the feed is served off github.com and does not draw down the 60/hr
 * unauthenticated REST budget. That budget is shared per source IP, so new
 * users and boats on Starlink (which recycles IPs aggressively) could exhaust
 * it before the App Store renders once. The cost is that the feed can't
 * distinguish a published Release from a bare tag, so isPublishedRelease
 * filters the placeholders out below.
 */
export declare function fetchReleasesMarkdown(owner: string, repo: string): Promise<string | undefined>;
//# sourceMappingURL=github-releases.d.ts.map