diff --git a/tests/tools/test_skills_hub.py b/tests/tools/test_skills_hub.py index 8e3453c04d..40143adc84 100644 --- a/tests/tools/test_skills_hub.py +++ b/tests/tools/test_skills_hub.py @@ -901,6 +901,22 @@ class TestCheckForSkillUpdates: assert bundle_content_hash(bundle) == content_hash(skill_dir) + def test_bundle_content_hash_accepts_binary_files(self): + bundle = SkillBundle( + name="demo-binary-skill", + files={ + "SKILL.md": "# Demo\n", + "assets/logo.png": b"\x89PNG\r\n\x1a\nbinary", + }, + source="github", + identifier="owner/repo/demo-binary-skill", + trust_level="community", + ) + + digest = bundle_content_hash(bundle) + + assert digest.startswith("sha256:") + def test_reports_update_when_remote_hash_differs(self): lock = MagicMock() lock.list_installed.return_value = [{ diff --git a/tools/skills_hub.py b/tools/skills_hub.py index 0ce1d9b34e..aaeabd2c28 100644 --- a/tools/skills_hub.py +++ b/tools/skills_hub.py @@ -2801,7 +2801,11 @@ def bundle_content_hash(bundle: SkillBundle) -> str: """Compute a deterministic hash for an in-memory skill bundle.""" h = hashlib.sha256() for rel_path in sorted(bundle.files): - h.update(bundle.files[rel_path].encode("utf-8")) + content = bundle.files[rel_path] + if isinstance(content, bytes): + h.update(content) + else: + h.update(content.encode("utf-8")) return f"sha256:{h.hexdigest()[:16]}"