Files
MechaCat02 8725939172 feat(dashboard): group tree, detail page, and members tab
SvelteKit UI for Phase-2 groups, mirroring the apps/users patterns:
- api.ts: Group/GroupDetail/GroupMember types + an api.groups client
  (list/get/create/update/reparent/delete + nested members CRUD); optional
  group selector wired into app create.
- routes/groups: a collapsible tree overview (assembled from parent_id)
  with a New-group form, and a detail page with breadcrumb, subgroups/apps
  lists, a rename form (no slug field — slug is frozen), a reparent
  control, a delete button that surfaces the 409 RESTRICT message, and a
  Members tab reusing RoleChip/ConfirmModal/ActionMenu.
- +layout.svelte: a Groups nav entry beside Apps.

npm run check: 0 errors; npm run build: success.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 20:15:44 +02:00
..

PiCloud Dashboard

SvelteKit SPA for the PiCloud control plane.

Stack

  • SvelteKit 2 with adapter-static (SPA fallback)
  • Svelte 5 (runes)
  • TypeScript
  • Vite

Scripts

npm install
npm run dev      # vite dev server on :5173, proxies /api → PICLOUD_API
npm run build    # static SPA bundle into ./build/
npm run check    # svelte-check
npm run lint
npm run format

By default npm run dev proxies /api/* and /healthz to http://127.0.0.1:18080. Override with PICLOUD_API=http://host:port npm run dev.

How it fits in

In production Caddy serves the contents of ./build/ as static files and falls back to index.html for client-side routing. The dashboard only talks to the control plane (/api/admin/* on the manager); data-plane invocations go through /api/execute/* on the orchestrator and are not issued from the dashboard directly during MVP.