From ea25cfe5418c625f572f5f54c9793edc5e9a418f Mon Sep 17 00:00:00 2001 From: ChrisBeWithYou Date: Mon, 22 Jun 2026 15:07:00 -0500 Subject: [PATCH] fix(v3): promote Virtuoso to the first-class sidebar slot (was slopscale) (#554) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(v3): promote Virtuoso to the first-class sidebar slot (was slopscale) The bundled practice plugin was rebranded/re-homed from the SlopScale fork (id: slopscale) to feedback-plugin-virtuoso (id: virtuoso); the desktop bundle swap is feedBack-desktop#31. shell.js still promoted `slopscale`, whose id no longer ships, so renderPromotedNav() (gated on the plugin appearing in /api/plugins) would find no match: the dedicated sidebar slot goes dark and Virtuoso drops to the generic Plugins gallery. Swap the NAV entry + PROMOTED_PLUGINS slot slopscale -> virtuoso (screen: plugin-virtuoso, label "Virtuoso - Practice", same FeedBarcade anchor + target icon) so the practice plugin keeps its first-class entry. Same pattern as the editor promotion (#546). Must land with the bundle swap or the practice plugin regresses in the UI. Signed-off-by: ChrisBeWithYou <16130099+ChrisBeWithYou@users.noreply.github.com> Co-Authored-By: Claude Opus 4.8 * fix(v3): clear dead slopscale id from Plugins gallery + refresh docs Review follow-up (topkoa) — same dead-id bug class on a second surface: - static/v3/plugins-page.js: drop the now-dead `slopscale: 'game'` from the CURATED category map and add `virtuoso: 'practice'`. The Virtuoso manifest sets `category: "practice"` (authoritative in categoryOf), so it already lands on the practice board; the curated entry is a defensive fallback so a manifest without `category` wouldn't drop to 'other'. - README.md: SlopScale row -> Virtuoso (new repo URL + description + clone). - docs/plugin-capability-inventory.md: slopscale row -> virtuoso (Active). No behavior change beyond gallery categorization for the dead id. Signed-off-by: ChrisBeWithYou <16130099+ChrisBeWithYou@users.noreply.github.com> Co-Authored-By: Claude Opus 4.8 --------- Signed-off-by: ChrisBeWithYou <16130099+ChrisBeWithYou@users.noreply.github.com> Co-authored-by: ChrisBeWithYou <16130099+ChrisBeWithYou@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 --- CHANGELOG.md | 1 + README.md | 2 +- docs/plugin-capability-inventory.md | 2 +- static/v3/plugins-page.js | 4 ++-- static/v3/shell.js | 4 ++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be7b98e..2e49934 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Screensaver no longer kicks in during windowed-mode playback** (#686). While a song is playing, `static/app.js` now holds a [Screen Wake Lock](https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API) (`navigator.wakeLock.request('screen')`) so the OS display/screensaver stays awake even though only audio + the highway animation are active and the keyboard/mouse are idle. The lock is acquired on `song:play`/`song:resume` and released on `song:pause`/`song:ended`/`song:stop` (kept only while actually playing), and re-acquired on `visibilitychange` when the tab refocuses (the API auto-releases a lock whenever the page is hidden). Both the HTML5 `