"""Main entry point for ShellGen CLI.""" import sys from .ui.argparse import create_parser from .ui.console import ConsoleUI from .core.generator import CommandGenerator from .backends.factory import BackendFactory from .safety.checker import SafetyChecker from .history import HistoryManager from .config import Config def main() -> int: """Main entry point for the CLI.""" parser = create_parser() args = parser.parse_args() config = Config() console = ConsoleUI() console.print_header() try: backend = BackendFactory.create_backend( backend_type=args.backend or config.get("default_backend", "ollama"), host=config.get("OLLAMA_HOST"), model=config.get("OLLAMA_MODEL") or "codellama", ) generator = CommandGenerator(backend) safety_checker = SafetyChecker() history_manager = HistoryManager( path=config.get("SHELLGEN_HISTORY_PATH", "~/.shellgen/history.db") ) if args.command == "generate": result = generator.generate( description=args.description, shell=args.shell or config.get("shell.default", "bash"), ) console.display_generated_command(result.command, result.explanation) is_safe, warning = safety_checker.check(result.command) if not is_safe and not args.force: console.print_safety_warning(warning) if not console.confirm_execution(): console.print_cancelled() return 0 if args.auto_execute and is_safe: console.execute_command(result.command) history_manager.add_entry( prompt=args.description, command=result.command, shell=args.shell or "bash", executed=True, ) elif args.execute or (args.auto_execute and is_safe): if console.confirm_execution(): console.execute_command(result.command) history_manager.add_entry( prompt=args.description, command=result.command, shell=args.shell or "bash", executed=True, ) else: console.print_cancelled() else: history_manager.add_entry( prompt=args.description, command=result.command, shell=args.shell or "bash", executed=False, ) elif args.command == "history": entries = history_manager.get_history(limit=args.limit) console.display_history(entries) elif args.command == "feedback": history_manager.add_feedback( entry_id=args.id, corrected_command=args.corrected, feedback=args.feedback, ) console.print_feedback_submitted() return 0 except ConnectionError as e: console.print_error(f"Connection error: {e}") return 1 except Exception as e: console.print_error(f"Error: {e}") return 1 if __name__ == "__main__": sys.exit(main())