7.5 KiB
7.5 KiB
Iteration 2 — Projects → Workspaces → Tabs (UX Polish + Behavior Fixes)
This plan is a follow-up iteration on the already-merged “Projects → Workspaces → Tabs” redesign.
Scope is client-only UX/behavior fixes requested after manual testing.
Goals (What changes in this iteration)
1) Sidebar drag behavior (Projects + Workspaces)
- Project drag moves the whole section
- Dragging a project heading reorders the entire project section (heading + its workspaces), even when expanded.
- Workspace drag is scoped
- Dragging a workspace only reorders within its project.
- A workspace must never end up visually under another project after drop.
- No “invalid” intermediate layouts
- If a drag results in a transient invalid arrangement (e.g., a workspace visually dropped between projects), the list must snap back to the canonical
Project → Workspacesstructure immediately after drop.
- If a drag results in a transient invalid arrangement (e.g., a workspace visually dropped between projects), the list must snap back to the canonical
2) Sidebar visuals + navigation polish
- Workspace rows match project row styling
- Remove the “weird border” on workspaces.
- Workspace rows should follow the same “ghost”/hover/pressed style language as project headings.
- Reduce workspace indentation/padding
- Workspaces are currently too indented; reduce indent, especially on mobile.
- Remove noisy “No agents yet” label
- Empty workspaces are valid; do not display a “No agents yet” label anywhere in the sidebar tree.
- Workspace click closes sidebar (mobile)
- When tapping a workspace from the left sidebar on mobile, the sidebar closes before navigation.
3) Workspace header + tab bar fixes
- Workspace header title is the branch name
- For git workspaces, the header must show the current branch name, including the base branch (e.g.,
main). - For non-git workspaces, fall back to workspace name.
- For git workspaces, the header must show the current branch name, including the base branch (e.g.,
- Agents and terminals are first-class tab types
- Remove “special layout” treatment where agents and terminals have creation controls on different rows.
- Provide a single unified “New tab” control that can create either:
- New agent (draft agent flow, pre-scoped to the workspace)
- New terminal (create terminal tab)
- Agent tabs show provider icons
- Terminal tabs: terminal icon.
- Agent tabs: provider icon (at minimum: Claude/cloud + Codex using existing app icon assets/components).
- Remember focused tab per workspace (critical)
- If a user focuses an agent/terminal tab in Workspace A, switches to Workspace B, and returns to Workspace A, the app must restore the previously focused tab.
- This must work even if the agent/terminal lists are still loading (do not overwrite the stored selection with a fallback while data is pending).
User Flows (Agreed / Required)
Sidebar
- User opens left sidebar.
- User expands a project to reveal workspaces.
- User drags a project header:
- Project moves relative to other projects.
- All its workspaces remain grouped with it.
- User drags a workspace:
- Only reorders within its project.
- Cannot be dropped into another project section.
- User taps a workspace on mobile:
- Sidebar closes.
- Workspace screen opens with branch name in header.
Workspace screen
- User opens a workspace.
- User can switch between agent and terminal tabs.
- User uses the unified “New tab” control to create either:
- a new agent (draft flow), or
- a new terminal
- User switches to a different workspace and returns:
- The previously focused tab is restored.
Acceptance Criteria (Strict)
Sidebar drag behavior
- Dragging a project heading reorders projects, and after drop the project heading is never separated from its own workspaces.
- Dragging a workspace can only reorder within its project; after drop a workspace is never displayed under another project.
- After any drag, the sidebar tree snaps back to valid
Project → Workspacesgrouping (no “interleaved” layout remains).
Sidebar visuals + navigation
- Workspace rows have no border and visually match the “ghost” style language of project headings.
- Workspace indentation/padding is reduced (especially mobile).
- “No agents yet” is not rendered anywhere in the sidebar tree.
- Clicking a workspace on mobile closes the left sidebar before navigation.
Workspace header + tabs
- Git workspace header shows branch name, including base branch (e.g.,
main). - There is one unified “New tab” control (not separate rows for agent vs terminal creation).
- Agent tabs show provider icons (Claude/Codex at minimum).
- Focused tab is restored when returning to a workspace (agent or terminal), and stored selection is not overwritten while lists are loading.
Implementation Plan (Code)
A) Sidebar drag scoping + snap-back
Target file(s):
packages/app/src/components/sidebar-agent-list.tsx
Work:
- Ensure drag end always triggers a re-render that restores the canonical
Project → Workspacesstructure (even if persisted order does not change). - Ensure reorder persistence remains:
- projects: device store project order
- workspaces: device store per-project workspace order
B) Sidebar styling + labels
Target file(s):
packages/app/src/components/sidebar-agent-list.tsx
Work:
- Remove the “No agents yet” createdAt label for empty workspaces (render empty/omitted createdAt instead).
- Align workspace row visuals with project row:
- remove border
- adjust padding
- reduce indentation (responsive: tighter on mobile)
C) Workspace screen: header title + unified “New tab”
Target file(s):
packages/app/src/screens/workspace/workspace-screen.tsx
Work:
- Header title uses branch name for git checkouts (including base branch).
- Replace separate “Create agent” vs “Create terminal” placement with one unified “New tab” control.
D) Workspace screen: provider icons + tab persistence
Target file(s):
packages/app/src/screens/workspace/workspace-screen.tsx- (potentially)
packages/app/src/stores/workspace-tabs-store.ts
Work:
- Agent tab icons render provider icon (Claude/Codex).
- Fix tab restore so requested/stored tabs are respected while data loads:
- do not redirect away from a requested tab just because lists haven’t populated yet
- do not overwrite stored tab selection with fallback while queries are pending
Verification Plan
Automated
npm run typecheck
npm run test --workspace=@getpaseo/app
Manual (agent-browser)
Using Metro web at http://localhost:8081:
- Sidebar drag:
- Expand a project, drag its heading above/below another project → confirm its workspaces stay grouped.
- Drag a workspace “across” another project → confirm after drop it remains under original project.
- Sidebar UI:
- Confirm workspace rows have no border and are less indented.
- Confirm no “No agents yet” labels.
- On mobile breakpoint, tap a workspace → sidebar closes.
- Workspace tabs:
- Confirm header shows branch name (including
main). - Confirm agent tabs show provider icons (Claude/Codex).
- Confirm there is one unified “New tab” control for both agent + terminal.
- Focus a terminal tab, switch to another workspace, switch back → terminal tab restored.
- Confirm header shows branch name (including
Non-goals
- No panel splitting implementation (just keep architecture compatible).
- No server protocol changes (daemon stays untouched on
:6767). - No additional persistence beyond what’s required to satisfy “remember focused tab”.