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
- Check existence first with get_bundle(name) (returns None when absent) or list bundles via get_skill_bundles().
- Catch FileNotFoundError and treat it as a no-op if idempotent deletion is intended.
- 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
- Make delete routines idempotent by catching FileNotFoundError.
- Use the bundle slug (the '/<slug>' key form) when addressing bundles.
- Avoid concurrent delete/delete races by serializing bundle maintenance in one process.
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
- Bundle already exists at {path}
- Hermes backend did not become ready: ${detail}
- Not a directory: ${watchDir}
- Could not create directory: ${error.message}
- Invalid rename
AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14).
Data as JSON: /api/errors/0b61ef06f3d4482a.
Report an issue: GitHub.