Initial Auto-Build plugin structure

This commit is contained in:
2025-12-21 23:29:55 +02:00
commit 7e4912add2
30 changed files with 3274 additions and 0 deletions

View File

@@ -0,0 +1,108 @@
#!/bin/bash
# Cleanup git worktrees
# Usage: worktree-cleanup.sh [feature-name]
# If no feature-name provided, lists candidates for cleanup
set -e
FEATURE_NAME="$1"
# Get project root (parent of .auto-build)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
PROJECT_NAME=$(basename "$PROJECT_ROOT")
WORKTREES_DIR="$(dirname "$PROJECT_ROOT")/ab-worktrees"
echo "========================================"
echo " Worktree Cleanup"
echo "========================================"
echo ""
cd "$PROJECT_ROOT"
# If specific feature provided, cleanup that one
if [ -n "$FEATURE_NAME" ]; then
BRANCH_NAME="feature/ab-${FEATURE_NAME}"
WORKTREE_PATH="${WORKTREES_DIR}/${PROJECT_NAME}-${FEATURE_NAME}"
echo "Cleaning up: $FEATURE_NAME"
echo " Branch: $BRANCH_NAME"
echo " Path: $WORKTREE_PATH"
echo ""
# Check if worktree exists
if [ ! -d "$WORKTREE_PATH" ]; then
echo "Worktree not found at: $WORKTREE_PATH"
exit 1
fi
# Check if branch is merged
MAIN_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main")
if git branch --merged "$MAIN_BRANCH" | grep -q "$BRANCH_NAME"; then
echo "Branch is merged to $MAIN_BRANCH"
else
echo "Warning: Branch is NOT merged to $MAIN_BRANCH"
echo "Proceed with cleanup? (y/n)"
read -r CONFIRM
if [ "$CONFIRM" != "y" ]; then
echo "Aborted"
exit 0
fi
fi
# Remove worktree
echo "Removing worktree..."
git worktree remove "$WORKTREE_PATH" --force
# Remove branch
echo "Removing branch..."
git branch -D "$BRANCH_NAME" 2>/dev/null || echo "Branch already removed or doesn't exist"
# Update registry
REGISTRY_FILE="$PROJECT_ROOT/.auto-build-data/worktrees/worktree-registry.json"
if [ -f "$REGISTRY_FILE" ] && command -v jq &> /dev/null; then
TEMP_FILE=$(mktemp)
jq --arg name "$FEATURE_NAME" '.worktrees |= map(select(.name != $name))' "$REGISTRY_FILE" > "$TEMP_FILE" && mv "$TEMP_FILE" "$REGISTRY_FILE"
echo "Registry updated"
fi
echo ""
echo "Cleanup complete!"
else
# List all worktrees and show which can be cleaned up
echo "Checking worktrees for cleanup..."
echo ""
MAIN_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main")
echo "Merged branches (safe to cleanup):"
MERGED_BRANCHES=$(git branch --merged "$MAIN_BRANCH" | grep "feature/ab-" || echo "")
if [ -n "$MERGED_BRANCHES" ]; then
echo "$MERGED_BRANCHES" | while read -r branch; do
FEATURE=$(echo "$branch" | sed 's/.*feature\/ab-//')
echo " - $FEATURE"
done
else
echo " (none)"
fi
echo ""
echo "Unmerged branches:"
UNMERGED_BRANCHES=$(git branch --no-merged "$MAIN_BRANCH" | grep "feature/ab-" || echo "")
if [ -n "$UNMERGED_BRANCHES" ]; then
echo "$UNMERGED_BRANCHES" | while read -r branch; do
FEATURE=$(echo "$branch" | sed 's/.*feature\/ab-//')
echo " - $FEATURE (NOT merged)"
done
else
echo " (none)"
fi
echo ""
echo "To cleanup a specific worktree:"
echo " bash .auto-build/scripts/worktree-cleanup.sh <feature-name>"
fi

View File

@@ -0,0 +1,111 @@
#!/bin/bash
# Create a git worktree for feature isolation
# Usage: worktree-create.sh <feature-name>
set -e
FEATURE_NAME="$1"
if [ -z "$FEATURE_NAME" ]; then
echo "Error: Feature name required"
echo "Usage: worktree-create.sh <feature-name>"
exit 1
fi
# Get project root (parent of .auto-build)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
PROJECT_NAME=$(basename "$PROJECT_ROOT")
# Define paths
BRANCH_NAME="feature/ab-${FEATURE_NAME}"
WORKTREES_DIR="$(dirname "$PROJECT_ROOT")/ab-worktrees"
WORKTREE_PATH="${WORKTREES_DIR}/${PROJECT_NAME}-${FEATURE_NAME}"
echo "========================================"
echo " Creating Git Worktree"
echo "========================================"
echo ""
echo "Feature: $FEATURE_NAME"
echo "Branch: $BRANCH_NAME"
echo "Path: $WORKTREE_PATH"
echo ""
# Check if we're in a git repository
if ! git -C "$PROJECT_ROOT" rev-parse --git-dir > /dev/null 2>&1; then
echo "Error: Not a git repository"
exit 1
fi
# Check for uncommitted changes
if ! git -C "$PROJECT_ROOT" diff-index --quiet HEAD -- 2>/dev/null; then
echo "Warning: You have uncommitted changes in the main repository"
echo ""
fi
# Create worktrees directory if needed
mkdir -p "$WORKTREES_DIR"
# Create branch if it doesn't exist
cd "$PROJECT_ROOT"
if git show-ref --verify --quiet "refs/heads/${BRANCH_NAME}"; then
echo "Branch already exists: ${BRANCH_NAME}"
else
echo "Creating branch: ${BRANCH_NAME}"
git branch "${BRANCH_NAME}"
fi
# Check if worktree already exists
if [ -d "$WORKTREE_PATH" ]; then
echo "Error: Worktree directory already exists: $WORKTREE_PATH"
echo "Use 'git worktree remove' to clean up first, or choose a different name"
exit 1
fi
# Create worktree
echo "Creating worktree..."
git worktree add "$WORKTREE_PATH" "$BRANCH_NAME"
# Update registry
REGISTRY_FILE="$PROJECT_ROOT/.auto-build-data/worktrees/worktree-registry.json"
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
if [ -f "$REGISTRY_FILE" ]; then
# Add to existing registry using jq if available, otherwise use simple append
if command -v jq &> /dev/null; then
TEMP_FILE=$(mktemp)
jq --arg name "$FEATURE_NAME" \
--arg branch "$BRANCH_NAME" \
--arg path "$WORKTREE_PATH" \
--arg created "$TIMESTAMP" \
'.worktrees += [{
"name": $name,
"branch": $branch,
"path": $path,
"created": $created,
"status": "active"
}]' "$REGISTRY_FILE" > "$TEMP_FILE" && mv "$TEMP_FILE" "$REGISTRY_FILE"
else
# Fallback: Just note the worktree was created
echo "Note: Install jq for automatic registry updates"
fi
fi
echo ""
echo "========================================"
echo " Worktree Created Successfully"
echo "========================================"
echo ""
echo "To work in this worktree:"
echo " cd $WORKTREE_PATH"
echo ""
echo "To return to main project:"
echo " cd $PROJECT_ROOT"
echo ""
echo "When done with the feature:"
echo " /ab:worktree cleanup $FEATURE_NAME"
echo ""
# Output for script parsing
echo "WORKTREE_CREATED=$WORKTREE_PATH"
echo "BRANCH=$BRANCH_NAME"

View File

@@ -0,0 +1,56 @@
#!/bin/bash
# List all git worktrees
# Usage: worktree-list.sh
set -e
# Get project root (parent of .auto-build)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
echo "========================================"
echo " Git Worktrees"
echo "========================================"
echo ""
# Check if we're in a git repository
if ! git -C "$PROJECT_ROOT" rev-parse --git-dir > /dev/null 2>&1; then
echo "Error: Not a git repository"
exit 1
fi
# List all worktrees from git
echo "Active Worktrees:"
echo ""
cd "$PROJECT_ROOT"
WORKTREES=$(git worktree list --porcelain)
if [ -z "$WORKTREES" ]; then
echo " No worktrees found"
else
git worktree list
fi
echo ""
# Show registry info if available
REGISTRY_FILE="$PROJECT_ROOT/.auto-build-data/worktrees/worktree-registry.json"
if [ -f "$REGISTRY_FILE" ]; then
echo "Auto-Build Registry:"
echo ""
if command -v jq &> /dev/null; then
jq -r '.worktrees[] | " \(.name) (\(.status))\n Branch: \(.branch)\n Path: \(.path)\n Created: \(.created)\n"' "$REGISTRY_FILE" 2>/dev/null || echo " (empty)"
else
cat "$REGISTRY_FILE"
fi
else
echo "Registry not found. Run /ab:worktree create first."
fi
echo ""
echo "Commands:"
echo " Create: /ab:worktree create <name>"
echo " Cleanup: /ab:worktree cleanup [name]"

View File

@@ -0,0 +1,49 @@
#!/bin/bash
# Show instructions for switching to a worktree
# Usage: worktree-switch.sh <feature-name>
set -e
FEATURE_NAME="$1"
# Get project root (parent of .auto-build)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
PROJECT_NAME=$(basename "$PROJECT_ROOT")
WORKTREES_DIR="$(dirname "$PROJECT_ROOT")/ab-worktrees"
if [ -z "$FEATURE_NAME" ]; then
echo "Error: Feature name required"
echo "Usage: worktree-switch.sh <feature-name>"
echo ""
echo "Available worktrees:"
ls -1 "$WORKTREES_DIR" 2>/dev/null | grep "^${PROJECT_NAME}-" | sed "s/${PROJECT_NAME}-/ /" || echo " (none)"
exit 1
fi
WORKTREE_PATH="${WORKTREES_DIR}/${PROJECT_NAME}-${FEATURE_NAME}"
if [ ! -d "$WORKTREE_PATH" ]; then
echo "Error: Worktree not found at: $WORKTREE_PATH"
echo ""
echo "Available worktrees:"
ls -1 "$WORKTREES_DIR" 2>/dev/null | grep "^${PROJECT_NAME}-" | sed "s/${PROJECT_NAME}-/ /" || echo " (none)"
exit 1
fi
echo "========================================"
echo " Switch to Worktree"
echo "========================================"
echo ""
echo "Feature: $FEATURE_NAME"
echo "Path: $WORKTREE_PATH"
echo ""
echo "To switch to this worktree, run:"
echo ""
echo " cd $WORKTREE_PATH"
echo ""
echo "Or start a new terminal/Claude Code session in that directory."
echo ""
echo "To return to main project:"
echo " cd $PROJECT_ROOT"
echo ""