NousResearch/hermes-agent · error · FileNotFoundError

No bundle at {path}

Error message

No bundle at {path}

What it means

Raised by delete_bundle() in agent/skill_bundles.py when the bundle file resolved from bundle_path_for(name) does not exist. Because names are slug-normalized, the file checked may differ from the string you passed. It signals a delete against a nonexistent (or differently-slugged) bundle.

Source

Thrown at agent/skill_bundles.py:429

    if instruction:
        payload["instruction"] = instruction

    path.write_text(
        yaml.safe_dump(payload, sort_keys=False, allow_unicode=True),
        encoding="utf-8",
    )
    scan_bundles()  # refresh cache
    return path


def delete_bundle(name: str) -> Path:
    """Delete a bundle by name. Returns the deleted path.

    Raises ``FileNotFoundError`` if the bundle doesn't exist.
    """
    path = bundle_path_for(name)
    if not path.exists():
        raise FileNotFoundError(f"No bundle at {path}")
    path.unlink()
    scan_bundles()
    return path


def get_bundle(name: str) -> Optional[Dict[str, Any]]:
    """Look up a bundle by name (slug-normalized)."""
    slug = _slugify(name)
    return get_skill_bundles().get(f"/{slug}")

View on GitHub (pinned to c896c09c42)

Solutions

  1. Check existence first with get_bundle(name) (returns None when absent) or list bundles via get_skill_bundles().
  2. Catch FileNotFoundError and treat it as a no-op if idempotent deletion is intended.
  3. Verify you are using the bundle's slug (the key form '/<slug>' in get_skill_bundles()) rather than an unrelated display name.

Example fix

# before
delete_bundle("research")

# after
if get_bundle("research") is not None:
    delete_bundle("research")
# or:
try:
    delete_bundle("research")
except FileNotFoundError:
    pass  # already gone
Defensive patterns

Strategy: validation

Validate before calling

from agent.skill_bundles import get_bundle

if get_bundle(name) is None:
    print(f"no bundle named {name}; nothing to delete")
else:
    delete_bundle(name)

Try / catch

try:
    delete_bundle(name)
except FileNotFoundError:
    pass  # already deleted; treat as success for idempotent cleanup

Prevention

When it happens

Trigger: Calling delete_bundle(name) where no bundle file exists at the slug-normalized path; calling delete twice in a row; passing a display name whose slug does not match the stored bundle's slug; concurrent deletion by another process.

Common situations: Cleanup scripts that assume a bundle exists; retry logic after a partially-failed run already deleted the file; name/slug mismatch after renaming a bundle manually in the YAML.

Related errors


AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14). Data as JSON: /api/errors/0b61ef06f3d4482a. Report an issue: GitHub.