Skip to content

Refresh design guidelines across the host app and workspace applets - #56

Merged
molefrog merged 16 commits into
mainfrom
design-guidelines
Jul 27, 2026
Merged

Refresh design guidelines across the host app and workspace applets#56
molefrog merged 16 commits into
mainfrom
design-guidelines

Conversation

@tonyfresher

@tonyfresher tonyfresher commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

The host app now follows the refreshed design guidance across chat, workspace, settings, development screens, and shared controls. Workspace applets keep the same radius language and clearer content, color, typography, and container guidance.

host design refresh
├─ shared radius and semantic styling
├─ concise applet guidance
├─ validated app icon IDs
└─ automatic bundled-skill updates

What changed

  • Align controls, overlays, typography, spacing, icons, and loading states with the updated host design system
  • Standardize the shared radius scale used by the host and workspace applets
  • Refine applet guidance around useful content, solid surfaces, typography, and subtle container edges
  • Validate app icon IDs across view configs, builders, scaffolding, and the client registry
  • Add workspace skill status APIs and automatic updates for bundled moi skills

Review focus

  • Check that the tighter radius scale stays coherent across dense and spacious surfaces
  • Check the app icon registry boundary between shared server types and client rendering
  • Check automatic skill updates for workspace switching, failure state, and persisted preference behavior

Verification

  • bun test — 593 passed
  • bun run format:check
  • bun run lint
  • bun run typecheck:client
  • git diff --check and git range-diff against the original PR history

@tonyfresher
tonyfresher requested a review from molefrog July 27, 2026 10:45
Comment thread workspace/.claude/skills/moi-workspace/SKILL.md
Comment thread server/skills-template.ts Outdated
Comment thread server/skills-template.ts Outdated
tonyfresher and others added 3 commits July 27, 2026 19:48
* Store the skill auto-update flag in server-side app settings

The auto-update preference lived in the client's localStorage (zustand
persist), so it was per-browser and invisible to the server. Move it to a
new app-wide settings store: a conf-backed settings.json in moi's data
dir, exposed via GET/PATCH /api/settings. conf gives atomic writes,
per-key schema validation, and migrations for future settings keys.

The workspace skill update hook now reads the flag through a react-query
query and enables it with a PATCH; banner display and auto-updates wait
until settings have loaded so the default value never flashes the prompt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Gv9P3ecorjQnhL3ABFTYQU

* Broadcast settings changes to open clients

A PATCH to /api/settings only updated the query cache of the client that
sent it; other open clients sat on the stale flag until a remount or
focus refetch, so an enabled auto-update never reached them (PR #64
review). Publish a settings:updated event carrying the new value over
the live-events socket, and let useAppSettings apply it to the cache
directly — no refetch round trip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Gv9P3ecorjQnhL3ABFTYQU

* Let app-settings declare its API-updatable fields

The PATCH /api/settings route hand-validated each settings key, so every
new key would touch api.ts (PR #64 review). app-settings now owns a map
of API-updatable fields with their runtime checks, and the route just
parses the body against it: unknown keys ignored, wrong types reject the
patch with a 400.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Gv9P3ecorjQnhL3ABFTYQU

* Validate settings patches with the conf schema

The API-updatable field map duplicated type checks the conf schema
already declares. Replace it with a plain whitelist: the route picks
whitelisted keys and object-form set() validates the merged store
against the schema before writing, so a bad value rejects the whole
patch (400 with conf's message) and persists nothing. Each settings
key is now declared once.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Gv9P3ecorjQnhL3ABFTYQU

---------

Co-authored-by: Claude <noreply@anthropic.com>
Resolve both conflicts by keeping both sides:

- `client/runtime/useWorkspaceEvents.ts` — the `WorkspaceEvent` union
  keeps `settings:updated` (this branch) alongside `tab:focus` (main),
  and the type import pulls in `AppSettings` and `WorkspaceTabId`.
- `server/api.ts` — the `lib/types` import keeps `AppSettings` (settings
  API) and `AppletKind` (applet error records).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011rAUcnSwr47GRZRmynJXFo
@molefrog
molefrog merged commit 43d2505 into main Jul 27, 2026
1 check passed
@molefrog
molefrog deleted the design-guidelines branch July 27, 2026 22:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants