diff --git a/install_mini_rag.sh b/install_mini_rag.sh index e6caf60..ecd66df 100755 --- a/install_mini_rag.sh +++ b/install_mini_rag.sh @@ -549,35 +549,125 @@ show_completion() { read -r run_test if [[ ! $run_test =~ ^[Nn]$ ]]; then run_quick_test + echo "" + show_beginner_guidance + else + show_beginner_guidance fi } -# Run quick test +# Create sample project for testing +create_sample_project() { + local sample_dir="$SCRIPT_DIR/.sample_test" + rm -rf "$sample_dir" + mkdir -p "$sample_dir" + + # Create a few small sample files + cat > "$sample_dir/README.md" << 'EOF' +# Sample Project + +This is a sample project for testing FSS-Mini-RAG search capabilities. + +## Features + +- User authentication system +- Document processing +- Search functionality +- Email integration +EOF + + cat > "$sample_dir/auth.py" << 'EOF' +# Authentication module +def login_user(username, password): + """Handle user login with password validation""" + if validate_credentials(username, password): + create_session(username) + return True + return False + +def validate_credentials(username, password): + """Check username and password against database""" + # Database validation logic here + return check_password_hash(username, password) +EOF + + cat > "$sample_dir/search.py" << 'EOF' +# Search functionality +def semantic_search(query, documents): + """Perform semantic search across document collection""" + embeddings = generate_embeddings(query) + results = find_similar_documents(embeddings, documents) + return rank_results(results) + +def generate_embeddings(text): + """Generate vector embeddings for text""" + # Embedding generation logic + return process_with_model(text) +EOF + + echo "$sample_dir" +} + +# Run quick test with sample data run_quick_test() { print_header "Quick Test" - print_info "Testing on this project directory..." - echo "This will index the FSS-Mini-RAG system itself as a test." + print_info "Creating small sample project for testing..." + local sample_dir=$(create_sample_project) + echo "Sample project created with 3 files for fast testing." echo "" - # Index this project - if ./rag-mini index "$SCRIPT_DIR"; then - print_success "Indexing completed" + # Index the sample project (much faster) + print_info "Indexing sample project (this should be fast)..." + if ./rag-mini index "$sample_dir" --quiet; then + print_success "Sample project indexed successfully" - # Try a search echo "" - print_info "Testing search functionality..." - ./rag-mini search "$SCRIPT_DIR" "embedding system" --limit 3 + print_info "Testing search with sample queries..." + echo -e "${BLUE}Running search: 'user authentication'${NC}" + ./rag-mini search "$sample_dir" "user authentication" --limit 2 echo "" print_success "Test completed successfully!" - echo -e "${CYAN}You can now use FSS-Mini-RAG on your own projects.${NC}" + echo -e "${CYAN}Ready to use FSS-Mini-RAG on your own projects!${NC}" + + # Offer beginner guidance + echo "" + echo -e "${YELLOW}💡 Beginner Tip:${NC} Try the interactive mode with pre-made questions" + echo " Run: ./rag-tui for guided experience" + + # Clean up sample + rm -rf "$sample_dir" else - print_error "Test failed" - echo "Check the error messages above for troubleshooting." + print_error "Sample test failed" + echo "This might indicate an issue with the installation." + rm -rf "$sample_dir" fi } +# Show beginner-friendly first steps +show_beginner_guidance() { + print_header "Getting Started - Your First Search" + + echo -e "${CYAN}FSS-Mini-RAG is ready! Here's how to start:${NC}" + echo "" + echo -e "${GREEN}🎯 For Beginners (Recommended):${NC}" + echo " ./rag-tui" + echo " ↳ Interactive interface with sample questions" + echo "" + echo -e "${BLUE}💻 For Developers:${NC}" + echo " ./rag-mini index /path/to/your/project" + echo " ./rag-mini search /path/to/your/project \"your question\"" + echo "" + echo -e "${YELLOW}📚 What can you search for?${NC}" + echo " • Code: \"authentication logic\", \"error handling\", \"API endpoints\"" + echo " • Docs: \"installation guide\", \"configuration options\" + echo " • Your own files: emails, notes, research documents" + echo "" + echo -e "${CYAN}💡 Pro tip:${NC} You can drag ANY text-based documents into a folder" + echo " and search through them - emails, notes, research, chat logs!" +} + # Main installation flow main() { echo -e "${CYAN}${BOLD}" diff --git a/rag-tui.py b/rag-tui.py index 07cb230..976eb67 100755 --- a/rag-tui.py +++ b/rag-tui.py @@ -278,8 +278,37 @@ class SimpleTUI: print(f"Project: {self.project_path.name}") print() - # Get search query - query = self.get_input("Enter search query", "").strip() + # Show sample questions for beginners + print("💡 Not sure what to search for? Try these sample questions:") + print() + sample_questions = [ + "authentication logic", + "error handling", + "API endpoints", + "configuration settings", + "database connection", + "user management" + ] + + for i, question in enumerate(sample_questions[:3], 1): + print(f" {i}. {question}") + print(" 4. Enter your own question") + print() + + # Let user choose a sample or enter their own + choice_str = self.get_input("Choose a number (1-4) or press Enter for custom", "4") + + try: + choice = int(choice_str) + if 1 <= choice <= 3: + query = sample_questions[choice - 1] + print(f"Selected: '{query}'") + print() + else: + query = self.get_input("Enter your search query", "").strip() + except ValueError: + query = self.get_input("Enter your search query", "").strip() + if not query: return @@ -354,6 +383,38 @@ class SimpleTUI: if len(results) > 1: print("💡 To see more context or specific results:") print(f" Run: ./rag-mini search {self.project_path} \"{query}\" --verbose") + + # Suggest follow-up questions based on the search + print() + print("🔍 Suggested follow-up searches:") + follow_up_questions = self.generate_follow_up_questions(query, results) + for i, question in enumerate(follow_up_questions, 1): + print(f" {i}. {question}") + + # Ask if they want to run a follow-up search + print() + choice = input("Run a follow-up search? Enter number (1-3) or press Enter to continue: ").strip() + if choice.isdigit() and 1 <= int(choice) <= len(follow_up_questions): + # Recursive search with the follow-up question + follow_up_query = follow_up_questions[int(choice) - 1] + print(f"\nSearching for: '{follow_up_query}'") + print("=" * 50) + # Run another search + follow_results = searcher.search(follow_up_query, top_k=5) + + if follow_results: + print(f"✅ Found {len(follow_results)} follow-up results:") + print() + for i, result in enumerate(follow_results[:3], 1): # Show top 3 + try: + rel_path = result.file_path.relative_to(self.project_path) + except: + rel_path = result.file_path + print(f"{i}. {rel_path} (Score: {result.score:.3f})") + print(f" {result.content.strip()[:100]}...") + print() + else: + print("❌ No follow-up results found") print(f" Or: ./rag-mini-enhanced context {self.project_path} \"{query}\"") print() @@ -364,6 +425,45 @@ class SimpleTUI: print() input("Press Enter to continue...") + def generate_follow_up_questions(self, original_query: str, results) -> List[str]: + """Generate contextual follow-up questions based on search results.""" + # Simple pattern-based follow-up generation + follow_ups = [] + + # Based on original query patterns + query_lower = original_query.lower() + + if "auth" in query_lower or "login" in query_lower: + follow_ups.extend(["password validation", "session management", "user permissions"]) + elif "error" in query_lower or "exception" in query_lower: + follow_ups.extend(["error logging", "exception handling", "error messages"]) + elif "api" in query_lower or "endpoint" in query_lower: + follow_ups.extend(["API documentation", "request validation", "response formatting"]) + elif "database" in query_lower or "db" in query_lower: + follow_ups.extend(["database schema", "query optimization", "connection pooling"]) + elif "config" in query_lower or "setting" in query_lower: + follow_ups.extend(["configuration files", "environment variables", "default values"]) + else: + # Generic follow-ups + follow_ups.extend(["implementation details", "error handling", "configuration"]) + + # Based on file types found in results + if results: + file_extensions = set() + for result in results[:3]: # Check first 3 results + ext = result.file_path.suffix.lower() + file_extensions.add(ext) + + if '.py' in file_extensions: + follow_ups.append("Python imports") + if '.js' in file_extensions: + follow_ups.append("JavaScript functions") + if '.md' in file_extensions: + follow_ups.append("documentation examples") + + # Return top 3 unique follow-ups + return list(dict.fromkeys(follow_ups))[:3] + def explore_interactive(self): """Interactive exploration interface with thinking mode.""" if not self.project_path: @@ -682,6 +782,12 @@ class SimpleTUI: status = "✅ Indexed" if rag_dir.exists() else "❌ Not indexed" print(f"📁 Current project: {self.project_path.name} ({status})") print() + else: + # Show beginner tips when no project selected + print("🎯 Welcome to FSS-Mini-RAG!") + print(" Search through code, documents, emails, notes - anything text-based!") + print(" Start by selecting a project directory below.") + print() options = [ "Select project directory",