Summary
Implement the admin pages slot: the manifests admin_pages array is the single canonical mechanism for plugin-supplied admin pages. The admin shell composes its menu from this array, gates access by the entrys capability field, and lazy-imports the entry ES module when the route is visited.
The SDKs registerMenu/registerAdminRoute calls are sugar that writes into this slot at build time, not a parallel runtime registry. Backward-compat: validator accepts legacy web.admin.menu shape and rewrites it.
Design reference
- docs/02-plugin-system.md §7.3 (cross-refs doc 05)
Acceptance criteria
Dependencies
#45 (lifecycle), #214 (frontend SDK), doc 05 (admin shell)
Complexity
M
Summary
Implement the admin pages slot: the manifests
admin_pagesarray is the single canonical mechanism for plugin-supplied admin pages. The admin shell composes its menu from this array, gates access by the entryscapabilityfield, and lazy-imports theentryES module when the route is visited.The SDKs
registerMenu/registerAdminRoutecalls are sugar that writes into this slot at build time, not a parallel runtime registry. Backward-compat: validator accepts legacyweb.admin.menushape and rewrites it.Design reference
Acceptance criteria
manifest.admin_pages[]and registers each entry in the admin shells page registry:{slug, parent, title, icon, capability, entry, plugin_slug, plugin_version}/admin/{plugin_slug}/{page_slug}the hosts admin router serves the layout shell and the pagesentryES module is lazy-imported via the import mapcapability, the admin shell shows a 403 without importing the entryparent: "tools"nests under the core "Tools" menu;parent: "{slug}/{page-slug}"nests under another plugin pageweb.admin.menushape and rewrites toadmin_pagesat install time; emits a deprecation warning to the plugin authorweb.admin.menurewrite preserves semanticsDependencies
#45 (lifecycle), #214 (frontend SDK), doc 05 (admin shell)
Complexity
M