Add commands and parsers modules
This commit is contained in:
103
.termflow/commands/export.py
Normal file
103
.termflow/commands/export.py
Normal file
@@ -0,0 +1,103 @@
|
||||
"""Export command for CLI."""
|
||||
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
import click
|
||||
from rich.console import Console
|
||||
|
||||
from ..core.database import SessionDatabase
|
||||
from ..exporters.ascii_generator import ASCIIGenerator
|
||||
from ..exporters.mermaid_generator import MermaidGenerator
|
||||
|
||||
console = Console()
|
||||
|
||||
|
||||
@click.command(name="export")
|
||||
@click.argument("source", type=str)
|
||||
@click.option(
|
||||
"--session-id",
|
||||
"-s",
|
||||
type=int,
|
||||
help="Session ID to export",
|
||||
)
|
||||
@click.option(
|
||||
"--format",
|
||||
"-f",
|
||||
type=click.Choice(["json", "ascii", "mermaid"]),
|
||||
default="json",
|
||||
help="Export format",
|
||||
)
|
||||
@click.option(
|
||||
"--output",
|
||||
"-o",
|
||||
type=click.Path(path_type=Path),
|
||||
required=True,
|
||||
help="Output file",
|
||||
)
|
||||
@click.pass_context
|
||||
def export_cmd(
|
||||
ctx: click.Context,
|
||||
source: str,
|
||||
session_id: Optional[int],
|
||||
format: str,
|
||||
output: Path,
|
||||
) -> None:
|
||||
"""Export a session to file."""
|
||||
db_path = ctx.obj.get("db")
|
||||
db = SessionDatabase(db_path)
|
||||
|
||||
if session_id is None:
|
||||
sessions = db.get_all_sessions()
|
||||
if sessions:
|
||||
session_id = sessions[0]["id"]
|
||||
else:
|
||||
console.print("[yellow]No sessions found[/yellow]")
|
||||
return
|
||||
|
||||
if source == "session":
|
||||
_export_session(db, session_id, format, output)
|
||||
else:
|
||||
console.print("[red]Unknown export source[/red]")
|
||||
|
||||
|
||||
def _export_session(db: SessionDatabase, session_id: int, format: str, output: Path) -> None:
|
||||
"""Export session to file."""
|
||||
session = db.get_session(session_id)
|
||||
if not session:
|
||||
console.print(f"[red]Session {session_id} not found[/red]")
|
||||
return
|
||||
|
||||
commands = db.get_session_commands(session_id)
|
||||
command_list = [cmd.get("command", "") for cmd in commands]
|
||||
|
||||
if format == "json":
|
||||
import json
|
||||
|
||||
data = {
|
||||
"session": session,
|
||||
"commands": commands,
|
||||
}
|
||||
with open(output, "w") as f:
|
||||
json.dump(data, f, indent=2, default=str)
|
||||
|
||||
elif format == "ascii":
|
||||
ascii_gen = ASCIIGenerator(style="detailed")
|
||||
metadata = {
|
||||
"title": f"Session: {session.get('name', 'Unknown')}",
|
||||
"command_count": len(command_list),
|
||||
}
|
||||
result = ascii_gen.generate_from_commands(command_list, metadata)
|
||||
with open(output, "w") as f:
|
||||
f.write(result)
|
||||
|
||||
elif format == "mermaid":
|
||||
mermaid_gen = MermaidGenerator()
|
||||
result = mermaid_gen.generate_flowchart(
|
||||
command_list,
|
||||
title=f"Session: {session.get('name', 'Unknown')}",
|
||||
)
|
||||
with open(output, "w") as f:
|
||||
f.write(result)
|
||||
|
||||
console.print(f"[green]Exported to {output}[/green]")
|
||||
Reference in New Issue
Block a user