From c129f22f5b5045d6d9e46012376ab291a66b61e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl-Einar=20Bergstr=C3=B8m?= Date: Sun, 11 Oct 2026 13:09:49 +0200 Subject: [PATCH] feat: releases and changelog links in the status pane; the version opens its release Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/keys.md | 3 ++- internal/ui/app/status.go | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/keys.md b/docs/keys.md index 4f0508c..893d179 100644 --- a/docs/keys.md +++ b/docs/keys.md @@ -116,7 +116,8 @@ On top, the status pane (`0`) shows the version, a newer release and how your accounts are doing. Focused, the right pane lists more: the version and updates (`U`), each account (`L` on one that needs it signs in), the config, state and cache files (`e` opens one in your editor), and links -to the docs, source and issues (`o` opens one), then the changelog of +to the docs, source, issues, releases and changelog (`o` opens one; on +the version or update, its release), then the changelog of every release up to yours, built in so it needs no network: `/` filters it (`/fixed`, `/search`). `y` copies any row. diff --git a/internal/ui/app/status.go b/internal/ui/app/status.go index 893b830..02628fa 100644 --- a/internal/ui/app/status.go +++ b/internal/ui/app/status.go @@ -65,8 +65,17 @@ func (m Model) statusFields() []panes.Field { out = append(out, f) } } - add(panes.Field{Label: "version", Value: cmpOr(m.versionLabel(), "dev")}) - add(panes.Field{Label: "update", Value: m.updateStatus(), Info: m.newer == nil}) + // A release's rows open its release page. + version := panes.Field{Label: "version", Value: cmpOr(m.versionLabel(), "dev")} + if strings.HasPrefix(version.Value, "v") { + version.URL = update.DefaultRepo + "/releases/tag/" + version.Value + } + add(version) + upd := panes.Field{Label: "update", Value: m.updateStatus(), Info: m.newer == nil} + if m.newer != nil { + upd.URL = update.DefaultRepo + "/releases/tag/" + m.newer.Tag + } + add(upd) add(panes.Field{Label: "license", Value: "GPL-3.0-or-later · © 2026 Karl-Einar Bergstrøm", Info: true}) for i, p := range m.providers { @@ -94,6 +103,8 @@ func (m Model) statusFields() []panes.Field { add(panes.Field{Label: "docs", Value: repo + "/…/docs", URL: update.DefaultRepo + "/src/branch/main/docs"}) add(panes.Field{Label: "source", Value: repo, URL: update.DefaultRepo}) add(panes.Field{Label: "issues", Value: repo + "/issues", URL: update.DefaultRepo + "/issues"}) + add(panes.Field{Label: "releases", Value: repo + "/releases", URL: update.DefaultRepo + "/releases"}) + add(panes.Field{Label: "changelog", Value: repo + "/…/CHANGELOG.md", URL: update.DefaultRepo + "/src/branch/main/CHANGELOG.md"}) return append(out, m.changelog...) }