# Proposal: Workspace-Based Tool Instances ## Status | Field | Value | |---|---| | Phase | **Proposal** | | Based on | [Explore](explore.md) | | Next | Spec | ## Decisions from Explore | Decision | Value | |---|---| | **Name** | "Workspace" (supersedes existing workspace.md) | | **Scope** | Unlimited workspaces per repository | | **Auto-create** | No — explicit creation only | | **Default branch** | Main/master or user-selected at creation time | | **Delete with running instances** | Allowed with confirmation; stops and deletes all associated tool instances | | **Name uniqueness** | Unique per project+repo (derived from project and repo names) | | **Deleted remote branch** | On sync/update, detect and ask for confirmation to delete local workspace/branch | ## Problem Statement The current tool instance creation requires users to choose between "mount" (read-only) and "clone" (writable but ephemeral) modes. This is confusing and leads to either: - **Mount mode**: Tools open files read-only, frustrating editing - **Clone mode**: Each instance clones the repo, wasting disk space and losing work on deletion ## Proposed Solution Introduce **Workspaces** as first-class entities: persistent, writable local clones of a repository that exist independently of tool instances. Users create workspaces explicitly, then start tool instances *on* a workspace. ### Entity Relationship ``` Project └── GitRepository (canonical source) └── Workspace (writable clone, unlimited per repo) └── ToolInstance (mounts workspace path) ``` ### Key Behaviors 1. **Workspace Creation**: User selects a repository → picks a branch → names the workspace → clone is created on disk 2. **Tool Instance Creation**: User selects a workspace → picks a tool type → instance starts with workspace mounted 3. **Multiple Tools per Workspace**: Several tool instances can share the same workspace (e.g., terminal + code-server) 4. **Persistence**: Workspaces survive tool instance deletion 5. **No Auto-Create**: Users must explicitly create workspaces; no magic default workspace ### UI Changes - **New sidebar entry**: "Workspaces" (between "Projects" and "Settings") - **Workspaces page**: List of all workspaces with repo/branch/status info - **Create workspace flow**: Repo picker → branch picker → name input - **Start tool from workspace**: Tool picker modal from workspace card - **Simplified tool creation**: Remove "clone mode" / "mount mode" toggle; always use workspace ### Database Changes New table: `workspaces` - `id` (UUID, PK) - `name` (string, user-defined) - `repo_id` (UUID, FK → git_repositories) - `user_id` (UUID, FK → users) - `branch` (string) - `path` (string, absolute disk path) - `status` (enum: ready, syncing, error) - `created_at`, `updated_at` Updated: `tool_instances` - Add `workspace_id` (UUID, FK → workspaces, nullable for migration) - Remove `clone_mode` (deprecated) - Remove `branch` (moved to workspace) ### File System Layout ``` /data/working-copies/ └── {repo-id}/ └── {workspace-name}/ └── .git/ └── [repo files] ``` ### Migration Strategy Existing `clone_mode` instances: - Extract cloned repo from instance directory - Move to `/data/working-copies/{repo-id}/{instance-name}/` - Create Workspace record - Update instance to reference workspace - Remove `clone_mode` flag Existing `mount_mode` instances: - On next start, create a workspace from the canonical repo - Switch instance to use workspace - Remove `clone_mode` flag ### Out of Scope - Auto-sync with canonical repo - Git push/pull/branch UI - Workspace sharing between users - Pre-created default workspaces - Read-only workspace mode ## Risks | Risk | Mitigation | |---|---| | Existing users with many clone_mode instances | One-time migration on instance restart | | Disk space from many workspaces | User-managed; can delete workspaces | | Workspace deleted while instances are running | Allowed with confirmation; cascade-delete tool instances | | Name collisions for workspace names | Unique per project+repo; derived from project and repo names | ## Acceptance Criteria - [ ] User can create a workspace from any repository - [ ] User can create unlimited workspaces per repository - [ ] Tool instances mount the workspace path, not the canonical repo path - [ ] Multiple tool instances can share one workspace - [ ] Workspaces persist after tool instance deletion - [ ] Existing clone_mode instances migrate to workspace on restart - [ ] UI no longer shows "mount vs clone" toggle - [ ] New sidebar navigation "Workspaces" exists ## Open Questions for Spec 1. ~~Should workspace deletion cascade-delete associated tool instances, or block?~~ **Answered**: Allowed with confirmation; cascade-delete tool instances 2. ~~Should workspace names be unique per-repo or globally unique?~~ **Answered**: Unique per project+repo; derived from project and repo names 3. ~~How do we handle the case where a workspace's branch is deleted from the remote?~~ **Answered**: On sync/update, detect and ask for confirmation to delete local workspace/branch 4. Should we validate the repo path exists before creating a workspace?