diff --git a/cli.py b/cli.py index a2a3f8c17..0d13d230c 100755 --- a/cli.py +++ b/cli.py @@ -1942,18 +1942,22 @@ class HermesCLI: ) def show_help(self): - """Display help information.""" - _cprint(f"\n{_BOLD}+{'-' * 50}+{_RST}") - _cprint(f"{_BOLD}|{' ' * 14}(^_^)? Available Commands{' ' * 10}|{_RST}") - _cprint(f"{_BOLD}+{'-' * 50}+{_RST}\n") - - for cmd, desc in COMMANDS.items(): - _cprint(f" {_GOLD}{cmd:<15}{_RST} {_DIM}-{_RST} {desc}") - + """Display help information with categorized commands.""" + from hermes_cli.commands import COMMANDS_BY_CATEGORY + + _cprint(f"\n{_BOLD}+{'-' * 55}+{_RST}") + _cprint(f"{_BOLD}|{' ' * 14}(^_^)? Available Commands{' ' * 15}|{_RST}") + _cprint(f"{_BOLD}+{'-' * 55}+{_RST}") + + for category, commands in COMMANDS_BY_CATEGORY.items(): + _cprint(f"\n {_BOLD}── {category} ──{_RST}") + for cmd, desc in commands.items(): + _cprint(f" {_GOLD}{cmd:<15}{_RST} {_DIM}-{_RST} {desc}") + if _skill_commands: _cprint(f"\n ⚡ {_BOLD}Skill Commands{_RST} ({len(_skill_commands)} installed):") for cmd, info in sorted(_skill_commands.items()): - _cprint(f" {_GOLD}{cmd:<22}{_RST} {_DIM}-{_RST} {info['description']}") + _cprint(f" {_GOLD}{cmd:<22}{_RST} {_DIM}-{_RST} {info['description']}") _cprint(f"\n {_DIM}Tip: Just type your message to chat with Hermes!{_RST}") _cprint(f" {_DIM}Multi-line: Alt+Enter for a new line{_RST}") diff --git a/hermes_cli/commands.py b/hermes_cli/commands.py index 72c9e77c1..e1b23d872 100644 --- a/hermes_cli/commands.py +++ b/hermes_cli/commands.py @@ -13,37 +13,43 @@ from typing import Any from prompt_toolkit.completion import Completer, Completion -COMMANDS = { - "/help": "Show this help message", - "/tools": "List available tools", - "/toolsets": "List available toolsets", - "/model": "Show or change the current model", - "/provider": "Show available providers and current provider", - "/prompt": "View/set custom system prompt", - "/personality": "Set a predefined personality", - "/clear": "Clear screen and reset conversation (fresh start)", - "/history": "Show conversation history", - "/new": "Start a new conversation (reset history)", - "/reset": "Reset conversation only (keep screen)", - "/retry": "Retry the last message (resend to agent)", - "/undo": "Remove the last user/assistant exchange", - "/save": "Save the current conversation", - "/config": "Show current configuration", - "/cron": "Manage scheduled tasks (list, add, remove)", - "/skills": "Search, install, inspect, or manage skills from online registries", - "/platforms": "Show gateway/messaging platform status", - "/verbose": "Cycle tool progress display: off → new → all → verbose", - "/compress": "Manually compress conversation context (flush memories + summarize)", - "/title": "Set a title for the current session (usage: /title My Session Name)", - "/usage": "Show token usage for the current session", - "/insights": "Show usage insights and analytics (last 30 days)", - "/paste": "Check clipboard for an image and attach it", - "/reload-mcp": "Reload MCP servers from config.yaml", - "/rollback": "List or restore filesystem checkpoints (usage: /rollback [number])", - "/skin": "Show or change the display skin/theme", - "/quit": "Exit the CLI (also: /exit, /q)", +# Commands organized by category for better help display +COMMANDS_BY_CATEGORY = { + "Session": { + "/new": "Start a new conversation (reset history)", + "/reset": "Reset conversation only (keep screen)", + "/clear": "Clear screen and reset conversation (fresh start)", + "/history": "Show conversation history", + "/save": "Save the current conversation", + "/retry": "Retry the last message (resend to agent)", + "/undo": "Remove the last user/assistant exchange", + }, + "Configuration": { + "/config": "Show current configuration", + "/model": "Show or change the current model", + "/prompt": "View/set custom system prompt", + "/personality": "Set a predefined personality", + }, + "Tools & Skills": { + "/tools": "List available tools", + "/toolsets": "List available toolsets", + "/skills": "Search, install, inspect, or manage skills", + "/cron": "Manage scheduled tasks (list, add, remove)", + }, + "Info": { + "/help": "Show this help message", + "/platforms": "Show gateway/messaging platform status", + }, + "Exit": { + "/quit": "Exit the CLI (also: /exit, /q)", + }, } +# Flat dict for backwards compatibility and autocomplete +COMMANDS = {} +for category_commands in COMMANDS_BY_CATEGORY.values(): + COMMANDS.update(category_commands) + class SlashCommandCompleter(Completer): """Autocomplete for built-in slash commands and optional skill commands."""