Commit Graph
302 Commits
Author SHA1 Message Date
Juan DenisandClaude Opus 4.8 dfc628e13b redesign(fleet): render fleet tables with sk-dtable
Agent Fleet and Fleet Monitor used the generic .table style while every other migrated list page uses the dense .sk-dtable look (mono uppercase headers, token row borders). Swap the className so they match their siblings under the Servers tab group.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 02:43:43 -04:00
Juan DenisandClaude Fable 5 df67ce782b fix(ui): remove dead agent-version management buttons (audit L3)
The Agent Versions tab rendered an "Add Version" button and per-row Edit/Delete
buttons with no handlers — there are no edit/delete endpoints. Remove the dead
controls (and now-unused Plus/Trash2 imports); the version list is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 18:35:43 -04:00
Juan DenisandClaude Fable 5 5ceb2d83b7 fix(ui): serialize terminal input + demo chrome for the Terminal tab
Verified the S8.3 terminal live end-to-end (WSL agent -> gateway ->
browser xterm) and fixed what the test surfaced:

- RemoteTerminal sent every keystroke as its own HTTP POST; parallel
  POSTs reach the agent out of order, so fast typing arrived scrambled
  ("echo" -> "ehe..."). Input is now queued and flushed sequentially,
  coalescing keys that arrive while a chunk is in flight.
- Terminal page header -> PageTopbar (icon + mono meta), matching every
  other migrated page.
- term-shell rail rows: server icon + right-aligned glowing status dot
  (demo con-target); shell pane now sits flush against the rail with
  RemoteTerminal's drawer chrome flattened (demo con-main).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:36:45 -04:00
Juan DenisandClaude Fable 5 b2e4ac7c60 feat: interactive Terminal tab on /terminal over agent PTY (S8.3)
The "Terminal & Logs" page had no terminal. Now a Terminal tab hosts the
xterm console (RemoteTerminal) against paired agent servers, behind a
demo-style target rail (.term-shell: agent list with glowing status
dots, offline rows disabled, first online server auto-selected).

RemoteTerminal was built but never mountable - it imported a
nonexistent SocketContext and listened for a terminal:<sid> event that
nothing emits. Fixed the full output path:

- backend sockets.py: new subscribe_terminal/unsubscribe_terminal
  handlers join the browser into the agent gateway stream room
  (server_<id>_terminal:<session>) after validating the session via
  TerminalService.get_session
- RemoteTerminal: rewired to services/socket.js; consumes server_stream
  events filtered by the session channel (agent PTY -> gateway ->
  xterm), re-subscribes on socket reconnect, unsubscribes on unmount

VALID_TABS gains terminal (appended - logs stays the default landing
since the shell needs a connected agent; panel-host PTY remains a S5
gap, TerminalService rejects local).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 23:55:39 -04:00
Juan DenisandClaude Fable 5 1cbaa6fa27 feat(ui): Databases SQL editor gutter + highlighting, click opens console (S8.1)
- new databases/SqlEditor.jsx: the demo .sql-editor as a working editor -
  transparent <textarea> overlaid on a scroll-synced highlighted <pre>
  (identical font metrics), line-number gutter, SQL keyword/string/
  number/comment tints; wrap=off + horizontal scroll sync
- ConsoleTab swaps its bare textarea for SqlEditor (focus/shortcuts/
  read-only badge unchanged); dead .dbx-editor styles replaced by
  .dbx-sqled
- UX: single-clicking a database node in the tree now opens its SQL
  console directly (previously only via right-click context menu) and
  expands its tables; collapsing stays on the chevron so re-clicks do
  not fold the tree

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 23:34:51 -04:00
Juan DenisandClaude Fable 5 7647fde208 feat(ui): Docker per-container accent dots (S8.6)
The demo gives each container a hue-hashed identity dot in the name cell
(.dot-ico); the live table only had a green/gray status dot duplicating
the Status pill. The dot is now deterministic per container name, glows
when running, dims when stopped.

Also closes the S8.6 audit items: KPI icon tone-wash was a false alarm
(rules + tone props verified correct); Projects KPI skipped (labels only
exist on per-container inspect, count would cost an extra fetch per
target); logs modal->drawer stays blocked on the S6.3 decision.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 23:09:20 -04:00
Juan DenisandClaude Fable 5 ad2d3015cb feat(ui): Files parity - syntax-tinted preview + quick access (S8.5)
- new file-manager/highlight.js: the demo hlCode line tinting (escape
  first, then kw/str/num/cmt/var token spans; PHP + JS keyword sets)
- PreviewDrawer read view -> .pv-code with line-number gutter on
  --bg-code; Edit mode keeps the textarea; >4000-line files fall back to
  the plain read-only textarea
- Quick access rail group above Folders (Sites /var/www, Stack
  /opt/serverkit, Web config /etc/nginx, Logs /var/log)
