From 3e8d3fdcde5b1cec68251b1cf709913d5f7b1d75 Mon Sep 17 00:00:00 2001 From: Zander <31216542+zcwessels@users.noreply.github.com> Date: Tue, 13 Jan 2026 05:46:57 +0200 Subject: [PATCH] feat: add dedicated uninstall.sh script (#45) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 * 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 * 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 --------- Co-authored-by: Claude Opus 4.5 --- uninstall.sh | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100755 uninstall.sh diff --git a/uninstall.sh b/uninstall.sh new file mode 100755 index 0000000..f1c2837 --- /dev/null +++ b/uninstall.sh @@ -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