Files
Developer 8c1948d226 chore: archive final 4 completed OpenSpec changes
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.
2026-06-12 21:11:11 +00:00

185 lines
8.7 KiB
Markdown

# Proposal: Workspace-First UI Refresh
## Status
| Field | Value |
|---|---|
| Phase | **Proposal** |
| Based on | [Working Copies Spec](../working-copies/spec.md) |
| Next | Spec |
## Problem
The current UI has two competing "workspace" concepts:
1. **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.
2. **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.tsx` and 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
1. Should the workspace detail page URL be `/workspaces/:id` or nested under project/repo?
2. Should we keep the sidebar Workspaces nav entry, or rely on Projects → Workspace flow?
3. How does "New Workspace" flow work from Projects page — inline form or navigate to create page?
4. Should workspace detail show repo remote URL and allow switching branches?
5. 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.tsx` is deleted
- [ ] `/projects/:id` shows project detail with repos and workspaces
- [ ] `/workspaces/:id` shows 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