- PageTopbar meta shows the browse target (agent name / "panel host")
- breadcrumb chevron icons -> demo mono "/" separators
- ext-badge on image thumbs always visible (was hover-only)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 23:06:53 -04:00
Juan DenisandClaude Fable 5 8ac61a7f1e feat(ui): WP list bulk-select + detail posture gauge & PHP version (S8.4)
List (demo bulkbar, real APIs, no bulk route needed):
- header + per-row checkboxes with accent is-selected rows
- bulkbar fans out per site: Start (unarchive), Stop (archive), Update
  core, Backup (snapshot), Clear cache - each scoped by an applies()
  filter so e.g. Stop only hits running sites; failure counts toasted

Detail:
- Security tab gains the demo posture panel: ScoreGauge ring + checklist
  computed from 3 real signals (integrity checksums clean, WP_DEBUG off,
  no critical/high vulnerabilities); checks that have not run stay out of
  the score instead of faking it
- header subtitle now shows PHP version (site.application.php_version)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 18:46:45 -04:00
Juan DenisandClaude Fable 5 6e3d0f5155 feat(ui): Services list -> dense sk-dtable + SegControl + src badges (S8.2)
The list was a flex-row layout with three native selects - the main reason
it did not read as the demo. Now:

- rows -> .sk-dtable in a surface card: checkbox gutter, Service (type
  tile + label sub), Source badge (GitHub/git icon + owner/name from
  deploy_repo_url), Domain (mono), Status Pill (amber deploying/building,
  red failed), Last Deploy, right-aligned lucide action icons
- status select -> SegControl (All/Running/Stopped); Type + Sort selects
  kept (capability superset over the demo)
- bulk-select + row-select preserved (sk-dtable is-selected)
- narrow screens drop Source/Domain/Last Deploy columns
- dead flex-row/list-header/status-dot/repo-pill SCSS removed

CPU/Memory/Server columns omitted (no list payload - S5 gap).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 11:15:04 -04:00
Juan DenisandClaude Fable 5 2312cf4448 feat(ui): WorkspaceDetail page + demo workspace cards (S8.7)
The demo's missing /workspaces/:id detail view, built on real data only:

- new pages/WorkspaceDetail.jsx: back-link + site-header hero (brand tile,
  active-workspace / status Pill, mono slug-members-since meta), Workspace
  info card (sk-info-row) + live Resources count strip, accent-underline
  tabs (Servers / Services / Sites / Members) over sk-dtable rows with
  Manage links, move-in/out pickers, member add/remove, per-app Share ACL
  modal, Set active (localStorage scope + reload, mirrors
  WorkspaceSwitcher), Settings edit modal (updateWorkspace), Archive/
  Restore + admin Delete
- list page slimmed to the demo card: clickable card -> detail, "Open >"
  footer, .ws-card.active accent wash for the scoped workspace; the
  members/resources/sharing modals moved into the detail page
- route /workspaces/:id added

Deferred (S5 backend): plan/billing, aggregated CPU/MEM usage bars,
member last_active.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 10:11:25 -04:00
Juan DenisandClaude Fable 5 a97f8a4215 feat(ui): Databases parity pass 2 - flush console + semantic tints (S8.1)
The demo is a flush full-height 3-pane console; the live page was padded
floating cards, which is why it did not read as the new design.

- de-cardify: .db-explorer padding/gaps -> 0; toolbar/tree-panel/
  workspace/statusbar lose radius+outer borders, join on 1px edges
- ResultsGrid: demo cellEl semantic tints (NULL italic-ghost, emails/URLs
  + positive statuses green, negative amber)
- tab strip: demo + new-tab pill (opens SQL console on selected source)
- result count number bold green

Follow-up (S8.1): SQL editor line-number gutter + keyword highlighting.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 02:37:40 -04:00
Juan DenisandClaude Fable 5 e0e660087e fix(ui): retint Agent Fleet + Fleet Monitor to design tokens (S8.0)
These two pages were never migrated: hard-coded Tailwind light-palette
utilities (bg-gray-200, bg-yellow-50, bg-blue-600, bg-white modal) made
the /servers -> /fleet jump read as a different app and broke dark theme.

- StatCard/StatsGrid -> MetricCard KPI strip; progress bars -> ds Gauge
- status Badges -> Pill (versions, rollouts, heatmap, alerts, anomalies,
  search, discovery)
- new token homes in _fleet-monitor.scss: .fleet-kpis/.fleet-warnrow/
  .fleet-ico/.fleet-statbox/.fleet-predbox/.fleet-modal/.fleet-statrow
