Git worktree workflow for parallel development with isolated branches per issue
All AI agents working on the CSKU Lab super-app MUST use git worktrees for development. This ensures isolation, prevents conflicts, and enables parallel work across multiple services.
.worktrees/
├── main-server-feat-123-abc123/ (Agent-1 on issue #123)
├── main-server-feat-124-def456/ (Agent-1 on issue #124)
├── config-server-feat-123-ghi789/ (Agent-2 on issue #123)
├── go-grader-feat-123-jkl012/ (Agent-3 on issue #123)
└── ...
Format: {service}-feat-{issue-number}-{unique-id}
service: main-server, go-grader, config-server, task-server, isolate-docker, web, api-docsissue-number: GitHub issue ID (e.g., #123 → 123)unique-id: Short hash for collision preventionFormat in worktree: feat/{issue}-{service}/{description}
Examples:
feat/123-main-server/add-user-authfeat/124-config-server/fix-redis-cachefeat/123-web/implement-settings-uiWhen routing to specialists:
# Create worktree for each service needed
./scripts/worktree.sh create main-server feat/123-main-server
./scripts/worktree.sh create config-server feat/123-config-server
# Output:
# ✅ Worktree created: .worktrees/main-server-feat-123-abc123/
# ✅ Worktree created: .worktrees/config-server-feat-123-def456/
Coordinator provides:
.worktrees/main-server-feat-123-abc123/# Enter worktree
cd .worktrees/main-server-feat-123-abc123/
# Verify correct branch
git branch -v
# * feat/123-main-server/add-user-auth
# Make changes
# ... implement feature ...
# Commit with proper format
git add .
git commit -m "feat(main-server): add user authentication
- Add JWT token generation
- Implement auth middleware
- Add user session management
Closes #123"
# Push to remote
git push -u origin feat/123-main-server/add-user-auth
From the branch created in worktree:
QA reviews PR(s) from worktree branches using standard checklist.
After approval, PR is merged to target branch.
After merge and QA approval:
# Remove worktree safely
./scripts/worktree.sh remove main-server main-server-feat-123-abc123
# Output:
# ✅ Worktree removed: .worktrees/main-server-feat-123-abc123/
Issue #123: Fix user authentication in main-server
Issue #123
↓
1 worktree created: main-server-feat-123-{id}
1 agent works in it
1 PR created
Issue #124: Add OAuth support
Issue #124
├─ 3 worktrees created (all isolated):
│ ├─ main-server-feat-124-{id} (Agent-1)
│ ├─ config-server-feat-124-{id} (Agent-2)
│ └─ web-feat-124-{id} (Agent-3)
│
├─ Agents work independently (no conflicts)
│
└─ 3 PRs created in parallel
Complex testing: Need to test 2 implementations of same feature
# Create multiple worktrees for same service
./scripts/worktree.sh create main-server feat/125-main-server-v1
./scripts/worktree.sh create main-server feat/125-main-server-v2
# Agent can test both implementations:
# - .worktrees/main-server-feat-125-v1-{id}/
# - .worktrees/main-server-feat-125-v2-{id}/
Verify worktree location (provided by coordinator):
cd {worktree-path}
git branch -v # Confirm correct branch
Always work within assigned worktree:
git checkout or git pull on parent repoUse correct branch naming:
feat/{issue}-{service}/{description}Make changes normally:
# Edit files
git add .
git commit -m "feat(service): description"
git push -u origin feat/{issue}-{service}/{description}
Follow commit format:
Test locally:
cd {worktree-path}
go test ./... # For Go services
npm test # For web/frontend
Create PR from pushed branch:
feat/{issue}-{service}/{description}Wait for QA approval:
.git/ or worktree structure# For each service involved in issue
./scripts/worktree.sh create {service} feat/{issue}-{service}
# Examples:
./scripts/worktree.sh create main-server feat/123-main-server
./scripts/worktree.sh create config-server feat/123-config-server
./scripts/worktree.sh create web feat/123-web
Output: Worktree path to assign to agent
# List all active worktrees
./scripts/worktree.sh list
# List worktrees for specific service
./scripts/worktree.sh list --service main-server
# Check status
git worktree list
After PR merge AND QA approval:
# Wait 5 minutes for final testing confirmation
# Remove each worktree
./scripts/worktree.sh remove main-server main-server-feat-123-{id}
./scripts/worktree.sh remove config-server config-server-feat-123-{id}
# Post comment on GitHub issue
gh issue comment 123 -b "✅ Worktrees cleaned up. Ready for deployment."
If worktree is actively being used:
# Prevent accidental deletion
./scripts/worktree.sh lock main-server main-server-feat-123-{id}
# When work done
./scripts/worktree.sh unlock main-server main-server-feat-123-{id}
All worktree operations use ./scripts/worktree.sh:
./scripts/worktree.sh create <service> <branch-name> [--force]
# Creates: .worktrees/{service}-{branch-name}-{timestamp}/
# Returns: Full path to worktree
# Options:
# --force: Skip confirmations
./scripts/worktree.sh list [--service <service>]
# Output: Table of all worktrees or filtered
# Shows: service | branch | path | status | locked
./scripts/worktree.sh remove <service> <worktree-name> [--force]
# Safely removes worktree
# Checks: clean working directory, not locked
# Options:
# --force: Skip confirmations (use with caution)
./scripts/worktree.sh lock <service> <worktree-name>
./scripts/worktree.sh unlock <service> <worktree-name>
# Lock: Prevents accidental removal during work
# Unlock: Allows removal after work complete
./scripts/worktree.sh cleanup-all --older-than <hours>
# Example: Remove inactive worktrees older than 72 hours
./scripts/worktree.sh cleanup-all --older-than 72h
cd .worktrees/main-server-feat-123-{id}/
# Install dependencies
go mod download
# Run hot reload development
air
# Run tests
go test ./...
# Build
go build -o bin/main-server ./cmd
cd .worktrees/web-feat-123-{id}/
# Install dependencies
npm install
# Run development server
npm run dev
# Run tests
npm test
# Build
npm run build
From parent repo:
# Use compose.sh with worktree paths
./compose.sh up
# Services read code from their worktrees
# (if using worktree paths in service volumes)
Problem: ./scripts/worktree.sh create fails with "branch already exists"
Solution:
# Check if worktree already created
./scripts/worktree.sh list --service main-server
# Use existing worktree instead
# Or force create:
./scripts/worktree.sh create main-server feat/123-main-server --force
Problem: Worktree is locked, can't remove
Solution:
# Check if locked
./scripts/worktree.sh list | grep main-server
# Unlock it
./scripts/worktree.sh unlock main-server main-server-feat-123-{id}
# Then remove
./scripts/worktree.sh remove main-server main-server-feat-123-{id}
Problem: Can't remove worktree with dirty state
Solution:
# Go to worktree
cd .worktrees/main-server-feat-123-{id}/
# Stash or commit changes
git stash
# OR
git add . && git commit -m "WIP: checkpoint"
# Then remove from parent
cd ../..
./scripts/worktree.sh remove main-server main-server-feat-123-{id}
Problem: In wrong branch inside worktree
Solution:
cd .worktrees/main-server-feat-123-{id}/
# Check current branch
git branch -v
# Should be on feat/123-main-server/...
# If not, you may be in wrong worktree
# Verify path matches assignment
Problem: Coordinator can't find worktree to remove
Solution:
# List all worktrees to find exact name
./scripts/worktree.sh list
# Get exact name (with timestamp)
# Use in remove command:
./scripts/worktree.sh remove main-server main-server-feat-123-EXACT-ID
git branch -vlist command to track all agentsThe first time you run ./setup.sh:
# Automatic conversion happens
./setup.sh
# Output:
# 🔄 Converting submodules to git worktrees (first time setup)...
# ✅ main-server: .worktrees/main-server-develop-20260328/
# ✅ go-grader: .worktrees/go-grader-develop-20260328/
# ✅ config-server: .worktrees/config-server-develop-20260328/
# ✅ task-server: .worktrees/task-server-develop-20260328/
# ✅ isolate-docker: .worktrees/isolate-docker-develop-20260328/
# ✅ web: .worktrees/web-develop-20260328/
# ✅ api-docs: .worktrees/api-docs-main-20260328/
#
# 7 worktrees created successfully.
# .gitignore updated to exclude .worktrees/
# ✅ Worktree migration complete!
No manual steps required - automatic and seamless.
REQUIRED for all agents:
REQUIRED for coordinators:
Benefits:
Load this skill: skill({ name: "git-worktree" })
Helper script: ./scripts/worktree.sh
Documentation: See AGENTS.md and COORDINATOR-WORKFLOW.md