From baf1954c3ab3e5be1a73af8f8155928ade81b4f4 Mon Sep 17 00:00:00 2001 From: Dev Chiniwala Date: Thu, 17 Sep 2026 16:05:47 +0530 Subject: [PATCH] fix: clear stale skill index on empty reload --- datamind/capabilities/skills/service.py | 2 + datamind/tests/test_skills.py | 49 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/datamind/capabilities/skills/service.py b/datamind/capabilities/skills/service.py index 5e8cea5..33f57a0 100644 --- a/datamind/capabilities/skills/service.py +++ b/datamind/capabilities/skills/service.py @@ -59,6 +59,8 @@ async def load(self) -> dict[str, int]: self._by_name = {m.name: m for m in manifests} manifests = list(self._by_name.values()) indexed = 0 + if not manifests and self._embedding and self._store: + await self._store.reset() if manifests and self._embedding and self._store: ids = [m.name for m in manifests] texts = [m.full_text for m in manifests] diff --git a/datamind/tests/test_skills.py b/datamind/tests/test_skills.py index 0401c54..f566a5b 100644 --- a/datamind/tests/test_skills.py +++ b/datamind/tests/test_skills.py @@ -7,6 +7,7 @@ from datamind.capabilities.skills import ( SkillManifest, + SkillsService, discover_skills, load_skill, ) @@ -62,6 +63,54 @@ def test_discover_skills_scans_subdirs(tmp_path: Path): assert [m.name for m in ms] == ["a", "b"] +class _SkillEmbedding: + dimension = 1 + + async def embed_texts(self, texts): + return [[float(index)] for index, _ in enumerate(texts)] + + +class _SkillVectorStore: + def __init__(self): + self.items = {} + + async def reset(self): + self.items.clear() + + async def add(self, ids, texts, embeddings, metadatas): + self.items = { + item_id: (text, metadata) + for item_id, text, metadata in zip(ids, texts, metadatas) + } + + +@pytest.mark.asyncio +async def test_skill_reload_clears_index_when_all_manifests_are_removed(tmp_path: Path): + skill_dir = tmp_path / 'alpha' + skill_dir.mkdir() + manifest = skill_dir / 'SKILL.md' + manifest.write_text( + '---\nname: alpha\ndescription: Alpha\n---\n\nBody\n', + encoding='utf-8', + ) + store = _SkillVectorStore() + service = SkillsService( + skills_dir=tmp_path, + profile_skills_dir=tmp_path / 'profile', + embedding=_SkillEmbedding(), + vector_store=store, + ) + + await service.load() + assert sorted(store.items) == ['alpha'] + + manifest.unlink() + stats = await service.load() + + assert stats['manifests'] == 0 + assert store.items == {} + + # ---------------------------------------------------------- code skills ---