- heatmap buckets + forecast chart strokes -> theme vars
- _utilities.scss: shim text-green-500/red-500/yellow-600/yellow-700

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 02:37:29 -04:00
Juan DenisandClaude Fable 5 6f5df6db6e refactor(styles): promote .sk-state primitive + final design-system sweeps
(1) New %sk-state placeholder + .sk-state class in _design-system.scss
(mono uppercase state chip, 7 tone modifiers); the 5 page-local copies
(.mon-state/.sec-state/.inc-state+.inc-impact/.git-chip/.bk-type) now
@extend it - class names and JSX untouched, compiled output verified
equivalent. (2) Dead connectionColors export removed from
connectionRules.js (zero consumers). (3) _email.scss globals evicted:
.status-badge deleted (its unique content was dead variants + a phantom
::before dot artifact in two text badges - strict improvement),
.empty-state moved to _empty-state.scss via an html-prefixed bridge that
preserves the cascade over page-partial copies. (4) TokenModal blocks in
_servers.scss re-tokened (--bg-code scripts/connection string, eyebrow
labels, green status dot) - no other selectors in the file changed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 02:11:49 -04:00
Juan DenisandClaude Fable 5 7b1e9849ab feat(ui): restyle the infra overlays (logs dock, SSH terminal, container logs)
Map item #21, bottom-dock IA kept (S6.3 stays open). LogsDrawer: sk-
drawer-style head (icon tile, mono source sub, live-dot line counter),
log well on --bg-code, mobile fix (dock was orphan-offset 250px with the
sidebar off-canvas). RemoteTerminal: previously UNSTYLED (classes had no
stylesheet; old VS Code palette in an embedded <style> tag) - now has a
proper token home in _logs-drawer.scss; xterm theme retinted to the new
palette incl. the v5 selectionBackground key fix (v4 selection key was
silently ignored). ContainerLogs: icon-tile header + mono sub; its
styles live in _wordpress-pipeline.scss (CONTAINER LOGS section only).
All socket/resize/follow/cleanup behavior byte-identical.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 02:11:49 -04:00
Juan DenisandClaude Fable 5 96641a1855 feat(ui): restyle the Applications pages + modernize the base app-* chrome
The last old-look pages. Base app-* classes in _applications.scss now
carry the new spec directly (gradient detail header + accent wash, mono
breadcrumbs/eyebrow panel headers, sk-info-row k/v grids, accent tab
strip) - property-aligned with the .wp-detail-page overrides so WP detail
stays identical and WordPressProject inherits the new chrome for free.
Applications list: PageTopbar + MetricCard KPI strip + dense sk-dtable
(type tiles, Pills, Gauge resource rows, SegControl filter); page no
longer borrows docker-* classes. ApplicationDetail: tinted header tile +
Pill/EnvTag, deploy/build Badges -> Pills, consoles on --bg-code; dead
blocks with zero consumers dropped. Also fixes pre-existing lint errors
(empty catches, unescaped entities). NOTE: /apps currently redirects to
/services so the list page is orphaned - restyled for consistency.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 02:11:48 -04:00
Juan DenisandClaude Fable 5 a15099c25f feat(ui): restyle the WordPress detail page (14 flat tabs) to the new look
Flat-tabs decision applied (S6.2): VALID_TABS + deep links byte-identical;
strip restyled to the accent-underline spec. Header -> demo site-header
(gradient + accent wash, WP-brand tile with status dot, Pill + EnvTag,
mono dotsep meta) and a NEW env-switcher dropdown bound to the real
site.environments payload (navigates between env site ids, with a
loading guard against stale renders).

