Spaces:
Sleeping
Sleeping
"""Argument parsing for KnowLang CLI.""" | |
import argparse | |
from pathlib import Path | |
from typing import Union | |
from knowlang.cli.commands.chat import chat_command | |
from knowlang.cli.types import ChatCommandArgs, ParseCommandArgs, BaseCommandArgs | |
from knowlang.cli.commands.parse import parse_command | |
def _convert_to_args(parsed_args: argparse.Namespace) -> Union[ParseCommandArgs, BaseCommandArgs]: | |
"""Convert parsed namespace to typed arguments.""" | |
base_args = { | |
"verbose": parsed_args.verbose, | |
"config": parsed_args.config if hasattr(parsed_args, "config") else None | |
} | |
if parsed_args.command == "parse": | |
return ParseCommandArgs( | |
**base_args, | |
path=parsed_args.path, | |
output=parsed_args.output, | |
command="parse" | |
) | |
elif parsed_args.command == "chat": | |
return ChatCommandArgs( | |
**base_args, | |
command="chat", | |
port=parsed_args.port, | |
share=parsed_args.share, | |
server_port=parsed_args.server_port, | |
server_name=parsed_args.server_name | |
) | |
return BaseCommandArgs(**base_args) | |
def create_parser() -> argparse.ArgumentParser: | |
"""Create the main argument parser.""" | |
parser = argparse.ArgumentParser( | |
description="KnowLang - Code Understanding Assistant", | |
formatter_class=argparse.RawDescriptionHelpFormatter | |
) | |
# Global options | |
parser.add_argument( | |
"--verbose", "-v", | |
action="store_true", | |
help="Enable verbose output" | |
) | |
parser.add_argument( | |
"--config", | |
type=Path, | |
help="Path to custom configuration file", | |
default=None | |
) | |
# Subcommands | |
subparsers = parser.add_subparsers( | |
title="commands", | |
description="Available commands", | |
dest="command" | |
) | |
subparsers.required = True | |
# Parse command | |
parse_parser = subparsers.add_parser( | |
"parse", | |
help="Parse and index a codebase" | |
) | |
parse_parser.add_argument( | |
"--output", | |
type=str, | |
choices=["table", "json"], | |
default="table", | |
help="Output format (default: table)" | |
) | |
parse_parser.add_argument( | |
"path", | |
type=Path, | |
help="Path to codebase directory or repository URL" | |
) | |
parse_parser.set_defaults(func=parse_command) | |
# Chat command | |
chat_parser = subparsers.add_parser( | |
"chat", | |
help="Launch the chat interface" | |
) | |
chat_parser.add_argument( | |
"--port", | |
type=int, | |
help="Port to run the interface on" | |
) | |
chat_parser.add_argument( | |
"--share", | |
action="store_true", | |
help="Create a shareable link" | |
) | |
chat_parser.add_argument( | |
"--server-port", | |
type=int, | |
help="Port to run the server on (if different from --port)" | |
) | |
chat_parser.add_argument( | |
"--server-name", | |
type=str, | |
help="Server name to listen on (default: 0.0.0.0)" | |
) | |
chat_parser.set_defaults(func=chat_command) | |
return parser | |
def parse_args() -> Union[ParseCommandArgs, BaseCommandArgs]: | |
"""Parse command line arguments into typed objects.""" | |
parser = create_parser() | |
return _convert_to_args(parser.parse_args()) |