5.4 KiB
5.4 KiB
Iteration 3 Plan — Workspace Header + Tabs Restore
Goal
Bring the Workspace screen layout back in line with the pre-tabs “Agent screen” structure (left sidebar + center content + right explorer sidebar), while keeping the new workspace-scoped tabs model (Agent + Terminal tabs) and the project → workspaces sidebar.
This iteration focuses on restoring missing/incorrect UX affordances:
- New tab dropdown must open and be visible.
- Right explorer sidebar must be togglable from the workspace header (with the correct icon behavior).
- Chat overflow (kebab) menu must exist again when an Agent tab is active.
- Terminal tabs must be closable from the workspace tab strip (X), since terminals are first-class tabs.
- Gestures for opening/closing sidebars must remain unchanged.
Non‑Goals (for this iteration)
- Panel splitting / VS Code-style split views (explicitly deferred).
- Changing the existing left sidebar open/close gestures or right explorer swipe gestures (must remain behaviorally identical).
- Introducing a DB / rehydration changes (agent hydration is already handled at startup).
Acceptance Criteria
A. New Tab menu
- Clicking New tab in the workspace header opens a visible dropdown/menu on desktop web.
- The menu contains exactly:
- Agent tab → navigates to the draft agent flow pre-scoped to the current workspace.
- Terminal tab → creates a new terminal for the current workspace and focuses it.
- The menu placement is correct (not off-screen), following established in-app patterns.
B. Workspace header parity (restored controls)
- Workspace header shows workspace name = branch name (as already implemented).
- Header contains:
- Left sidebar toggle (existing)
- Right explorer sidebar toggle (restored)
- Chat overflow kebab menu (restored) when an Agent tab is active
- Right explorer toggle icon matches legacy behavior:
- On mobile: Git workspace → Git icon; non-git → Folder icon
- Visual “open” state is reflected (muted vs active color).
C. Tabs UX parity
- Desktop workspace tab strip:
- Shows provider icon for Agent tabs (Claude/Codex) and terminal icon for Terminal tabs.
- Terminal tabs include an X close affordance.
- Closing a terminal tab:
- Calls the existing kill terminal API
- Removes the terminal from the workspace tab strip
- Leaves the workspace in a valid focused state (falls back to another available tab).
D. Right explorer sidebar structure & gestures (no regressions)
- Explorer sidebar is the same right panel conceptually as before:
- Not embedded “inside” the tab content surface
- Toggled by header button and swipe gesture on mobile
- Gestures remain unchanged:
- Left sidebar: swipe right to open (mobile), swipe left/backdrop to close
- Right sidebar: swipe left to open (mobile), swipe right/backdrop/X to close
E. Verification gates
npm run typecheckpasses.npm run test --workspace=@getpaseo/app(vitest) passes.- Playwright E2E:
- Add/update a spec that proves New tab menu opens and is on-screen.
- Add/update a spec that toggles the explorer sidebar from the workspace header.
- Run
npm run test:e2e --workspace=@getpaseo/app(uses isolated daemon/metro; must NOT hit:6767).
- Manual verification with
agent-browser(desktop + mobile viewport) confirms:- New tab menu visible and clickable
- Explorer toggle present and works
- Kebab menu present for Agent tab
- Terminal close X works
Implementation Outline
1) Workspace header composition
- Refactor
packages/app/src/screens/workspace/workspace-screen.tsxheader to match the legacy “agent header” affordances:- Use the same header primitives used by
AgentReadyScreen(MenuHeader,HeaderToggleButton,DropdownMenu). - Restore explorer toggle button in the workspace header.
- Restore agent kebab menu (only when active tab is an Agent tab).
- Use the same header primitives used by
2) New tab dropdown placement fix
- Ensure the New tab dropdown uses a pattern that cannot render off-screen near the top of the viewport:
- Prefer the existing header-menu pattern (DropdownMenu), or
- If using Combobox, set an explicit
desktopPlacementthat renders below the trigger.
3) Terminal tab close affordance
- Add close (X) for terminal tabs in the workspace tab strip.
- Implement a minimal kill-terminal mutation in
WorkspaceScreen(mirroring the existingTerminalPanemutation behavior) and ensure focus fallback.
4) E2E coverage
- Add
packages/app/e2e/workspace-tabs-header.spec.ts(or similar) covering:- New tab menu opening (visible on screen)
- Explorer toggle presence + open/close behavior
User Flows (must work)
-
Open workspace
- Tap workspace in sidebar → sidebar closes → workspace screen opens
- Header shows branch name
-
Open new terminal tab
- Header → New tab → Terminal tab
- Terminal appears as a tab (with terminal icon)
- Terminal is focused
-
Close terminal tab
- Click X on terminal tab
- Terminal is killed and disappears from tab strip
- Focus returns to another tab
-
Toggle explorer
- Header right icon toggles right sidebar
- Mobile swipe gesture still opens the right sidebar
-
Agent overflow menu
- With an Agent tab active, kebab menu opens
- Menu content appears (parity with previous agent overflow)