8c1948d226
Move the following completed changes from openspec/changes/ to openspec/changes/archive/2026-06-12-completed-changes-archive/: - multi-session-terminal-ux - reorganize-long-files - working-copies - workspace-first-ui Update parent and archive .pi-map*.md indexes to reflect the move and remove the transient active-changes-archive grouping. openspec/changes/ now contains only the archive/ directory.
8.7 KiB
8.7 KiB
Proposal: Workspace-First UI Refresh
Status
| Field | Value |
|---|---|
| Phase | Proposal |
| Based on | Working Copies Spec |
| Next | Spec |
Problem
The current UI has two competing "workspace" concepts:
- Old "Repository Workspace" (
repo-workspace.tsx): A file browser + editor + git toolbar view tied to a repository. This was the default view when opening a project. It reads files from the repo path directly and offers quick editing. - New "Workspace" (
workspaces.tsx): A list of persistent writable clones that tool instances mount. These are first-class entities with their own lifecycle.
These two concepts confuse users. The old workspace is redundant now that workspaces are persistent clones — users should work inside a workspace, not directly on the repo.
Additionally:
- The Projects page only shows a list of projects with "Open Workspace" links — no visibility into repos or workspaces
- Tool instances are spawned from the repo-workspace view, not from the workspace view
- Mobile layout of the old workspace is cramped and not well-suited for the new paradigm
Solution
Replace the old "Repository Workspace" with a Workspace-First navigation model:
New Information Architecture
Projects
└── Project Card (inline repos + workspaces)
└── Repo: "my-app"
├── Workspace: "main" → /workspaces/{id}
├── Workspace: "feature-auth" → /workspaces/{id}
└── [+ New Workspace]
Workspaces
└── All Workspaces (grid/list)
└── Workspace Card → /workspaces/{id}
Workspace Detail Page (/workspaces/:workspaceId)
The workspace detail page is the primary work surface. It replaces the old repo-workspace:
┌──────────────────────────────────────────────────────────────┐
│ {project} / {repo} / {workspace-name} [Start Tool ▼] │
├──────────────┬───────────────────────────────────────────────┤
│ │ Tabs: [Files] [Git] [Tools] │
│ File Tree ├───────────────────────────────────────────────┤
│ (workspace │ │
│ clone) │ {active tab content} │
│ │ │
│ 📁 src/ │ │
│ 📄 README │ │
│ │ │
├──────────────┤ │
│ Git Status │ │
│ (compact) │ │
└──────────────┴───────────────────────────────────────────────┘
Panels (collapsible, IDE-style):
- Files: File tree from workspace clone path + file viewer/editor
- Git: Commit panel, branch selector, push/pull/fetch actions (operating on workspace clone)
- Tools: List of active tool instances on this workspace + spawn new tool
Start Tool: Inline modal (not page navigation) to spawn a tool instance on this workspace.
Projects Page Refresh
Project cards now show:
- Project name + description
- Repositories (accordion/list)
- For each repo: its workspaces as clickable chips/cards
- "New Workspace" button per repo
┌─────────────────────────────────────────────┐
│ My Project │
│ A web application │
├─────────────────────────────────────────────┤
│ Repositories: │
│ │
│ ▼ my-app (git@github.com:...) │
│ ┌─────────┐ ┌─────────────┐ [+ New] │
│ │ main │ │ feature-auth│ │
│ │ ● 2 │ │ ● 0 │ │
│ └─────────┘ └─────────────┘ │
│ │
│ ▶ api-service │
│ ┌─────────┐ [+ New] │
│ │ main │ │
│ └─────────┘ │
└─────────────────────────────────────────────┘
Mobile Layout
Bottom tab bar (4 tabs):
- Files: Full-screen file tree + viewer
- Git: Compact commit panel + action buttons
- Tools: Instance list + spawn button
- Menu: Workspace switcher, settings
Swipe between tabs. File tree is always accessible.
Deleted
pages/repo-workspace.tsx— old repository workspace (file browser + editor on repo path)- Route
/projects/:projectId→ now shows project detail, not file browser - Old workspace header component
- Git toolbar component (replaced by panel in workspace detail)
Scope
In Scope
- New workspace detail page (
/workspaces/:workspaceId) - File browser reading from workspace clone path
- File viewer/editor for workspace files
- Git operations on workspace clone (status, commit, push, pull, fetch, branch)
- Tool instance list per workspace
- Inline tool spawn modal
- Collapsible IDE-style panels (desktop)
- Bottom tab bar layout (mobile)
- Projects page refresh (inline repos + workspaces)
- Workspace list page improvements (link to detail page)
- Backend: file endpoints for workspace path
- Backend: git endpoints for workspace path
- Delete old
repo-workspace.tsxand related components - Update routing
Out of Scope
- Git history / diff view (deferred, can reuse existing page)
- Workspace sharing between users
- Advanced IDE features (search, multi-file edit)
- Auto-sync on schedule
- Terminal integration inside workspace page
Decisions
| # | Question | Answer |
|---|---|---|
| 1 | Projects page → what happens on "Open"? | A — Show project detail with repos + workspaces inline |
| 2 | Workspace page layout? | C — Collapsible panels, IDE-style |
| 3 | File browser source? | Workspace clone path (/data/working-copies/{repo-id}/{name}/) |
| 4 | Git actions scope? | Workspace clone |
| 5 | Tool spawning? | Inline modal on workspace page |
| 6 | Mobile layout? | Bottom tab bar (Files / Git / Tools / Menu), swipeable |
| 7 | Old workspace fallback? | No fallback — delete immediately |
| 8 | Projects page detail level? | Inline workspace cards on project page |
Open Questions for Spec
- Should the workspace detail page URL be
/workspaces/:idor nested under project/repo? - Should we keep the sidebar Workspaces nav entry, or rely on Projects → Workspace flow?
- How does "New Workspace" flow work from Projects page — inline form or navigate to create page?
- Should workspace detail show repo remote URL and allow switching branches?
- What happens when a workspace has no tool instances yet — show empty state or prompt to spawn?
Risks
| Risk | Mitigation |
|---|---|
| Users confused by navigation change | Keep "Workspaces" in sidebar, add breadcrumbs |
| Large frontend refactor | Break into 3 PRs: backend endpoints, workspace detail page, projects refresh |
| Mobile layout complexity | Prototype with CSS grid first, test on actual device |
| Git operations on workspace path | Reuse existing git service, just change the path argument |
Success Criteria
- Old
repo-workspace.tsxis deleted /projects/:idshows project detail with repos and workspaces/workspaces/:idshows workspace detail with Files, Git, Tools panels- File browser reads from workspace clone path
- Git commit/push/pull work on workspace clone
- Tool spawn modal creates instance with workspace mounted
- Mobile layout uses bottom tabs
- All existing tests pass (or updated)
- ruff clean, TypeScript clean, eslint clean