All app-* shared-class overrides scoped under .wp-detail-page in
_wordpress.scss - _applications.scss untouched (Applications keeps its
look until its own pass). Per tab: Overview KPI strip + k/v rows + quick
actions; EnvironmentCard -> EnvTag/Pill (fixes staging mislabeled DEV);
SnapshotTable -> sk-dtable (drops inline #EF4444); Plugins/Themes ->
dense tables with amber update chips + bulk wash; Git tab -> hash chips
+ feed commits; Uptime/Analytics -> MetricCard strips + retinted REAL
recharts (no fake response-time/referrers - backend gaps); Vulns ->
severity KPI strip + chip table; Security -> --bg-code integrity well;
Updates -> run rows with Pills; Reports Badges -> Pills. HealthDot
colorMap fixed (referenced a nonexistent --color-success). WP list +
Projects styles verified unregressed; .wp-env-badge/-status kept for
their other consumers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 01:29:51 -04:00
Juan DenisandClaude Fable 5 382dd76fd5 feat(ui): restyle the Backups body to the new look
StatCards -> MetricCard KPI strip (incl. previously-dropped file_backups
count + conditional remote card); backups list -> dense sk-dtable with
type-tinted icon tiles, mono type chips, remote-sync Pills, SegControl
type filter (same state values); schedules -> dense table with cron-chip
times + status Pills; storage tab gains a real-data spec-card strip +
SegControl provider picker (all S3/B2 fields kept); restore modal ->
amber warning + sk-info-rows (stays a modal). Heatmap/GFS/multi-
destination/selective-restore deferred (backend gaps, map S5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 00:48:29 -04:00
Juan DenisandClaude Fable 5 8279c10826 feat(ui): restyle the Workflow Builder to the new look
Floating toolbar/palette cards -> flush wf-head bar (ghost title input,
real is_active Pill, mono dotsep meta) + wf-rail node palette (eyebrow
groups, tinted icon chips). NEW: Active switch wired to the REAL
Workflow.is_active flag (backend already persists it - map S5 "likely
gap" resolved); list modal shows per-workflow active Pills. ReactFlow
chrome tokenized (theme-aware dot grid via CSS var, minimap/controls on
surfaces, accent edges); nodes keep exact geometry (no layout drift).
WorkflowExecutionHistory gray-* Tailwind theming bug FIXED (token-backed
console frame, status Pills, level-colored log lines). Node/panel
palettes retinted to new-palette literals; ReactFlow interactions
verified byte-identical.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 00:48:28 -04:00
Juan DenisandClaude Fable 5 1490315f25 feat(ui): restyle the Git page body to the new look
StatStrip -> MetricCard strip (server status/URL/SSH/version from the
loaded status payload); repo cards -> dense sk-dtable (icon tile, mono
branch chips, stars/forks/updated); repo detail re-tinted (mono tree,
accent hash chips); webhooks -> dense table with brand source tiles +
Pills (all 4 actions kept); deployments -> feed rows with status Pills,
rollback/redeploy kept; icon-font close spans -> lucide X. Git now owns
its own log-output styles (no _email.scss dependency). Provider OAuth +
Gitea metrics deferred (backend gaps).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 00:48:28 -04:00
Juan DenisandClaude Fable 5 89fb2c7519 feat(ui): restyle Status Pages body + cross-cutting token cleanup
StatusPages (completes the Monitoring group): Badges -> ds Pills, hero
gains a comp-dots component strip (real loaded statuses only), metrics ->
sk-spec-cards, incidents -> inc-state/impact mono chips with state-tinted
washes, rail items get visibility pills + mono slugs; all CRUD/check/
transition flows kept; default page color -> new accent.

Cleanup flagged by earlier waves: utils/serviceTypes.js old-palette hex
swapped to new-palette values (keys/shape kept; consumers verified -
Services/ServiceDetail/useService, NOT ApplicationDetail as the map
claimed); serverdetail/ServicesTab Badge -> Pill; _server-packages +
_server-services migrated off shadcn vars (incl. the broken accent-as-
background hover) onto surface/text tokens + eyebrow headers + --bg-code
log panes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 00:18:28 -04:00
Juan DenisandClaude Fable 5 ff2192cb45 feat(ui): restyle the Security suite (shell + 13 tabs) to the new look
Shell: StatStrip -> MetricCard KPI strip (alerts/malware/ClamAV/scan from
real status), tab strip -> accent wash via scoped SCSS (ids untouched).
Tabs: Overview cards -> Pill + sk-info-row; Scanner/Quarantine/IP-lists/
SSH-keys/fail2ban lists -> dense sk-dtable with mono cells + state chips;
Vulnerability + Audit render their REAL scores via ScoreGauge; Integrity
changes get kind chips + --bg-code file lists; Firewall sub-views -> ds
SegControl with live counts; Events -> ds Feed with tone dots;
AutoUpdates/Config reskinned (Config via SCSS only). All flows kept
(scans, bans, rules, keys, baselines). Geo-blocking/policy toggles/
schedules/sessions deferred (backend gaps).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 00:18:28 -04:00
Juan DenisandClaude Fable 5 bc7edde302 feat(ui): restyle the Email Server body to the new look
Status tab service cards -> icon tiles + Pills (controls kept); Domains
tab gains a real-data MetricCard KPI strip + dense sk-dtable with
DKIM/SPF/DMARC presence pills; Accounts/Aliases/Forwarding card lists ->
dense tables with mono cells; DNS providers + webmail reskinned; queue ->
dense table that now also renders the already-loaded Recipients field;
previously-unstyled password modal styled. All scoped under .email-page
to avoid cascade leaks; tab ids/deep links untouched. Volume/reputation/
activity-feed surfaces deferred (backend gaps).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 00:18:09 -04:00
Juan DenisandClaude Fable 5 4691bff8a3 feat(ui): restyle the Workspaces body to the new look
Header -> PageTopbar (flat item, no tabs); cards -> prototype ws-card
(ServiceTile avatar honoring the real primary_color, status Pill, mono
slug/since meta, stat strip, hover lift); members modal rows get avatars
+ role Pill/tags (backend role names kept verbatim - S6.6 unresolved);
resources modal gets eyebrows + pick-lists; sharing ACL role select ->
SegControl (same values). Create-modal color default #6366f1 -> #6d7cff.
Plan/billing/usage/counts not in payload -> skipped, nothing faked.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 00:18:09 -04:00
Juan DenisandClaude Fable 5 2f66507a0c feat(ui): restyle the Terminal/Logs page to the flush console look
Log Files + Journal tabs -> single bordered console frame (con-rail
target list with mono eyebrow groups, accent-bg active rows, session-head
viewer bar, log well on --bg-code); Processes tab -> same frame with
sk-dtable-spec sortable table + token gauges; Services tab cards re-
tinted with status stripes. Terminal gets its OWN proc-chip filter chips
(no longer depends on _templates.scss .filter-chip); process/service
statuses -> ds Pills; hashColor/priority palettes retinted to the new
palette. Legacy block kept for shared consumers (JournalControls/
ProcessTable/ServiceCard).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 00:17:54 -04:00
Juan DenisandClaude Fable 5 b38053d448 feat(ui): restyle the Cron Jobs body to the new look
StatCards -> MetricCard KPI strip (jobs/active/service/platform from real
status), job cards -> dense .sk-dtable (clock tile, mono schedule chip +
readable hint, Pill status, all 4 row actions kept incl. run-now), new
list head with search + All/Enabled/Disabled SegControl (client-side
only), modals reskinned with mono eyebrows + --bg-code run output.
Next-run/history/success-rate omitted (backend gap, map S5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 00:17:53 -04:00
Juan DenisandClaude Fable 5 a16ff1b8f8 feat(ui): restyle ServiceDetail tabs + Templates catalog to the new look
ServiceDetail: header -> ServiceTile gradient avatar + ds Pill + mono
dotsep meta (adds the real domain link); OverviewTab -> MetricCard strip
+ sk-info-row key/values + EnvTag + Gauge bars, deploy statuses -> Pills;
MetricsTab gauges tokenized (no fake history charts - backend gap);
Packages -> sk-dtable; Events -> tone dots + Pills; logs/shell/commands/
gunicorn consoles re-tinted to --bg-code (fixes broken light theme);
settings/git modal polished via SCSS only. Templates: catalog -> tpl-card
grid (icon tile, mono version, clamped desc, tag chips, amber featured
star, hover-reveal Deploy wired to the existing install flow) + cat-chip
category filter; drawer no longer stacks under the install modal. All
tabs, filters, handlers, and deep links kept.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 23:45:28 -04:00
Juan DenisandClaude Fable 5 8a61bd67ab feat(ui): restyle the ServerDetail tab bodies to the new look
Header -> demo detail-header (surface gradient + accent wash, mono dotsep
meta, ds Pill status); overview KPI tiles -> spec-card look with thin ds
Gauges (CPU/RAM/Disk retinted to accent-bright/cyan/green convention);
tab strip -> accent underline; data tables + services/packages tables ->
dense sk-dtable spec (scoped fixes for their shadcn-var partials);
docker/cron/cloudflared tabs re-skinned with Pills and mono eyebrows.
Dead blocks removed (kpi-gauge ring, resource-meters, duplicate
server-detail-tabs, notifications-tab). Servers LIST + ops workspace
styles untouched; all tabs, actions, telemetry, and deep links kept.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 23:45:16 -04:00
Juan DenisandClaude Fable 5 8f46ac8369 feat(ui): restyle the Monitoring body to the new look
Overview: StatStrip -> MetricCard KPI strip, current metrics -> host-card
grid (icon tile + Pill + thin token-colored Gauges + mono host-mini
footer), active alerts -> alert-row pattern with red-wash firing chips.
Alert Rules / Delivery / History tabs re-skinned in place (Pills, mono
eyebrows, surface tokens); all CRUD, scheduler, and channel config kept.
Synthetic uptime monitors / response-time charts deferred (backend gap,
REDESIGN_MAP S5). Also removes the dead .alert-item block that collided
with _servers.scss.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 23:45:05 -04:00
Juan DenisandClaude Fable 5 6687c429fa feat(ui): restyle the FTP Server body to the new look
Completes the Files group. StatStrip -> MetricCard KPI strip (status/
active server/users/connections), users + connections tables -> .sk-dtable
with Pills and mono cells, mono eyebrow section headers, surface-token
cards, log viewer on --bg-code. Replaced the broken icon-font <span>s with
lucide icons inside the same buttons. Dead pre-topbar blocks dropped.
All capabilities kept (install flow, user CRUD + password modal,
disconnect, logs, deep-linked tabs).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 23:44:55 -04:00
Juan DenisandClaude Fable 5 f31bc89958 feat(ui): restyle the File Manager body to the flush three-pane console
SCSS-only reskin of the FileManager page to the demo's `.fmgr` look:
- page goes full-bleed flush (no floating cards): toolbar / tree rail /
  listing / status bar joined by 1px soft borders
- left rail: flat groups under mono-uppercase eyebrow headers, demo tree
  rows (accent-bg active, amber folders), dense type filters + disk gauges
- list view: sticky mono-uppercase headers, tighter rows, mono size/
  modified/permissions cells
- grid view: transparent cards with surface-2 hover, accent-bg selection
  (type-tinted thumbs kept)
- status bar + breadcrumbs go mono; bulk bar becomes a flush accent strip
- type palette literals aligned to the redesign tokens (amber/violet/
  green/cyan); context menu + preview drawer re-tinted to surface tokens
- dropped dead blocks from the pre-topbar era (.page-header, .sort-popover,
  .filter-chips-row, .quick-access-*, .analysis-*, .toolbar-select)

All capabilities kept (uploads, bulk ops, type filters, disk mounts,
remote targets, shortcuts) — zero JSX changes. Build verified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 23:08:22 -04:00
Juan DenisandClaude Opus 4.8 b758fda2fd feat(ui): restyle the DNS Zones + SSL bodies to the new look
Finish the Domains trio visually:
- DNS Zones: records table -> dense .sk-dtable; record type rendered as a colored .dns-rtype chip (A/CNAME/MX/TXT/NS/SOA…); content cell uses .sk-cell-mono. Drop unused Badge import.
- SSL Certificates: per-cert status Badge -> Pill (green Valid / amber Expiring). Drop unused Badge import.
Both already themed from Phase 0; these add the redesign's chip/pill language.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 00:25:09 -04:00
Juan DenisandClaude Opus 4.8 506945c44b feat(ui): restyle the Services list to a KPI strip + dense table
StatStrip -> MetricCard KPI strip (Running/Stopped/Total/Last Deploy with tone icons + subs); per-row status -> Pill; list header -> mono uppercase dense, list card on surface/border-soft tokens. All existing logic kept: search/type/status/sort filters, multi-select + bulk start/stop/restart, repo pill, per-row action buttons, and wordpress/service navigation. Drop now-unused StatStrip/Stat import.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 23:57:55 -04:00
Juan DenisandClaude Opus 4.8 d18d20ce36 feat(ui): restyle the WordPress site list to a dense table
Convert the .wp-site-card grid into a dense .sk-dtable: Site tile + name/port, Environments, Version (mono), Status (Pill green/gray), tag chips, and Open-Site/WP-Admin links. Add a status SegControl (All/Running/Stopped) alongside the existing tag filter; row click still opens the site detail. Omitted SSL/plugins/visits/uptime/server columns (not in the get_sites payload — no list backend) per restyle-first. Drop an unused Badge import.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:11:22 -04:00
Juan DenisandClaude Opus 4.8 e2faf9dc6e feat(ui): restyle the Servers list table to the demo's dense look
Visual restyle of the existing .servers-table (no column/capability changes — bulk-select, group, telemetry, and row actions all kept): mono uppercase headers, and thin token-colored telemetry gauges (CPU=accent-bright, RAM=cyan, Disk=green). Region/Load columns omitted (mock-only, no backend field) per restyle-first.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 19:18:28 -04:00
Juan DenisandClaude Opus 4.8 e2968b2197 feat(ui): migrate the WordPress group to the top-bar layout (sidebar now flat)
Final sidebar sub-menu moved to the demo's top-bar structure (REDESIGN_MAP §6 decision 3):
- Add shared WORDPRESS_TABS (WordPress / Pipeline); render PageTopbar on WordPress (sites list) and WordPressProjects (pipeline).
- Remove the wordpress subItems from the sidebar — NO sidebar item has a sub-menu anymore; the rail is fully flat, matching the demo.
- WordPress list: both headers (loading + main) swapped; Import Site + Create Site actions kept.
- Pipeline list header swapped (title 'Pipeline').
- The Pipeline tab is now always visible (was wpInstalled-gated in the sidebar).
Six infra groups total now use the top-bar layout: Domains, Servers, Services, Files, Monitoring, Marketplace, WordPress. Body restyles still pending per group.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 19:07:35 -04:00
Juan DenisandClaude Opus 4.8 7cc27cb82f feat(ui): migrate Monitoring + Marketplace groups to the top-bar layout
Final two sidebar sub-menus moved to the demo's top-bar structure (REDESIGN_MAP §6 decision 3):
- Monitoring group: shared MONITOR_TABS (Monitoring/Status Pages); PageTopbar on both pages (Refresh + Start/Stop + Create-Page actions kept).
- Marketplace group: shared MARKET_TABS (Marketplace/Downloads); PageTopbar replaces the marketplace hero; Downloads header swapped (Import ZIP + Refresh kept).
- Remove the monitoring + marketplace subItems from the sidebar.
Only WordPress (Pipeline) still has a sidebar sub-menu; everything else is now flat + top-bar. Body restyles still pending per group.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 18:35:21 -04:00
Juan DenisandClaude Opus 4.8 faa6355c75 feat(ui): migrate the Files page group to the top-bar layout
Move Files + FTP to the demo's top-bar structure (REDESIGN_MAP §6 decision 3):
- Add shared FILE_TABS (Files / FTP Server); render PageTopbar on both pages.
- Remove the files subItems from the sidebar (route /ftp unchanged, reachable from the tab).
- FileManager: top bar added as the first child of the full-bleed fullscreen browser (already a flex column; body keeps filling) — the toolbar, tree, preview, upload tray and all file ops are untouched.
- FTPServer: .page-header swapped for PageTopbar; the conditional install/test/start/stop/restart actions moved verbatim into the top bar.
- Fix a pre-existing unescaped-apostrophe lint error in FTPServer.
Follow-up: restyle the FileManager + FTP bodies.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 16:26:55 -04:00
Juan DenisandClaude Opus 4.8 c6d44ac502 feat(ui): restyle New Service mode chooser to the demo's method cards
Restyle .new-service-page__mode-card into the demo's centered method-card look (icon chip on top, title, description, corner check on the active card) and tokenize the old teal/indigo active-state literals. GitHub-OAuth repo picker, manifest detection, and the template flow are all preserved. Follow-up: template-catalog grid + Docker-Image/From-Scratch methods.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 16:14:08 -04:00
Juan DenisandClaude Opus 4.8 4e95c2257f feat(ui): migrate the Services page group to the top-bar layout
Move Services + its sub-pages to the demo's top-bar structure (REDESIGN_MAP §6 decision 3):
- Add shared SERVICE_TABS (Services/New Service/Templates/Deploy Activity); render PageTopbar on all 4 group pages so the tab group persists.
- Remove the services subItems from the sidebar (routes /services/new, /templates, /deployments unchanged, reachable from the tabs).
- Services: header -> PageTopbar (meta shows total/running; New Service action kept).
- NewService: drop the now-redundant breadcrumb; Connections action kept.
- Templates: search box moved into the top-bar actions.
- Deployments: New Service + Live/Paused + Refresh actions kept.
Follow-up: restyle the bodies (NewService method-cards + template catalog, Services dense table, ServiceDetail tabs).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:07:48 -04:00
Juan DenisandClaude Opus 4.8 8e61ad08d8 feat(ui): migrate the Servers page group to the top-bar layout
Move Servers + its 4 sub-pages to the demo's top-bar structure (REDESIGN_MAP §6 decision 3):
- Add shared SERVER_TABS (Servers/Agent Fleet/Fleet Monitor/Cloud Servers/Config Templates) and render PageTopbar on all 5 pages so the tab group persists.
- Remove the servers subItems from the sidebar (routes unchanged, reachable from the tabs).
- Main Servers page: top bar added ABOVE the full-bleed ops workspace (container -> column); the fleet-health rail, status/group filtering, workbar, bulk actions and pairing are fully preserved — no capability removed.
- Sub-pages (AgentFleet/FleetMonitor/CloudProvision/ServerTemplates): .page-header swapped for PageTopbar, action buttons preserved.
- Fix a pre-existing unescaped-quote lint error in FleetMonitor.
Follow-up: restyle the Servers list body to the demo's dense table + ServerDetail tabs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:30:51 -04:00
Juan DenisandClaude Opus 4.8 0eab32096b feat(ui): share the top-bar tab group across Domains/DNS/SSL
Finish the domain page group so the Domains/DNS Zones/SSL tabs persist on all three:
- Extract DOMAIN_TABS to components/domains/domainTabs.jsx; Domains imports it.
- DNSZones + SSLCertificates pages now render the shared <PageTopbar tabs={DOMAIN_TABS}> in place of their old headers (actions preserved).
- Fix a pre-existing unescaped-apostrophe lint error in SSLCertificates.
DNS/SSL page bodies (lists/forms) are not yet restyled — headers only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 04:03:29 -04:00
Juan DenisandClaude Opus 4.8 68695a779c feat(ui): migrate Domains to the demo's top-bar layout
First infra page moved to the demo structure (REDESIGN_MAP §6 decision 3):
- Add shared PageTopbar ds primitive (icon + title + routed sub-nav + actions).
- Domains: top bar with Domains/DNS Zones/SSL tabs (replaces the removed sidebar sub-menu), KPI strip (MetricCard), segmented filter (SegControl), .sk-dtable list, and a detail Drawer with SSL/linked-site/status specs + all actions (visit/verify/SSL/delete). Add-domain + enable-SSL modals preserved.
- Remove the domains subItems from sidebarItems.js (/dns, /ssl routes unchanged, reachable from the top-bar tabs).
- Omit registrar/DNSSEC/nameservers columns (no WHOIS backend yet) per restyle-first.
Follow-up: give DNSZones + SSLCertificates pages the same top bar so the tab group persists.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:46:46 -04:00
Juan DenisandClaude Opus 4.8 0b9ee6c61e feat(ui): Phase 1 page restyles (dashboard, settings, databases, docker, marketplace)
- Dashboard: metric tiles -> MetricCard, apps status -> Pill; retint MetricsGraph to the new palette while keeping the recharts chart intact.
- Settings: nav group labels -> mono eyebrow, toggles -> gradient-on, theme-preview swatches repainted.
- Databases: engine status-dot glow, green result count, UTF-8 + Connected status-bar segments.
- Docker: MetricCard KPI strip atop the content area, status filter -> segmented control (kept the rich dx- rail/tabs/inspector).
- Marketplace: mono eyebrows, token card shadow, accent category chips (kept tabs + install-from-source).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:35:04 -04:00
Juan DenisandClaude Opus 4.8 e8b5299415 refactor(styles): tokenize hardcoded colors to design tokens
Replace accidental old-palette literals (old indigo/green/amber/zinc surfaces+borders, white/black washes) with design tokens so they theme correctly in light mode and track a custom accent. Intentional literals (brand colors, categorical log/node/file-type palettes, theme-preview mockups, white-on-color, scrims) were preserved.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:34:49 -04:00
Juan DenisandClaude Opus 4.8 326bc89679 feat(ui): redesign foundation — tokens, self-hosted fonts, primitives, sidebar
Phase 0 of the ServerKit UI redesign (see docs/REDESIGN_MAP.md):
- Remap design tokens to the new infra-console palette behind existing names; add prototype token names (surface ramp, cyan/violet, accent-bright/-bg). Dark/light/system.
- Self-host IBM Plex (woff2 vendored via scripts/fetch-fonts.mjs); no Google Fonts CDN.
- Runtime-derive the full accent ramp in ThemeContext.
- Add shared design-system primitives in components/ds (Pill, EnvTag, SegControl, MetricCard, Gauge, ServiceTile, Sparkline, AreaChart, ScoreGauge, Feed, Drawer).
- Restyle the sidebar (gradient rail, mono section headers, left accent bar) and switch the brand to the demo's gradient-tile logo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 03:34:28 -04:00
Juan Denis 986909a955 Surface Docker DBs, add base port & migration fixes
Expose and surface containerised databases and introduce managed app base port control. Backend: add endpoint to list databases across all Docker apps, robustly resolve compose container names, include docker DB user when querying, compute migration needs from live heads and self-heal orphaned alembic_version entries by stamping to head, and add the managed_app_base_port system setting. Template service now honours the managed_app_base_port and WordPress template default HTTP port updated to 8300. Frontend: add react-icons brand icons and DatabaseBrands component, show Docker-hosted DBs under their engine nodes with a docker badge, platform-aware console shortcut label, pass DB user to docker table/query API calls, add API client header merge fix, UI for managing base port in settings, enhanced migration history UI (backup/apply/resync flows, confirm dialog, toasts), and various style tweaks and color additions.
2026-06-06 23:29:22 -04:00
Juan DenisandClaude Opus 4.8 2d83440040 feat(workspaces): viewer/editor grant roles + operate-endpoint access (#33)
Completes the chosen access-level ACL design: a grant now lets the user actually
operate the resource, gated by a real role.

- Grants carry a role: editor (view + operate) or viewer (read-only). grant POST
  validates role in {viewer, editor} (default editor); ResourceGrantService gains
  grant_role(); the Sharing UI gains a role selector.
- Two access helpers split the app endpoints: _can_access_app (owner/admin/ANY
  grant) gates reads (get_app, /linked, /logs, /container-logs, /containers,
  /status); _can_edit_app (owner/admin/EDITOR grant) gates mutations (/link,
  /unlink, /environment, PUT, /start, /stop, /restart).
- DELETE stays owner-or-admin (an editor can't delete — tested).
- The same sweep fixed a latent int-vs-str ownership bug across ~14 app endpoints
  (compared app.user_id to the stringified get_jwt_identity(); now user.id).

Verified: 3 more ACL tests (viewer read-only + can't operate, editor operates +
can't delete, role validation/default), full suite 130 passed, lint + build.
Still owner-only: env-vars/databases/domains blueprints (follow-up sweep).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 13:13:18 -04:00
Juan DenisandClaude Opus 4.8 4dca43b6b0 feat(workspaces): sharing UI for per-site ACL grants (#33)
Completes the per-site ACL feature with UI on top of the backend (d9a5ec7).

- A per-app 'Share' action in the Workspaces Resources modal opens an inline
  sub-view: current grantees with Revoke, plus a grant-access list of users
  (the owner and existing grantees are filtered out).
- Client methods getAppGrants / grantAppAccess / revokeAppAccess.

Verified: frontend lint-clean (no new warnings) + production build. The grant
endpoints are covered by backend tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 12:03:38 -04:00
Juan DenisandClaude Opus 4.8 35c7a73d8c feat(workspaces): manage servers in the workspace Resources modal (#33)
Completes the reassignment feature symmetrically — the server reassign endpoint
shipped earlier (e89415f) was API-only; now it has UI.

- getServers gains an allWorkspaces bypass (empty X-Workspace-Id header) and a
  setServerWorkspace client method (mirrors apps).
- The per-workspace modal is now a 'Resources' modal with both Applications and
  Servers sections, each with move-in / move-out.

Verified: frontend lint-clean (no new warnings) + production build. The server
endpoint itself is already covered by backend tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 11:18:46 -04:00
Juan DenisandClaude Opus 4.8 e89415f3e0 feat(workspaces): reassign apps/servers between workspaces (#33)
Completes the organizing loop — existing resources were stuck wherever the
backfill put them (Default); now they can be moved into client workspaces.

- PUT /apps/<id>/workspace (owner-or-admin on the app) and
  PUT /servers/<id>/workspace (developer+), both requiring the TARGET be a
  workspace the caller can access (member or admin). A null target moves the
  resource back to Default.
- UI: an 'Apps' management modal on each Workspaces card (mirrors the Members
  modal) with move-in / move-out. It fetches with allWorkspaces (an empty
  X-Workspace-Id header) so it can see apps in other workspaces to move them in,
  sidestepping the ambient scope.
- Fixed a real bug caught by tests: the app ownership check compared app.user_id
  to the stringified get_jwt_identity() (int != str -> spurious 403); now uses
  user.id.

Verified: 2 new endpoint tests (ownership + target-membership + null->Default +
role gates), full suite 122 passed, frontend lint-clean + production build.
Servers reassignment is API-only for now; the modal is apps-only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 09:32:30 -04:00