#!/bin/bash set -euo pipefail # Create a git worktree for issue work or PR review # # Usage: # ./create-worktree.sh issue # ./create-worktree.sh review # # Returns: Absolute path to created worktree (stdout) MODE="$1" REPO_PATH=$(git rev-parse --show-toplevel 2>/dev/null || pwd) REPO_NAME=$(basename "$REPO_PATH") WORKTREES_DIR="${REPO_PATH}/../worktrees" # Ensure worktrees directory exists mkdir -p "$WORKTREES_DIR" # Fetch latest from origin cd "$REPO_PATH" git fetch origin >/dev/null 2>&1 case "$MODE" in issue) ISSUE_NUMBER="$2" WORKTREE_NAME="${REPO_NAME}-issue-${ISSUE_NUMBER}" WORKTREE_PATH="${WORKTREES_DIR}/${WORKTREE_NAME}" # Get issue title for branch name (tea issues output has title on line 2: " # #1 Title here") ISSUE_TITLE=$(tea issues "$ISSUE_NUMBER" 2>/dev/null | sed -n '2p' | sed 's/.*#[0-9]* //' | xargs || echo "untitled") # Create safe branch name BRANCH_NAME="issue-${ISSUE_NUMBER}-$(echo "$ISSUE_TITLE" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr -cd '[:alnum:]-' | cut -c1-50)" # Remove worktree if it already exists if [ -d "$WORKTREE_PATH" ]; then git worktree remove "$WORKTREE_PATH" --force 2>/dev/null || true fi # Delete branch if it exists git branch -D "$BRANCH_NAME" 2>/dev/null || true # Create worktree with new branch from main git worktree add "$WORKTREE_PATH" -b "$BRANCH_NAME" origin/main >/dev/null 2>&1 echo "$WORKTREE_PATH" ;; review) PR_NUMBER="$2" BRANCH_NAME="$3" WORKTREE_NAME="${REPO_NAME}-review-${PR_NUMBER}" WORKTREE_PATH="${WORKTREES_DIR}/${WORKTREE_NAME}" # Remove worktree if it already exists if [ -d "$WORKTREE_PATH" ]; then git worktree remove "$WORKTREE_PATH" --force 2>/dev/null || true fi # Create worktree from existing branch git worktree add "$WORKTREE_PATH" "origin/${BRANCH_NAME}" >/dev/null 2>&1 echo "$WORKTREE_PATH" ;; *) echo "Error: Invalid mode '$MODE'. Use 'issue' or 'review'" >&2 echo "Usage:" >&2 echo " $0 issue " >&2 echo " $0 review " >&2 exit 1 ;; esac