the plugins screen becomes /marketplace

`/plugins` redirects rather than 404s: the word is in the dock, in the docs and in
whatever anyone bookmarked, and a route that worked yesterday returning nothing
reads as the feature having been removed. The API keeps its name — only the screen
moved — so the permission entry lists both paths, because a client-side redirect
is still a route that has to resolve before it can send anyone anywhere.

Also: the fetch stubs in marketplace.test.ts needed `as unknown as typeof fetch`.
Bun's `typeof fetch` carries `preconnect`, so a bare stub is not assignable —
tests passed while tsgo did not, which is the wrong way round to find out.

tsgo clean, frontend builds, 873 pass / 7 fail unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 04:10:23 +00:00
co-authored by Claude Opus 5
parent 921fbff9fe
commit 1b65b83f1f
5 changed files with 18 additions and 7 deletions
+5 -1
View File
@@ -69,7 +69,11 @@ export function App() {
<Route path="/photos" element={<Dashboard.PhotosScreen />} />
<Route path="/photos/:section" element={<Dashboard.PhotosScreen />} />
<Route path="/app-store" element={<Dashboard.AppStoreScreen />} />
<Route path="/plugins" element={<Dashboard.PluginsScreen />} />
<Route path="/marketplace" element={<Dashboard.PluginsScreen />} />
{/* The screen was `/plugins` until marketplace.officer.dev existed. Redirected rather than
dropped: the word appears in the dock, in docs, and in whatever anyone bookmarked, and a
404 on a route that worked yesterday reads as the feature having been removed. */}
<Route path="/plugins" element={<Navigate to="/marketplace" replace />} />
{/* Installed plugins. Core routes above stay hand-written; everything below is generated from
what is installed, because a bundler cannot follow a runtime import specifier. The wildcard
hands the whole subtree to the plugin's own router, which react-router nests natively. */}