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.
5.2 KiB
5.2 KiB
Tasks: Workspace-Based Tool Instances
Status
| Field | Value |
|---|---|
| Phase | Tasks |
| Based on | Design |
| Next | Apply |
PR Breakdown
PR-1: Backend Foundation
Scope: Database migration, models, services, API endpoints for workspaces Est. lines: ~800 backend, ~300 tests Files touched: 8 new, 2 modified
Tasks:
- Create Alembic migration for
workspacestable +workspace_idontool_instances - Create
Workspacemodel (apps/api/src/models/workspace.py) - Add
workspace_idtoToolInstancemodel (nullable FK) - Create
GitService(apps/api/src/services/git_service.py) — clone, fetch, pull, branch_exists_remotely - Create
WorkspaceManager(apps/api/src/services/workspace_manager.py) — create, delete, sync - Create workspace API router (
apps/api/src/api/workspaces.py) — CRUD + sync endpoints - Add workspace routes to FastAPI app (
apps/api/src/main.py) - Write unit tests for GitService
- Write integration tests for workspace CRUD
- Write integration tests for delete-with-instances (409 behavior)
- Write integration tests for sync-with-deleted-branch (409 behavior)
PR-2: Backend Integration
Scope: Tool instance creation/start uses workspace instead of repo path Est. lines: ~400 backend, ~200 tests Files touched: 3 modified
Tasks:
- Update
create_instanceendpoint to acceptworkspace_idinstead ofclone_mode - Update
start_instanceto mount workspace path (workspace.path) instead of repo path - Update compose generation to use
WORKSPACE_PATHvariable - Update
tool_instances.pycompose template rendering - Write integration tests for instance creation with workspace
- Write integration tests for instance start with workspace mount
- Verify old mount_mode instances still work (backward compat)
PR-3: Frontend Core
Scope: Workspaces UI — list, create, card, actions Est. lines: ~1,200 frontend, ~400 tests Files touched: 10 new, 2 modified
Tasks:
- Create workspace types (
apps/web/src/types/workspace.ts) - Create workspace API client (
apps/web/src/api/workspaces.ts) - Create
useWorkspaceshook (apps/web/src/hooks/use-workspaces.ts) - Create
useWorkspaceActionshook (apps/web/src/hooks/use-workspace-actions.ts) - Create
WorkspaceCardcomponent (apps/web/src/components/workspace-card.tsx) - Create
WorkspaceCreateFormcomponent (apps/web/src/components/workspace-create-form.tsx) - Create
StartToolModalcomponent (apps/web/src/components/start-tool-modal.tsx) - Create
WorkspacesPage(apps/web/src/pages/workspaces.tsx) - Update
Sidebarto add Workspaces nav item - Update router/routes to include
/workspaces - Write component tests for WorkspaceCard
- Write hook tests for useWorkspaceActions
- Write tests for create form validation
PR-4: Frontend Integration
Scope: Update existing flows to use workspaces, dashboard integration Est. lines: ~600 frontend, ~200 tests Files touched: 5 modified
Tasks:
- Update
CreateSessionFormto use workspace picker instead of repo+clone_mode - Update
SessionsPagedashboard to show workspaces section - Update
SessionCardto show workspace name instead of clone mode - Update
useInstanceActionsto passworkspace_idon create - Remove clone_mode/mount_mode UI toggles
- Update types to remove deprecated
clone_modefield - Write integration tests for full create-workspace → start-tool flow
- Write tests for dashboard workspaces section
Acceptance Criteria (All PRs)
- User can create a workspace from any repository
- User can create unlimited workspaces per repository
- Workspace names are unique per repo
- Tool instances mount the workspace path
- Multiple tool instances can share one workspace
- Workspaces persist after tool instance deletion
- Deleting a workspace with running instances shows confirmation, stops and deletes instances
- Syncing a workspace with a deleted remote branch shows confirmation
- UI no longer shows "mount vs clone" toggle
- New sidebar navigation "Workspaces" exists
- All existing tests still pass
- ruff clean
- TypeScript compilation clean
Implementation Order
PR-1 (Backend Foundation)
→ PR-2 (Backend Integration)
→ PR-3 (Frontend Core)
→ PR-4 (Frontend Integration)
Each PR depends on the previous. No parallel work.
Verification Steps per PR
PR-1
cd apps/api
alembic upgrade head
pytest tests/unit/test_git_service.py tests/integration/test_workspaces.py -v
python -m ruff check src/services/git_service.py src/services/workspace_manager.py src/api/workspaces.py
PR-2
cd apps/api
pytest tests/integration/test_tool_instances_with_workspace.py -v
python -m ruff check src/api/tool_instances.py
PR-3
cd apps/web
npm run test -- --run workspaces
npx tsc --noEmit
npx eslint src/pages/workspaces.tsx src/components/workspace-*.tsx
PR-4
cd apps/web
npm run test -- --run sessions create-session
npx tsc --noEmit
npx eslint src/pages/sessions.tsx src/components/create-session-form.tsx