mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-25 00:51:20 +00:00
feat(plugins): plugin CLI registration system — decouple plugin commands from core
Add ctx.register_cli_command() to PluginContext for general plugins and discover_plugin_cli_commands() to memory plugin system. Plugins that provide a register_cli(subparser) function in their cli.py are automatically discovered during argparse setup and wired into the CLI. - Remove 95-line hardcoded honcho argparse block from main.py - Move honcho subcommand tree into plugins/memory/honcho/cli.py via register_cli() convention - hermes honcho setup now redirects to hermes memory setup (unified path) - hermes honcho (no subcommand) shows status instead of running setup - Future plugins can register CLI commands without touching core files - PluginManager stores CLI registrations in _cli_commands dict - Memory plugin discovery scans cli.py for register_cli at argparse time main.py: -102 lines of hardcoded plugin routing
This commit is contained in:
parent
c02c3dc723
commit
dd8a42bf7d
4 changed files with 231 additions and 102 deletions
|
|
@ -182,6 +182,32 @@ class PluginContext:
|
|||
cli._pending_input.put(msg)
|
||||
return True
|
||||
|
||||
# -- CLI command registration --------------------------------------------
|
||||
|
||||
def register_cli_command(
|
||||
self,
|
||||
name: str,
|
||||
help: str,
|
||||
setup_fn: Callable,
|
||||
handler_fn: Callable | None = None,
|
||||
description: str = "",
|
||||
) -> None:
|
||||
"""Register a CLI subcommand (e.g. ``hermes honcho ...``).
|
||||
|
||||
The *setup_fn* receives an argparse subparser and should add any
|
||||
arguments/sub-subparsers. If *handler_fn* is provided it is set
|
||||
as the default dispatch function via ``set_defaults(func=...)``.
|
||||
"""
|
||||
self._manager._cli_commands[name] = {
|
||||
"name": name,
|
||||
"help": help,
|
||||
"description": description,
|
||||
"setup_fn": setup_fn,
|
||||
"handler_fn": handler_fn,
|
||||
"plugin": self.manifest.name,
|
||||
}
|
||||
logger.debug("Plugin %s registered CLI command: %s", self.manifest.name, name)
|
||||
|
||||
# -- hook registration --------------------------------------------------
|
||||
|
||||
def register_hook(self, hook_name: str, callback: Callable) -> None:
|
||||
|
|
@ -213,6 +239,7 @@ class PluginManager:
|
|||
self._plugins: Dict[str, LoadedPlugin] = {}
|
||||
self._hooks: Dict[str, List[Callable]] = {}
|
||||
self._plugin_tool_names: Set[str] = set()
|
||||
self._cli_commands: Dict[str, dict] = {}
|
||||
self._discovered: bool = False
|
||||
self._cli_ref = None # Set by CLI after plugin discovery
|
||||
|
||||
|
|
@ -526,6 +553,15 @@ def get_plugin_tool_names() -> Set[str]:
|
|||
return get_plugin_manager()._plugin_tool_names
|
||||
|
||||
|
||||
def get_plugin_cli_commands() -> Dict[str, dict]:
|
||||
"""Return CLI commands registered by general plugins.
|
||||
|
||||
Returns a dict of ``{name: {help, setup_fn, handler_fn, ...}}``
|
||||
suitable for wiring into argparse subparsers.
|
||||
"""
|
||||
return dict(get_plugin_manager()._cli_commands)
|
||||
|
||||
|
||||
def get_plugin_toolsets() -> List[tuple]:
|
||||
"""Return plugin toolsets as ``(key, label, description)`` tuples.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue