From 73befa505d510dc96dc445337a12d81b496407fb Mon Sep 17 00:00:00 2001 From: Bartok9 Date: Thu, 16 Apr 2026 18:40:04 +0530 Subject: [PATCH] fix(cli): handle null/non-dict display config in skin initialization display: null or display: in config.yaml crashed skin init with AttributeError. Now falls back to default skin gracefully. Cherry-picked from #10867 by @Bartok9. Consolidates #10876 by @cola-runner. Co-authored-by: cola-runner --- hermes_cli/skin_engine.py | 4 +++- tests/hermes_cli/test_skin_engine.py | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/hermes_cli/skin_engine.py b/hermes_cli/skin_engine.py index b992ada06..160e7c119 100644 --- a/hermes_cli/skin_engine.py +++ b/hermes_cli/skin_engine.py @@ -708,7 +708,9 @@ def init_skin_from_config(config: dict) -> None: Call this once during CLI init with the loaded config dict. """ - display = config.get("display", {}) + display = config.get("display") or {} + if not isinstance(display, dict): + display = {} skin_name = display.get("skin", "default") if isinstance(skin_name, str) and skin_name.strip(): set_active_skin(skin_name.strip()) diff --git a/tests/hermes_cli/test_skin_engine.py b/tests/hermes_cli/test_skin_engine.py index aadcde3a6..3ce185b82 100644 --- a/tests/hermes_cli/test_skin_engine.py +++ b/tests/hermes_cli/test_skin_engine.py @@ -152,6 +152,24 @@ class TestSkinManagement: init_skin_from_config({}) assert get_active_skin_name() == "default" + def test_init_skin_from_null_display(self): + """display: null should fall back to default, not crash.""" + from hermes_cli.skin_engine import init_skin_from_config, get_active_skin_name + init_skin_from_config({"display": None}) + assert get_active_skin_name() == "default" + + def test_init_skin_from_non_dict_display(self): + """display: should fall back to default.""" + from hermes_cli.skin_engine import init_skin_from_config, get_active_skin_name + init_skin_from_config({"display": "invalid"}) + assert get_active_skin_name() == "default" + + init_skin_from_config({"display": 42}) + assert get_active_skin_name() == "default" + + init_skin_from_config({"display": []}) + assert get_active_skin_name() == "default" + class TestUserSkins: def test_load_user_skin_from_yaml(self, tmp_path, monkeypatch):