Themes are already modular via folder discovery (GET /api/themes/list scans themes/<name>/). This brings the SAME model to pages: - backend/routes/features.js: public GET /api/features/list scans frontend/features/<id>/feature.json and returns the page manifest. The Node process reads its own bind-mounted /app/frontend — no runFileOp / regen / source-array plumbing needed (sidesteps the shell-generator gotchas). - features/<id>/feature.json: each page now self-describes (id, routes, module, handler, navId, nav, order). 6 real features + 3 redirect-only (config/peers/ssh) so behaviour is preserved exactly. - kernel loadManifest() prefers /api/features/list, falls back to the static features/manifest.dev.json when the endpoint isn't up yet. Result: dropping a features/<id>/ folder registers a page; deleting it removes it — zero central edits, exactly like dropping a theme folder. (Backend route needs a Node restart to activate; the static-manifest fallback keeps everything working until then.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: librelad <librelad@digitalangels.vip>
9 lines
219 B
JSON
9 lines
219 B
JSON
{
|
|
"id": "ssh",
|
|
"routes": ["/ssh", "/ssh*"],
|
|
"handler": "handleSsh",
|
|
"navId": "nav-config",
|
|
"order": 80,
|
|
"note": "Legacy /ssh* -> /admin/tools/ssh-access redirect. No module; routes to the legacy handler."
|
|
}
|