diff --git a/.cli_memory/commands/suggestions.py b/.cli_memory/commands/suggestions.py new file mode 100644 index 0000000..fcae148 --- /dev/null +++ b/.cli_memory/commands/suggestions.py @@ -0,0 +1,112 @@ +import click +from rich import print as rprint +from rich.panel import Panel +from rich.table import Table + +from ..config import Config +from ..database import Database +from ..suggestions import SuggestionEngine + + +@click.group() +def suggest(): + """Get smart command suggestions.""" + pass + + +@suggest.command() +@click.argument("prefix") +@click.option("--project", "-p", help="Project ID") +@click.option("--limit", "-l", default=5, help="Maximum suggestions") +def next(prefix, project, limit): + """Get suggestions for next command.""" + db = Database() + engine = SuggestionEngine(db=db) + + project_id = int(project) if project else None + suggestions = engine.get_suggestions(prefix, project_id=project_id, limit=limit) + + db.close() + + if not suggestions: + rprint(f"[yellow]No suggestions for: {prefix}[/yellow]") + return + + table = Table(title=f"Suggestions for: {prefix}") + table.add_column("Command", style="cyan") + table.add_column("Confidence", style="magenta") + table.add_column("Frequency", style="green") + + for s in suggestions: + table.add_row( + s.command, + f"{s.confidence:.2%}", + str(s.frequency), + ) + + rprint(Panel(table, title="Suggestions")) + + +@suggest.command() +@click.argument("prefix") +@click.option("--project", "-p", help="Project ID") +def autocomplete(prefix, project): + """Get autocomplete candidates.""" + db = Database() + engine = SuggestionEngine(db=db) + + project_id = int(project) if project else None + candidates = engine.get_autocomplete_candidates(prefix, project_id) + + db.close() + + if candidates: + rprint("[cyan]Autocomplete candidates:[/cyan]") + for c in candidates: + rprint(f" {c}") + else: + rprint(f"[yellow]No autocomplete candidates for: {prefix}[/yellow]") + + +@suggest.command() +def train(): + """Train suggestion engine.""" + db = Database() + engine = SuggestionEngine(db=db) + + engine.train() + + db.close() + + rprint("[green]Suggestion engine trained successfully![/green]") + + +@suggest.command() +@click.option("--project", "-p", help="Project ID") +def patterns(project): + """Show detected patterns.""" + db = Database() + engine = SuggestionEngine(db=db) + + project_id = int(project) if project else None + patterns = engine.get_pattern_suggestions(project_id) + + db.close() + + if not patterns: + rprint("[yellow]No patterns detected yet[/yellow]") + return + + table = Table(title="Detected Patterns") + table.add_column("Name", style="cyan") + table.add_column("Commands", style="magenta") + table.add_column("Occurrences", style="green") + table.add_column("Confidence", style="yellow") + + for p in patterns[:20]: + cmds = " | ".join(p.command_sequence[:3]) + if len(p.command_sequence) > 3: + cmds += " | ..." + table.add_row(p.name, cmds, str(p.occurrences), f"{p.confidence:.2%}") + + rprint(Panel(table, title="Patterns"))