diff --git a/scripts/marketplace-sync.ts b/scripts/marketplace-sync.ts index 97d340b9..7ab10f1b 100644 --- a/scripts/marketplace-sync.ts +++ b/scripts/marketplace-sync.ts @@ -66,7 +66,19 @@ const git = (dir: string, args: string[]): string | null => { return new TextDecoder().decode(result.stdout).trim() || null; }; -const PLUGINS_DIR = resolve(import.meta.dir, '..', 'plugins'); +/* + Which plugins directory to publish FROM. + + There are two, and they are not the same thing. `platform/plugins/` holds what this machine has + INSTALLED — updated by `plugins:update`, which is a git pull, and therefore always at whatever version + was last installed. `officer-dev/plugins/` holds every repo in the org, cloned for working on, and is + where a release is actually made. + + Publishing from the install directory means the catalogue advertises the version this machine happens + to be running rather than the version that was released. That is exactly what happened on 2026-08-27: + 21 plugins were tagged and the store went on showing 1.0.0. +*/ +const PLUGINS_DIR = process.env.PLUGINS_DIR ?? resolve(import.meta.dir, '..', 'plugins'); async function syncOne(dir: string): Promise { const appName = basename(dir); diff --git a/src/workspaces/officerdev/src/apps/Plugins/PluginGrid.tsx b/src/workspaces/officerdev/src/apps/Plugins/PluginGrid.tsx index fa4dc61b..a4c81e09 100644 --- a/src/workspaces/officerdev/src/apps/Plugins/PluginGrid.tsx +++ b/src/workspaces/officerdev/src/apps/Plugins/PluginGrid.tsx @@ -29,7 +29,14 @@ const Card = ({ entry, search }: { entry: Entry; search: string }) => { return (
{entry.image ? ( @@ -62,7 +69,7 @@ const Card = ({ entry, search }: { entry: Entry; search: string }) => { {!!entry.tags?.length && (
{entry.tags.map((tag) => ( - + {tag} ))} diff --git a/todo/plugin-ecosystem/marketplace-browse-by-tag.md b/todo/plugin-ecosystem/marketplace-browse-by-tag.md index a1443c57..7fb59d2d 100644 --- a/todo/plugin-ecosystem/marketplace-browse-by-tag.md +++ b/todo/plugin-ecosystem/marketplace-browse-by-tag.md @@ -12,21 +12,23 @@ order: 5 own tags in its manifest, the sync caches them, and `CatalogueEntry.tags` serves them normalised. All 21 are tagged and every tag has at least three plugins behind it. -**The UI is not started.** What the owner asked for, 2026-08-27: +**The UI landed the same day** (`d58f5881`, card styling corrected in a follow-up): tags down the left +with counts, cards in a grid on the right, detail replacing the grid with a back link that keeps `?tag=`. +Both the filter and the selection are in the URL so browser Back works. The screen also moved from +`useDashboardState` to `useAuthoredLayout`, or none of it would have reached anyone who had opened it +before. + +What is left here is what the owner has not looked at yet, and one thing he named and I have not built: + +- **"more that I want to implement here, one of them very challenging but fun"** — not described yet. +- Whether "Untagged" earns its place in the left-hand list. +- Whether the cards want to be bigger. + +Original ask, 2026-08-27, kept because it is the spec: - tags listed down the LEFT, as the filter - plugins on the right as **cards in a grid**, app-store style — not the current master/detail list - clicking a card opens the detail, with a **back button returning where you were** -Two things to settle before building: - -- **"All" has to be the default selection**, or a store that filters opens on nothing. -- **Does the detail replace the grid or sit beside it?** A back button implies replace, which changes the - screen from master-detail to list-then-page. The current screen is explicitly built the other way - (`?selected=` rather than a route, deliberately — see `docs/navigation-audit.md`), so this is a real - change rather than a tweak. - -Whatever it becomes, the filter AND the selection both belong in the URL, or Back breaks. - -**More is wanted here beyond this** — the owner has said so, including "one very challenging but fun" -thing not yet described. +Both questions it raised were answered in the building: "All" is the default, and the detail REPLACES +the grid — a grid needs the width and a detail beside one gets half of it.