diff --git a/hermes_cli/skin_engine.py b/hermes_cli/skin_engine.py index b992ada06f..160e7c119c 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 aadcde3a6f..3ce185b82a 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):