gabriel / musehub public
feat BREAKING feat/57-version-tags-gui #1 / 1
AI Agent gabriel · 1 day ago · Oct 21, 2026 · Diff

feat: MuseHub GUI display of version tags (muse#57 item 1)

Version tags (musehub_version_tags, pushed via `muse tag push <remote> <tag>`) have been stored and queryable since muse#56 shipped (GET /{owner}/{slug}/version-tags), but had zero UI surface -- a repo's version tag history was invisible on the hub itself. Final item of muse#57's deferred-items list.

Added a "Version Tags" section to the existing GET /{owner}/{repo_slug}/ tags page, below the existing release-based tag list. The two systems render independently and are clearly distinct: a release always carries a changelog/assets/semantic-analysis; a version tag is just a named pointer to a commit, optionally Ed25519-signed (muse#57 item 3). Chose this page over a brand-new route specifically to avoid colliding with the wire-protocol GET endpoint already registered at the exact same `/{owner}/{slug}/version-tags` path for the muse CLI (api/routes/wire.py, mounted with no prefix) -- this repo's convention keeps CLI wire routes and browser UI routes in separate modules, so reusing that exact path for an HTML page would require content-negotiation logic this ticket's scope didn't call for.

Each row shows the tag name, a link to the commit detail page, a "✓ signed" badge when both signer_public_key and signature are present, author, and message. Empty state points users at `muse tag add` / `muse tag push`.

New tests/test_musehub_ui_version_tags_ssr.py (6), matching this repo's existing test_musehub_ui_releases_ssr.py SSR-testing convention (httpx AsyncClient against real routes, asserting rendered HTML, not mocked templates): tag renders server-side, signed tag shows the badge, unsigned tag does not, empty state when no version tags exist, commit_id links to the correct commit detail URL, and releases + version tags render independently of each other on the same page. Confirmed genuine RED (6/6 failed) before GREEN with the fix restored.

Live-verified against the real local musehub instance after a container restart: GET /gabriel/muse/tags renders the "Version Tags" section cleanly (empty state, since no real tag has been pushed to that repo on local yet), confirming no template/route errors in production code, not just the test suite.

Targeted regression suite -- the new file plus test_musehub_ui_ releases_ssr.py (unaffected sibling) and test_musehub_version_tags_ service.py -- all pass (16 passed), zero regressions.

This closes out muse#57 entirely -- all 6 deferred items from the original ticket are now implemented.

Co-Authored-By: Claude Sonnet 5 <[email protected]>

sha256:59e0a0e73fb6ffc89260298b173f25c3b7d6ecbf73fbd89ebe55b66201048029 sha
+18 ~3 symbols
3 changed · 1091 in snapshot files
sha256:1c59db240ead594312c71ce05833d1e4922dcef419d444649b8cf05a042d5e81 snapshot
+18
symbols added
~3
symbols modified
3
files changed
1091
files in snapshot
0
dead code introduced
Semantic Changes 21 symbols
+ _make_repo function async_function _make_repo L21–32
+ _make_version_tag function async_function _make_version_tag L35–49
+ AsyncClient import import AsyncClient L14–14
+ AsyncSession import import AsyncSession L15–15
+ MusehubRepo import import MusehubRepo L18–18
+ MusehubVersionTag import import MusehubVersionTag L18–18
+ annotations import import annotations L10–10
+ compute_identity_id import import compute_identity_id L17–17
+ compute_repo_id import import compute_repo_id L17–17
+ datetime import import datetime L12–12
+ timezone import import timezone L12–12
+ test_commit_id_links_to_commit_detail function async_function test_commit_id_links_to_commit_detail L98–106
+ test_empty_state_when_no_version_tags function async_function test_empty_state_when_no_version_tags L89–95
+ test_releases_and_version_tags_both_render_independently function async_function test_releases_and_version_tags_both_render_independently L109–131
+ test_signed_version_tag_shows_badge function async_function test_signed_version_tag_shows_badge L64–74
+ test_unsigned_version_tag_shows_no_signed_badge function async_function test_unsigned_version_tag_shows_no_signed_badge L77–86
+ test_version_tag_renders_server_side function async_function test_version_tag_renders_server_side L52–61
~ musehub/api/routes/musehub/ui_releases.py .py 1 symbol added, 3 symbols modified
+ musehub_version_tags import import musehub_version_tags L29–29
Files Changed
+1 ~2
1091 in snapshot
← Older Oldest on feat/57-version-tags-gui
All commits
Newer → Latest on feat/57-version-tags-gui

0 comments

No comments yet. Be the first to start the discussion.

To add a comment, use the Muse CLI: muse hub commit comment sha256:59e0a0e73fb6ffc89260298b173f25c3b7d6ecbf73fbd89ebe55b66201048029 --body "your comment"