Skip to content

Entry-screen wizard rebuild + shadcn visual polish - #346

Merged
trevormil merged 11 commits into
mainfrom
feat/shadcn-ui-migration
Aug 20, 2026
Merged

trevormil merged 11 commits into
mainfrom
feat/shadcn-ui-migration

Conversation

@trevormil

Copy link
Copy Markdown
Owner

What

Eleven commits in two arcs, on top of the merged shadcn/ui migration (#344):

Visual polish (2 commits)

  • Visual refresh — radius, elevation, ambient tint across the app.
  • Glassmorphism on the top chrome (backdrop-blur).

New-workspace / entry-screen UX (9 commits)

  • Redesigned the New-workspace entry screen around intent.
  • Rebuilt the new-session flow as one linear 3-step wizard (Workspace → Model → Resume), with visible options and click-anywhere navigation.
  • Workspace comes first: pick which workspace before what to do in it; resume is workspace-scoped and recedes behind the engine choice.
  • No auto-advance — every wizard step waits for an explicit Next.
  • Fix: browser handoff walks the configured-browser chain (OSC 8 + plain-text links); right-click no longer destroys the active selection (rightClickSelectsWord: false).

Testing

  • bunx tsc --noEmit clean.
  • bun run test: 3405 pass / 0 fail (one pre-existing local-dirt failure fixed by removing an untracked stray .TerMinal/backlog counter — not part of this branch).
  • Includes new Playwright UX specs (tests/ux/entry-wizard.spec.ts and friends).

🤖 Generated with Claude Code

https://claude.ai/code/session_01J6bPUG7QhYiLqwXHV4xRnM

trevormil and others added 11 commits August 20, 2026 13:19
- --radius 0.5rem → 0.75rem (rounder cards/buttons/inputs app-wide)
- Ambient violet/teal brand tint in the window background corners
- Cards: translucent bg + backdrop-blur + shadow-sm elevation
- Badges: pill-shaped (rounded-full)
- Buttons: focus ring offset + violet glow on primary
- Dialogs/popovers/dropdowns/selects: heavier elevation (shadow-2xl/xl)
- Inputs/textareas: stronger focus ring (ring-2)
- Top-level intent tabs: New session | Resume | Scratch | New repo
- Single/Paired-loop toggle kept within New session (gated by loopsOn)
- Shared workspace picker for single + loop; recents/pins above the card
- Migrated to shadcn Button/Input/Textarea/Card/Tabs/Badge + semantic tokens
- Update loops-experiment gate test for the cleaner loopsOn && gating

Preserves all launch logic (spawn options, remote dir browsing, scaffold,
resume filtering, loop config).
…spacing

- Resume is now self-contained: its own engine picker, no longer coupled to
  the New-session picker or the workspace filter (dropped filterDir; search
  already matches cwd)
- Tightened padding throughout (container, header, tabs, cards, section labels)
- Spawn options are transparent (no card background/border) — a plain collapsible
- Resume list denser (p-2.5, space-y-1.5); smaller header/logo

No behavior change to launch logic (spawn, remote browsing, scaffold, loop).
…view)

- Step 1 Model: engine + model/effort/harness
- Step 2 Workspace: local vs remote, then folder / SSH dir browser
- Step 3 Review: summary + optional name + spawn options + launch
- Progress bar + Back/Next; recent/pinned workspaces stay as one-click fast path
- Paired loop keeps its own single card (goal/topology/roles/workspace)

Respects the dependency order (model→engine, host→location, workspace UI→location).
Replace the four-tab entry screen with a single step form. The intent
(new session / resume / paired loop / scratch / new repo) is now the
first field — a select — and the remaining steps are derived from it, so
every path answers one question per step instead of showing a whole tab
of controls at once.

- Pinned/recent workspace chips SELECT a repo instead of launching a
  session on click. Picking a repo then customizing the model is now
  possible; a remote chip also switches the form to that SSH host.
- Location, host, engine and loop topology are selects rather than
  button grids.
- Only the last step launches, and it summarizes what is about to run.
- Drop `scratchEngine` (scratch now uses the wizard's engine/model) and
  `choiceFromRecent` (superseded by selectWorkspace + buildChoice).

The loops-experiment test pinned the old mode toggle's source text; it
now pins the same property on the intent select — the loop option is
offered only when the flag is on, and an already-picked loop intent
falls back when the flag goes off.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WXyD9HvjP57L5BY9u2iqf8
Three refinements to the entry wizard:

- Show every option by default instead of hiding it behind a dropdown.
  Intent, location, host, engine and loop topology are now chips/cards.
  Model and reasoning effort stay dropdowns — they are long, single-value
  lists where a menu genuinely beats a grid — via new ModelDropdown /
  EffortDropdown, compact siblings of the existing card pickers in the
  same module so both forms read the same registry.
- Resume is workspace-scoped. It gains the workspace step and filters the
  session list by the selected repo (filterSessionMetas already took a
  filterDir), with a "show every workspace" escape hatch and an empty
  state that names the directory rather than implying no sessions exist.
- The step rail navigates forward as well as back: any step is clickable
  once every earlier step is answered. Steps that fully answer themselves
  in one click — an intent card, a workspace chip, a picked folder — now
  advance optimistically, so the common path never needs Next.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WXyD9HvjP57L5BY9u2iqf8
Selecting an option on the entry screen no longer jumps to the next
step. Intent cards, workspace chips, and the folder browser now only
SELECT; the explicit Next button is the sole way forward.

The optimistic-advance helper is removed entirely rather than left
unused — no call site remains that wants it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYiGxmeqKxR4H1NHGmf6vT
Two separate flakiness reports, two root causes.

Links: openInApp registered both an 'error' and an 'exit' handler, and a
failed spawn fires BOTH — exiting with a null code, which is != 0. One
failure therefore ran the fallback twice and opened the URL twice. A
settled latch now makes the outcome fire once.

The handoff also resolved to a single app: a configured browser missing
on THIS machine bailed straight to the OS default, so Chrome and Safari
were never tried. resolvedBrowserApps returns the configured app followed
by every installed browser, and openInApp walks it before falling back.

Copy: xterm defaults rightClickSelectsWord ON for macOS, and mousedown
beats contextmenu — right-clicking outside a selection replaced it with
the word under the cursor, so the menu's Copy took the wrong text. Off.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYiGxmeqKxR4H1NHGmf6vT
Step 1 mixed two questions. "New session / Resume / Scratch / New repo"
is really WHERE the work happens (existing repo, a fresh scaffold, a
scratch dir) crossed with WHAT to do there (new session, resume, loop),
so the wizard made you commit to an action before you knew the repo —
and it offered Resume for a scratch dir that can never have one.

Split the axes. `target` is asked first and decides which actions even
exist; `action` follows, and only an existing repo shows it. The rest of
the screen still reads one derived `intent`, so steps, summary, and the
launch buttons are unchanged.

The scaffold form folds into the workspace step it belongs to, which
retires the separate Project step.

Covered by tests/ux/entry-wizard.spec.ts against the real app, including
a guard that selecting a target does not advance the step by itself.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYiGxmeqKxR4H1NHGmf6vT
The session rows carried card-weight borders and full-strength text, so
a long list shouted over the question the step actually opens on. They
now sit on a darker ground with dimmed text and come back to full
contrast on hover, where the choice is being made.

The engine picker moves from filter-sized chips to the same pick-one
cards the model step uses, so the first question on the step reads as a
question rather than as a filter above a list.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RYiGxmeqKxR4H1NHGmf6vT
@trevormil
trevormil merged commit 28e6403 into main Aug 20, 2026
3 of 4 checks passed
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.

1 participant