86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
"""Compare command for CLI."""
|
|
|
|
from typing import List, Optional
|
|
|
|
import click
|
|
from rich.console import Console
|
|
from rich.panel import Panel
|
|
from rich.table import Table
|
|
|
|
from ..core.database import SessionDatabase
|
|
from ..core.team_comparison import TeamComparisonAnalyzer
|
|
|
|
console = Console()
|
|
|
|
|
|
@click.command(name="compare")
|
|
@click.option(
|
|
"--sessions",
|
|
"-s",
|
|
multiple=True,
|
|
type=int,
|
|
help="Session IDs to compare",
|
|
)
|
|
@click.option(
|
|
"--all",
|
|
is_flag=True,
|
|
default=False,
|
|
help="Compare all sessions",
|
|
)
|
|
@click.pass_context
|
|
def compare_cmd(
|
|
ctx: click.Context,
|
|
sessions: tuple,
|
|
all_sessions: bool,
|
|
) -> None:
|
|
"""Compare terminal sessions."""
|
|
db_path = ctx.obj.get("db")
|
|
db = SessionDatabase(db_path)
|
|
|
|
if all_sessions:
|
|
all_sessions_data = db.get_all_sessions()
|
|
session_ids = [s["id"] for s in all_sessions_data]
|
|
else:
|
|
session_ids = list(sessions)
|
|
|
|
if len(session_ids) < 2:
|
|
console.print("[yellow]Please provide at least 2 session IDs to compare[/yellow]")
|
|
return
|
|
|
|
sessions_data = []
|
|
for sid in session_ids:
|
|
session = db.get_session(sid)
|
|
if session:
|
|
commands = db.get_session_commands(sid)
|
|
session["commands"] = commands
|
|
sessions_data.append(session)
|
|
|
|
if not sessions_data:
|
|
console.print("[yellow]No valid sessions found[/yellow]")
|
|
return
|
|
|
|
analyzer = TeamComparisonAnalyzer()
|
|
patterns = analyzer.analyze_sessions(sessions_data)
|
|
|
|
table = Table(title="Session Comparison")
|
|
table.add_column("Session")
|
|
table.add_column("Commands", justify="right")
|
|
table.add_column("Common Patterns", justify="right")
|
|
|
|
for session in sessions_data:
|
|
session_patterns = [p for p in patterns if session["name"] in p.users]
|
|
table.add_row(
|
|
session["name"],
|
|
str(session["command_count"]),
|
|
str(len(session_patterns)),
|
|
)
|
|
|
|
console.print(table)
|
|
|
|
if patterns:
|
|
pattern_text = click.style("Top Common Patterns:\n", bold=True)
|
|
for i, pattern in enumerate(patterns[:5], 1):
|
|
pattern_text += f"{i}. {pattern.commands} (used {pattern.frequency} times)\n"
|
|
|
|
console.print(Panel(pattern_text, title="Patterns"))
|