2323from archpkg .search_dnf import search_dnf
2424from archpkg .command_gen import generate_command
2525from archpkg .logging_config import get_logger , PackageHelperLogger
26+ from archpkg .suggest import suggest_apps , list_purposes
2627
2728console = Console ()
2829logger = get_logger (__name__ )
@@ -316,10 +317,22 @@ def main() -> None:
316317 logger .info ("Starting archpkg-helper CLI" )
317318
318319 parser = argparse .ArgumentParser (description = "Universal Package Helper CLI" )
319- parser .add_argument ('query' , type = str , nargs = '*' , help = 'Name of the software to search for' )
320+ subparsers = parser .add_subparsers (dest = 'command' , help = 'Available commands' )
321+
322+ # Search command (default behavior)
323+ search_parser = subparsers .add_parser ('search' , help = 'Search for packages by name' )
324+ search_parser .add_argument ('query' , type = str , nargs = '*' , help = 'Name of the software to search for' )
325+ search_parser .add_argument ('--aur' , action = 'store_true' , help = 'Prefer AUR packages over Pacman when both are available' )
326+
327+ # Suggest command
328+ suggest_parser = subparsers .add_parser ('suggest' , help = 'Get app suggestions based on purpose' )
329+ suggest_parser .add_argument ('purpose' , type = str , nargs = '*' , help = 'Purpose or use case (e.g., "video editing", "office")' )
330+ suggest_parser .add_argument ('--list' , action = 'store_true' , help = 'List all available purposes' )
331+
332+ # Global arguments
320333 parser .add_argument ('--debug' , action = 'store_true' , help = 'Enable debug logging to console' )
321334 parser .add_argument ('--log-info' , action = 'store_true' , help = 'Show logging configuration and exit' )
322- parser . add_argument ( '--aur' , action = 'store_true' , help = 'Prefer AUR packages over Pacman when both are available' )
335+
323336 args = parser .parse_args ()
324337
325338 # Enable debug mode if requested
@@ -342,15 +355,78 @@ def main() -> None:
342355 ))
343356 return
344357
358+ # Handle different commands
359+ if args .command == 'suggest' :
360+ handle_suggest_command (args )
361+ return
362+ elif args .command == 'search' or args .command is None :
363+ # Default to search behavior for backward compatibility
364+ handle_search_command (args )
365+ return
366+ else :
367+ console .print (Panel (
368+ "[red]Unknown command.[/red]\n \n "
369+ "[bold cyan]Available commands:[/bold cyan]\n "
370+ "- [cyan]archpkg search firefox[/cyan] - Search for packages by name\n "
371+ "- [cyan]archpkg suggest video editing[/cyan] - Get app suggestions by purpose\n "
372+ "- [cyan]archpkg suggest --list[/cyan] - List all available purposes\n "
373+ "- [cyan]archpkg --help[/cyan] - Show help information" ,
374+ title = "Invalid Command" ,
375+ border_style = "red"
376+ ))
377+ return
378+
379+
380+ def handle_suggest_command (args ) -> None :
381+ """Handle the suggest command."""
382+ if args .list :
383+ logger .info ("Listing all available purposes" )
384+ list_purposes ()
385+ return
386+
387+ if not args .purpose :
388+ console .print (Panel (
389+ "[red]No purpose specified.[/red]\n \n "
390+ "[bold cyan]Usage:[/bold cyan]\n "
391+ "- [cyan]archpkg suggest video editing[/cyan] - Get video editing apps\n "
392+ "- [cyan]archpkg suggest office[/cyan] - Get office applications\n "
393+ "- [cyan]archpkg suggest --list[/cyan] - List all available purposes\n "
394+ "- [cyan]archpkg suggest --help[/cyan] - Show help information" ,
395+ title = "No Purpose Specified" ,
396+ border_style = "red"
397+ ))
398+ return
399+
400+ purpose = ' ' .join (args .purpose )
401+ logger .info (f"Purpose suggestion query: '{ purpose } '" )
402+
403+ if not purpose .strip ():
404+ logger .warning ("Empty purpose query provided by user" )
405+ console .print (Panel (
406+ "[red]Empty purpose query provided.[/red]\n \n "
407+ "[bold cyan]Usage:[/bold cyan]\n "
408+ "- [cyan]archpkg suggest video editing[/cyan] - Get video editing apps\n "
409+ "- [cyan]archpkg suggest office[/cyan] - Get office applications\n "
410+ "- [cyan]archpkg suggest --list[/cyan] - List all available purposes" ,
411+ title = "Invalid Input" ,
412+ border_style = "red"
413+ ))
414+ return
415+
416+ # Display suggestions
417+ suggest_apps (purpose )
418+
419+
420+ def handle_search_command (args ) -> None :
421+ """Handle the search command (original functionality)."""
345422 if not args .query :
346423 console .print (Panel (
347424 "[red]No search query provided.[/red]\n \n "
348425 "[bold cyan]Usage:[/bold cyan]\n "
349- "- [cyan]archpkg firefox[/cyan] - Search for Firefox\n "
350- "- [cyan]archpkg visual studio code[/cyan] - Search for VS Code\n "
351- "- [cyan]archpkg --aur firefox[/cyan] - Prefer AUR packages over Pacman\n "
352- "- [cyan]archpkg --debug firefox[/cyan] - Search with debug output\n "
353- "- [cyan]archpkg --log-info[/cyan] - Show logging configuration\n "
426+ "- [cyan]archpkg search firefox[/cyan] - Search for Firefox\n "
427+ "- [cyan]archpkg search visual studio code[/cyan] - Search for VS Code\n "
428+ "- [cyan]archpkg search --aur firefox[/cyan] - Prefer AUR packages over Pacman\n "
429+ "- [cyan]archpkg suggest video editing[/cyan] - Get app suggestions by purpose\n "
354430 "- [cyan]archpkg --help[/cyan] - Show help information" ,
355431 title = "Invalid Input" ,
356432 border_style = "red"
@@ -365,10 +441,10 @@ def main() -> None:
365441 console .print (Panel (
366442 "[red]Empty search query provided.[/red]\n \n "
367443 "[bold cyan]Usage:[/bold cyan]\n "
368- "- [cyan]archpkg firefox[/cyan] - Search for Firefox\n "
369- "- [cyan]archpkg visual studio code[/cyan] - Search for VS Code\n "
370- "- [cyan]archpkg --aur firefox[/cyan] - Prefer AUR packages over Pacman\n "
371- "- [cyan]archpkg --help [/cyan] - Show help information " ,
444+ "- [cyan]archpkg search firefox[/cyan] - Search for Firefox\n "
445+ "- [cyan]archpkg search visual studio code[/cyan] - Search for VS Code\n "
446+ "- [cyan]archpkg search --aur firefox[/cyan] - Prefer AUR packages over Pacman\n "
447+ "- [cyan]archpkg suggest video editing [/cyan] - Get app suggestions by purpose " ,
372448 title = "Invalid Input" ,
373449 border_style = "red"
374450 ))
0 commit comments