Add commands and parsers modules
This commit is contained in:
89
.termflow/commands/record.py
Normal file
89
.termflow/commands/record.py
Normal file
@@ -0,0 +1,89 @@
|
||||
"""Record command for CLI."""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
import click
|
||||
from rich.console import Console
|
||||
from rich.prompt import Prompt
|
||||
|
||||
from ..core.database import SessionDatabase
|
||||
from ..core.recorder import InteractiveRecorder
|
||||
|
||||
console = Console()
|
||||
|
||||
|
||||
@click.command(name="record")
|
||||
@click.argument("name", type=str, default=None)
|
||||
@click.option(
|
||||
"--interactive/--no-interactive",
|
||||
default=True,
|
||||
help="Run in interactive mode",
|
||||
)
|
||||
@click.option(
|
||||
"--from-history",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
help="Record from shell history",
|
||||
)
|
||||
@click.option(
|
||||
"--count",
|
||||
default=50,
|
||||
help="Number of history commands to record",
|
||||
)
|
||||
@click.option(
|
||||
"--output",
|
||||
"-o",
|
||||
type=click.Path(path_type=Path),
|
||||
help="Output file for session export",
|
||||
)
|
||||
@click.pass_context
|
||||
def record_cmd(
|
||||
ctx: click.Context,
|
||||
name: Optional[str],
|
||||
interactive: bool,
|
||||
from_history: bool,
|
||||
count: int,
|
||||
output: Optional[Path],
|
||||
) -> None:
|
||||
"""Record a terminal session."""
|
||||
db_path = ctx.obj.get("db", Path.home() / ".termflow" / "sessions.db")
|
||||
db = SessionDatabase(db_path)
|
||||
|
||||
if not name:
|
||||
name = Prompt.ask("Enter session name", default=f"session_{len(db.get_all_sessions()) + 1}")
|
||||
|
||||
if interactive:
|
||||
recorder = InteractiveRecorder(db_path)
|
||||
session = recorder.run_interactive(name)
|
||||
|
||||
if output:
|
||||
_export_session(session, output)
|
||||
|
||||
console.print(f"\n[green]Session '{name}' recorded with {session.command_count} commands[/green]")
|
||||
|
||||
elif from_history:
|
||||
from ..core.recorder import SessionRecorder
|
||||
|
||||
recorder = SessionRecorder(db_path)
|
||||
session = recorder.record_from_history(name, count=count)
|
||||
recorder.save_to_database(db)
|
||||
|
||||
console.print(f"\n[green]Recorded {session.command_count} commands from history[/green]")
|
||||
|
||||
if output:
|
||||
_export_session(session, output)
|
||||
|
||||
else:
|
||||
console.print("[yellow]Please specify --interactive or --from-history[/yellow]")
|
||||
|
||||
|
||||
def _export_session(session, output: Path) -> None:
|
||||
"""Export session to file."""
|
||||
import json
|
||||
|
||||
with open(output, "w") as f:
|
||||
json.dump(session.to_dict(), f, indent=2, default=str)
|
||||
|
||||
console.print(f"[cyan]Session exported to {output}[/cyan]")
|
||||
Reference in New Issue
Block a user