mirror of
https://github.com/samsonjs/vibetunnel.git
synced 2026-04-12 12:25:53 +00:00
194 lines
No EOL
5.5 KiB
Markdown
194 lines
No EOL
5.5 KiB
Markdown
# Git Worktree Follow Mode Specification
|
|
|
|
## Overview
|
|
|
|
Follow mode is a feature that enables automatic synchronization between Git worktrees and the main repository. It ensures team members stay on the same branch by automatically switching branches when changes are detected.
|
|
|
|
## Core Concept
|
|
|
|
Follow mode creates a **unidirectional sync** from a worktree to the main repository:
|
|
- When someone switches branches in a worktree
|
|
- The main repository automatically follows that branch change
|
|
- This keeps the main repository synchronized with active development
|
|
|
|
## When Follow Mode Should Be Available
|
|
|
|
### ✅ Follow Mode SHOULD appear when:
|
|
|
|
1. **Creating a session in a worktree**
|
|
- You've selected a worktree from the dropdown
|
|
- The session will run in that worktree's directory
|
|
- Follow mode will sync the main repository to match this worktree's branch
|
|
|
|
2. **Viewing worktrees in the Worktree Manager**
|
|
- Each worktree (except main) shows a "Follow" button
|
|
- Enables following that specific worktree's branch
|
|
|
|
3. **Session list with worktree sessions**
|
|
- Repository headers show follow mode status
|
|
- Dropdown allows changing which worktree to follow
|
|
|
|
### ❌ Follow Mode should NOT appear when:
|
|
|
|
1. **No worktree is selected** (using main repository)
|
|
- There's nothing to follow - you're already in the main repo
|
|
- Follow mode has no purpose without a worktree
|
|
|
|
2. **Repository has no worktrees**
|
|
- No worktrees exist to follow
|
|
- Only the main repository is available
|
|
|
|
3. **Not in a Git repository**
|
|
- Obviously, no Git features available
|
|
|
|
## UI Behavior Rules
|
|
|
|
### Session Creation Form
|
|
|
|
```typescript
|
|
// Show follow mode toggle only when:
|
|
const showFollowModeToggle =
|
|
gitRepoInfo?.isGitRepo &&
|
|
selectedWorktree !== undefined &&
|
|
selectedWorktree !== 'none';
|
|
```
|
|
|
|
#### Toggle States:
|
|
|
|
1. **Worktree Selected**:
|
|
- Show: "Follow Mode" toggle
|
|
- Description: "Keep main repository in sync with this worktree"
|
|
- Default: OFF (user must explicitly enable)
|
|
|
|
2. **No Worktree Selected**:
|
|
- Hide the entire follow mode section
|
|
- No toggle should be visible
|
|
|
|
3. **Follow Mode Already Active**:
|
|
- Show: "Follow Mode" toggle (disabled)
|
|
- Description: "Currently following: [branch-name]"
|
|
- Info: User must disable from worktree manager
|
|
|
|
### Worktree Manager
|
|
|
|
Each worktree row shows:
|
|
- **"Follow" button**: When not currently following
|
|
- **"Following" button** (green): When actively following this worktree
|
|
- **No button**: For the main worktree (can't follow itself)
|
|
|
|
### Session List
|
|
|
|
Repository headers show:
|
|
- **Purple badge**: When follow mode is active, shows branch name
|
|
- **Dropdown**: To change follow mode settings per repository
|
|
|
|
## Technical Implementation
|
|
|
|
### State Logic
|
|
|
|
```typescript
|
|
// Follow mode is only meaningful when:
|
|
// 1. We have a worktree to follow
|
|
// 2. We're not already in that worktree
|
|
// 3. The main repo can switch to that branch
|
|
|
|
const canEnableFollowMode = (
|
|
worktree: Worktree,
|
|
currentLocation: string,
|
|
mainRepoPath: string
|
|
) => {
|
|
// Can't follow if we're in the main repo with no worktree selected
|
|
if (currentLocation === mainRepoPath && !worktree) {
|
|
return false;
|
|
}
|
|
|
|
// Can't follow the main worktree
|
|
if (worktree.isMainWorktree) {
|
|
return false;
|
|
}
|
|
|
|
// Can follow if we're creating a session in a worktree
|
|
if (worktree && currentLocation === worktree.path) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
```
|
|
|
|
### Configuration Storage
|
|
|
|
Follow mode state is stored in Git config:
|
|
```bash
|
|
# Enable follow mode for a branch
|
|
git config vibetunnel.followBranch "feature/new-ui"
|
|
|
|
# Check current follow mode
|
|
git config vibetunnel.followBranch
|
|
|
|
# Disable follow mode
|
|
git config --unset vibetunnel.followBranch
|
|
```
|
|
|
|
### Synchronization Rules
|
|
|
|
1. **Automatic Sync**:
|
|
- Triggered by `post-checkout` git hook in worktrees
|
|
- Only syncs if main repo has no uncommitted changes
|
|
- Disables follow mode if branches have diverged
|
|
|
|
2. **Manual Override**:
|
|
- Users can always manually switch branches
|
|
- Follow mode doesn't prevent manual git operations
|
|
- Re-enables when returning to the followed branch
|
|
|
|
## User Experience Guidelines
|
|
|
|
### Clear Messaging
|
|
|
|
1. **When Enabling**:
|
|
- "Follow mode will keep your main repository on the same branch as this worktree"
|
|
- "Enable to automatically sync branch changes"
|
|
|
|
2. **When Active**:
|
|
- "Following worktree: feature/new-ui"
|
|
- "Main repository syncs with this worktree's branch"
|
|
|
|
3. **When Disabled**:
|
|
- "Follow mode disabled due to uncommitted changes"
|
|
- "Branches have diverged - follow mode disabled"
|
|
|
|
### Visual Indicators
|
|
|
|
- **Toggle Switch**: Only visible when applicable
|
|
- **Status Badge**: Purple badge with branch name when active
|
|
- **Button States**: Clear "Follow"/"Following" states in worktree manager
|
|
|
|
## Error Handling
|
|
|
|
### Common Scenarios
|
|
|
|
1. **Uncommitted Changes**:
|
|
- Disable follow mode automatically
|
|
- Show notification to user
|
|
- Don't lose any work
|
|
|
|
2. **Branch Divergence**:
|
|
- Detect when branches have different commits
|
|
- Disable follow mode to prevent conflicts
|
|
- Notify user of the situation
|
|
|
|
3. **Worktree Deletion**:
|
|
- Automatically disable follow mode
|
|
- Clean up git config
|
|
- Update UI immediately
|
|
|
|
## Summary
|
|
|
|
Follow mode should be:
|
|
- **Contextual**: Only shown when it makes sense
|
|
- **Safe**: Never causes data loss or conflicts
|
|
- **Clear**: Users understand what it does
|
|
- **Automatic**: Works in the background when enabled
|
|
|
|
The key principle: **Follow mode only exists when there's a worktree to follow**. Without a worktree selection, the feature should not be visible or accessible. |