From e2d738f89df4fa88f8d1b431cf9929d5a197210b Mon Sep 17 00:00:00 2001 From: aydnOktay Date: Fri, 28 Aug 2026 16:47:18 +0300 Subject: [PATCH] fix(cli): guard disabled_toolsets on partial CLI instances show_banner/_show_status call get_tool_definitions with disabled_toolsets, but test and early-init paths build HermesCLI via __new__ without running __init__, so self.disabled_toolsets was missing and CI failed with AttributeError in test_cli_context_warning. Co-authored-by: Cursor --- hermes_cli/cli_info_mixin.py | 6 +++--- hermes_cli/cli_loops_mixin.py | 2 +- hermes_cli/cli_session_mixin.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hermes_cli/cli_info_mixin.py b/hermes_cli/cli_info_mixin.py index d126d61be7..5a35f17b04 100644 --- a/hermes_cli/cli_info_mixin.py +++ b/hermes_cli/cli_info_mixin.py @@ -134,7 +134,7 @@ class CLIInfoMixin: from model_tools import get_toolset_for_tool tools = get_tool_definitions( enabled_toolsets=self.enabled_toolsets, - disabled_toolsets=self.disabled_toolsets, quiet_mode=True) + disabled_toolsets=getattr(self, "disabled_toolsets", None), quiet_mode=True) availability = compute_toolset_availability(self.enabled_toolsets) tmap = _toolset_map(tools, availability, get_toolset_for_tool) save_banner_snapshot(tools, self.enabled_toolsets, availability, tmap) @@ -148,7 +148,7 @@ class CLIInfoMixin: # Cold path: compute live, then persist the snapshot for the next launch. from model_tools import get_toolset_for_tool tools = get_tool_definitions(enabled_toolsets=self.enabled_toolsets, - disabled_toolsets=self.disabled_toolsets, quiet_mode=True) + disabled_toolsets=getattr(self, "disabled_toolsets", None), quiet_mode=True) availability = compute_toolset_availability(self.enabled_toolsets) build_welcome_banner(tools=tools, availability=availability, **banner_kw) try: @@ -357,7 +357,7 @@ class CLIInfoMixin: # Pre-assembly list: /tools is a discovery surface, so it must show the full catalog # including tools deferred behind the tool_search bridge (users verify MCP installs here). tools = get_tool_definitions(enabled_toolsets=self.enabled_toolsets, - disabled_toolsets=self.disabled_toolsets, quiet_mode=True, + disabled_toolsets=getattr(self, "disabled_toolsets", None), quiet_mode=True, skip_tool_search_assembly=True) if not tools: print("(;_;) No tools available") diff --git a/hermes_cli/cli_loops_mixin.py b/hermes_cli/cli_loops_mixin.py index fa00827bff..a699545dc6 100644 --- a/hermes_cli/cli_loops_mixin.py +++ b/hermes_cli/cli_loops_mixin.py @@ -83,7 +83,7 @@ class CLILoopsMixin: cc.print(_build_compact_banner()) else: tools = get_tool_definitions(enabled_toolsets=self.enabled_toolsets, - disabled_toolsets=self.disabled_toolsets, quiet_mode=True) + disabled_toolsets=getattr(self, "disabled_toolsets", None), quiet_mode=True) agent = getattr(self, "agent", None) ctx_len = None if agent and hasattr(agent, "context_compressor"): diff --git a/hermes_cli/cli_session_mixin.py b/hermes_cli/cli_session_mixin.py index 7281d1a3ff..a955e5513d 100644 --- a/hermes_cli/cli_session_mixin.py +++ b/hermes_cli/cli_session_mixin.py @@ -217,7 +217,7 @@ class CLISessionMixin: tool_status = "tools deferred" else: tools = get_tool_definitions(enabled_toolsets=self.enabled_toolsets, - disabled_toolsets=self.disabled_toolsets, quiet_mode=True) + disabled_toolsets=getattr(self, "disabled_toolsets", None), quiet_mode=True) tool_status = f"{len(tools) if tools else 0} tools" model_short = self.model.split("/")[-1] if "/" in self.model else self.model