137 lines
4.2 KiB
Bash
Executable file
137 lines
4.2 KiB
Bash
Executable file
#!/bin/bash
|
|
# verify-worktree-location - Verify we're in a worktree, not main directory
|
|
#
|
|
# Purpose: Prevent agents from making changes in the main directory
|
|
# Usage: ./.git-hooks/verify-worktree-location
|
|
#
|
|
# Installation: Copy to .git-hooks/verify-worktree-location and chmod +x
|
|
#
|
|
# Exit codes:
|
|
# 0 - In a worktree (safe to proceed)
|
|
# 1 - In main directory (BLOCKED)
|
|
# 2 - Unknown location (warning)
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Function: Print colored message
|
|
log_info() { echo -e "${GREEN}[✓]${NC} $1"; }
|
|
log_warn() { echo -e "${YELLOW}[⚠]${NC} $1"; }
|
|
log_error() { echo -e "${RED}[✗]${NC} $1"; }
|
|
log_blocked() { echo -e "${RED}[BLOCKED]${NC} $1"; }
|
|
|
|
# Get current directory and project info
|
|
CURRENT_DIR=$(pwd)
|
|
|
|
# Detect project root and name dynamically
|
|
PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || echo "")
|
|
PROJECT_NAME=$(basename "$PROJECT_ROOT")
|
|
PROJECT_PARENT=$(dirname "$PROJECT_ROOT")
|
|
WORKTREE_ROOT="${PROJECT_PARENT}/${PROJECT_NAME}-worktrees"
|
|
|
|
# Check if we're in a worktree
|
|
is_in_worktree() {
|
|
# Method 1: Check if path contains -worktrees/
|
|
if [[ "$CURRENT_DIR" == *"-worktrees/"* ]]; then
|
|
return 0
|
|
fi
|
|
|
|
# Method 2: Check git worktree list
|
|
if git rev-parse --git-dir 2>/dev/null | grep -q "worktrees"; then
|
|
return 0
|
|
fi
|
|
|
|
return 1
|
|
}
|
|
|
|
# Extract stream name from worktree path
|
|
get_stream_name() {
|
|
# Try to extract from path like /path/project-worktrees/stream-XX-name/...
|
|
echo "$CURRENT_DIR" | grep -oP '[^/]*-worktrees/\K[^/]+' || echo "unknown"
|
|
}
|
|
|
|
# Check if we're in a worktree
|
|
if is_in_worktree; then
|
|
STREAM_NAME=$(get_stream_name)
|
|
|
|
log_info "Worktree verification: PASSED"
|
|
log_info "Location: $CURRENT_DIR"
|
|
log_info "Stream: $STREAM_NAME"
|
|
|
|
# Verify we're on the correct branch
|
|
CURRENT_BRANCH=$(git branch --show-current)
|
|
if [[ "$CURRENT_BRANCH" == "$STREAM_NAME" ]]; then
|
|
log_info "Branch: $CURRENT_BRANCH (matches worktree)"
|
|
else
|
|
log_warn "Branch: $CURRENT_BRANCH (expected: $STREAM_NAME)"
|
|
log_warn "You may be on the wrong branch!"
|
|
fi
|
|
|
|
echo ""
|
|
log_info "Safe to proceed with development work."
|
|
exit 0
|
|
|
|
elif [[ "$CURRENT_DIR" == "$PROJECT_ROOT"* ]] && [[ "$CURRENT_DIR" != *"-worktrees"* ]]; then
|
|
# We're in the main directory - BLOCK
|
|
log_blocked "========================================="
|
|
log_blocked "LOCATION VERIFICATION FAILED"
|
|
log_blocked "========================================="
|
|
log_error ""
|
|
log_error "You are in the MAIN directory:"
|
|
log_error " Current: $CURRENT_DIR"
|
|
log_error " Project: $PROJECT_NAME"
|
|
log_error ""
|
|
log_error "Expected worktree pattern:"
|
|
log_error " ${WORKTREE_ROOT}/stream-XX-name"
|
|
log_error ""
|
|
log_error "Making changes in the main directory will result in:"
|
|
log_error " - Agent collisions"
|
|
log_error " - Work being staged/stashed and lost"
|
|
log_error " - Merge conflicts between concurrent agents"
|
|
log_error ""
|
|
log_error "Action required:"
|
|
log_error " 1. Navigate to existing worktree:"
|
|
log_error " cd ${WORKTREE_ROOT}/stream-XX-name"
|
|
log_error ""
|
|
log_error " 2. Or create new worktree:"
|
|
log_error " git worktree add ${WORKTREE_ROOT}/stream-XX-name -b stream-XX-name"
|
|
log_error ""
|
|
log_error " 3. Then verify location:"
|
|
log_error " ./.git-hooks/verify-worktree-location"
|
|
log_error ""
|
|
log_blocked "========================================="
|
|
|
|
exit 1
|
|
|
|
else
|
|
# Unknown location
|
|
log_warn "========================================="
|
|
log_warn "LOCATION VERIFICATION: UNKNOWN"
|
|
log_warn "========================================="
|
|
log_warn ""
|
|
log_warn "Current directory: $CURRENT_DIR"
|
|
log_warn ""
|
|
log_warn "This doesn't match expected patterns:"
|
|
log_warn " - Worktree: ${WORKTREE_ROOT}/stream-*"
|
|
log_warn " - Main: $PROJECT_ROOT"
|
|
log_warn ""
|
|
log_warn "If you're working on a stream, you should be in a worktree."
|
|
log_warn "If this is intentional (e.g., documentation, scripts), you may proceed."
|
|
log_warn ""
|
|
|
|
# Check if git repo
|
|
if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then
|
|
CURRENT_BRANCH=$(git branch --show-current)
|
|
log_warn "Current branch: $CURRENT_BRANCH"
|
|
fi
|
|
|
|
log_warn "========================================="
|
|
|
|
exit 2
|
|
fi
|