diff --git a/packages/ui/src/stores/useAgentsStore.ts b/packages/ui/src/stores/useAgentsStore.ts index 1412bc0a..4e7beef2 100644 --- a/packages/ui/src/stores/useAgentsStore.ts +++ b/packages/ui/src/stores/useAgentsStore.ts @@ -700,7 +700,9 @@ async function performConfigRefresh(options: { uiRefreshTasks.push(commandsStore.loadCommands().then(() => undefined)); } if (refreshSkills) { - invalidateSkillsLoadCache(currentDirectory); + // Match loadSkills cache key (active-project-first). Passing client/directory-store + // path here misses the key when those diverge after getRequestDirectory(). + invalidateSkillsLoadCache(); uiRefreshTasks.push(skillsStore.loadSkills().then(() => undefined)); uiRefreshTasks.push(skillsCatalogStore.loadCatalog({ refresh: true }).then(() => undefined)); } diff --git a/packages/ui/src/stores/useSkillsStore.test.ts b/packages/ui/src/stores/useSkillsStore.test.ts index 010e5b55..f75fb711 100644 --- a/packages/ui/src/stores/useSkillsStore.test.ts +++ b/packages/ui/src/stores/useSkillsStore.test.ts @@ -100,4 +100,20 @@ describe('useSkillsStore directory resolution', () => { group: undefined, }]); }); + + test('invalidateSkillsLoadCache() with no argument clears the active-project cache key used by loadSkills', async () => { + expect(await useSkillsStore.getState().loadSkills()).toBe(true); + expect(runtimeFetchCalls.length).toBe(1); + + // Wrong key: client-directory-first null maps to __default__, not the active project. + invalidateSkillsLoadCache(null); + expect(await useSkillsStore.getState().loadSkills()).toBe(true); + expect(runtimeFetchCalls.length).toBe(1); + + // Default resolution must match loadSkills (active project first). + invalidateSkillsLoadCache(); + expect(await useSkillsStore.getState().loadSkills()).toBe(true); + expect(runtimeFetchCalls.length).toBe(2); + expect(runtimeFetchCalls[1]?.url).toContain(`directory=${encodeURIComponent(activeProjectPath)}`); + }); });