From cd5bb32a21754ef2a9bf07f2997bb9a4a4301868 Mon Sep 17 00:00:00 2001 From: Alan Wizemann Date: Tue, 5 May 2026 20:31:27 +0200 Subject: [PATCH] =?UTF-8?q?release:=20prep=20v2.7.0=20=E2=80=94=20consolid?= =?UTF-8?q?ated=20notes=20+=20in-app=20Sparkle=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rolls up everything since v2.6.5 (36 commits across remote-perf, project wizard, dashboard widgets, OAuth resilience, ScarfMon instrumentation, and the v2.7 skeleton-then-hydrate redesign) into a single 2.7.0 release. * releases/v2.7.0/RELEASE_NOTES.md — full consolidated notes, reorganized around the throughline (slow-remote performance) with five thematic sections: skeleton-then-hydrate loaders, SSH cancellation, project wizard + Keychain cron secrets, dashboard widgets, OAuth resilience, and ScarfMon. Replaces the previously- drafted dashboard-only v2.7.0 stub and the separate v2.8 wizard stub (both unreleased). * releases/v2.8/ — deleted; folded into v2.7. * README.md — "What's New in 2.6" → "What's New in 2.7" with the five-section summary linking out to the full notes. * tools/render-release-notes.py — stdlib-only Markdown → HTML renderer covering the subset of GitHub-flavored markdown that release notes use (## / ### headings, paragraphs, ul lists, fenced code, inline code/bold/italic/links, hr). Output includes a small \n{body}\n" + + +def main(argv: list[str]) -> int: + if len(argv) != 2: + sys.stderr.write("usage: render-release-notes.py \n") + return 2 + path = Path(argv[1]) + if not path.exists(): + sys.stderr.write(f"file not found: {path}\n") + return 1 + sys.stdout.write(render_document(path.read_text(encoding="utf-8"))) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv))