feat: add dedicated uninstall.sh script (#45)

* feat: add dedicated uninstall.sh script

Add a standalone uninstall script that provides:
- Safety confirmation prompt before removal (skip with -y/--yes)
- Installation check to verify Ralph is installed
- Removal plan display showing exactly what will be removed
- Consistent styling matching install.sh (colors, logging)
- Help option (-h/--help) for usage information
- Preserves project directories created with ralph-setup

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* docs: add function documentation to uninstall.sh

Address CodeRabbit review comments:
- Add documentation comments to all functions (log, check_installation,
  show_removal_plan, confirm_uninstall, remove_commands, remove_ralph_home, main)
- Improve check_installation to detect partial installations by checking
  all Ralph commands, not just the main ralph command

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: use safe arithmetic to avoid set -e failure

Replace ((removed++)) with removed=$((removed + 1)) to prevent
script termination when removed is 0, as post-increment returns
exit code 1 when the expression value is 0 under set -e.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Zander 2026-01-13 05:46:57 +02:00 committed by GitHub
parent 3dc3479c27
commit 3e8d3fdcde
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

194
uninstall.sh Executable file
View file

@ -0,0 +1,194 @@
#!/bin/bash
# Ralph for Claude Code - Uninstallation Script
set -e
# Configuration
INSTALL_DIR="$HOME/.local/bin"
RALPH_HOME="$HOME/.ralph"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Log a message with timestamp and color coding
# Arguments:
# $1 - Log level (INFO, WARN, ERROR, SUCCESS)
# $2 - Message to log
# Output: Writes colored, timestamped message to stdout
# Uses: Color variables (RED, GREEN, YELLOW, BLUE, NC)
log() {
local level=$1
local message=$2
local color=""
case $level in
"INFO") color=$BLUE ;;
"WARN") color=$YELLOW ;;
"ERROR") color=$RED ;;
"SUCCESS") color=$GREEN ;;
esac
echo -e "${color}[$(date '+%H:%M:%S')] [$level] $message${NC}"
}
# Check if Ralph is installed by verifying commands or home directory exist
# Uses: INSTALL_DIR, RALPH_HOME environment variables
# Behavior: Checks for any Ralph command or home directory
# Exit: Exits with status 0 if not installed, displaying checked locations
check_installation() {
local installed=false
# Check for any of the Ralph commands
for cmd in ralph ralph-monitor ralph-setup ralph-import; do
if [ -f "$INSTALL_DIR/$cmd" ]; then
installed=true
break
fi
done
# Also check for Ralph home directory
if [ "$installed" = false ] && [ -d "$RALPH_HOME" ]; then
installed=true
fi
if [ "$installed" = false ]; then
log "WARN" "Ralph does not appear to be installed"
echo "Checked locations:"
echo " - $INSTALL_DIR/{ralph,ralph-monitor,ralph-setup,ralph-import}"
echo " - $RALPH_HOME"
exit 0
fi
}
# Display a plan of what will be removed during uninstallation
# Uses: INSTALL_DIR, RALPH_HOME environment variables
# Output: Prints list of Ralph commands and home directory to stdout
# Behavior: Shows only items that actually exist on the system
show_removal_plan() {
echo ""
log "INFO" "The following will be removed:"
echo ""
# Commands
echo "Commands in $INSTALL_DIR:"
for cmd in ralph ralph-monitor ralph-setup ralph-import; do
if [ -f "$INSTALL_DIR/$cmd" ]; then
echo " - $cmd"
fi
done
# Ralph home
if [ -d "$RALPH_HOME" ]; then
echo ""
echo "Ralph home directory:"
echo " - $RALPH_HOME (includes templates, scripts, and libraries)"
fi
echo ""
}
# Prompt user to confirm uninstallation
# Arguments:
# $1 - Optional flag (-y or --yes) to skip confirmation prompt
# Behavior: Returns 0 if confirmed, exits with 0 if cancelled
# Exit: Exits with status 0 if user declines confirmation
confirm_uninstall() {
if [ "${1:-}" = "-y" ] || [ "${1:-}" = "--yes" ]; then
return 0
fi
read -p "Are you sure you want to uninstall Ralph? [y/N] " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log "INFO" "Uninstallation cancelled"
exit 0
fi
}
# Remove Ralph commands from INSTALL_DIR
# Removes: ralph, ralph-monitor, ralph-setup, ralph-import
# Uses: INSTALL_DIR environment variable
# Output: Logs success with count of removed commands, or info if none found
remove_commands() {
log "INFO" "Removing Ralph commands..."
local removed=0
for cmd in ralph ralph-monitor ralph-setup ralph-import; do
if [ -f "$INSTALL_DIR/$cmd" ]; then
rm -f "$INSTALL_DIR/$cmd"
removed=$((removed + 1))
fi
done
if [ $removed -gt 0 ]; then
log "SUCCESS" "Removed $removed command(s) from $INSTALL_DIR"
else
log "INFO" "No commands found in $INSTALL_DIR"
fi
}
# Remove Ralph home directory containing templates, scripts, and libraries
# Uses: RALPH_HOME environment variable
# Behavior: Removes directory recursively if it exists
# Output: Logs success if removed, or info if directory not found
remove_ralph_home() {
log "INFO" "Removing Ralph home directory..."
if [ -d "$RALPH_HOME" ]; then
rm -rf "$RALPH_HOME"
log "SUCCESS" "Removed $RALPH_HOME"
else
log "INFO" "Ralph home directory not found"
fi
}
# Main uninstallation flow for Ralph for Claude Code
# Arguments:
# $1 - Optional flag passed to confirm_uninstall (-y/--yes)
# Behavior: Orchestrates full uninstall by calling check, plan, confirm, and remove functions
# Note: Does not remove project directories created with ralph-setup
main() {
echo "🗑️ Uninstalling Ralph for Claude Code..."
check_installation
show_removal_plan
confirm_uninstall "$1"
echo ""
remove_commands
remove_ralph_home
echo ""
log "SUCCESS" "Ralph for Claude Code has been uninstalled"
echo ""
echo "Note: Project files created with ralph-setup are not removed."
echo "You can safely delete those project directories manually if needed."
echo ""
}
# Handle command line arguments
case "${1:-}" in
-h|--help)
echo "Ralph for Claude Code - Uninstallation Script"
echo ""
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " -y, --yes Skip confirmation prompt"
echo " -h, --help Show this help message"
echo ""
echo "This script removes:"
echo " - Ralph commands from $INSTALL_DIR"
echo " - Ralph home directory ($RALPH_HOME)"
echo ""
echo "Project directories created with ralph-setup are NOT removed."
;;
*)
main "$1"
;;
esac