Add intelligent path detection for nearby FSS-Mini-RAG indexes

- Implement find_nearby_index() to search current dir + 2 levels up
- Add helpful navigation guidance when index found elsewhere
- Update search command to show guidance instead of failing
- Update status command to detect nearby indexes
- Keep detection simple and not overly complex
- Fix command parameter bug (--show-perf)

Features:
- Searches current directory, parent, and grandparent for .mini-rag
- Shows exact navigation commands when index found nearby
- Provides clear "cd path && rag-mini search" instructions
- Falls back to "create index here" if not found nearby

User experience improvements:
- No more mysterious "not indexed" errors in subdirectories
- Clear guidance on how to navigate to existing indexes
- Simple 3-level search depth keeps it fast and predictable
This commit is contained in:
FSSCoding 2025-09-06 21:28:02 +10:00
parent af4db45ce9
commit 0a0efc0e6d

View File

@ -38,6 +38,52 @@ logger = logging.getLogger(__name__)
console = Console() console = Console()
def find_nearby_index(start_path: Path = None) -> Optional[Path]:
"""
Find .mini-rag index in current directory or up to 2 levels up.
Args:
start_path: Starting directory to search from (default: current directory)
Returns:
Path to directory containing .mini-rag, or None if not found
"""
if start_path is None:
start_path = Path.cwd()
current = start_path.resolve()
# Search current directory and up to 2 levels up
for level in range(3): # 0, 1, 2 levels up
rag_dir = current / ".mini-rag"
if rag_dir.exists() and rag_dir.is_dir():
return current
# Move up one level
parent = current.parent
if parent == current: # Reached filesystem root
break
current = parent
return None
def show_index_guidance(query_path: Path, found_index_path: Path) -> None:
"""Show helpful guidance when index is found in a different location."""
relative_path = found_index_path.relative_to(Path.cwd()) if found_index_path != Path.cwd() else Path(".")
console.print(f"\n[yellow]📍 Found FSS-Mini-RAG index in:[/yellow] [blue]{found_index_path}[/blue]")
console.print(f"[dim]Current directory:[/dim] [dim]{query_path}[/dim]")
console.print()
console.print("[green]🚀 To search the index, navigate there first:[/green]")
console.print(f" [bold]cd {relative_path}[/bold]")
console.print(f" [bold]rag-mini search 'your query here'[/bold]")
console.print()
console.print("[cyan]💡 Or specify the path directly:[/cyan]")
console.print(f" [bold]rag-mini search -p {found_index_path} 'your query here'[/bold]")
console.print()
@click.group() @click.group()
@click.option("--verbose", "-v", is_flag=True, help="Enable verbose logging") @click.option("--verbose", "-v", is_flag=True, help="Enable verbose logging")
@click.option("--quiet", "-q", is_flag=True, help="Suppress output") @click.option("--quiet", "-q", is_flag=True, help="Suppress output")
@ -153,7 +199,7 @@ def init(path: str, force: bool, reindex: bool, model: Optional[str]):
) )
@click.option("--lang", multiple=True, help="Filter by language (python, javascript, etc.)") @click.option("--lang", multiple=True, help="Filter by language (python, javascript, etc.)")
@click.option("--show-content", "-c", is_flag=True, help="Show code content in results") @click.option("--show-content", "-c", is_flag=True, help="Show code content in results")
@click.option("--show-per", is_flag=True, help="Show performance metrics") @click.option("--show-perf", is_flag=True, help="Show performance metrics")
def search( def search(
query: str, query: str,
path: str, path: str,
@ -166,10 +212,21 @@ def search(
"""Search codebase using semantic similarity.""" """Search codebase using semantic similarity."""
project_path = Path(path).resolve() project_path = Path(path).resolve()
# Check if indexed # Check if indexed at specified path
rag_dir = project_path / ".mini-rag" rag_dir = project_path / ".mini-rag"
if not rag_dir.exists(): if not rag_dir.exists():
console.print("[red]Error:[/red] Project not indexed. Run 'rag-mini init' first.") # Try to find nearby index if searching from current directory
if path == ".":
nearby_index = find_nearby_index()
if nearby_index:
show_index_guidance(project_path, nearby_index)
sys.exit(0)
console.print(f"[red]Error:[/red] No FSS-Mini-RAG index found at [blue]{project_path}[/blue]")
console.print()
console.print("[yellow]💡 To create an index:[/yellow]")
console.print(f" [bold]rag-mini init -p {project_path}[/bold]")
console.print()
sys.exit(1) sys.exit(1)
# Get performance monitor # Get performance monitor
@ -714,7 +771,18 @@ def status(path: str, port: int, discovery: bool):
console.print(f" • Error: {e}") console.print(f" • Error: {e}")
else: else:
console.print(" • Status: [red]❌ Not indexed[/red]") console.print(" • Status: [red]❌ Not indexed[/red]")
console.print(" • Run 'rag-mini init' to initialize")
# Try to find nearby index if checking current directory
if path == ".":
nearby_index = find_nearby_index()
if nearby_index:
console.print(f" • Found index in: [blue]{nearby_index}[/blue]")
relative_path = nearby_index.relative_to(Path.cwd()) if nearby_index != Path.cwd() else Path(".")
console.print(f" • Use: [bold]cd {relative_path} && rag-mini status[/bold]")
else:
console.print(" • Run 'rag-mini init' to initialize")
else:
console.print(" • Run 'rag-mini init' to initialize")
# Check server status # Check server status
console.print("\n[bold]🚀 Server Status:[/bold]") console.print("\n[bold]🚀 Server Status:[/bold]")