🚀 New Feature: ralph-import - Converts existing PRDs/specs to Ralph format using Claude Code intelligence - Supports multiple formats: Markdown, text, JSON, Word docs, PDFs - Creates complete Ralph project with PROMPT.md, @fix_plan.md, specs/ - Leverages Claude Code for intelligent requirement parsing and conversion 🔧 Implementation: - ralph_import.sh: Core conversion script with Claude Code integration - Global installation: ralph-import command available system-wide - Smart conversion prompt that extracts goals, priorities, and technical specs - Auto-generates proper Ralph project structure from any source format 📚 Enhanced Documentation: - New "Importing Existing Requirements" section in README - Option A (import PRD) vs Option B (manual setup) in Quick Start - Comprehensive format support and usage examples - Command reference updated with ralph-import 🎯 Benefits: - Eliminates manual conversion from PRDs to Ralph format - Leverages Claude Code's intelligence for requirement interpretation - Dramatically reduces onboarding friction for existing projects - Maintains all original requirement context while making it actionable Sample PRD included for testing and demonstration purposes.
291 lines
No EOL
7.9 KiB
Bash
Executable file
291 lines
No EOL
7.9 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# Ralph for Claude Code - Global Installation Script
|
|
set -e
|
|
|
|
# Configuration
|
|
INSTALL_DIR="$HOME/.local/bin"
|
|
RALPH_HOME="$HOME/.ralph"
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
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 dependencies
|
|
check_dependencies() {
|
|
log "INFO" "Checking dependencies..."
|
|
|
|
local missing_deps=()
|
|
|
|
if ! command -v node &> /dev/null && ! command -v npx &> /dev/null; then
|
|
missing_deps+=("Node.js/npm")
|
|
fi
|
|
|
|
if ! command -v jq &> /dev/null; then
|
|
missing_deps+=("jq")
|
|
fi
|
|
|
|
if ! command -v git &> /dev/null; then
|
|
missing_deps+=("git")
|
|
fi
|
|
|
|
if [ ${#missing_deps[@]} -ne 0 ]; then
|
|
log "ERROR" "Missing required dependencies: ${missing_deps[*]}"
|
|
echo "Please install the missing dependencies:"
|
|
echo " Ubuntu/Debian: sudo apt-get install nodejs npm jq git"
|
|
echo " macOS: brew install node jq git"
|
|
echo " CentOS/RHEL: sudo yum install nodejs npm jq git"
|
|
exit 1
|
|
fi
|
|
|
|
# Check Claude Code CLI
|
|
if ! npx @anthropic/claude-code --version &> /dev/null; then
|
|
log "WARN" "Claude Code CLI not found. It will be downloaded when first used."
|
|
fi
|
|
|
|
# Check tmux (optional)
|
|
if ! command -v tmux &> /dev/null; then
|
|
log "WARN" "tmux not found. Install for integrated monitoring: apt-get install tmux / brew install tmux"
|
|
fi
|
|
|
|
log "SUCCESS" "Dependencies check completed"
|
|
}
|
|
|
|
# Create installation directory
|
|
create_install_dirs() {
|
|
log "INFO" "Creating installation directories..."
|
|
|
|
mkdir -p "$INSTALL_DIR"
|
|
mkdir -p "$RALPH_HOME"
|
|
mkdir -p "$RALPH_HOME/templates"
|
|
|
|
log "SUCCESS" "Directories created: $INSTALL_DIR, $RALPH_HOME"
|
|
}
|
|
|
|
# Install Ralph scripts
|
|
install_scripts() {
|
|
log "INFO" "Installing Ralph scripts..."
|
|
|
|
# Copy templates to Ralph home
|
|
cp -r "$SCRIPT_DIR/templates/"* "$RALPH_HOME/templates/"
|
|
|
|
# Create the main ralph command
|
|
cat > "$INSTALL_DIR/ralph" << 'EOF'
|
|
#!/bin/bash
|
|
# Ralph for Claude Code - Main Command
|
|
|
|
RALPH_HOME="$HOME/.ralph"
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
# Source the actual ralph loop script with global paths
|
|
exec "$RALPH_HOME/ralph_loop.sh" "$@"
|
|
EOF
|
|
|
|
# Create ralph-monitor command
|
|
cat > "$INSTALL_DIR/ralph-monitor" << 'EOF'
|
|
#!/bin/bash
|
|
# Ralph Monitor - Global Command
|
|
|
|
RALPH_HOME="$HOME/.ralph"
|
|
|
|
exec "$RALPH_HOME/ralph_monitor.sh" "$@"
|
|
EOF
|
|
|
|
# Create ralph-setup command
|
|
cat > "$INSTALL_DIR/ralph-setup" << 'EOF'
|
|
#!/bin/bash
|
|
# Ralph Project Setup - Global Command
|
|
|
|
RALPH_HOME="$HOME/.ralph"
|
|
|
|
exec "$RALPH_HOME/setup.sh" "$@"
|
|
EOF
|
|
|
|
# Create ralph-import command
|
|
cat > "$INSTALL_DIR/ralph-import" << 'EOF'
|
|
#!/bin/bash
|
|
# Ralph PRD Import - Global Command
|
|
|
|
RALPH_HOME="$HOME/.ralph"
|
|
|
|
exec "$RALPH_HOME/ralph_import.sh" "$@"
|
|
EOF
|
|
|
|
# Copy actual script files to Ralph home with modifications for global operation
|
|
cp "$SCRIPT_DIR/ralph_monitor.sh" "$RALPH_HOME/"
|
|
|
|
# Copy PRD import script to Ralph home
|
|
cp "$SCRIPT_DIR/ralph_import.sh" "$RALPH_HOME/"
|
|
|
|
# Make all commands executable
|
|
chmod +x "$INSTALL_DIR/ralph"
|
|
chmod +x "$INSTALL_DIR/ralph-monitor"
|
|
chmod +x "$INSTALL_DIR/ralph-setup"
|
|
chmod +x "$INSTALL_DIR/ralph-import"
|
|
chmod +x "$RALPH_HOME/ralph_monitor.sh"
|
|
chmod +x "$RALPH_HOME/ralph_import.sh"
|
|
|
|
log "SUCCESS" "Ralph scripts installed to $INSTALL_DIR"
|
|
}
|
|
|
|
# Install global ralph_loop.sh
|
|
install_ralph_loop() {
|
|
log "INFO" "Installing global ralph_loop.sh..."
|
|
|
|
# Create modified ralph_loop.sh for global operation
|
|
sed \
|
|
-e "s|RALPH_HOME=\"\$HOME/.ralph\"|RALPH_HOME=\"\$HOME/.ralph\"|g" \
|
|
-e "s|\$script_dir/ralph_monitor.sh|\$RALPH_HOME/ralph_monitor.sh|g" \
|
|
-e "s|\$script_dir/ralph_loop.sh|\$RALPH_HOME/ralph_loop.sh|g" \
|
|
"$SCRIPT_DIR/ralph_loop.sh" > "$RALPH_HOME/ralph_loop.sh"
|
|
|
|
chmod +x "$RALPH_HOME/ralph_loop.sh"
|
|
|
|
log "SUCCESS" "Global ralph_loop.sh installed"
|
|
}
|
|
|
|
# Install global setup.sh
|
|
install_setup() {
|
|
log "INFO" "Installing global setup script..."
|
|
|
|
# Create modified setup.sh for global operation
|
|
cat > "$RALPH_HOME/setup.sh" << 'EOF'
|
|
#!/bin/bash
|
|
|
|
# Ralph Project Setup Script - Global Version
|
|
set -e
|
|
|
|
PROJECT_NAME=${1:-"my-project"}
|
|
RALPH_HOME="$HOME/.ralph"
|
|
|
|
echo "🚀 Setting up Ralph project: $PROJECT_NAME"
|
|
|
|
# Create project directory in current location
|
|
mkdir -p "$PROJECT_NAME"
|
|
cd "$PROJECT_NAME"
|
|
|
|
# Create structure
|
|
mkdir -p {specs/stdlib,src,examples,logs,docs/generated}
|
|
|
|
# Copy templates from Ralph home
|
|
cp "$RALPH_HOME/templates/PROMPT.md" .
|
|
cp "$RALPH_HOME/templates/fix_plan.md" @fix_plan.md
|
|
cp "$RALPH_HOME/templates/AGENT.md" @AGENT.md
|
|
cp -r "$RALPH_HOME/templates/specs/"* specs/ 2>/dev/null || true
|
|
|
|
# Initialize git
|
|
git init
|
|
echo "# $PROJECT_NAME" > README.md
|
|
git add .
|
|
git commit -m "Initial Ralph project setup"
|
|
|
|
echo "✅ Project $PROJECT_NAME created!"
|
|
echo "Next steps:"
|
|
echo " 1. Edit PROMPT.md with your project requirements"
|
|
echo " 2. Update specs/ with your project specifications"
|
|
echo " 3. Run: ralph --monitor"
|
|
echo " 4. Monitor: ralph-monitor (if running manually)"
|
|
EOF
|
|
|
|
chmod +x "$RALPH_HOME/setup.sh"
|
|
|
|
log "SUCCESS" "Global setup script installed"
|
|
}
|
|
|
|
# Check PATH
|
|
check_path() {
|
|
log "INFO" "Checking PATH configuration..."
|
|
|
|
if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
|
|
log "WARN" "$INSTALL_DIR is not in your PATH"
|
|
echo ""
|
|
echo "Add this to your ~/.bashrc, ~/.zshrc, or ~/.profile:"
|
|
echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
|
|
echo ""
|
|
echo "Then run: source ~/.bashrc (or restart your terminal)"
|
|
echo ""
|
|
else
|
|
log "SUCCESS" "$INSTALL_DIR is already in PATH"
|
|
fi
|
|
}
|
|
|
|
# Main installation
|
|
main() {
|
|
echo "🚀 Installing Ralph for Claude Code globally..."
|
|
echo ""
|
|
|
|
check_dependencies
|
|
create_install_dirs
|
|
install_scripts
|
|
install_ralph_loop
|
|
install_setup
|
|
check_path
|
|
|
|
echo ""
|
|
log "SUCCESS" "🎉 Ralph for Claude Code installed successfully!"
|
|
echo ""
|
|
echo "Global commands available:"
|
|
echo " ralph --monitor # Start Ralph with integrated monitoring"
|
|
echo " ralph --help # Show Ralph options"
|
|
echo " ralph-setup my-project # Create new Ralph project"
|
|
echo " ralph-import prd.md # Convert PRD to Ralph project"
|
|
echo " ralph-monitor # Manual monitoring dashboard"
|
|
echo ""
|
|
echo "Quick start:"
|
|
echo " 1. ralph-setup my-awesome-project"
|
|
echo " 2. cd my-awesome-project"
|
|
echo " 3. # Edit PROMPT.md with your requirements"
|
|
echo " 4. ralph --monitor"
|
|
echo ""
|
|
|
|
if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
|
|
echo "⚠️ Don't forget to add $INSTALL_DIR to your PATH (see above)"
|
|
fi
|
|
}
|
|
|
|
# Handle command line arguments
|
|
case "${1:-install}" in
|
|
install)
|
|
main
|
|
;;
|
|
uninstall)
|
|
log "INFO" "Uninstalling Ralph for Claude Code..."
|
|
rm -f "$INSTALL_DIR/ralph" "$INSTALL_DIR/ralph-monitor" "$INSTALL_DIR/ralph-setup" "$INSTALL_DIR/ralph-import"
|
|
rm -rf "$RALPH_HOME"
|
|
log "SUCCESS" "Ralph for Claude Code uninstalled"
|
|
;;
|
|
--help|-h)
|
|
echo "Ralph for Claude Code Installation"
|
|
echo ""
|
|
echo "Usage: $0 [install|uninstall]"
|
|
echo ""
|
|
echo "Commands:"
|
|
echo " install Install Ralph globally (default)"
|
|
echo " uninstall Remove Ralph installation"
|
|
echo " --help Show this help"
|
|
;;
|
|
*)
|
|
echo "Unknown command: $1"
|
|
echo "Use --help for usage information"
|
|
exit 1
|
|
;;
|
|
esac |