diff --git a/app/shellgen/ui/argparse.py b/app/shellgen/ui/argparse.py new file mode 100644 index 0000000..80031b3 --- /dev/null +++ b/app/shellgen/ui/argparse.py @@ -0,0 +1,104 @@ +"""Argument parser for ShellGen CLI using argparse.""" + +import argparse + + +def create_parser() -> argparse.ArgumentParser: + """Create the argument parser for ShellGen CLI. + + Returns: + Configured ArgumentParser instance. + """ + parser = argparse.ArgumentParser( + prog="shellgen", + description="ShellGen - Convert natural language to shell commands using local LLMs", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" + Examples: + shellgen "find all python files in current directory" + shellgen "create a new git branch and switch to it" + shellgen "list all processes using more than 100MB memory" + shellgen --shell zsh "show me the disk usage sorted by size" + + Supported shells: bash, zsh + """, + ) + + parser.add_argument( + "--version", + action="version", + version="%(prog)s 0.1.0", + ) + + parser.add_argument( + "--backend", + choices=["ollama", "llama_cpp"], + help="LLM backend to use (default: ollama)", + ) + + parser.add_argument( + "--shell", + choices=["bash", "zsh"], + help="Target shell for command generation", + ) + + subparsers = parser.add_subparsers( + dest="command", + title="commands", + description="Available commands", + ) + + generate_parser = subparsers.add_parser( + "generate", + help="Generate a shell command from natural language", + ) + generate_parser.add_argument( + "description", + help="Natural language description of what you want to do", + ) + generate_parser.add_argument( + "--execute", + action="store_true", + help="Execute the generated command", + ) + generate_parser.add_argument( + "--auto-execute", + action="store_true", + help="Automatically execute safe commands without confirmation", + ) + generate_parser.add_argument( + "--force", + action="store_true", + help="Force execution even for potentially dangerous commands", + ) + + history_parser = subparsers.add_parser( + "history", + help="Show command generation history", + ) + history_parser.add_argument( + "--limit", + type=int, + default=20, + help="Maximum number of entries to show (default: 20)", + ) + + feedback_parser = subparsers.add_parser( + "feedback", + help="Submit feedback for a generated command", + ) + feedback_parser.add_argument( + "id", + type=int, + help="ID of the history entry to provide feedback for", + ) + feedback_parser.add_argument( + "--corrected", + help="The corrected command", + ) + feedback_parser.add_argument( + "--feedback", + help="Additional feedback or notes", + ) + + return parser