Bug
cli.py:6577 calls qcmd.get("type") on whatever value is in quick_commands — no validation that it is actually a dict.
Reproduction
- Add this to
~/.hermes/config.yaml:
- Start Hermes CLI
- Type
/foo
Result
Error: 'str' object has no attribute 'get'
All slash commands that match a quick_commands key crash — even if the key overlaps with a valid skill command, because quick_commands is checked BEFORE skill commands in the dispatch chain. For example, if both quick_commands.mul-agents (string) and a skill command /mul-agents exist, the broken quick_commands entry poisons /mul-agents and prevents the skill from loading.
Location
cli.py:6573-6577:
base_cmd = cmd_lower.split()[0]
quick_commands = self.config.get("quick_commands", {})
if base_cmd.lstrip("/") in quick_commands:
qcmd = quick_commands[base_cmd.lstrip("/")]
if qcmd.get("type") == "exec": # <-- crash: str has no .get()
Fix
Guard with isinstance(qcmd, dict) before accessing dict methods:
if not isinstance(qcmd, dict):
logger.warning(f"quick_commands entry for {base_cmd} is not a dict, skipping")
# fall through to plugin commands / skill commands checks
elif qcmd.get("type") == "exec":
...
Bug
cli.py:6577callsqcmd.get("type")on whatever value is inquick_commands— no validation that it is actually a dict.Reproduction
~/.hermes/config.yaml:/fooResult
All slash commands that match a quick_commands key crash — even if the key overlaps with a valid skill command, because quick_commands is checked BEFORE skill commands in the dispatch chain. For example, if both
quick_commands.mul-agents(string) and a skill command/mul-agentsexist, the broken quick_commands entry poisons/mul-agentsand prevents the skill from loading.Location
cli.py:6573-6577:Fix
Guard with
isinstance(qcmd, dict)before accessing dict methods: