Repository navigation
Release v28.0.0 - #435
Release v28.0.0#435
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Release v27.1.0 (merge back into develop)
TrackListProvider kept an unfiltered page-1 library list query active once any tracklist existed, refetched on every curation invalidation and window focus. On grow that ran a COUNT(*) over the whole song table and timed out with 503s. BREAKING CHANGE: TrackListProvider no longer accepts listEndpoint/listQueryKey. Call useTrackList().updateTrack(track) from a track mutation's onSuccess instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mutation-refresh # Conflicts: # CHANGELOG.md
…ation-refresh feat(genre-tree)!: drop TrackListProvider list polling, add updateTrack
…control # Conflicts: # CHANGELOG.md
…trol feat(genre-tree): add floating control slot
…ee-view-6-4-0 build(deps): bump genre-tree-view to 6.4.0
…ption-heading # Conflicts: # packages/app-kit-ui/src/genre-tree/GenreTreeView.tsx # packages/app-kit/src/genre-tree/TrackListContext.tsx
…tion-heading feat(genre-tree): improve playback and sharing
…-sidebar-top-right # Conflicts: # CHANGELOG.md # packages/app-kit/src/genre-tree/track-list-sidebar/TrackListSidebar.test.tsx # packages/app-kit/src/genre-tree/track-list-sidebar/TrackListSidebar.tsx
…debar-top-right feat(genre-tree): anchor TrackListSidebar top-right
There was a problem hiding this comment.
🟡 Changes recommended
A moderate unresolved finding flags that the .npmrc scope registry move conflicts with the still-GitHub-targeted auth token and publish workflow, risking publishing to the wrong registry or auth failure, alongside outstanding changelog and coverage-gate concerns.
3 open issues
1 file not reviewed
pnpm-lock.yaml: Generated file
What changed in this PR
This is the release/28.0.0 PR (27.1.0 → 28.0.0), cut from develop, so it bundles all merged feature work since the last release in addition to the mechanical version/changelog bump. The headline functional changes center on the player and track list: in-panel playback/seek/volume controls with prev/next navigation and auto-advance (including auto-skipping embed-blocked YouTube tracks), a new genre/artist Share flow (SharePopup/Toast/BasePopup focus-trap & backdrop support), a redesigned track-list sidebar scroll-follow behavior, and a breaking removal of TrackListProvider's listEndpoint/listQueryKey props in favor of useTrackList().updateTrack(...).
Changes:
- Player rework in
app-kit:playbackConfirmedTrackId,seekTo, clampedvolume, richeronTrackEndevent; YouTube usescontrols=0and a single playback command per load. TrackListContextgains runtime-unplayable tracking, prev/next navigation, auto-advance, andupdateTrack; drops the always-on library list query (breaking prop removal).- New
app-kit-uifeatures: Share popup/button/preview,PlayerControls, sidebar collapse/scroll-follow, Wikipedia/Wikidata links,floatingControlsLeadinghost slot. - Release plumbing: version bumps to 28.0.0,
genre-tree-view6.4.0, lowered coverage thresholds, and an.npmrcregistry switch to npmjs.org.
| File | Description |
|---|---|
pnpm-workspace.yaml, pnpm-lock.yaml |
Bump genre-tree-view to 6.4.0 (now resolved from npmjs.org) |
packages/app-kit/package.json, packages/app-kit-ui/package.json |
Version bump to 28.0.0 and peer ^28.0.0 |
packages/app-kit/src/player/PlayerContext.tsx (+test) |
seekTo, volume clamp/apply, playbackConfirmedTrackId, onTrackEnd event, YouTube controls=0 |
packages/app-kit/src/player/MediaController.ts |
(context) volume/seek interface used by new controls |
packages/app-kit/src/genre-tree/TrackListContext.tsx (+test) |
Nav/auto-advance/runtime-unplayable/updateTrack; removes list-query props |
packages/app-kit/src/genre-tree/useGenreTreeViewState.ts |
Resolve legacy criteria UUID selection to playlist UUID |
packages/app-kit/src/genre-tree/api/library/index.ts |
Doc comment update after prop removal |
packages/app-kit/vitest.config.ts, packages/app-kit-ui/vitest.config.ts |
Lower coverage thresholds |
packages/app-kit-ui/src/popup/BasePopup.tsx, PopupTitle.tsx, Toast.tsx, index.ts |
Focus trap/escape/backdrop, class hooks, new Toast export |
packages/app-kit-ui/src/genre-tree/Share*.tsx, share.ts, index.ts |
New share popup/button/preview + types |
packages/app-kit-ui/src/genre-tree/PlayerControls.tsx (+test), PlayerPanel.tsx (+test) |
In-panel transport controls; panel minimizes instead of closing |
packages/app-kit-ui/src/genre-tree/track-list-sidebar/* (+tests), track-position-play-pause.css |
Collapse/scroll-follow, status spinner/bars, layout anchor |
packages/app-kit-ui/src/genre-tree/TrackItem.tsx, GenrePlaylistTracks.tsx, MusicBrainzRecordingLink.tsx, UnplayableReason.tsx (deleted) |
Title→MB link, drop separate unplayable-reason UI |
packages/app-kit-ui/src/genre-tree/GenreTreeView.tsx (+test), GenreDetailExtras.tsx (+test), GenreActionBand.tsx, artist/useArtistPanel.tsx |
Share wiring, artist-filter relayout, floating host control, Wiki links |
packages/app-kit-ui/scripts/copy-genre-tree-css.mjs |
Inline local play/pause CSS into published styles |
CHANGELOG.md, architecture.md |
28.0.0 notes; YouTube iframe behavior doc |
apps/playground/src/App.tsx, main.tsx |
Exercise share/controlled selection/registry-aware URL state |
.npmrc |
Switch @behindthemusictree scope registry to npmjs.org |
I flagged a duplicated ### Changed heading in the changelog, an .npmrc/publish-pipeline registry inconsistency to verify, and the broad coverage-threshold reduction. No blocking decoupling/export-wiring violations were found, and new imports/references all resolve.
Review effort: Balanced
| @behindthemusictree:registry=https://registry.npmjs.org | ||
| //npm.pkg.github.com/:_authToken=${NPM_TOKEN} |
| ### Changed | ||
|
|
||
| - **app-kit-ui**: Anchor fixed track list sidebars below the header and let them grow toward the player. | ||
|
|
||
| ### Fixed | ||
|
|
||
| - Keep tree nodes sized by song count while an artist filter is active, including while artist details load. | ||
|
|
||
| ### Changed | ||
|
|
||
| - Upgrade genre-tree-view to 6.4.0 for density-aware node sizing. |
| lines: 90, | ||
| functions: 90, | ||
| branches: 85, | ||
| statements: 90, |


Release v28.0.0 (27.1.0 -> 28.0.0). After this merges, run
pnpm tag-releaseonmainto tag and trigger the publish workflow, then merge the companion PR intodevelop.