Repository navigation
feat: calmer, plain-language web UI for everyday users - #683
Conversation
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Humanize schedules and trigger events, badge only exceptions (Disabled, managed source), sentence-case run statuses, add a head enable switch to job detail, and fold scheduler internals into Advanced details. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Rows and cards title secrets by name with the ref path as meta and the full ref in the hover title; the empty kind placeholder and namespace tone pills are gone. The security note drops the triple counts, save and delete confirm with toasts instead of a dismissable banner, and typed delete confirmation asks for the friendly name. The create hook now adds the vault: prefix to a bare name before the unchanged PUT request. Co-Authored-By: Claude Opus 5.5 <[email protected]>
The create dialog is Name + Secret value with a live saved-as preview and the optional label behind More options; one hint replaces the section help and boundary notice. The sheet uses the shared copy button, a ghost close button with a focus ring, an Updated/Created fact list, a single Saved/Missing word, and a plain delete foot instead of the CLI footer. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
One plain permission vocabulary shared by create, settings, overview and configuration; fleet rows drop layer provenance and the provider meta segment; Overview keeps Setup + Live sessions on the shared Panel; Sessions tab uses filter counts instead of a second stats grid, drops the Iterations column, and gains a Retry action. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Approval is decided once in the window head; the rail and run pages drop raw ids, CLI hints, and event-type microtext (kept behind Inspect); the subhead keeps only exception pills and freshness; operator verbs read in plain language. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Rows show one plain type word and at most one Outdated pill, single-scope lists render flat, and search reads as "Search knowledge" / "N matches". Detail leads with the memory name and description, renders content as markdown with the source one toggle away, keeps three overview rows, and moves the remaining facts and the decision history into closed folds. Edit/Delete sit in the header; delete confirms by typing the memory name. Copy aliases workspace to project and drops controller/runtime jargon. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…utralize the live chip Co-Authored-By: Claude Opus 5.5 <[email protected]>
…he settings frame Co-Authored-By: Claude Opus 5.5 <[email protected]>
…Advanced Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ider list Co-Authored-By: Claude Opus 5.5 <[email protected]>
…-in copy Co-Authored-By: Claude Opus 5.5 <[email protected]>
…sions, and marketplace settings Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Replaces internal strings (wire fields, CLI hint, digest, debug query) with plain copy, aliases generation as round and quarantined as set aside, snaps the run page to the shared gutter and 4px grid, unifies run durations, and crossfades Inspect tabs with runViewTransition. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…nts below complexity limits Resolve the React Doctor findings in the ui-settings slice by extracting focused child components and hooks instead of suppressing the rule: move generalUpdateNeedsAttention into its own module, split the update, providers, MCP authorize, provider detail/inspect views, RestartBanner, and SplitButton into cohesive pieces, and move the provider editor tier state into hooks/. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Resolve the React Doctor no-high-complexity-react-function findings in the loops slice by extracting render branches into child components and moving derivations into pure lib helpers (binding counts, editor node readouts, node verb commit mode, request context blocks) with lookup tables in place of if-chains. Behavior, copy, test ids and props contracts are unchanged. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…mand The UI pass moved the chord into a styled tooltip and dropped the native title, which also removed the only machine-readable signal that the palette keymap had hydrated. Derive aria-keyshortcuts from the live palette.open binding and wait for it in the E2E navigation fixtures. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Resolve React Doctor no-high-complexity-react-function findings across the tasks system and the OS tasks app by extracting per-state render branches into child components, moving the task-card meta derivation into a pure view-model helper, the completed-run result lookup into a hook, and the catalog mode views into their own module. Behavior, copy, and test ids are unchanged. Co-Authored-By: Claude Opus 5.5 <[email protected]>
The UI pass kept every raw error off the setup gate, which also hid the daemon's fixed non-loopback HTTP refusal and claimed CompozyOS wasn't responding. A 403 from onboarding now shows the daemon-authored message; other failures keep runtime messages off screen. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Follow intentional copy, fold, and markup changes: composer ids on data-detail, update phase on data-phase, source badge words, settings nav order, Advanced folds, bell pill count, Home first-run state, and renamed empty/permission copy. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…iews Extract focused hooks, pure view-model helpers, and render-branch components so every React Doctor no-high-complexity-react-function finding in this slice lands at or below the 15/15 threshold, with no behavior, copy, test id, or prop-contract change. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Settings nav order, update phase on data-phase, and the palette chord on aria-keyshortcuts instead of the removed native title. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Resolve react-doctor no-high-complexity-react-function for AgentAuthoredFileEditor, AgentCommandSelect, AgentSettingsRuntimeSection, AgentStatsGrid, useHomeSystem, GatewayAuditPanel, useOnboardingDefaultModel, AgentDetailLocation, AgentsCatalogLocation, RuntimeSelectorTrigger, and WorktreeRow by extracting focused child components, topbar hooks, and pure view-model helpers. Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| @@ -227,26 +214,24 @@ function VaultDeleteDialog({ | |||
| onConfirm, | |||
| }: VaultDeleteDialogProps) { | |||
| const sessionScope = target ? isSessionScopedVaultRef(target.ref) : false; | |||
| const confirmTypingValue = target && !sessionScope ? target.ref : undefined; | |||
| const title = target ? vaultSecretTitle(target.ref) : ""; | |||
| const confirmTypingValue = target && !sessionScope ? title : undefined; | |||
There was a problem hiding this comment.
Delete confirmation loses identity
For non-session secrets, the user now types only the last part of the name to confirm deletion. vault:providers/openai/api-key and vault:mcp/server/api-key both accept api-key, so the typed check no longer confirms which secret the user intends to delete. The full name is still shown in the dialog, but this weakens the safeguard against deleting the wrong secret.
| const applyIntent = () => { | ||
| // A transition's update runs a frame later; never resurrect a settled intent. | ||
| if (settled) return; | ||
| windowManagerStore.trigger.routeIntentSet({ intent: { id: intentId, windowId: id, route } }); | ||
| this.publish(); | ||
| }; | ||
| if (transition && this.animatesInWindow(id)) { | ||
| void runViewTransition(applyIntent, { types: [transition] }); |
There was a problem hiding this comment.
Fast responses skip transitions
The command starts before the browser runs the transition update. If the command finishes first, settled makes that update skip the route change, so the in-window drill animation is lost. The current tests run the update immediately and keep the command pending; covering the opposite order would protect this transition.
Knowledge Base Used: Web application
| expected: Overview Setup panel lists Model (live selector) and Permissions in plain language (no Command row, no At a glance rail); Instructions AGENT.md renders markdown prose without a meta strip and SOUL/HEARTBEAT tabs carry no missing-file warning pills; Configuration Runtime shows "Defined in" with layer/override provenance, Access lists Allowed/Blocked tools and Tool groups as neutral pills, and MCP uses hairline rows; Sessions empty New session opens the launch dialog and, after creation, navigates through the created session owner workspace to its composer. | ||
| entry_points: web /agents/$name?tab=overview|instructions|configuration|sessions | ||
| qa_status: pass | ||
| qa_status: untested |
There was a problem hiding this comment.
Changed scenarios remain unverified
This scenario has updated expectations but is marked untested; the PR also says the affected browser scenarios were not run locally. The repository requires changed user-visible behavior to have its affected QA scenarios both updated and verified before delivery. Please satisfy that requirement before merging. The changed marketplace and Vault scenarios show the same unverified pattern.
Context Used: CLAUDE.md (source)
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
…ason Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
What & why
CompozyOS was hard to use for anyone who isn't a heavy technical user. Screens were dense, internal terms leaked onto the page (
Layer project_profile,Top-K,BM25,Slice 1,configured=true,compozy.loop/v1, "daemon", raw state tokens likewaiting-for-input), status colors competed with each other, and several screens hand-built copies of@compozy/uiprimitives. This PR is a plain-language, lower-density pass over the wholeweb/app. Behavior, routes, HTTP/DTO contracts, config keys and test ids are unchanged; technical detail is still there, one step deeper (a closed Advanced / Technical details section, a tooltip or an inspector) instead of on the first screen.How it was produced
@compozy/uiprimitives, and the remaining shell and session copy.Highlights by area
Layer …,Shadows …). Rows no longer show the raw provider or model id in mono. Overview and Configuration no longer repeat each other. Permission labels match between the create dialog and settings.compozy__*tool names are gone from the transcript.Empty/Alert.SettingsPageStatereplaces 18 hand-built loading/error states, and raw error text never becomes the headline.RestartBannerfrom@compozy/ui.compare-and-swap/422copy are gone from the screen.MonoTagis deleted in favor ofPill.ListGroup/MetricGrid/StatusDot.ConfirmDialog.vault:refs.vault:prefix is added automatically, and the stored value keeps the same shape.Pill.Count.View transitions
The app had none. Router-level
defaultViewTransitionis deliberately not used, for two reasons:React.startTransition, so the snapshot would capture the old DOM.What this PR does instead:
runViewTransition(update, { types, reduced })andviewTransitionName(...)in@compozy/ui. React 19.2 stable has no<ViewTransition>, and this helper is the single place to swap to it later.tokens-runtime.css: the root never animates, pointer events pass through during a transition, and there are reduced-motion overrides.New or extended
@compozy/uiprimitivesDisclosure: one generic fold replacing 7 hand-rolled copies (marketplace, knowledge, vault, About, job detail, tasks dashboard, task form).TranscriptDisclosurepromoted from web.Pill.Count.EntityDialogHeaderwith an optionaleyebrow.StatusDotinfotone.SplitButtonactionProps.RestartBannerdefault label no longer says "daemon".Each comes with its story and tests.
Copy system
COPY.md§6 anddocs/_memory/glossary.md(edited together) gain these surface aliases. They are UI labels only; canonical names stay in code, the wire and the CLI:generation→ "round"quarantined→ "set aside"dream→ "tidy up"The site Loops guides are updated for "Copy and edit".
Screenshots
Every image is a Storybook route story rendered with the same MSW fixtures before (main) and after (this branch), at 1440×900. All 321 route stories were captured on both sides; these are the most representative 25.
Home
Home — first run
Agents list
Agent detail
Agent settings
Sessions
Session — approval
Settings — Memory
Settings — General
Settings — Providers
Settings — MCP servers
Loops catalog
Loop detail
Loop editor
Loop run
Tasks dashboard
Tasks list
Task detail
Jobs
Trigger detail
Knowledge
Vault
Vault — new secret
Marketplace — installed
Extension detail
How you verified it
bunx turbo run typecheck --filter=./web --filter=./packages/uion the fully merged tree: pass (3/3).bunx oxlint --deny-warningson all 735 changed TS/TSX files: exit 0. Pre-commit oxfmt and oxlint passed on every commit.make gate, E2E/Playwright and the full web suite. The heavy lanes run in CI. Playwright specs anddocs/qa/scenariosthat quote changed strings were updated to the new copy but not executed here. This PR is delivered only once CI is green./api/observe/overviewhad no MSW handler, so the Home story showed "Failed to fetch" on main. This PR adds a typed fixture (story mocks only) and re-captured the "before" Home with it.Impact
compozy__*IDs change. User state is untouched.docs/qa/scenariosupdated and reset to untested where behavior changed.skills/compozy/): none; it drives CLI/HTTP, not UI labels.text-subtle/text-fainttones: a token change that needs design sign-off.SplitButton: blocked on dropdown items that can be disabled and stay mounted.actionPropslanded as the first step.SkillExposePanel,SessionVaultPanel,RuntimeConnectionIndicator).make gatepasses locally; this PR is delivered only after its required CI checks are green. (Gates delegated to CI by request, see above.)🤖 Generated with Claude Code