From 32126ddbe1f094028bb611252ca8126503bf980b Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 19 Aug 2026 03:15:31 +0000 Subject: [PATCH 1/3] core: remove misleading nav.screen/nav.icon from plugin manifest docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neither field is read anywhere in the frontend — the nav dropdown builder in static/js/plugin-loader.js always derives the screen id as "plugin-" + plugin.id. Plugin authors were cargo-culting nav.screen values (sometimes inconsistent with their own plugin id) because the docs implied it did something. Documents the actual behavior instead of a manifest field with no effect. Fixes #21 Signed-off-by: Claude --- CLAUDE.md | 4 +++- plugins/folder_library/CLAUDE.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 8b90aea4..0798886e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -38,7 +38,7 @@ Plugins are the primary extension point. Each plugin lives in `plugins//` "version": "1.0.0", "private": false, "type": "visualization", - "nav": { "label": "My Plugin", "screen": "plugin-my_plugin" }, + "nav": { "label": "My Plugin" }, "screen": "screen.html", "script": "screen.js", "styles": "assets/plugin.css", @@ -56,6 +56,8 @@ Plugins are the primary extension point. Each plugin lives in `plugins//` All fields except `id` and `name` are optional. Plugins can have any combination of frontend (screen/script), backend (routes), and settings. +`nav.screen` and `nav.icon` are **not consumed anywhere** — the plugin loader's nav dropdown builder always derives the screen id as `"plugin-" + plugin.id` (`static/js/plugin-loader.js`), regardless of what a manifest declares. Don't set either field; they have no effect. + `version` and `private` are advisory metadata — the plugin loader does not currently consume them, but plugins commonly include them for publishing/tooling purposes. `description`, `category`, and `icon` are **optional, additive v3 Pedalboard metadata** (surfaced in `/api/plugins`, consumed by the v3 Plugins page `static/v3/plugins-page.js`). `description` is a short one-sentence summary shown under the pedal name. `category` (`audio | creation | practice | game | tools`, free-form; unknown/absent → curated default → `"other"`) picks which pedalboard the plugin sits on. `icon` is an assets-relative thumbnail path (e.g. `"assets/thumb.png"`, ~square ~256×256, same containment rule as `styles`, served via `/api/plugins//assets/...`); if omitted the loader auto-detects `assets/thumb.png`, and plugins with no thumbnail get a default pedal graphic. All three are backward-compatible — omit them and the plugin still loads. See [docs/plugin-v3-ui.md](docs/plugin-v3-ui.md). diff --git a/plugins/folder_library/CLAUDE.md b/plugins/folder_library/CLAUDE.md index a44ea027..548ef857 100644 --- a/plugins/folder_library/CLAUDE.md +++ b/plugins/folder_library/CLAUDE.md @@ -69,7 +69,7 @@ Routes that receive a JSON body must import `Request` from fastapi explicitly an ### 9. Plugin id must be consistent everywhere The plugin id (`folder_library`) must match in: -- `plugin.json` → `"id"` and `"nav.screen"` +- `plugin.json` → `"id"` - `screen.js` → `PLUGIN_ID` constant and `API` constant (`/api/plugins/folder_library`) - `routes.py` → `APIRouter(prefix="/api/plugins/folder_library")` From b37166ce59606c32fa47624a0090168acad2efea Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 19 Aug 2026 04:16:38 +0000 Subject: [PATCH 2/3] fix: remove stale nav.screen example from AGENTS.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to the CLAUDE.md fix: AGENTS.md carried the same outdated nav.screen example in its plugin.json manifest sample. nav.screen has no consumer (see CLAUDE.md's Plugin System section) — noted by pullfrog's review on this PR. Signed-off-by: Claude --- AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index 2447ba3d..803b9baa 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -49,7 +49,7 @@ Plugins are the primary extension point. Each plugin lives in `plugins//` "version": "1.0.0", "private": false, "type": "visualization", - "nav": { "label": "My Plugin", "screen": "plugin-my_plugin" }, + "nav": { "label": "My Plugin" }, "screen": "screen.html", "script": "screen.js", "styles": "assets/plugin.css", From 8255817b966bfce953938b5b52d0ab13e1c671ca Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 19 Aug 2026 09:51:54 +0000 Subject: [PATCH 3/3] Remove ignored nav.screen from folder_library manifest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to the nav.screen/nav.icon docs fix: this bundled plugin's own manifest still set nav.screen, which the plugin loader never reads — flagged by CodeRabbit's review on this PR. Signed-off-by: Claude --- plugins/folder_library/plugin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/folder_library/plugin.json b/plugins/folder_library/plugin.json index 02b8a931..8657f035 100644 --- a/plugins/folder_library/plugin.json +++ b/plugins/folder_library/plugin.json @@ -3,7 +3,7 @@ "name": "Folder Library", "version": "1.8.0", "bundled": true, - "nav": { "label": "Folders", "screen": "plugin-folder_library" }, + "nav": { "label": "Folders" }, "screen": "screen.html", "script": "screen.js", "routes": "routes.py"