""" Export and reporting CLI commands. """ import sys from typing import Optional from tddai import TddaiError from services import ExportService from cli.presenters import OutputFormatter class ExportCommands: """Commands for data export and reporting.""" def __init__(self): self.service = ExportService() def issue_index(self, format_type: str = "tsv", sort_by: str = "number", filter_state: Optional[str] = None, filter_priority: Optional[str] = None, include_state: bool = False) -> None: """Output compact index of all issues for Unix processing. Args: format_type: Output format (tsv, csv, json, fields) sort_by: Sort by field (number, title, priority, state, created, updated) filter_state: Filter by state (open, closed) filter_priority: Filter by priority (low, medium, high, critical, none) include_state: Include state column in output """ try: output = self.service.export_issues( format_type=format_type, sort_by=sort_by, filter_state=filter_state, filter_priority=filter_priority, include_state=include_state ) # Output directly to stdout for piping print(output) except TddaiError as e: # Send error to stderr to avoid corrupting piped output print(f"❌ Error: {e}", file=sys.stderr) sys.exit(1) def export_issues_csv(self, output_file: str = None) -> None: """Export issues in CSV format.""" try: output = self.service.export_issues( format_type="csv", sort_by="number" ) if output_file: with open(output_file, 'w') as f: f.write(output) OutputFormatter.success(f"Issues exported to {output_file}") else: print(output) except TddaiError as e: OutputFormatter.exit_with_error(str(e)) def export_issues_json(self, output_file: str = None) -> None: """Export issues in JSON format.""" try: output = self.service.export_issues( format_type="json", sort_by="number" ) if output_file: with open(output_file, 'w') as f: f.write(output) OutputFormatter.success(f"Issues exported to {output_file}") else: print(output) except TddaiError as e: OutputFormatter.exit_with_error(str(e))