hermes - ✅(Solved) Fix plugins enable and list use different key sources, causing mismatch when manifest name differs from directory name [1 pull requests, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
NousResearch/hermes-agent#18005Fetched 2026-05-01 05:54:26
View on GitHub
Comments
0
Participants
1
Timeline
5
Reactions
0
Author
Participants
Timeline (top)
labeled ×4cross-referenced ×1

Root Cause

If a plugin's directory name and manifest name differ, it shows "not enabled" forever — enable says "already enabled" because it finds the directory, but list can't match because the key differs.

Fix Action

Fixed

PR fix notes

PR #18009: fix(plugins): enable aliases using manifest names

Description (problem / solution / changelog)

Summary

  • Store the manifest-declared plugin name when enabling a plugin by its installed directory name.
  • Remove stale directory aliases from enabled/disabled config sets during enable/disable.
  • Add a regression test for directory name vs manifest name mismatches.

Root cause

hermes plugins enable <dir> persisted the raw directory argument in plugins.enabled, while hermes plugins list discovers plugins by the manifest name. If those values differ, list never sees the plugin as enabled.

Fix

Resolve the plugin's config key from plugin.yaml before updating plugins.enabled / plugins.disabled, falling back to the supplied name when no manifest name is available.

Regression coverage

  • tests/hermes_cli/test_plugins_cmd.py::TestCmdEnable::test_enable_by_directory_stores_manifest_name

Testing

  • scripts/run_tests.sh tests/hermes_cli/test_plugins_cmd.py::TestCmdEnable::test_enable_by_directory_stores_manifest_name -q
  • scripts/run_tests.sh tests/hermes_cli/test_plugins_cmd.py -q
  • scripts/run_tests.sh tests/hermes_cli/test_plugins.py -q

Closes #18005

Changed files

  • hermes_cli/plugins_cmd.py (modified, +37/-8)
  • tests/hermes_cli/test_plugins_cmd.py (modified, +22/-0)

Code Example

# hermes_cli/plugins_cmd.py, line ~584
def cmd_enable(name: str) -> None:
    # ... existing logic ...
    
    # Resolve manifest name before storing
    user_dir = _plugins_dir()
    plugin_dir = user_dir / name
    if plugin_dir.is_dir():
        manifest = _read_manifest(plugin_dir)
        name = manifest.get("name", name)  # use manifest name, fallback to directory
    
    enabled.add(name)
    # ...
RAW_BUFFERClick to expand / collapse

Bug Description

hermes plugins enable and hermes plugins list use different keys to identify a plugin, causing a mismatch when plugin.yaml declares a name different from the directory name.

  • cmd_enable: uses the directory name to find the plugin and stores it into config.yamlplugins.enabled
  • cmd_list: reads plugin.yaml and uses the manifest name to match against the enabled set

If a plugin's directory name and manifest name differ, it shows "not enabled" forever — enable says "already enabled" because it finds the directory, but list can't match because the key differs.

Steps to Reproduce

  1. Install a plugin where plugin.yaml name != directory name. Example: ~/.hermes/plugins/ping_island/ with name: ping-island in its manifest.
  2. Run hermes plugins enable ping_island → config stores ping_island
  3. Run hermes plugins list → reads manifest name ping-island, looks for it in enabled set → not found → shows "not enabled"
  4. Running hermes plugins enable ping_island again says "already enabled"

Suggested Fix

In cmd_enable(), read the manifest and use the manifest-declared name when storing to config, not the raw argument:

# hermes_cli/plugins_cmd.py, line ~584
def cmd_enable(name: str) -> None:
    # ... existing logic ...
    
    # Resolve manifest name before storing
    user_dir = _plugins_dir()
    plugin_dir = user_dir / name
    if plugin_dir.is_dir():
        manifest = _read_manifest(plugin_dir)
        name = manifest.get("name", name)  # use manifest name, fallback to directory
    
    enabled.add(name)
    # ...

Environment

  • Hermes Agent (latest)
  • Reproduced with ping-island plugin (directory ping_island, manifest name: ping-island)

extent analysis

TL;DR

Update the cmd_enable function to use the manifest-declared name when storing enabled plugins to the config.

Guidance

  • Verify the issue by checking if the plugin.yaml name matches the directory name for the problematic plugin.
  • In hermes_cli/plugins_cmd.py, update the cmd_enable function to read the manifest and use the declared name, as shown in the suggested fix.
  • Test the updated cmd_enable function with a plugin that has a different directory and manifest name.
  • Check the config.yaml file to ensure that the enabled plugin is stored with the correct name.

Example

def cmd_enable(name: str) -> None:
    # ... existing logic ...
    
    # Resolve manifest name before storing
    user_dir = _plugins_dir()
    plugin_dir = user_dir / name
    if plugin_dir.is_dir():
        manifest = _read_manifest(plugin_dir)
        name = manifest.get("name", name)  # use manifest name, fallback to directory
    
    enabled.add(name)
    # ...

Notes

This fix assumes that the plugin.yaml manifest is correctly formatted and contains a name field. If the manifest is missing or malformed, additional error handling may be necessary.

Recommendation

Apply the suggested workaround by updating the cmd_enable function to use the manifest-declared name, as this should resolve the mismatch issue without requiring a full version upgrade.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

hermes - ✅(Solved) Fix plugins enable and list use different key sources, causing mismatch when manifest name differs from directory name [1 pull requests, 1 participants]