mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-11 02:33:51 +08:00
feat: Add pycli bash wrapper with hierarchical vector database support
- Create unified bash wrapper (pycli) for Python CLI tools - Implement hierarchical vector database with smart parent discovery - Add comprehensive installation script with auto-configuration - Remove redundant analyzer.py and api_indexer.py files - Enhance Python scripts with environment variable support - Update documentation to focus on pycli unified interface Key Features: - Automatic parent directory vector DB discovery - No redundant vectorization in subdirectories - Central vector database storage in ~/.claude/vector_db - Configurable Python interpreter paths - One-command installation and setup 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
302
.claude/scripts/install_pycli.sh
Normal file
302
.claude/scripts/install_pycli.sh
Normal file
@@ -0,0 +1,302 @@
|
||||
#!/bin/bash
|
||||
|
||||
#==============================================================================
|
||||
# pycli Installation Script
|
||||
#
|
||||
# This script installs the pycli bash wrapper and configuration files
|
||||
# to the ~/.claude directory structure.
|
||||
#==============================================================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Print colored output
|
||||
print_status() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
#==============================================================================
|
||||
# Configuration
|
||||
#==============================================================================
|
||||
|
||||
SOURCE_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
INSTALL_BASE="$HOME/.claude"
|
||||
INSTALL_DIR="$INSTALL_BASE/scripts"
|
||||
PYTHON_SCRIPT_DIR="$INSTALL_BASE/python_script"
|
||||
VECTOR_DB_DIR="$INSTALL_BASE/vector_db"
|
||||
CONFIG_DIR="$INSTALL_BASE/config"
|
||||
LOGS_DIR="$INSTALL_BASE/logs"
|
||||
|
||||
#==============================================================================
|
||||
# Pre-installation Checks
|
||||
#==============================================================================
|
||||
|
||||
print_status "Starting pycli installation..."
|
||||
print_status "Source directory: $SOURCE_DIR"
|
||||
print_status "Install directory: $INSTALL_DIR"
|
||||
|
||||
# Check if source files exist
|
||||
if [[ ! -f "$SOURCE_DIR/pycli" ]]; then
|
||||
print_error "pycli script not found in $SOURCE_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "$SOURCE_DIR/pycli.conf" ]]; then
|
||||
print_error "pycli.conf not found in $SOURCE_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if Python script directory exists
|
||||
if [[ ! -d "$PYTHON_SCRIPT_DIR" ]]; then
|
||||
print_warning "Python script directory not found: $PYTHON_SCRIPT_DIR"
|
||||
print_status "Please ensure the Python scripts are installed in ~/.claude/python_script/"
|
||||
read -p "Continue installation anyway? (y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
print_status "Installation cancelled."
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
#==============================================================================
|
||||
# Create Directory Structure
|
||||
#==============================================================================
|
||||
|
||||
print_status "Creating directory structure..."
|
||||
|
||||
# Create all required directories
|
||||
directories=(
|
||||
"$INSTALL_BASE"
|
||||
"$INSTALL_DIR"
|
||||
"$VECTOR_DB_DIR"
|
||||
"$CONFIG_DIR"
|
||||
"$LOGS_DIR"
|
||||
)
|
||||
|
||||
for dir in "${directories[@]}"; do
|
||||
if [[ ! -d "$dir" ]]; then
|
||||
mkdir -p "$dir"
|
||||
print_status "Created directory: $dir"
|
||||
else
|
||||
print_status "Directory exists: $dir"
|
||||
fi
|
||||
done
|
||||
|
||||
#==============================================================================
|
||||
# Install Files
|
||||
#==============================================================================
|
||||
|
||||
print_status "Installing pycli files..."
|
||||
|
||||
# Backup existing files if they exist
|
||||
if [[ -f "$INSTALL_DIR/pycli" ]]; then
|
||||
backup_file="$INSTALL_DIR/pycli.backup.$(date +%Y%m%d_%H%M%S)"
|
||||
cp "$INSTALL_DIR/pycli" "$backup_file"
|
||||
print_warning "Backed up existing pycli to: $backup_file"
|
||||
fi
|
||||
|
||||
if [[ -f "$INSTALL_DIR/pycli.conf" ]]; then
|
||||
backup_file="$INSTALL_DIR/pycli.conf.backup.$(date +%Y%m%d_%H%M%S)"
|
||||
cp "$INSTALL_DIR/pycli.conf" "$backup_file"
|
||||
print_warning "Backed up existing pycli.conf to: $backup_file"
|
||||
fi
|
||||
|
||||
# Copy files
|
||||
cp "$SOURCE_DIR/pycli" "$INSTALL_DIR/"
|
||||
cp "$SOURCE_DIR/pycli.conf" "$INSTALL_DIR/"
|
||||
|
||||
# Make executable
|
||||
chmod +x "$INSTALL_DIR/pycli"
|
||||
|
||||
print_success "Files installed successfully"
|
||||
|
||||
#==============================================================================
|
||||
# Configuration Updates
|
||||
#==============================================================================
|
||||
|
||||
print_status "Updating configuration..."
|
||||
|
||||
# Detect Python path
|
||||
PYTHON_CANDIDATES=(
|
||||
"/usr/bin/python3"
|
||||
"/usr/local/bin/python3"
|
||||
"/opt/conda/bin/python"
|
||||
"$(which python3 2>/dev/null || echo "")"
|
||||
"$(which python 2>/dev/null || echo "")"
|
||||
)
|
||||
|
||||
DETECTED_PYTHON=""
|
||||
for candidate in "${PYTHON_CANDIDATES[@]}"; do
|
||||
if [[ -n "$candidate" ]] && [[ -x "$candidate" ]]; then
|
||||
# Test if it's Python 3
|
||||
if "$candidate" -c "import sys; exit(0 if sys.version_info >= (3, 6) else 1)" 2>/dev/null; then
|
||||
DETECTED_PYTHON="$candidate"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ -n "$DETECTED_PYTHON" ]]; then
|
||||
print_success "Detected Python: $DETECTED_PYTHON"
|
||||
|
||||
# Update configuration file
|
||||
sed -i.bak "s|^PYTHON_PATH=.*|PYTHON_PATH=\"$DETECTED_PYTHON\"|" "$INSTALL_DIR/pycli.conf"
|
||||
print_status "Updated PYTHON_PATH in configuration"
|
||||
else
|
||||
print_warning "Could not detect Python 3.6+. Please manually update PYTHON_PATH in:"
|
||||
print_warning " $INSTALL_DIR/pycli.conf"
|
||||
fi
|
||||
|
||||
#==============================================================================
|
||||
# Shell Integration Setup
|
||||
#==============================================================================
|
||||
|
||||
print_status "Setting up shell integration..."
|
||||
|
||||
# Detect shell
|
||||
SHELL_RC=""
|
||||
if [[ -n "${BASH_VERSION:-}" ]] || [[ "$SHELL" == *"bash"* ]]; then
|
||||
SHELL_RC="$HOME/.bashrc"
|
||||
elif [[ -n "${ZSH_VERSION:-}" ]] || [[ "$SHELL" == *"zsh"* ]]; then
|
||||
SHELL_RC="$HOME/.zshrc"
|
||||
fi
|
||||
|
||||
# Function to add alias/path to shell config
|
||||
add_to_shell_config() {
|
||||
local config_file="$1"
|
||||
local content="$2"
|
||||
|
||||
if [[ -f "$config_file" ]]; then
|
||||
if ! grep -q "pycli" "$config_file"; then
|
||||
echo "" >> "$config_file"
|
||||
echo "# pycli - Python CLI Wrapper" >> "$config_file"
|
||||
echo "$content" >> "$config_file"
|
||||
print_success "Added pycli to $config_file"
|
||||
return 0
|
||||
else
|
||||
print_warning "pycli already configured in $config_file"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Try to add alias automatically
|
||||
ALIAS_ADDED=false
|
||||
PATH_ADDED=false
|
||||
|
||||
if [[ -n "$SHELL_RC" ]]; then
|
||||
# Try to add alias
|
||||
if add_to_shell_config "$SHELL_RC" "alias pycli='$INSTALL_DIR/pycli'"; then
|
||||
ALIAS_ADDED=true
|
||||
fi
|
||||
|
||||
# Also add to PATH
|
||||
if add_to_shell_config "$SHELL_RC" "export PATH=\"\$PATH:$INSTALL_DIR\""; then
|
||||
PATH_ADDED=true
|
||||
fi
|
||||
fi
|
||||
|
||||
#==============================================================================
|
||||
# Test Installation
|
||||
#==============================================================================
|
||||
|
||||
print_status "Testing installation..."
|
||||
|
||||
# Test that the script is executable
|
||||
if [[ -x "$INSTALL_DIR/pycli" ]]; then
|
||||
print_success "pycli script is executable"
|
||||
else
|
||||
print_error "pycli script is not executable"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test configuration loading
|
||||
if "$INSTALL_DIR/pycli" --help >/dev/null 2>&1; then
|
||||
print_success "pycli configuration loads correctly"
|
||||
else
|
||||
print_warning "pycli configuration test failed - check Python path"
|
||||
fi
|
||||
|
||||
#==============================================================================
|
||||
# Installation Summary
|
||||
#==============================================================================
|
||||
|
||||
print_success "Installation completed successfully!"
|
||||
echo
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📁 Installation Summary:"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo " • Executable: $INSTALL_DIR/pycli"
|
||||
echo " • Config: $INSTALL_DIR/pycli.conf"
|
||||
echo " • Vector DB: $VECTOR_DB_DIR/"
|
||||
echo " • Logs: $LOGS_DIR/"
|
||||
echo
|
||||
|
||||
echo "🚀 Quick Start:"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
if [[ "$ALIAS_ADDED" == true ]]; then
|
||||
echo " 1. Reload your shell configuration:"
|
||||
echo " source $SHELL_RC"
|
||||
echo
|
||||
echo " 2. Initialize vector DB for a project:"
|
||||
echo " cd /path/to/your/project"
|
||||
echo " pycli --init"
|
||||
echo
|
||||
echo " 3. Start analyzing code:"
|
||||
echo " pycli --analyze --query \"authentication patterns\" --tool gemini"
|
||||
else
|
||||
echo " 1. Add pycli to your shell configuration:"
|
||||
if [[ -n "$SHELL_RC" ]]; then
|
||||
echo " echo \"alias pycli='$INSTALL_DIR/pycli'\" >> $SHELL_RC"
|
||||
echo " source $SHELL_RC"
|
||||
else
|
||||
echo " alias pycli='$INSTALL_DIR/pycli'"
|
||||
fi
|
||||
echo
|
||||
echo " 2. Or add to PATH:"
|
||||
echo " export PATH=\"\$PATH:$INSTALL_DIR\""
|
||||
echo
|
||||
echo " 3. Initialize vector DB for a project:"
|
||||
echo " cd /path/to/your/project"
|
||||
echo " pycli --init"
|
||||
echo
|
||||
echo " 4. Start analyzing code:"
|
||||
echo " pycli --analyze --query \"authentication patterns\" --tool gemini"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "📚 Documentation:"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo " • Help: pycli --help"
|
||||
echo " • Strategy: ~/.claude/workflows/python-tools-strategy.md"
|
||||
echo
|
||||
echo "⚙️ Configuration:"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo " • Edit config: $INSTALL_DIR/pycli.conf"
|
||||
|
||||
if [[ -z "$DETECTED_PYTHON" ]]; then
|
||||
echo " • ⚠️ Please update PYTHON_PATH in pycli.conf"
|
||||
fi
|
||||
|
||||
echo
|
||||
print_success "Installation complete! 🎉"
|
||||
Reference in New Issue
Block a user